package org.mercury_im.messenger.ui.chat; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.core.centers.ConnectionCenter; import org.mercury_im.messenger.xmpp.model.ChatModel; import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.xmpp.model.EntityModel; import org.mercury_im.messenger.xmpp.model.MessageModel; import org.mercury_im.messenger.xmpp.repository.ChatRepository; import org.mercury_im.messenger.xmpp.repository.MessageRepository; import org.mercury_im.messenger.xmpp.repository.RosterRepository; import java.util.List; import javax.inject.Inject; import io.reactivex.Completable; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.functions.Consumer; public class ChatViewModel extends ViewModel { private final CompositeDisposable disposable = new CompositeDisposable(); @Inject MessageRepository messageRepository; @Inject RosterRepository rosterRepository; @Inject ChatRepository chatRepository; @Inject ConnectionCenter connectionCenter; private MutableLiveData entity = new MutableLiveData<>(); private MutableLiveData contact = new MutableLiveData<>(); private MutableLiveData> messages = new MutableLiveData<>(); private MutableLiveData contactDisplayName = new MutableLiveData<>(); private MutableLiveData chat = new MutableLiveData<>(); public ChatViewModel() { super(); MercuryImApplication.getApplication().getAppComponent().inject(this); } public void init(long accountId, EntityBareJid jid) { disposable.add(rosterRepository.getOrCreateEntity(accountId, jid) .subscribe((Consumer) this::init)); } public void init(EntityModel entityModel) { disposable.add(rosterRepository.getContact(entityModel.getAccount().getId(), entityModel.getJid()) .subscribe(reactiveResult -> { ContactModel model = reactiveResult.first(); ChatViewModel.this.contact.setValue(model); contactDisplayName.setValue(model.getRostername()); })); disposable.add(messageRepository.getAllMessagesOfEntity(entityModel) .subscribe(reactiveResult -> { List messages = reactiveResult.toList(); ChatViewModel.this.messages.setValue(messages); })); } @Override protected void onCleared() { super.onCleared(); disposable.clear(); } public LiveData> getMessages() { return messages; } public LiveData getContact() { return contact; } public LiveData getContactDisplayName() { return contactDisplayName; } public void queryTextChanged(String query) { /* if (query.isEmpty()) { disposable.add(messageRepository.getAllMessagesOfChat(accountId, jid) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe((Consumer>) messages -> ChatViewModel.this.messages.setValue(messages))); } disposable.add(messageRepository.findMessageByQuery(accountId, jid, query) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe((Consumer>) o -> { messages.setValue(o); })); */ } public Completable requestMamMessages() { return Completable.fromAction(() -> { ChatModel chatModel = ChatViewModel.this.chat.getValue(); if (chatModel == null) { return; } connectionCenter.requestMamMessagesFor(chatModel); }); } }