| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package io.v.moments.ux; |
| |
| import android.content.Context; |
| import android.content.Intent; |
| import android.os.Handler; |
| import android.support.v7.widget.RecyclerView; |
| import android.support.v7.widget.SwitchCompat; |
| import android.util.Log; |
| import android.view.View; |
| import android.widget.CompoundButton; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| import android.widget.Toast; |
| |
| import java.util.concurrent.ExecutorService; |
| |
| import io.v.moments.R; |
| import io.v.moments.ifc.Advertiser; |
| import io.v.moments.ifc.Moment; |
| import static io.v.moments.ifc.Moment.AdState; |
| import io.v.moments.ifc.Moment.Kind; |
| import io.v.moments.ifc.Moment.Style; |
| |
| /** |
| * Holds the views comprising a Moment for a RecyclerView. |
| */ |
| public class MomentHolder extends RecyclerView.ViewHolder { |
| private static final String TAG = "MomentHolder"; |
| private final TextView authorTextView; |
| private final TextView captionTextView; |
| private final SwitchCompat advertiseButton; |
| private final ImageView imageView; |
| private final Context mContext; |
| private final ExecutorService mExecutor; |
| private final Handler mHandler; |
| |
| public MomentHolder( |
| View itemView, Context context, |
| ExecutorService executor, Handler handler) { |
| super(itemView); |
| mContext = context; |
| mExecutor = executor; |
| mHandler = handler; |
| authorTextView = (TextView) itemView.findViewById(R.id.moment_author); |
| captionTextView = (TextView) itemView.findViewById(R.id.moment_caption); |
| advertiseButton = (SwitchCompat) itemView.findViewById(R.id.advertise_button); |
| imageView = (ImageView) itemView.findViewById(R.id.moment_image); |
| } |
| |
| /** |
| * Modifies the view to reflect the state of moment. |
| */ |
| public void bind(Moment moment, Advertiser advertiser) { |
| final Kind kind = advertiser == null ? Kind.REMOTE : Kind.LOCAL; |
| Log.d(TAG, "Holder: binding " + kind + " " + moment); |
| authorTextView.setText(moment.getAuthor()); |
| captionTextView.setText(moment.getCaption()); |
| if (moment.hasPhoto(kind, Style.THUMB)) { |
| imageView.setImageBitmap(moment.getPhoto(kind, Style.THUMB)); |
| imageView.setOnClickListener(showPhoto(moment, kind)); |
| } else { |
| Log.d(TAG, kind.toString() + " " + Style.THUMB + " not ready."); |
| } |
| if (moment.hasPhoto(kind, Style.FULL)) { |
| if (!moment.hasPhoto(kind, Style.THUMB)) { |
| throw new IllegalStateException(Style.THUMB.toString() + |
| " should be ready if " + Style.FULL + " is ready."); |
| } |
| } else { |
| Log.d(TAG, kind.toString() + " " + Style.FULL + " not ready."); |
| } |
| if (kind.equals(Kind.REMOTE)) { |
| advertiseButton.setVisibility(View.INVISIBLE); |
| } else { |
| advertiseButton.setText(""); |
| advertiseButton.setVisibility(View.VISIBLE); |
| advertiseButton.setEnabled(true); |
| advertiseButton.setChecked(moment.getDesiredAdState().equals(AdState.ON)); |
| advertiseButton.setOnCheckedChangeListener( |
| toggleAdvertising(moment, advertiser)); |
| } |
| } |
| |
| /** |
| * Fires an activity that will try to show a large photo, failing over to |
| * show a blown up version of a thumbnail. |
| */ |
| private View.OnClickListener showPhoto( |
| final Moment moment, final Kind kind) { |
| return new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| Log.d(TAG, "Clicked moment."); |
| Intent intent = ShowPhotoActivity.makeIntent( |
| mContext, moment.getOrdinal(), kind); |
| mContext.startActivity(intent); |
| } |
| |
| }; |
| } |
| |
| private CompoundButton.OnCheckedChangeListener toggleAdvertising( |
| final Moment moment, final Advertiser advertiser) { |
| return new CompoundButton.OnCheckedChangeListener() { |
| @Override |
| public void onCheckedChanged(CompoundButton button, boolean isChecked) { |
| if (isChecked) { |
| moment.setDesiredAdState(AdState.ON); |
| mExecutor.submit(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| advertiser.advertiseStart(); |
| toast("Started advertising " + moment.getCaption()); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| toast("Had problem starting advertising."); |
| } |
| } |
| }); |
| } else { |
| moment.setDesiredAdState(AdState.OFF); |
| mExecutor.submit(new Runnable() { |
| @Override |
| public void run() { |
| try { |
| advertiser.advertiseStop(); |
| toast("Stopped advertising " + moment.getCaption()); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| toast("Had problem stopping advertising."); |
| } |
| } |
| }); |
| } |
| } |
| }; |
| } |
| |
| private void toast(final String msg) { |
| mHandler.post(new Runnable() { |
| @Override |
| public void run() { |
| Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); |
| } |
| }); |
| } |
| } |