package com.kickstarter.viewmodels; import android.support.annotation.NonNull; import com.kickstarter.libs.ActivityViewModel; import com.kickstarter.libs.Environment; import com.kickstarter.models.Message; import com.kickstarter.models.MessageThread; import com.kickstarter.models.User; import com.kickstarter.ui.viewholders.MessageThreadViewHolder; import org.joda.time.DateTime; import rx.Observable; import rx.subjects.PublishSubject; import static com.kickstarter.libs.rx.transformers.Transformers.takeWhen; public interface MessageThreadHolderViewModel { interface Inputs { /** Call to configure with a MessageThread. */ void configureWith(MessageThread messageThread); /** Call when the the message thread card view has been clicked. */ void messageThreadCardViewClicked(); } interface Outputs { /** Emits the date to display. */ Observable<DateTime> dateDateTime(); /** Emits the message body to display. */ Observable<String> messageBodyTextViewText(); /** Emits the participant's avatar url to display. */ Observable<String> participantAvatarUrl(); /** Emits the participant name to display. */ Observable<String> participantNameTextViewText(); /** Emits when we want to start the {@link com.kickstarter.ui.activities.MessagesActivity}. */ Observable<MessageThread> startMessagesActivity(); /** Emits a boolean to determine if the unread indicator should be hidden. */ Observable<Boolean> unreadIndicatorImageViewHidden(); } final class ViewModel extends ActivityViewModel<MessageThreadViewHolder> implements Inputs, Outputs { public ViewModel(final @NonNull Environment environment) { super(environment); final Observable<Message> lastMessage = this.messageThread.map(MessageThread::lastMessage); final Observable<User> participant = this.messageThread.map(MessageThread::participant); this.dateDateTime = lastMessage.map(Message::createdAt); this.messageBodyTextViewText = lastMessage.map(Message::body); this.participantAvatarUrl = participant.map(p -> p.avatar().medium()); this.participantNameTextViewText = participant.map(User::name); this.startMessagesActivity = this.messageThread.compose(takeWhen(this.messageThreadCardViewClicked)); this.unreadIndicatorImageViewHidden = this.messageThread.map(m -> m.unreadMessagesCount() == 0); } private final PublishSubject<MessageThread> messageThread = PublishSubject.create(); private final PublishSubject<Void> messageThreadCardViewClicked = PublishSubject.create(); private final Observable<DateTime> dateDateTime; private final Observable<String> messageBodyTextViewText; private final Observable<String> participantAvatarUrl; private final Observable<String> participantNameTextViewText; private final Observable<MessageThread> startMessagesActivity; private final Observable<Boolean> unreadIndicatorImageViewHidden; public final Inputs inputs = this; public final Outputs outputs = this; @Override public void configureWith(final @NonNull MessageThread messageThread) { this.messageThread.onNext(messageThread); } @Override public void messageThreadCardViewClicked() { this.messageThreadCardViewClicked.onNext(null); } @Override public @NonNull Observable<DateTime> dateDateTime() { return this.dateDateTime; } @Override public @NonNull Observable<String> messageBodyTextViewText() { return this.messageBodyTextViewText; } @Override public @NonNull Observable<String> participantAvatarUrl() { return this.participantAvatarUrl; } @Override public @NonNull Observable<String> participantNameTextViewText() { return this.participantNameTextViewText; } @Override public @NonNull Observable<MessageThread> startMessagesActivity() { return this.startMessagesActivity; } @Override public @NonNull Observable<Boolean> unreadIndicatorImageViewHidden() { return this.unreadIndicatorImageViewHidden; } } }