Mercury-IM/domain/src/main/java/org/mercury_im/messenger/core/viewmodel/chat/ChatViewModel.java

111 lines
4.4 KiB
Java
Raw Normal View History

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;
import io.reactivex.functions.Function;
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();
@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) {
contactRepository.getOrCreatePeer(accountId, contactJid)
.flatMapObservable(contactRepository::observePeer)
.subscribe(peer);
peer.compose(schedulers.executeUiSafeObservable())
.subscribe();
2020-07-13 18:49:29 +02:00
peer.filter(Optional::isPresent).map(Optional::getItem)
.flatMap(p -> directChatRepository.getOrCreateChatWithPeer(p).toObservable())
.subscribe(chat);
2020-07-13 18:49:29 +02:00
chat.compose(schedulers.executeUiSafeObservable()).subscribe();
Observable<List<Message>> allMessagesObservable = chat.flatMap(messageRepository::observeMessages);
2020-07-13 20:50:44 +02:00
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()) {
messageQueryObservable.onNext(chat.flatMap(messageRepository::observeMessages));
2020-07-13 01:39:26 +02:00
} else {
messageQueryObservable.onNext(chat.flatMap(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) {
addDisposable(messenger.getMessageConsignor(chat.getValue())
.sendTextMessage(chat.getValue(), body)
.compose(schedulers.executeUiSafeSingle())
.subscribe(messageId -> LOGGER.log(Level.INFO, "Successfully sent message."),
e -> LOGGER.log(Level.WARNING, "Error sending message.", e)));
2020-07-13 18:49:29 +02:00
}
2020-06-09 21:52:53 +02:00
}