2020-06-09 21:52:53 +02:00
|
|
|
package org.mercury_im.messenger.core.viewmodel.chat;
|
|
|
|
|
2020-07-13 18:49:29 +02:00
|
|
|
import org.jxmpp.jid.EntityBareJid;
|
2020-06-11 16:04:06 +02:00
|
|
|
import org.mercury_im.messenger.core.Messenger;
|
2020-06-09 21:52:53 +02:00
|
|
|
import org.mercury_im.messenger.core.SchedulersFacade;
|
2020-07-13 18:49:29 +02:00
|
|
|
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;
|
2020-07-13 01:39:26 +02:00
|
|
|
import org.mercury_im.messenger.core.util.Optional;
|
2020-06-09 21:52:53 +02:00
|
|
|
import org.mercury_im.messenger.core.viewmodel.MercuryViewModel;
|
2020-06-11 16:04:06 +02: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;
|
2020-06-09 21:52:53 +02:00
|
|
|
|
2020-06-11 16:04:06 +02:00
|
|
|
import java.util.List;
|
2020-07-13 18:49:29 +02:00
|
|
|
import java.util.UUID;
|
|
|
|
import java.util.logging.Level;
|
|
|
|
import java.util.logging.Logger;
|
2020-06-11 16:04:06 +02:00
|
|
|
|
|
|
|
import io.reactivex.Observable;
|
2020-07-13 20:50:44 +02:00
|
|
|
import io.reactivex.Single;
|
2020-07-13 01:39:26 +02:00
|
|
|
import io.reactivex.subjects.BehaviorSubject;
|
2020-06-11 16:04:06 +02:00
|
|
|
import lombok.Getter;
|
2020-06-09 21:52:53 +02:00
|
|
|
|
|
|
|
public class ChatViewModel implements MercuryViewModel {
|
|
|
|
|
2020-07-13 18:49:29 +02:00
|
|
|
private static final Logger LOGGER = Logger.getLogger(ChatViewModel.class.getName());
|
|
|
|
|
2020-06-11 16:04:06 +02:00
|
|
|
private final Messenger messenger;
|
2020-07-13 18:49:29 +02:00
|
|
|
private final PeerRepository contactRepository;
|
|
|
|
private final DirectChatRepository directChatRepository;
|
|
|
|
private final MessageRepository messageRepository;
|
2020-06-09 21:52:53 +02:00
|
|
|
private final SchedulersFacade schedulers;
|
|
|
|
|
2020-06-11 16:04:06 +02:00
|
|
|
@Getter
|
2020-07-13 20:50:44 +02:00
|
|
|
private BehaviorSubject<Optional<Peer>> peer = BehaviorSubject.create();
|
|
|
|
|
2020-07-13 22:16:13 +02:00
|
|
|
private Single<DirectChat> directChat;
|
2020-07-13 20:50:44 +02:00
|
|
|
|
|
|
|
@Getter
|
|
|
|
private BehaviorSubject<DirectChat> chat = BehaviorSubject.create();
|
2020-06-11 16:04:06 +02:00
|
|
|
|
|
|
|
@Getter
|
|
|
|
private Observable<List<Message>> messages;
|
|
|
|
|
|
|
|
@Getter
|
|
|
|
private Observable<String> contactDisplayName;
|
|
|
|
|
2020-07-13 01:39:26 +02:00
|
|
|
private final BehaviorSubject<Observable<List<Message>>> messageQueryObservable = BehaviorSubject.create();
|
|
|
|
|
2020-06-11 16:04:06 +02:00
|
|
|
|
|
|
|
public ChatViewModel(Messenger messenger,
|
2020-07-13 18:49:29 +02:00
|
|
|
PeerRepository peerRepository,
|
|
|
|
DirectChatRepository directChatRepository,
|
|
|
|
MessageRepository messageRepository,
|
2020-07-13 01:39:26 +02:00
|
|
|
SchedulersFacade schedulers) {
|
2020-06-11 16:04:06 +02:00
|
|
|
this.messenger = messenger;
|
2020-07-13 18:49:29 +02:00
|
|
|
this.contactRepository = peerRepository;
|
|
|
|
this.directChatRepository = directChatRepository;
|
|
|
|
this.messageRepository = messageRepository;
|
2020-06-09 21:52:53 +02:00
|
|
|
this.schedulers = schedulers;
|
2020-07-13 01:39:26 +02:00
|
|
|
}
|
2020-06-11 16:04:06 +02:00
|
|
|
|
2020-07-13 18:49:29 +02:00
|
|
|
public void init(UUID accountId, EntityBareJid contactJid) {
|
2020-07-13 20:50:44 +02:00
|
|
|
Single<Peer> peerSingle = contactRepository.getOrCreatePeer(accountId, contactJid);
|
|
|
|
peerSingle.flatMapObservable(contactRepository::observePeer).subscribe(peer);
|
|
|
|
directChat = peerSingle.flatMap(directChatRepository::getOrCreateChatWithPeer);
|
2020-07-13 18:49:29 +02:00
|
|
|
|
2020-07-13 20:50:44 +02:00
|
|
|
directChat.toObservable().compose(schedulers.executeUiSafeObservable()).subscribe(chat);
|
2020-07-13 18:49:29 +02:00
|
|
|
|
2020-07-13 20:50:44 +02:00
|
|
|
Observable<List<Message>> allMessagesObservable = directChat.flatMapObservable(messageRepository::observeMessages);
|
|
|
|
messageQueryObservable.onNext(allMessagesObservable);
|
2020-07-13 01:39:26 +02:00
|
|
|
messages = Observable.switchOnNext(messageQueryObservable);
|
2020-07-13 20:50:44 +02:00
|
|
|
contactDisplayName = peer.filter(Optional::isPresent).map(Optional::getItem)
|
|
|
|
.map(Peer::getDisplayName);
|
2020-06-11 16:04:06 +02:00
|
|
|
}
|
|
|
|
|
2020-07-13 01:39:26 +02:00
|
|
|
public void onQueryTextChanged(String query) {
|
|
|
|
if (query.trim().isEmpty()) {
|
2020-07-13 20:50:44 +02:00
|
|
|
messageQueryObservable.onNext(directChat.flatMapObservable(messageRepository::observeMessages));
|
2020-07-13 01:39:26 +02:00
|
|
|
} else {
|
2020-07-13 20:50:44 +02:00
|
|
|
messageQueryObservable.onNext(directChat.flatMapObservable(c -> messageRepository.findMessagesWithBody(c, query)));
|
2020-07-13 01:39:26 +02:00
|
|
|
}
|
2020-06-09 21:52:53 +02:00
|
|
|
}
|
2020-07-13 18:49:29 +02:00
|
|
|
|
|
|
|
public void deleteContact() {
|
|
|
|
addDisposable(peer.single(new Optional<>())
|
|
|
|
.filter(Optional::isPresent)
|
|
|
|
.map(Optional::getItem)
|
|
|
|
.flatMapCompletable(messenger::deleteContact)
|
|
|
|
.compose(schedulers.executeUiSafeCompletable())
|
|
|
|
.subscribe(
|
|
|
|
() -> LOGGER.log(Level.INFO, "Contact deleted."),
|
|
|
|
e -> LOGGER.log(Level.SEVERE, "Error deleting contact.", e)));
|
|
|
|
}
|
|
|
|
|
|
|
|
public void sendMessage(String body) {
|
2020-07-13 20:50:44 +02:00
|
|
|
addDisposable(messenger.sendEncryptedMessage(peer.getValue().getItem(), body)
|
2020-07-13 18:49:29 +02:00
|
|
|
.compose(schedulers.executeUiSafeCompletable())
|
|
|
|
.subscribe(() -> LOGGER.log(Level.INFO, "Successfully sent encrypted message."),
|
|
|
|
e -> LOGGER.log(Level.SEVERE, "Error sending encrypted message.", e)));
|
|
|
|
}
|
2020-06-09 21:52:53 +02:00
|
|
|
}
|