package org.mercury_im.messenger.core.viewmodel.chat; import org.mercury_im.messenger.core.Messenger; import org.mercury_im.messenger.core.SchedulersFacade; import org.mercury_im.messenger.core.data.repository.Repositories; import org.mercury_im.messenger.core.util.Optional; import org.mercury_im.messenger.core.viewmodel.MercuryViewModel; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.message.Message; import java.util.List; import io.reactivex.Observable; import io.reactivex.subjects.BehaviorSubject; import lombok.Getter; public class ChatViewModel implements MercuryViewModel { private final Messenger messenger; private final Repositories repositories; private final SchedulersFacade schedulers; private DirectChat chat; @Getter private Observable peer; @Getter private Observable> messages; @Getter private Observable contactDisplayName; private final BehaviorSubject>> messageQueryObservable = BehaviorSubject.create(); public ChatViewModel(Messenger messenger, Repositories repositories, SchedulersFacade schedulers) { this.messenger = messenger; this.repositories = repositories; this.schedulers = schedulers; } public void init(DirectChat directChat) { this.chat = directChat; //peer = repositories.getPeerRepository().observePeer(chat.getPeer()); messageQueryObservable.onNext(repositories.getMessageRepository().observeMessages(chat)); messages = Observable.switchOnNext(messageQueryObservable); peer = repositories.getPeerRepository().observePeer(chat.getPeer().getId()) .filter(Optional::isPresent).map(Optional::getItem); contactDisplayName = repositories.getPeerRepository().observePeer(chat.getPeer()) .map(optional -> optional.isPresent() ? optional.getItem().getDisplayName() : "DELETED"); } public void onQueryTextChanged(String query) { if (query.trim().isEmpty()) { messageQueryObservable.onNext(repositories.getMessageRepository().observeMessages(chat)); } else { messageQueryObservable.onNext(repositories.getMessageRepository().findMessagesWithBody(chat, query)); } } }