package com.kickstarter.ui.viewholders; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.CardView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.jakewharton.rxbinding.view.RxView; import com.kickstarter.R; import com.kickstarter.libs.KSString; import com.kickstarter.libs.transformations.CircleTransformation; import com.kickstarter.libs.utils.DateTimeUtils; import com.kickstarter.libs.utils.ViewUtils; import com.kickstarter.models.MessageThread; import com.kickstarter.ui.IntentKey; import com.kickstarter.ui.activities.MessagesActivity; import com.kickstarter.viewmodels.MessageThreadHolderViewModel; import com.squareup.picasso.Picasso; import org.joda.time.DateTime; import butterknife.Bind; import butterknife.ButterKnife; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; import static com.kickstarter.libs.utils.ObjectUtils.requireNonNull; public final class MessageThreadViewHolder extends KSViewHolder { private final MessageThreadHolderViewModel.ViewModel viewModel; protected @Bind(R.id.date_text_view) TextView dateTextView; protected @Bind(R.id.message_body_text_view) TextView messageBodyTextView; protected @Bind(R.id.message_thread_card_view) CardView messageThreadCardView; protected @Bind(R.id.participant_avatar_image_view) ImageView participantAvatarImageView; protected @Bind(R.id.participant_name_text_view) TextView participantNameTextView; protected @Bind(R.id.unread_indicator_image_view) ImageView unreadIndicatorImageView; private KSString ksString; public MessageThreadViewHolder(final @NonNull View view) { super(view); this.ksString = environment().ksString(); this.viewModel = new MessageThreadHolderViewModel.ViewModel(environment()); ButterKnife.bind(this, view); RxView.clicks(this.messageThreadCardView) .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(__ -> this.viewModel.inputs.messageThreadCardViewClicked()); this.viewModel.outputs.dateDateTime() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::setDateTextView); this.viewModel.outputs.messageBodyTextViewText() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this.messageBodyTextView::setText); this.viewModel.outputs.participantAvatarUrl() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::setParticipantAvatarImageView); this.viewModel.outputs.participantNameTextViewText() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this.participantNameTextView::setText); this.viewModel.outputs.startMessagesActivity() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::startMessagesActivity); this.viewModel.outputs.unreadIndicatorImageViewHidden() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.unreadIndicatorImageView)); } @Override public void bindData(final @Nullable Object data) throws Exception { final MessageThread messageThread = requireNonNull((MessageThread) data); this.viewModel.inputs.configureWith(messageThread); } private void setDateTextView(final @NonNull DateTime date) { this.dateTextView.setText(DateTimeUtils.relative(context(), ksString, date)); } private void setParticipantAvatarImageView(final @NonNull String avatarUrl) { Picasso.with(context()).load(avatarUrl) .transform(new CircleTransformation()) .into(this.participantAvatarImageView); } private void startMessagesActivity(final @NonNull MessageThread messageThread) { final Context context = context(); final Intent intent = new Intent(context, MessagesActivity.class) .putExtra(IntentKey.MESSAGE_THREAD, messageThread); context.startActivity(intent); } }