2020-06-06 18:45:20 +02:00
|
|
|
package org.mercury_im.messenger.android.ui.chat;
|
2019-04-22 04:54:02 +02:00
|
|
|
|
2019-08-29 00:22:26 +02:00
|
|
|
import androidx.lifecycle.LiveData;
|
|
|
|
import androidx.lifecycle.MutableLiveData;
|
2019-05-18 10:06:16 +02:00
|
|
|
import androidx.lifecycle.ViewModel;
|
2019-04-22 04:54:02 +02:00
|
|
|
|
2019-05-04 00:27:02 +02:00
|
|
|
import org.jxmpp.jid.EntityBareJid;
|
2020-06-06 18:45:20 +02:00
|
|
|
import org.mercury_im.messenger.android.MercuryImApplication;
|
|
|
|
import org.mercury_im.messenger.core.Messenger;
|
|
|
|
import org.mercury_im.messenger.core.data.repository.DirectChatRepository;
|
|
|
|
import org.mercury_im.messenger.core.data.repository.MessageRepository;
|
|
|
|
import org.mercury_im.messenger.core.data.repository.PeerRepository;
|
2019-12-06 15:52:50 +01:00
|
|
|
import org.mercury_im.messenger.entity.chat.DirectChat;
|
|
|
|
import org.mercury_im.messenger.entity.contact.Peer;
|
|
|
|
import org.mercury_im.messenger.entity.message.Message;
|
2019-08-29 00:22:26 +02:00
|
|
|
|
|
|
|
import java.util.List;
|
2019-12-21 16:30:14 +01:00
|
|
|
import java.util.UUID;
|
2020-05-31 22:32:33 +02:00
|
|
|
import java.util.logging.Level;
|
|
|
|
import java.util.logging.Logger;
|
2019-08-29 00:22:26 +02:00
|
|
|
|
|
|
|
import javax.inject.Inject;
|
|
|
|
|
2019-10-28 14:56:56 +01:00
|
|
|
import io.reactivex.Completable;
|
2019-12-21 05:34:19 +01:00
|
|
|
import io.reactivex.Observable;
|
|
|
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
2019-10-28 14:56:56 +01:00
|
|
|
import io.reactivex.disposables.CompositeDisposable;
|
2019-12-21 05:34:19 +01:00
|
|
|
import io.reactivex.schedulers.Schedulers;
|
2019-10-28 14:56:56 +01:00
|
|
|
|
2019-04-22 04:54:02 +02:00
|
|
|
public class ChatViewModel extends ViewModel {
|
2019-05-04 00:27:02 +02:00
|
|
|
|
2019-08-29 00:22:26 +02:00
|
|
|
private final CompositeDisposable disposable = new CompositeDisposable();
|
2020-05-31 22:32:33 +02:00
|
|
|
private static final Logger LOGGER = Logger.getLogger(ChatViewModel.class.getName());
|
2019-08-29 00:22:26 +02:00
|
|
|
|
|
|
|
@Inject
|
2019-12-06 15:52:50 +01:00
|
|
|
PeerRepository contactRepository;
|
2019-08-29 00:22:26 +02:00
|
|
|
|
|
|
|
@Inject
|
2019-12-06 15:52:50 +01:00
|
|
|
DirectChatRepository chatRepository;
|
2019-08-29 00:22:26 +02:00
|
|
|
|
2019-12-07 02:04:31 +01:00
|
|
|
@Inject
|
|
|
|
MessageRepository messageRepository;
|
|
|
|
|
2020-06-04 23:49:03 +02:00
|
|
|
@Inject
|
|
|
|
Messenger messenger;
|
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
private MutableLiveData<Peer> contact = new MutableLiveData<>();
|
|
|
|
private MutableLiveData<List<Message>> messages = new MutableLiveData<>();
|
2019-08-29 00:22:26 +02:00
|
|
|
private MutableLiveData<String> contactDisplayName = new MutableLiveData<>();
|
2019-12-06 15:52:50 +01:00
|
|
|
private MutableLiveData<DirectChat> chat = new MutableLiveData<>();
|
2019-08-29 00:22:26 +02:00
|
|
|
|
|
|
|
public ChatViewModel() {
|
|
|
|
super();
|
|
|
|
MercuryImApplication.getApplication().getAppComponent().inject(this);
|
|
|
|
}
|
|
|
|
|
2019-12-21 16:30:14 +01:00
|
|
|
public void init(UUID accountId, EntityBareJid jid) {
|
2019-12-06 15:52:50 +01:00
|
|
|
disposable.add(contactRepository.getOrCreatePeer(accountId, jid.toString())
|
2020-05-31 22:32:33 +02:00
|
|
|
.flatMap(peer -> chatRepository.getOrCreateChatWithPeer(peer))
|
|
|
|
.subscribe(this::init,
|
|
|
|
error -> LOGGER.log(Level.SEVERE, "Error subscribing to peer data", error)));
|
2019-12-06 15:52:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public void init(DirectChat chat) {
|
|
|
|
this.chat.setValue(chat);
|
2020-06-04 23:49:03 +02:00
|
|
|
this.contact.setValue(chat.getPeer());
|
2019-08-29 00:22:26 +02:00
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
// Subscribe peer
|
|
|
|
disposable.add(contactRepository.observePeer(chat.getPeer().getId())
|
2020-06-04 23:49:03 +02:00
|
|
|
.subscribe(peer -> {
|
|
|
|
if (peer.isPresent()) {
|
|
|
|
contactDisplayName.setValue(peer.getItem().getName());
|
|
|
|
}
|
|
|
|
},
|
2020-05-31 22:32:33 +02:00
|
|
|
error -> LOGGER.log(Level.SEVERE, "Error subscribing display name to peer", error)));
|
2019-09-08 04:47:59 +02:00
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
// Subscribe messages
|
2019-12-07 02:04:31 +01:00
|
|
|
disposable.add(messageRepository.observeMessages(chat)
|
2020-06-05 16:35:16 +02:00
|
|
|
.subscribe(messageList -> {
|
|
|
|
LOGGER.log(Level.INFO, "NEW MESSAGES.");
|
|
|
|
ChatViewModel.this.messages.setValue(messageList);
|
|
|
|
},
|
2020-05-31 22:32:33 +02:00
|
|
|
error -> LOGGER.log(Level.SEVERE, "Error subscribing to messages", error)));
|
2019-08-29 00:22:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onCleared() {
|
|
|
|
super.onCleared();
|
2020-06-05 16:35:16 +02:00
|
|
|
LOGGER.log(Level.INFO, "CLEAR");
|
2019-08-29 00:22:26 +02:00
|
|
|
disposable.clear();
|
|
|
|
}
|
2019-06-06 23:32:41 +02:00
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
public LiveData<List<Message>> getMessages() {
|
2019-08-29 00:22:26 +02:00
|
|
|
return messages;
|
|
|
|
}
|
2019-05-04 00:27:02 +02:00
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
public LiveData<Peer> getContact() {
|
2019-08-29 00:22:26 +02:00
|
|
|
return contact;
|
2019-05-04 00:27:02 +02:00
|
|
|
}
|
|
|
|
|
2019-08-29 00:22:26 +02:00
|
|
|
public LiveData<String> getContactDisplayName() {
|
|
|
|
return contactDisplayName;
|
|
|
|
}
|
2019-08-29 16:06:47 +02:00
|
|
|
|
|
|
|
public void queryTextChanged(String query) {
|
2019-12-21 05:34:19 +01:00
|
|
|
Observable<List<Message>> observable = query.isEmpty() ?
|
|
|
|
messageRepository.observeMessages(chat.getValue()) :
|
|
|
|
messageRepository.findMessagesWithBody(chat.getValue(), query);
|
2019-10-28 14:56:56 +01:00
|
|
|
|
2019-12-21 05:34:19 +01:00
|
|
|
disposable.add(observable.subscribe(messages ->
|
|
|
|
ChatViewModel.this.messages.setValue(messages)));
|
2019-08-29 16:06:47 +02:00
|
|
|
}
|
2019-09-08 04:47:59 +02:00
|
|
|
|
|
|
|
public Completable requestMamMessages() {
|
2019-12-06 15:52:50 +01:00
|
|
|
/*
|
2019-09-11 01:40:32 +02:00
|
|
|
return Completable.fromAction(() -> {
|
|
|
|
ChatModel chatModel = ChatViewModel.this.chat.getValue();
|
|
|
|
if (chatModel == null) {
|
|
|
|
return;
|
2019-09-08 04:47:59 +02:00
|
|
|
}
|
2019-09-11 01:40:32 +02:00
|
|
|
connectionCenter.requestMamMessagesFor(chatModel);
|
2019-09-08 04:47:59 +02:00
|
|
|
});
|
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
*/
|
|
|
|
return null;
|
2019-09-08 04:47:59 +02:00
|
|
|
}
|
2020-06-04 23:49:03 +02:00
|
|
|
|
|
|
|
public void deleteContact() {
|
|
|
|
Peer contact = getContact().getValue();
|
|
|
|
disposable.add(messenger.deleteContact(contact)
|
|
|
|
.subscribeOn(Schedulers.io())
|
|
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
|
|
.subscribe(() -> LOGGER.log(Level.INFO, "Contact deleted."), e -> {
|
|
|
|
LOGGER.log(Level.SEVERE, e.getMessage(), e);
|
|
|
|
}));
|
|
|
|
}
|
2020-06-05 00:22:48 +02:00
|
|
|
|
|
|
|
public void sendMessage(String body) {
|
|
|
|
disposable.add(messenger.sendMessage(getContact().getValue(), body)
|
2020-06-05 16:35:16 +02:00
|
|
|
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe());
|
2020-06-05 00:22:48 +02:00
|
|
|
}
|
2019-04-22 04:54:02 +02:00
|
|
|
}
|