package com.kickstarter.ui.viewholders; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.CardView; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.kickstarter.R; import com.kickstarter.libs.transformations.CircleTransformation; import com.kickstarter.libs.utils.ObjectUtils; import com.kickstarter.libs.utils.ViewUtils; import com.kickstarter.models.Message; import com.kickstarter.viewmodels.MessageHolderViewModel; import com.squareup.picasso.Picasso; import butterknife.Bind; import butterknife.ButterKnife; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; public final class MessageViewHolder extends KSViewHolder { private final MessageHolderViewModel.ViewModel viewModel; protected @Bind(R.id.message_body_card_view) CardView messageBodyCardView; protected @Bind(R.id.message_body_text_view) TextView messageBodyTextView; protected @Bind(R.id.sender_avatar_image_view) ImageView participantAvatarImageView; public MessageViewHolder(final @NonNull View view) { super(view); this.viewModel = new MessageHolderViewModel.ViewModel(environment()); ButterKnife.bind(this, view); this.viewModel.outputs.participantAvatarImageHidden() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.participantAvatarImageView)); this.viewModel.outputs.participantAvatarImageUrl() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::setParticipantAvatarImageView); this.viewModel.outputs.messageBodyCardViewAlignParentEnd() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::alignMessageBodyCardView); this.viewModel.outputs.messageBodyTextViewBackgroundColorInt() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(colorInt -> this.messageBodyTextView.setBackgroundColor(ContextCompat.getColor(this.context(), colorInt)) ); this.viewModel.outputs.messageBodyTextViewText() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this.messageBodyTextView::setText); this.viewModel.outputs.messageBodyTextViewTextColorInt() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(colorInt -> this.messageBodyTextView.setTextColor(ContextCompat.getColor(this.context(), colorInt)) ); } @Override public void bindData(final @Nullable Object data) throws Exception { final Message message = ObjectUtils.requireNonNull((Message) data); this.viewModel.inputs.configureWith(message); } private void alignMessageBodyCardView(final boolean alignParentEnd) { final RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) this.messageBodyCardView.getLayoutParams(); layoutParams.addRule(alignParentEnd ? RelativeLayout.ALIGN_PARENT_END : RelativeLayout.ALIGN_PARENT_START); layoutParams.addRule(alignParentEnd ? RelativeLayout.ALIGN_PARENT_RIGHT : RelativeLayout.ALIGN_PARENT_LEFT); this.messageBodyCardView.setLayoutParams(layoutParams); } private void setParticipantAvatarImageView(final @NonNull String avatarUrl) { Picasso.with(this.context()).load(avatarUrl) .transform(new CircleTransformation()) .into(this.participantAvatarImageView); } }