From d4de49e25b6f61c09ee16e768b6fa4e717556ed6 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Dec 2019 00:37:35 +0100 Subject: [PATCH] Remove Contact classes in favor of extended Peer logic --- .../messenger/ui/chat/ChatViewModel.java | 4 +- .../contacts/ContactListItemViewModel.java | 4 +- .../roster/contacts/ContactListViewModel.java | 4 +- .../messenger/data/di/MappingModule.java | 7 -- .../messenger/data/di/RepositoryModule.java | 8 +- .../data/mapping/ContactMapping.java | 32 -------- .../messenger/data/mapping/PeerMapping.java | 75 +++++++++++++++++++ .../data/model/AbstractContactModel.java | 45 ----------- .../data/model/AbstractPeerModel.java | 19 ++++- .../repository/XmppContactRepository.java | 75 ------------------- .../data/repository/XmppPeerRepository.java | 75 +++++++++++++++++++ .../repository/AccountRepositoryTest.java | 2 +- .../org/mercury_im/messenger/DataStore.java | 22 ++++++ .../org/mercury_im/messenger/Messenger.java | 1 - .../data/repository/ContactRepository.java | 32 -------- .../data/repository/PeerRepository.java | 32 ++++++++ .../messenger/entity/contact/Contact.java | 40 ---------- .../messenger/entity/contact/IContact.java | 62 --------------- .../messenger/entity/contact/IPeer.java | 17 +++++ .../messenger/entity/contact/Peer.java | 6 ++ .../entity/contact/SubscriptionMode.java | 52 +++++++++++++ .../domain/xmpp/XmppDirectMessageCenter.java | 22 +++++- 22 files changed, 327 insertions(+), 309 deletions(-) delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/DataStore.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 45f2851..17066fe 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -11,7 +11,7 @@ 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.data.repository.XmppContactRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; import java.util.List; @@ -29,7 +29,7 @@ public class ChatViewModel extends ViewModel { MessageRepository messageRepository; @Inject - XmppContactRepository xmppContactRepository; + XmppPeerRepository xmppContactRepository; @Inject ChatRepository chatRepository; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java index 73f9e88..baa12ad 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java @@ -7,14 +7,14 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.data.repository.XmppContactRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; import javax.inject.Inject; public class ContactListItemViewModel extends AndroidViewModel { @Inject - XmppContactRepository contactRepository; + XmppPeerRepository contactRepository; private LiveData contact; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index 9192f04..1c04349 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -8,7 +8,7 @@ import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.data.repository.XmppContactRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; import java.util.List; @@ -22,7 +22,7 @@ import io.reactivex.schedulers.Schedulers; public class ContactListViewModel extends ViewModel { @Inject - XmppContactRepository xmppContactRepository; + XmppPeerRepository xmppContactRepository; private final MutableLiveData> rosterEntryList = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java index 4c949b9..c9086b1 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java @@ -1,7 +1,6 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.mapping.AccountMapping; -import org.mercury_im.messenger.data.mapping.ContactMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.mapping.MessageContentMapping; @@ -29,12 +28,6 @@ public class MappingModule { return new PeerMapping(provideAccountMapping()); } - @Provides - @Singleton - static ContactMapping provideContactMapping() { - return new ContactMapping(provideAccountMapping()); - } - @Provides @Singleton static DirectChatMapping provideDirectChatMapping() { diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index fb55e72..fbd9572 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -1,12 +1,12 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.repository.AccountRepository; -import org.mercury_im.messenger.data.repository.ContactRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; import org.mercury_im.messenger.data.repository.EntityCapsRepository; import org.mercury_im.messenger.data.repository.XmppAccountRepository; import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; -import org.mercury_im.messenger.data.repository.XmppContactRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Named; @@ -50,10 +50,10 @@ public class RepositoryModule { @Provides @Singleton - public static ContactRepository provideRosterRepository( + public static PeerRepository provideRosterRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppContactRepository(data, ioScheduler, uiScheduler); + return new XmppPeerRepository(data, ioScheduler, uiScheduler); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java deleted file mode 100644 index d9acd1b..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.mercury_im.messenger.data.mapping; - -import org.mercury_im.messenger.data.model.ContactModel; -import org.mercury_im.messenger.entity.contact.Contact; - -import javax.inject.Inject; - -public class ContactMapping implements Mapping { - - private final AccountMapping accountMapping; - - @Inject - public ContactMapping(AccountMapping accountMapping) { - this.accountMapping = accountMapping; - } - - @Override - public ContactModel entityToModel(Contact entity, ContactModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new ContactModel(); - } - return null; - } - - @Override - public Contact modelToEntity(ContactModel model, Contact entity) { - return null; - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java index 8118a84..b25bcdd 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -1,5 +1,6 @@ package org.mercury_im.messenger.data.mapping; +import org.mercury_im.messenger.data.enums.SubscriptionDirection; import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; @@ -25,6 +26,10 @@ public class PeerMapping implements Mapping { } model.setAccount(accountMapping.entityToModel(entity.getAccount(), model.getAccount())); model.setAddress(entity.getAddress()); + model.setName(entity.getName()); + + // TODO: sub direction + return model; } @@ -39,6 +44,76 @@ public class PeerMapping implements Mapping { entity.setAccount(accountMapping.modelToEntity(model.getAccount(), entity.getAccount())); entity.setAddress(model.getAddress()); entity.setId(model.getId()); + + // TODO: Sub direction return entity; } + + private void setSubscriptionDirectionInModel(PeerModel model, Peer entity) { + switch (entity.getSubscriptionMode()) { + case NONE: + model.setSubscriptionDirection(SubscriptionDirection.none); + model.setSubscriptionPreApproved(false); + model.setSubscriptionPending(false); + break; + + case NONE_PREAPPROVED: + model.setSubscriptionDirection(SubscriptionDirection.none); + model.setSubscriptionPreApproved(true); + model.setSubscriptionPending(false); + break; + + case TO_THEM_PENDING: + model.setSubscriptionDirection(SubscriptionDirection.to); + model.setSubscriptionPending(true); + model.setSubscriptionPreApproved(false); + break; + case TO_THEM_PENDING_PREAPPROVED: + model.setSubscriptionDirection(SubscriptionDirection.to); + model.setSubscriptionPending(true); + model.setSubscriptionPreApproved(true); + break; + case TO_THEM_ACCEPTED: + model.setSubscriptionDirection(SubscriptionDirection.to); + model.setSubscriptionPending(false); + model.setSubscriptionPreApproved(false); + break; + case TO_THEM_ACCEPTED_PREAPPROVED: + model.setSubscriptionDirection(SubscriptionDirection.to); + model.setSubscriptionPending(false); + model.setSubscriptionPreApproved(true); + break; + case FROM_THEM_PENDING: + model.setSubscriptionDirection(SubscriptionDirection.from); + model.setSubscriptionPending(true); + model.setSubscriptionPreApproved(false); + break; + case FROM_THEM_ACCEPTED: + model.setSubscriptionDirection(SubscriptionDirection.from); + model.setSubscriptionPending(false); + model.setSubscriptionPreApproved(false); + break; + case BIDIRECTIONAL: + model.setSubscriptionDirection(SubscriptionDirection.both); + model.setSubscriptionPending(false); + model.setSubscriptionPreApproved(false); + break; + } + } + + private void setSubscriptionDirectionInEntity(Peer entity, PeerModel model) { + + switch (model.getSubscriptionDirection()) { + case none: + break; + case to: + break; + case from: + break; + case both: + break; + case remove: + break; + } + } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java deleted file mode 100644 index 352350d..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.mercury_im.messenger.data.model; - -import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; -import org.mercury_im.messenger.data.enums.SubscriptionDirection; - -import io.requery.Convert; -import io.requery.Entity; -import io.requery.ForeignKey; -import io.requery.Generated; -import io.requery.Key; -import io.requery.OneToOne; -import io.requery.Persistable; -import io.requery.Table; - -@Entity -@Table(name = "contacts") -public abstract class AbstractContactModel implements Persistable { - - @Key - @Generated - long id; - - @OneToOne - @ForeignKey(referencedColumn = "id") - PeerModel entity; - - String rostername; - - @Convert(SubscriptionDirectionConverter.class) - SubscriptionDirection sub_direction; - - boolean sub_pending; - - boolean sub_approved; - - @Override - public String toString() { - return "Contact[" + id + ", " + - rostername + ", " + - entity + ", " + - sub_direction + ", " + - (sub_pending ? "pending" : "not pending") + ", " + - (sub_approved ? "approved" : "not approved") + "]"; - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index b445601..12b82fb 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -1,6 +1,10 @@ package org.mercury_im.messenger.data.model; +import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; +import org.mercury_im.messenger.data.enums.SubscriptionDirection; + import io.requery.Column; +import io.requery.Convert; import io.requery.Entity; import io.requery.ForeignKey; import io.requery.Generated; @@ -10,7 +14,7 @@ import io.requery.Persistable; import io.requery.Table; @Entity -@Table(name = "peers") +@Table(name = "contacts") public abstract class AbstractPeerModel implements Persistable { @Key @Generated @@ -23,9 +27,20 @@ public abstract class AbstractPeerModel implements Persistable { @Column(nullable = false) String address; + @Column + String name; + + @Convert(SubscriptionDirectionConverter.class) + SubscriptionDirection subscriptionDirection; + + boolean subscriptionPending; + + boolean subscriptionPreApproved; + @Override public String toString() { - return "Entity[" + id + ", " + + return "Peer[" + id + ", " + + name + ", " + address + ", " + account + "]"; } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java deleted file mode 100644 index 8bf876b..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.mercury_im.messenger.data.repository; - -import org.mercury_im.messenger.data.util.Optional; -import org.mercury_im.messenger.entity.contact.Contact; -import org.mercury_im.messenger.util.ThreadUtils; - -import java.util.List; - -import javax.inject.Inject; -import javax.inject.Named; - -import io.reactivex.Completable; -import io.reactivex.Maybe; -import io.reactivex.Observable; -import io.reactivex.Scheduler; -import io.reactivex.Single; -import io.requery.Persistable; -import io.requery.reactivex.ReactiveEntityStore; - -public class XmppContactRepository - extends RequeryRepository - implements ContactRepository { - - @Inject - public XmppContactRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { - super(data, subscriberScheduler, observerScheduler); - } - - @Override - public Single insertContact(Contact contact) { - return null; - } - - @Override - public Observable> observeContact(long contactId) { - return null; - } - - @Override - public Maybe getContact(long contactId) { - return null; - } - - @Override - public Observable> observeContactByAddress(String address) { - return null; - } - - @Override - public Maybe getContactByAddress(String address) { - return null; - } - - @Override - public Observable> observeAllContacts() { - return null; - } - - @Override - public Single updateContact(Contact contact) { - return null; - } - - @Override - public Single upsertContact(Contact contact) { - return null; - } - - @Override - public Completable deleteContact(Contact contact) { - return null; - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java new file mode 100644 index 0000000..cae0e87 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -0,0 +1,75 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.util.ThreadUtils; + +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +public class XmppPeerRepository + extends RequeryRepository + implements PeerRepository { + + @Inject + public XmppPeerRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + super(data, subscriberScheduler, observerScheduler); + } + + @Override + public Single insertPeer(Peer contact) { + return null; + } + + @Override + public Observable> observePeer(long contactId) { + return null; + } + + @Override + public Maybe getPeer(long contactId) { + return null; + } + + @Override + public Observable> observePeerByAddress(String address) { + return null; + } + + @Override + public Maybe getPeerByAddress(String address) { + return null; + } + + @Override + public Observable> observeAllPeers() { + return null; + } + + @Override + public Single updatePeer(Peer contact) { + return null; + } + + @Override + public Single upsertPeer(Peer contact) { + return null; + } + + @Override + public Completable deletePeer(Peer contact) { + return null; + } +} diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 3747d35..8611389 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -30,7 +30,7 @@ public class AccountRepositoryTest { XmppDirectChatRepository directChatRepository; @Inject - XmppContactRepository contactRepository; + XmppPeerRepository contactRepository; @Inject public AccountRepositoryTest() { diff --git a/domain/src/main/java/org/mercury_im/messenger/DataStore.java b/domain/src/main/java/org/mercury_im/messenger/DataStore.java new file mode 100644 index 0000000..9a1bd6f --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/DataStore.java @@ -0,0 +1,22 @@ +package org.mercury_im.messenger; + +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.Peer; + +import javax.inject.Inject; + +public class DataStore { + + @Inject + PeerRepository peerRepository; + + @Inject + public DataStore() { + + } + + public Peer getPeer(Account account, String address) { + return null; + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index a6753e7..427a156 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -17,5 +17,4 @@ public class Messenger { public ConnectionMethod getConnection(Account account) { return connections.get(account.getId()); } - } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java deleted file mode 100644 index 9681eeb..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.mercury_im.messenger.data.repository; - -import org.mercury_im.messenger.entity.contact.Contact; -import org.mercury_im.messenger.data.util.Optional; - -import java.util.List; - -import io.reactivex.Completable; -import io.reactivex.Maybe; -import io.reactivex.Observable; -import io.reactivex.Single; - -public interface ContactRepository { - - Single insertContact(Contact contact); - - Observable> observeContact(long contactId); - - Maybe getContact(long contactId); - - Observable> observeContactByAddress(String address); - - Maybe getContactByAddress(String address); - - Observable> observeAllContacts(); - - Single updateContact(Contact contact); - - Single upsertContact(Contact contact); - - Completable deleteContact(Contact contact); -} diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java new file mode 100644 index 0000000..7d422e3 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java @@ -0,0 +1,32 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.data.util.Optional; + +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Single; + +public interface PeerRepository { + + Single insertPeer(Peer Peer); + + Observable> observePeer(long PeerId); + + Maybe getPeer(long PeerId); + + Observable> observePeerByAddress(String address); + + Maybe getPeerByAddress(String address); + + Observable> observeAllPeers(); + + Single updatePeer(Peer Peer); + + Single upsertPeer(Peer Peer); + + Completable deletePeer(Peer Peer); +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java deleted file mode 100644 index 86968b8..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.mercury_im.messenger.entity.contact; - -public interface Contact extends Peer { - - SubscriptionMode getSubscriptionMode(); - - void setSubscriptionMode(SubscriptionMode mode); - - enum SubscriptionMode { - /** - * No subscription between us an them. - */ - NONE, - - /** - * We sent a subscription request, which is now pending to be accepted. - */ - TO_THEM_PENDING, - - /** - * We sent a subscription request and they accepted it. - */ - TO_THEM_ACCEPTED, - - /** - * They sent us a subscription request, but we did not yet accept it. - */ - FROM_THEM_PENDING, - - /** - * They sent us a subscription request and we accepted it. - */ - FROM_THEM_ACCEPTED, - - /** - * They accepted us and we accepted them. - */ - BIDIRECTIONAL - } -} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java deleted file mode 100644 index 6f9c449..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.mercury_im.messenger.entity.contact; - -import org.mercury_im.messenger.entity.Account; - -public class IContact implements Contact { - - protected long id; - protected Account account; - protected String address; - protected String name; - protected SubscriptionMode subscriptionMode; - - @Override - public SubscriptionMode getSubscriptionMode() { - return subscriptionMode; - } - - @Override - public void setSubscriptionMode(SubscriptionMode mode) { - this.subscriptionMode = mode; - } - - @Override - public long getId() { - return id; - } - - @Override - public void setId(long id) { - this.id = id; - } - - @Override - public Account getAccount() { - return account; - } - - @Override - public void setAccount(Account account) { - this.account = account; - } - - @Override - public String getAddress() { - return address; - } - - @Override - public void setAddress(String address) { - this.address = address; - } - - @Override - public String getName() { - return name; - } - - @Override - public void setName(String name) { - this.name = name; - } -} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java index 389236a..f461042 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java @@ -8,6 +8,7 @@ public class IPeer implements Peer { protected Account account; protected String address; protected String name; + protected SubscriptionMode subscriptionMode; @Override public long getId() { @@ -48,4 +49,20 @@ public class IPeer implements Peer { public void setName(String name) { this.name = name; } + + @Override + public SubscriptionMode getSubscriptionMode() { + return subscriptionMode; + } + + @Override + public void setSubscriptionMode(SubscriptionMode mode) { + this.subscriptionMode = mode; + } + + @Override + public boolean isContact() { + return subscriptionMode != SubscriptionMode.NONE + && subscriptionMode != SubscriptionMode.FROM_THEM_PENDING; + } } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java index 1b1b7e7..c0ea28a 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java @@ -23,4 +23,10 @@ public interface Peer { String getName(); void setName(String name); + + SubscriptionMode getSubscriptionMode(); + + void setSubscriptionMode(SubscriptionMode mode); + + boolean isContact(); } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java new file mode 100644 index 0000000..9eb1f2c --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java @@ -0,0 +1,52 @@ +package org.mercury_im.messenger.entity.contact; + +public enum SubscriptionMode { + /** + * No subscription between us an them. + */ + NONE, + + /** + * No subscription between us and them. + * However, we pre-approved their subscription, should they decide to subscribe to us. + */ + NONE_PREAPPROVED, + + /** + * We sent a subscription request, which is now pending to be accepted. + * We do not pre-approve their subscription to us. + */ + TO_THEM_PENDING, + + /** + * We sent a subscription request, which is now pending to be accepted. + * Also, we pre-approved their subscription to us. + */ + TO_THEM_PENDING_PREAPPROVED, + + /** + * We sent a subscription request and they approved it. + */ + TO_THEM_ACCEPTED, + + /** + * We sent a subscription request and they approved it. + * Also, we pre-approved their subscription, should they decide to subscribe back. + */ + TO_THEM_ACCEPTED_PREAPPROVED, + + /** + * They sent us a subscription request, but we did not yet accept it. + */ + FROM_THEM_PENDING, + + /** + * They sent us a subscription request and we accepted it. + */ + FROM_THEM_ACCEPTED, + + /** + * They accepted us and we accepted them. + */ + BIDIRECTIONAL +} diff --git a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java index b0ecd30..abaa683 100644 --- a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java @@ -1,26 +1,44 @@ package org.mercury_im.messenger.domain.xmpp; +import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.chat2.Chat; import org.jivesoftware.smack.chat2.ChatManager; +import org.jivesoftware.smack.chat2.IncomingChatMessageListener; import org.jivesoftware.smackx.sid.element.OriginIdElement; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.MessageCenter; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.transport.xmpp.XmppTcpConnectionMethod; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + import io.reactivex.Completable; +import sun.reflect.generics.tree.Tree; public class XmppDirectMessageCenter implements MessageCenter { private final Messenger messenger; + private final Account account; - public XmppDirectMessageCenter(Messenger messenger) { + private Set messageListeners = new LinkedHashSet<>(); + + public XmppDirectMessageCenter(Account account, Messenger messenger) { this.messenger = messenger; + this.account = account; + XMPPConnection connection = ((XmppTcpConnectionMethod) getMessenger() + .getConnection(account)).getConnection(); + } @Override @@ -52,7 +70,7 @@ public class XmppDirectMessageCenter @Override public void addIncomingMessageListener(IncomingDirectMessageListener listener) { - + messageListeners.add(listener); } protected ChatManager getChatManager(DirectChat chat) {