diff --git a/build.gradle b/build.gradle index 2d41731..7f3eb3c 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.1' + classpath 'com.android.tools.build:gradle:3.5.2' // NOTE: Do not place your application dependencies here; they belong diff --git a/core-old/build.gradle b/core-old/build.gradle index 6ecb6fa..c7ecd80 100644 --- a/core-old/build.gradle +++ b/core-old/build.gradle @@ -9,8 +9,7 @@ sourceSets { dependencies { api project(':entity') // Entities - api project(':repository') // Repository - api project(":thread_utils") + api project(':data') // Repository // Smack // Not all of those are needed, but it may be a good idea to define those versions explicitly diff --git a/core/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java b/core/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java deleted file mode 100644 index b642ace..0000000 --- a/core/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.mercury_im.core.usecase; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.chat.DirectChat; -import org.mercury_im.messenger.core.entity.contact.Interlocutor; -import org.mercury_im.messenger.core.entity.message.Message; -import org.mercury_im.messenger.core.entity.message.MessageMetadata; - -public class SendDirectMessage< - M extends Message, - C extends DirectChat, - AD extends Address.UserAddress, - MM extends MessageMetadata, - IL extends Interlocutor, - AC extends Account> { - - private final M message; - private final C chat; - - public SendDirectMessage(M message, C chat) { - this.message = message; - this.chat = chat; - } - - public M getMessage() { - return message; - } - - public C getChat() { - return chat; - } -} diff --git a/core/.gitignore b/data/.gitignore similarity index 100% rename from core/.gitignore rename to data/.gitignore diff --git a/repository/build.gradle b/data/build.gradle similarity index 85% rename from repository/build.gradle rename to data/build.gradle index 295beca..f8d2ebb 100644 --- a/repository/build.gradle +++ b/data/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'java-library' dependencies { api project(":entity") - api project(":thread_utils") // RxJava 2 api "io.reactivex.rxjava2:rxjava:$rxJava2Version" diff --git a/data/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java b/data/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java new file mode 100644 index 0000000..85429cd --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java @@ -0,0 +1,33 @@ +package org.mercury_im.messenger.core.repository; + +import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.core.util.Optional; + +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Single; + +public interface AccountRepository { + + Single insertAccount(Account account); + + Observable> observeAccount(long accountId); + + Maybe getAccount(long accountId); + + Observable> observeAccountByAddress(String address); + + Maybe getAccountByAddress(String address); + + Observable> observeAllAccounts(); + + Single updateAccount(Account account); + + Single upsertAccount(Account account); + + Completable deleteAccount(Account account); + +} diff --git a/data/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java b/data/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java new file mode 100644 index 0000000..19daaf7 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java @@ -0,0 +1,32 @@ +package org.mercury_im.messenger.core.repository; + +import org.mercury_im.messenger.core.entity.contact.Contact; +import org.mercury_im.messenger.core.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/data/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java new file mode 100644 index 0000000..2cca016 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java @@ -0,0 +1,46 @@ +package org.mercury_im.messenger.core.repository; + +import org.mercury_im.messenger.core.entity.chat.DirectChat; +import org.mercury_im.messenger.core.entity.contact.Peer; +import org.mercury_im.messenger.core.entity.message.Message; +import org.mercury_im.messenger.core.util.Optional; + +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Single; + +public interface DirectChatRepository { + + Single insertDirectChat(DirectChat chat); + + Observable> observeDirectChat(long chatId); + + Maybe getDirectChat(long chatId); + + Observable> observeDirectChatByInterlocutor(Peer peer); + + Maybe getDirectChatByInterlocutor(Peer peer); + + Observable> observeAllDirectChats(); + + Single updateDirectChat(DirectChat chat); + + Single upsertDirectChat(DirectChat chat); + + Completable deleteDirectChat(DirectChat chat); + + // Messages + + Single insertMessage(DirectChat chat, Message message); + + Observable> observeMessages(DirectChat chat); + + Single updateMessage(Message message); + + Single upsertMessage(DirectChat chat, Message message); + + Completable deleteMessage(Message message); +} diff --git a/data/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java new file mode 100644 index 0000000..a5e1271 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java @@ -0,0 +1,45 @@ +package org.mercury_im.messenger.core.repository; + +import org.mercury_im.messenger.core.entity.chat.GroupChat; +import org.mercury_im.messenger.core.entity.message.Message; +import org.mercury_im.messenger.core.util.Optional; + +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Single; + +public interface GroupChatRepository { + + Single insertGroupChat(GroupChat chat); + + Observable> observeGroupChat(long chatId); + + Maybe getGroupChat(long chatId); + + Observable> observeGroupChatByRoomAddress(String roomAddress); + + Maybe getGroupChatByRoomAddress(String roomAddress); + + Observable> observeAllGroupChats(); + + Single updateGroupChat(GroupChat chat); + + Single upsertGroupChat(GroupChat chat); + + Completable deleteGroupChat(GroupChat chat); + + // Messages + + Single insertMessage(GroupChat chat, Message message); + + Observable> observeMessages(GroupChat chat); + + Single updateMessage(Message message); + + Single upsertMessage(GroupChat chat, Message message); + + Completable deleteMessage(Message message); +} diff --git a/repository/src/main/java/org/mercury_im/messenger/core/util/Optional.java b/data/src/main/java/org/mercury_im/messenger/core/util/Optional.java similarity index 100% rename from repository/src/main/java/org/mercury_im/messenger/core/util/Optional.java rename to data/src/main/java/org/mercury_im/messenger/core/util/Optional.java diff --git a/entity_xmpp/.gitignore b/domain/.gitignore similarity index 100% rename from entity_xmpp/.gitignore rename to domain/.gitignore diff --git a/core/build.gradle b/domain/build.gradle similarity index 84% rename from core/build.gradle rename to domain/build.gradle index a723522..e520b65 100644 --- a/core/build.gradle +++ b/domain/build.gradle @@ -3,8 +3,7 @@ apply plugin: 'java-library' dependencies { implementation project(':entity') - implementation project(':repository') - implementation project(":thread_utils") + implementation project(':data') // RxJava2 implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version" diff --git a/domain/src/main/java/org/mercury_im/core/MessageCenter.java b/domain/src/main/java/org/mercury_im/core/MessageCenter.java new file mode 100644 index 0000000..8baeb10 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/MessageCenter.java @@ -0,0 +1,17 @@ +package org.mercury_im.core; + +import org.mercury_im.core.transport.connection.ConnectionMethod; +import org.mercury_im.core.transport.listener.IncomingDirectMessageListener; +import org.mercury_im.messenger.core.entity.chat.Chat; +import org.mercury_im.messenger.core.entity.message.Message; + +import io.reactivex.Completable; + +public interface MessageCenter { + + Messenger getMessenger(); + + Completable sendMessage(Message message, C chat); + + void addIncomingMessageListener(IncomingDirectMessageListener listener); +} diff --git a/transport/src/main/java/org/mercury_im/core/Messenger.java b/domain/src/main/java/org/mercury_im/core/Messenger.java similarity index 58% rename from transport/src/main/java/org/mercury_im/core/Messenger.java rename to domain/src/main/java/org/mercury_im/core/Messenger.java index ab0cbeb..32f65ec 100644 --- a/transport/src/main/java/org/mercury_im/core/Messenger.java +++ b/domain/src/main/java/org/mercury_im/core/Messenger.java @@ -1,6 +1,7 @@ package org.mercury_im.core; -import org.mercury_im.core.connection.ConnectionMethod; +import org.mercury_im.core.transport.connection.ConnectionMethod; +import org.mercury_im.messenger.core.entity.Account; import java.util.HashMap; import java.util.Map; @@ -13,5 +14,8 @@ public class Messenger { connections.put(connection.getAccount().getId(), connection); } + public ConnectionMethod getConnection(Account account) { + return connections.get(account.getId()); + } } diff --git a/domain/src/main/java/org/mercury_im/core/transport/ConnectionType.java b/domain/src/main/java/org/mercury_im/core/transport/ConnectionType.java new file mode 100644 index 0000000..c9b4acb --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/transport/ConnectionType.java @@ -0,0 +1,22 @@ +package org.mercury_im.core.transport; + +public enum ConnectionType { + // Smack Connection Types from module transport_xmpp. + /** + * Underlying connection is a Smack XMPPTCPConnection. + */ + SMACK_TCP, + + /** + * Underlying connection is a Smack XMPPBOSHConnection. + * @deprecated Not yet implemented. + */ + SMACK_BOSH, + + /** + * Underlying connection is a Smack XMPPWebsocketConnection. + * @deprecated Not yet implemented. + */ + SMACK_WEBSOCKETS, + ; +} diff --git a/domain/src/main/java/org/mercury_im/core/transport/connection/AbstractConnectionMethod.java b/domain/src/main/java/org/mercury_im/core/transport/connection/AbstractConnectionMethod.java new file mode 100644 index 0000000..69ba923 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/transport/connection/AbstractConnectionMethod.java @@ -0,0 +1,26 @@ +package org.mercury_im.core.transport.connection; + +import org.mercury_im.core.Messenger; +import org.mercury_im.messenger.core.entity.Account; + +public abstract class AbstractConnectionMethod + implements ConnectionMethod { + + protected final Account account; + protected final Messenger messenger; + + public AbstractConnectionMethod(Account account, Messenger messenger) { + this.account = account; + this.messenger = messenger; + } + + @Override + public Account getAccount() { + return account; + } + + @Override + public Messenger getMessenger() { + return messenger; + } +} diff --git a/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionFactory.java b/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionFactory.java new file mode 100644 index 0000000..395410b --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionFactory.java @@ -0,0 +1,13 @@ +package org.mercury_im.core.transport.connection; + +import org.mercury_im.core.Messenger; +import org.mercury_im.messenger.core.entity.Account; + +public interface ConnectionFactory< + CM extends ConnectionMethod> { + + Messenger getMessenger(); + + CM provideConnection(Account account); + +} diff --git a/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionMethod.java b/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionMethod.java new file mode 100644 index 0000000..3aceba6 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionMethod.java @@ -0,0 +1,18 @@ +package org.mercury_im.core.transport.connection; + +import org.mercury_im.core.Messenger; +import org.mercury_im.core.transport.ConnectionType; +import org.mercury_im.messenger.core.entity.Account; + +import io.reactivex.Completable; + +public interface ConnectionMethod { + + Account getAccount(); + + Messenger getMessenger(); + + Completable connect(); + + ConnectionType getConnectionType(); +} diff --git a/transport/src/main/java/org/mercury_im/core/connection/exception/ConnectionFailedException.java b/domain/src/main/java/org/mercury_im/core/transport/connection/exception/ConnectionFailedException.java similarity index 65% rename from transport/src/main/java/org/mercury_im/core/connection/exception/ConnectionFailedException.java rename to domain/src/main/java/org/mercury_im/core/transport/connection/exception/ConnectionFailedException.java index 1c64385..a97fca7 100644 --- a/transport/src/main/java/org/mercury_im/core/connection/exception/ConnectionFailedException.java +++ b/domain/src/main/java/org/mercury_im/core/transport/connection/exception/ConnectionFailedException.java @@ -1,4 +1,4 @@ -package org.mercury_im.core.connection.exception; +package org.mercury_im.core.transport.connection.exception; public class ConnectionFailedException extends Exception { diff --git a/domain/src/main/java/org/mercury_im/core/transport/listener/IncomingDirectMessageListener.java b/domain/src/main/java/org/mercury_im/core/transport/listener/IncomingDirectMessageListener.java new file mode 100644 index 0000000..153f084 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/transport/listener/IncomingDirectMessageListener.java @@ -0,0 +1,11 @@ +package org.mercury_im.core.transport.listener; + +import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.core.entity.chat.DirectChat; +import org.mercury_im.messenger.core.entity.message.Message; + +public interface IncomingDirectMessageListener { + + void onIncomingDirectMessage(Account account, DirectChat chat, Message message); + +} diff --git a/domain/src/main/java/org/mercury_im/core/transport/listener/IncomingGroupChatMessageListener.java b/domain/src/main/java/org/mercury_im/core/transport/listener/IncomingGroupChatMessageListener.java new file mode 100644 index 0000000..2e8a116 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/transport/listener/IncomingGroupChatMessageListener.java @@ -0,0 +1,11 @@ +package org.mercury_im.core.transport.listener; + +import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.core.entity.chat.GroupChat; +import org.mercury_im.messenger.core.entity.message.Message; + +public interface IncomingGroupChatMessageListener { + + void onIncomingDirectMessage(Account account, GroupChat chat, Message message); + +} diff --git a/domain/src/main/java/org/mercury_im/core/transport/listener/TypingEventListener.java b/domain/src/main/java/org/mercury_im/core/transport/listener/TypingEventListener.java new file mode 100644 index 0000000..48489e8 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/transport/listener/TypingEventListener.java @@ -0,0 +1,9 @@ +package org.mercury_im.core.transport.listener; + +import org.mercury_im.messenger.core.entity.chat.Chat; +import org.mercury_im.messenger.core.entity.event.TypingEvent; + +public interface TypingEventListener { + + void onTypingEventReceived(Chat chat, TypingEvent typingEvent); +} diff --git a/domain/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java b/domain/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java new file mode 100644 index 0000000..827a0b7 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java @@ -0,0 +1,23 @@ +package org.mercury_im.core.usecase; + +import org.mercury_im.messenger.core.entity.chat.DirectChat; +import org.mercury_im.messenger.core.entity.message.Message; + +public class SendDirectMessage { + + private final Message message; + private final DirectChat chat; + + public SendDirectMessage(Message message, DirectChat chat) { + this.message = message; + this.chat = chat; + } + + public Message getMessage() { + return message; + } + + public DirectChat getChat() { + return chat; + } +} diff --git a/thread_utils/src/main/java/org/mercury_im/messenger/thread_utils/ThreadUtils.java b/domain/src/main/java/org/mercury_im/core/util/ThreadUtils.java similarity index 88% rename from thread_utils/src/main/java/org/mercury_im/messenger/thread_utils/ThreadUtils.java rename to domain/src/main/java/org/mercury_im/core/util/ThreadUtils.java index 08d5e31..c8615b1 100644 --- a/thread_utils/src/main/java/org/mercury_im/messenger/thread_utils/ThreadUtils.java +++ b/domain/src/main/java/org/mercury_im/core/util/ThreadUtils.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.thread_utils; +package org.mercury_im.core.util; /** * Name constants used by dagger in combination with the @Named annotation. diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java index 09ddf56..a58d562 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java @@ -2,23 +2,20 @@ package org.mercury_im.messenger.core.entity; /** * User Account entity. - * - * @param UserAddress Type. This type describes the accounts address. - * @param AuthMethod Type. This type describes details about the accounts authentication method. */ -public interface Account { +public interface Account { void setId(long id); long getId(); - void setAddress(AD address); + void setAddress(String address); - AD getAddress(); + String getAddress(); - void setAuthentication(AU authentication); + void setAuthentication(AuthMethod authentication); - AU getAuthentication(); + AuthMethod getAuthentication(); void setEnabled(boolean enabled); @@ -30,5 +27,6 @@ public interface Account - implements Account { +public class IAccount implements Account { protected long id; - protected AD address; - protected AU authentication; + protected String address; + protected AuthMethod authentication; protected boolean enabled; @Override @@ -22,22 +19,22 @@ public abstract class AbstractAccount< } @Override - public void setAddress(AD address) { + public void setAddress(String address) { this.address = address; } @Override - public AD getAddress() { + public String getAddress() { return address; } @Override - public void setAuthentication(AU authentication) { + public void setAuthentication(AuthMethod authentication) { this.authentication = authentication; } @Override - public AU getAuthentication() { + public AuthMethod getAuthentication() { return authentication; } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/PasswordAuthentication.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/PasswordAuthentication.java new file mode 100644 index 0000000..62da690 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/PasswordAuthentication.java @@ -0,0 +1,15 @@ +package org.mercury_im.messenger.core.entity; + +public class PasswordAuthentication implements Account.AuthMethod { + + private String password; + + public PasswordAuthentication(String password) { + this.password = password; + } + + @Override + public String getPassword() { + return password; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java index 175891a..b059a83 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java @@ -1,19 +1,16 @@ package org.mercury_im.messenger.core.entity.chat; -import org.mercury_im.messenger.core.entity.Address; import org.mercury_im.messenger.core.entity.Account; -public interface Chat< - AC extends Account, - AD extends Address.UserAddress> { +public interface Chat { long getId(); void setId(long id); - AC getAccount(); + Account getAccount(); - void setAccount(AC account); + void setAccount(Account account); ChatPreferences getChatPreferences(); diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java index c364525..77abeaf 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java @@ -4,15 +4,15 @@ public interface ChatPreferences { NotificationPreferences getNotificationPreference(); - boolean setNotificationPreference(NotificationPreferences notificationPreferences); + void setNotificationPreference(NotificationPreferences notificationPreferences); boolean isTypingNotificationsSupported(); void setTypingNotificationsSupported(boolean typingNotificationsSupported); - boolean isSendTypingNotifications(); + boolean isSendTypingNotificationsEnabled(); - void setSendTypingNotifications(boolean sendTypingNotifications); + void setSendTypingNotificationsEnabled(boolean sendTypingNotifications); boolean isReadNotificationsSupported(); diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java index 088b4b7..c13b637 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java @@ -1,17 +1,11 @@ package org.mercury_im.messenger.core.entity.chat; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.contact.Interlocutor; +import org.mercury_im.messenger.core.entity.contact.Peer; -public interface DirectChat< - IL extends Interlocutor, - AC extends Account, - AD extends Address.UserAddress> - extends Chat { +public interface DirectChat extends Chat { - IL getInterlocutor(); + Peer getPeer(); - void setInterlocutor(IL interlocutor); + void setPeer(Peer peer); } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/GroupChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/GroupChat.java index dcf8806..a41d85d 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/GroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/GroupChat.java @@ -1,26 +1,18 @@ package org.mercury_im.messenger.core.entity.chat; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.contact.Interlocutor; +import org.mercury_im.messenger.core.entity.contact.Peer; import java.util.Set; -public interface GroupChat< - AC extends Account, - AD extends Address.UserAddress, - RA extends Address.RoomAddress, - PA extends Address.RoomParticipantAddress, - IL extends Interlocutor> - extends Chat { +public interface GroupChat extends Chat { - Set getParticipants(); + Set getParticipants(); - void setParticipants(Set participants); + void setParticipants(Set participants); - RA getRoomAddress(); + String getRoomAddress(); - void setRoomAddress(RA roomAddress); + void setRoomAddress(String roomAddress); String getRoomName(); diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IChatPreferences.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IChatPreferences.java new file mode 100644 index 0000000..73e3558 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IChatPreferences.java @@ -0,0 +1,60 @@ +package org.mercury_im.messenger.core.entity.chat; + +public class IChatPreferences implements ChatPreferences { + + protected NotificationPreferences notificationPreferences; + protected boolean typingNotificationsSupported; + protected boolean sendTypingNotificationsEnabled; + protected boolean readNotificationsSupported; + protected boolean sendReadNotificationsEnabled; + + @Override + public NotificationPreferences getNotificationPreference() { + return notificationPreferences; + } + + @Override + public void setNotificationPreference(NotificationPreferences notificationPreferences) { + this.notificationPreferences = notificationPreferences; + } + + @Override + public boolean isTypingNotificationsSupported() { + return typingNotificationsSupported; + } + + @Override + public void setTypingNotificationsSupported(boolean typingNotificationsSupported) { + this.typingNotificationsSupported = typingNotificationsSupported; + } + + @Override + public boolean isSendTypingNotificationsEnabled() { + return sendTypingNotificationsEnabled; + } + + @Override + public void setSendTypingNotificationsEnabled(boolean sendTypingNotifications) { + this.sendTypingNotificationsEnabled = sendTypingNotifications; + } + + @Override + public boolean isReadNotificationsSupported() { + return readNotificationsSupported; + } + + @Override + public void setReadNotificationsSupported(boolean readNotificationsSupported) { + this.readNotificationsSupported = readNotificationsSupported; + } + + @Override + public boolean isSendReadNotifications() { + return sendReadNotificationsEnabled; + } + + @Override + public void setSendReadNotifications(boolean sendReadNotifications) { + this.sendReadNotificationsEnabled = sendReadNotifications; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractDirectChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IDirectChat.java similarity index 53% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractDirectChat.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IDirectChat.java index aa11194..5b35ed0 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractDirectChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IDirectChat.java @@ -1,28 +1,23 @@ package org.mercury_im.messenger.core.entity.chat; -import org.mercury_im.messenger.core.entity.Address; import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.contact.Interlocutor; +import org.mercury_im.messenger.core.entity.contact.Peer; -public abstract class AbstractDirectChat< - IL extends Interlocutor, - AC extends Account, - AD extends Address.UserAddress> - implements DirectChat { +public class IDirectChat implements DirectChat { protected long id; - protected IL interlocutor; - protected AC account; + protected Peer peer; + protected Account account; protected ChatPreferences preferences; @Override - public IL getInterlocutor() { - return interlocutor; + public Peer getPeer() { + return peer; } @Override - public void setInterlocutor(IL interlocutor) { - this.interlocutor = interlocutor; + public void setPeer(Peer peer) { + this.peer = peer; } @Override @@ -36,12 +31,12 @@ public abstract class AbstractDirectChat< } @Override - public AC getAccount() { + public Account getAccount() { return account; } @Override - public void setAccount(AC account) { + public void setAccount(Account account) { this.account = account; } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractGroupChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IGroupChat.java similarity index 58% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractGroupChat.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IGroupChat.java index 13d6d79..b641906 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractGroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IGroupChat.java @@ -1,27 +1,36 @@ package org.mercury_im.messenger.core.entity.chat; -import org.mercury_im.messenger.core.entity.Address; import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.core.entity.contact.Peer; -public abstract class AbstractGroupChat< - AC extends Account, - AD extends Address.UserAddress, - RA extends Address.RoomAddress> - implements GroupChat { +import java.util.Set; + +public class IGroupChat implements GroupChat { private long id; - private AC account; - private RA roomAddress; + private Account account; + private String roomAddress; private String roomName; protected ChatPreferences preferences; + protected Set participants; @Override - public RA getRoomAddress() { + public Set getParticipants() { + return participants; + } + + @Override + public void setParticipants(Set participants) { + this.participants = participants; + } + + @Override + public String getRoomAddress() { return roomAddress; } @Override - public void setRoomAddress(RA roomAddress) { + public void setRoomAddress(String roomAddress) { this.roomAddress = roomAddress; } @@ -46,12 +55,12 @@ public abstract class AbstractGroupChat< } @Override - public AC getAccount() { + public Account getAccount() { return account; } @Override - public void setAccount(AC account) { + public void setAccount(Account account) { this.account = account; } @@ -63,7 +72,7 @@ public abstract class AbstractGroupChat< @Override public void setChatPreferences(ChatPreferences chatPreferences) { - this.preferences = preferences; + this.preferences = chatPreferences; } } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/INotificationPreferences.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/INotificationPreferences.java new file mode 100644 index 0000000..e6cce4e --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/INotificationPreferences.java @@ -0,0 +1,27 @@ +package org.mercury_im.messenger.core.entity.chat; + +public class INotificationPreferences implements ChatPreferences.NotificationPreferences { + + protected boolean notifyOnMessage; + protected boolean notifyOnMention; + + @Override + public boolean isNotifyOnMessage() { + return notifyOnMessage; + } + + @Override + public void setNotifyOnMessage(boolean notify) { + this.notifyOnMessage = notify; + } + + @Override + public boolean isNotifyOnMention() { + return notifyOnMention; + } + + @Override + public void setNotifyOnMention(boolean notify) { + this.notifyOnMention = notify; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java index deff2e9..cde9ae3 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java @@ -1,12 +1,6 @@ package org.mercury_im.messenger.core.entity.contact; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; - -public interface Contact< - AC extends Account, - AD extends Address.UserAddress> - extends Interlocutor { +public interface Contact extends Peer { SubscriptionMode getSubscriptionMode(); diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IContact.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IContact.java new file mode 100644 index 0000000..a579ff3 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IContact.java @@ -0,0 +1,62 @@ +package org.mercury_im.messenger.core.entity.contact; + +import org.mercury_im.messenger.core.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/core/entity/contact/AbstractInterlocutor.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IPeer.java similarity index 60% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/contact/AbstractInterlocutor.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IPeer.java index 22fe69b..847d94a 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/AbstractInterlocutor.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IPeer.java @@ -1,17 +1,12 @@ package org.mercury_im.messenger.core.entity.contact; import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -public abstract class AbstractInterlocutor< - AC extends Account, - IA extends Address, - AD extends Address.UserAddress> - implements Interlocutor { +public class IPeer implements Peer { protected long id; - protected AC account; - protected IA address; + protected Account account; + protected String address; protected String name; @Override @@ -25,22 +20,22 @@ public abstract class AbstractInterlocutor< } @Override - public AC getAccount() { + public Account getAccount() { return account; } @Override - public void setAccount(AC account) { + public void setAccount(Account account) { this.account = account; } @Override - public IA getAddress() { + public String getAddress() { return address; } @Override - public void setAddress(IA address) { + public void setAddress(String address) { this.address = address; } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Interlocutor.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Interlocutor.java deleted file mode 100644 index ae2aea7..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Interlocutor.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.mercury_im.messenger.core.entity.contact; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; - -/** - * Defines a user on the network (eg. a contact, chat partner, group chat member etc). - * Basically anyone that may send you a message is an Interlocutor. - * - * @param Account Type - * @param Address type for the Interlocutor - * @param UserAddress type for the account - */ -public interface Interlocutor< - AC extends Account, - IA extends Address, - AD extends Address.UserAddress> { - - long getId(); - - void setId(long id); - - AC getAccount(); - - void setAccount(AC account); - - IA getAddress(); - - void setAddress(IA address); - - String getName(); - - void setName(String name); -} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Peer.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Peer.java new file mode 100644 index 0000000..5f39fc2 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Peer.java @@ -0,0 +1,26 @@ +package org.mercury_im.messenger.core.entity.contact; + +import org.mercury_im.messenger.core.entity.Account; + +/** + * Defines a user on the network (eg. a contact, chat partner, group chat member etc). + * Basically anyone that may send you a message is a Peer. + */ +public interface Peer { + + long getId(); + + void setId(long id); + + Account getAccount(); + + void setAccount(Account account); + + String getAddress(); + + void setAddress(String address); + + String getName(); + + void setName(String name); +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/event/ITypingEvent.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/event/ITypingEvent.java new file mode 100644 index 0000000..fd02b77 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/event/ITypingEvent.java @@ -0,0 +1,20 @@ +package org.mercury_im.messenger.core.entity.event; + +import org.mercury_im.messenger.core.entity.contact.Peer; + +import java.util.Map; + +public class ITypingEvent implements TypingEvent { + + public Map typingStates; + + @Override + public Map getTypingStates() { + return typingStates; + } + + @Override + public void setTypingStates(Map typingStates) { + this.typingStates = typingStates; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingEvent.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingEvent.java new file mode 100644 index 0000000..a85d364 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingEvent.java @@ -0,0 +1,12 @@ +package org.mercury_im.messenger.core.entity.event; + +import org.mercury_im.messenger.core.entity.contact.Peer; + +import java.util.Map; + +public interface TypingEvent { + + Map getTypingStates(); + + void setTypingStates(Map typingStates); +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingState.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingState.java new file mode 100644 index 0000000..5c6a14e --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingState.java @@ -0,0 +1,24 @@ +package org.mercury_im.messenger.core.entity.event; + +public enum TypingState { + /** + * The peer is typing. + */ + typing, + + /** + * The peer was typing and is now pausing for a short amount of time. + */ + pause, + + /** + * The peer is deleting from their input field. + */ + deleting, + + /** + * The peer stopped typing completely. + * TODO: Makes sense? + */ + stop +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/AbstractMessage.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessage.java similarity index 73% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/AbstractMessage.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessage.java index d492ce5..4ded303 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/AbstractMessage.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessage.java @@ -1,22 +1,17 @@ package org.mercury_im.messenger.core.entity.message; -import org.mercury_im.messenger.core.entity.Address; - import java.util.Date; import java.util.List; -public abstract class AbstractMessage< - AD extends Address, - MM extends MessageMetadata> - implements Message { +public class IMessage implements Message { protected long id; - protected AD sender; - protected AD recipient; + protected String sender; + protected String recipient; protected Date timestamp; protected List payloads; protected MessageDeliveryState deliveryState; - protected MM metadata; + protected MessageMetadata metadata; @Override public long getId() { @@ -29,22 +24,22 @@ public abstract class AbstractMessage< } @Override - public AD getSender() { + public String getSender() { return sender; } @Override - public void setSender(AD address) { + public void setSender(String address) { this.sender = address; } @Override - public AD getRecipient() { + public String getRecipient() { return recipient; } @Override - public void setRecipient(AD recipient) { + public void setRecipient(String recipient) { this.recipient = recipient; } @@ -79,12 +74,12 @@ public abstract class AbstractMessage< } @Override - public MM getMetadata() { + public MessageMetadata getMetadata() { return metadata; } @Override - public void setMetadata(MM metadata) { + public void setMetadata(MessageMetadata metadata) { this.metadata = metadata; } } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessagePayload.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessagePayload.java new file mode 100644 index 0000000..30c7811 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessagePayload.java @@ -0,0 +1,20 @@ +package org.mercury_im.messenger.core.entity.message; + +import org.mercury_im.messenger.core.entity.message.content.MessageContent; + +import java.util.List; + +public class IMessagePayload implements MessagePayload { + + protected List contents; + + @Override + public List getMessageContents() { + return contents; + } + + @Override + public void setMessageContents(List messageContents) { + this.contents = messageContents; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java index 8db0112..ce85330 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java @@ -1,23 +1,21 @@ package org.mercury_im.messenger.core.entity.message; -import org.mercury_im.messenger.core.entity.Address; - import java.util.Date; import java.util.List; -public interface Message { +public interface Message { long getId(); void setId(long id); - MA getSender(); + String getSender(); - void setSender(MA address); + void setSender(String address); - MA getRecipient(); + String getRecipient(); - void setRecipient(MA recipient); + void setRecipient(String recipient); Date getTimestamp(); @@ -31,7 +29,7 @@ public interface Message { void setDeliveryState(MessageDeliveryState deliveryState); - MM getMetadata(); + MessageMetadata getMetadata(); - void setMetadata(MM metadata); + void setMetadata(MessageMetadata metadata); } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessagePayload.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessagePayload.java index 125086b..24bc2b2 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessagePayload.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessagePayload.java @@ -1,11 +1,21 @@ package org.mercury_im.messenger.core.entity.message; +import org.mercury_im.messenger.core.entity.message.content.MessageContent; + import java.util.List; +/** + * Defines the payload of a message. + * A payload can either be a plaintext container or an encrypted container and contains + * MessageContents. + * A message may contain encrypted and unencrypted contents. Those could then be represented by + * two different MessageContents. + */ public interface MessagePayload { List getMessageContents(); void setMessageContents(List messageContents); + } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageContent.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/MessageContent.java similarity index 71% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageContent.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/MessageContent.java index ad462c5..4b9f9f0 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageContent.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/MessageContent.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.message; +package org.mercury_im.messenger.core.entity.message.content; public interface MessageContent { diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/TextMessageContent.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/TextMessageContent.java similarity index 80% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/TextMessageContent.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/TextMessageContent.java index f013524..64c5940 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/TextMessageContent.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/TextMessageContent.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.message; +package org.mercury_im.messenger.core.entity.message.content; public class TextMessageContent implements MessageContent.Body { diff --git a/entity_xmpp/build.gradle b/entity_xmpp/build.gradle deleted file mode 100644 index 826c7a1..0000000 --- a/entity_xmpp/build.gradle +++ /dev/null @@ -1,11 +0,0 @@ -apply plugin: 'java-library' - -dependencies { - api project(":entity") - - // JXMPP for Jid types. Version comes from smacks version.gradle - api("org.jxmpp:jxmpp-jid:$jxmppVersion") -} - -sourceCompatibility = "8" -targetCompatibility = "8" diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAccount.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAccount.java deleted file mode 100644 index a707254..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAccount.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity; - -import org.mercury_im.messenger.core.entity.AbstractAccount; - -public class XmppAccount extends AbstractAccount { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAddress.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAddress.java deleted file mode 100644 index fb4e9c7..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAddress.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity; - -import org.jxmpp.jid.EntityBareJid; -import org.jxmpp.jid.EntityFullJid; -import org.mercury_im.messenger.core.entity.Address; - -public class XmppAddress implements Address { - - private EntityBareJid jid; - - public XmppAddress(EntityBareJid jid) { - this.jid = jid; - } - - public EntityBareJid getJid() { - return jid; - } - - public static class XmppUserAddress extends XmppAddress implements Address.UserAddress { - - public XmppUserAddress(EntityBareJid jid) { - super(jid); - } - } - - public static class XmppRoomAddress extends XmppAddress implements Address.RoomAddress { - - public XmppRoomAddress(EntityBareJid jid) { - super(jid); - } - - } - - public static class XmppRoomParticipantAddress implements Address.RoomParticipantAddress { - - private EntityFullJid jid; - - public XmppRoomParticipantAddress(EntityFullJid jid) { - this.jid = jid; - } - - public EntityFullJid getJid() { - return jid; - } - } -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppDirectChat.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppDirectChat.java deleted file mode 100644 index 07d12aa..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppDirectChat.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity.chat; - -import org.mercury_im.messenger.core.entity.chat.AbstractDirectChat; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; -import org.mercury_im.messenger.xmpp.entity.contact.XmppDirectInterlocutor; - -public class XmppDirectChat extends AbstractDirectChat { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppMuc.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppMuc.java deleted file mode 100644 index a726c01..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppMuc.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity.chat; - -import org.mercury_im.messenger.core.entity.chat.AbstractGroupChat; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; - -public class XmppMuc extends AbstractGroupChat { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppContact.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppContact.java deleted file mode 100644 index 35db795..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppContact.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity.contact; - -import org.mercury_im.messenger.core.entity.contact.AbstractInterlocutor; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; - -public class XmppContact extends AbstractInterlocutor< - XmppAccount, - XmppAddress.XmppUserAddress, - XmppAddress.XmppUserAddress> { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppDirectInterlocutor.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppDirectInterlocutor.java deleted file mode 100644 index b38df70..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppDirectInterlocutor.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity.contact; - -import org.mercury_im.messenger.core.entity.contact.AbstractInterlocutor; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; - -public class XmppDirectInterlocutor extends AbstractInterlocutor< - XmppAccount, - XmppAddress.XmppUserAddress, - XmppAddress.XmppUserAddress> { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppMucParticipant.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppMucParticipant.java deleted file mode 100644 index b85f9ae..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppMucParticipant.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity.contact; - -import org.mercury_im.messenger.core.entity.contact.AbstractInterlocutor; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; - -public class XmppMucParticipant extends AbstractInterlocutor< - XmppAccount, - XmppAddress.XmppRoomParticipantAddress, - XmppAddress.XmppUserAddress> { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessage.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessage.java deleted file mode 100644 index e60ca64..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessage.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity.message; - -import org.mercury_im.messenger.core.entity.message.AbstractMessage; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; - -public final class XmppMessage { - - private XmppMessage() { - - } - - public class DirectMessage extends AbstractMessage< - XmppAddress.XmppUserAddress, - XmppMessageMetadata> { - - } - - public class MucMessage extends AbstractMessage< - XmppAddress.XmppRoomParticipantAddress, - XmppMessageMetadata> { - - } - - // Maybe? - public class MixMessage extends AbstractMessage< - XmppAddress.XmppRoomParticipantAddress, - XmppMessageMetadata> { - - } -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessageMetadata.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessageMetadata.java deleted file mode 100644 index b607e28..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessageMetadata.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity.message; - -import org.mercury_im.messenger.core.entity.message.MessageMetadata; - -public class XmppMessageMetadata implements MessageMetadata { - -} diff --git a/repository/.gitignore b/repository/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/repository/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/repository/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java b/repository/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java deleted file mode 100644 index f2d4621..0000000 --- a/repository/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.mercury_im.messenger.core.repository; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.util.Optional; - -import java.util.List; - -import io.reactivex.Completable; -import io.reactivex.Maybe; -import io.reactivex.Observable; -import io.reactivex.Single; - -public interface AccountRepository< - AC extends Account, - AD extends Address.UserAddress> { - - Single insertAccount(AC account); - - Observable> observeAccount(long accountId); - - Maybe getAccount(long accountId); - - Observable> observeAccountByAddress(AD address); - - Maybe getAccountByAddress(AD address); - - Observable> observeAllAccounts(); - - Single updateAccount(AC account); - - Single upsertAccount(AC account); - - Completable deleteAccount(AC account); - -} diff --git a/repository/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java b/repository/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java deleted file mode 100644 index 73c4d98..0000000 --- a/repository/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.mercury_im.messenger.core.repository; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.contact.Contact; -import org.mercury_im.messenger.core.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< - AC extends Account, - AD extends Address.UserAddress, - C extends Contact> { - - Single insertContact(C contact); - - Observable> observeContact(long contactId); - - Maybe getContact(long contactId); - - Observable> observeContactByAddress(AD address); - - Maybe getContactByAddress(AD address); - - Observable> observeAllContacts(); - - Single updateContact(C contact); - - Single upsertContact(C contact); - - Completable deleteContact(C contact); -} diff --git a/repository/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java b/repository/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java deleted file mode 100644 index 2266b56..0000000 --- a/repository/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.mercury_im.messenger.core.repository; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.chat.DirectChat; -import org.mercury_im.messenger.core.entity.contact.Interlocutor; -import org.mercury_im.messenger.core.entity.message.Message; -import org.mercury_im.messenger.core.entity.message.MessageMetadata; -import org.mercury_im.messenger.core.entity.message.MessagePayload; -import org.mercury_im.messenger.core.util.Optional; - -import java.util.List; - -import io.reactivex.Completable; -import io.reactivex.Maybe; -import io.reactivex.Observable; -import io.reactivex.Single; - -public interface DirectChatRepository< - DC extends DirectChat, - IL extends Interlocutor, - AC extends Account, - AD extends Address.UserAddress, - M extends Message, - MM extends MessageMetadata, - MP extends MessagePayload> { - - Single insertDirectChat(DC chat); - - Observable> observeDirectChat(long chatId); - - Maybe getDirectChat(long chatId); - - Observable> observeDirectChatByInterlocutor(IL interlocutor); - - Maybe getDirectChatByInterlocutor(IL interlocutor); - - Observable> observeAllDirectChats(); - - Single updateDirectChat(DC chat); - - Single upsertDirectChat(DC chat); - - Completable deleteDirectChat(DC chat); - - // Messages - - Single insertMessage(DC chat, M message); - - Observable> observeMessages(DC chat); - - Single updateMessage(M message); - - Single upsertMessage(DC chat, M message); - - Completable deleteMessage(M message); -} diff --git a/repository/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java b/repository/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java deleted file mode 100644 index 460a00c..0000000 --- a/repository/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.mercury_im.messenger.core.repository; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.chat.GroupChat; -import org.mercury_im.messenger.core.entity.message.Message; -import org.mercury_im.messenger.core.entity.message.MessageMetadata; -import org.mercury_im.messenger.core.entity.message.MessagePayload; -import org.mercury_im.messenger.core.util.Optional; - -import java.util.List; - -import io.reactivex.Completable; -import io.reactivex.Maybe; -import io.reactivex.Observable; -import io.reactivex.Single; - -public interface GroupChatRepository< - GC extends GroupChat, - AC extends Account, - AD extends Address.UserAddress, - RA extends Address.RoomAddress, - M extends Message, - MM extends MessageMetadata, - MP extends MessagePayload> { - - Single insertGroupChat(GC chat); - - Observable> observeGroupChat(long chatId); - - Maybe getGroupChat(long chatId); - - Observable> observeGroupChatByRoomAddress(RA roomAddress); - - Maybe getGroupChatByRoomAddress(RA roomAddress); - - Observable> observeAllGroupChats(); - - Single updateGroupChat(GC chat); - - Single upsertGroupChat(GC chat); - - Completable deleteGroupChat(GC chat); - - // Messages - - Single insertMessage(GC chat, M message); - - Observable> observeMessages(GC chat); - - Single updateMessage(M message); - - Single upsertMessage(GC chat, M message); - - Completable deleteMessage(M message); -} diff --git a/repository_xmpp/build.gradle b/repository_xmpp/build.gradle index 48eb0b9..8c68c29 100644 --- a/repository_xmpp/build.gradle +++ b/repository_xmpp/build.gradle @@ -8,12 +8,9 @@ sourceSets { dependencies { - // implementation project(":core") - implementation project(":entity_xmpp") - implementation project(":repository") - - // JXMPP for Jid types. Version comes from smacks version.gradle - api("org.jxmpp:jxmpp-jid:$jxmppVersion") + implementation project(":entity") + implementation project(':domain') + implementation project(':data') // RxJava2 api "io.reactivex.rxjava2:rxjava:$rxJava2Version" @@ -28,7 +25,6 @@ dependencies { // JUnit for testing testImplementation "junit:junit:$junitVersion" - implementation project(':thread_utils') } sourceCompatibility = "8" diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/EntityBareJidConverter.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/EntityBareJidConverter.java deleted file mode 100644 index eac74da..0000000 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/EntityBareJidConverter.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.mercury_im.messenger.xmpp.converter; - -import org.jxmpp.jid.EntityBareJid; -import org.jxmpp.jid.impl.JidCreate; - -import io.requery.Converter; - -public class EntityBareJidConverter implements Converter { - @Override - public Class getMappedType() { - return EntityBareJid.class; - } - - @Override - public Class getPersistedType() { - return String.class; - } - - @Override - public Integer getPersistedSize() { - return null; - } - - @Override - public String convertToPersisted(EntityBareJid jid) { - return jid == null ? null : jid.asUnescapedString(); - } - - @Override - public EntityBareJid convertToMapped(Class aClass, String string) { - return string == null ? null : JidCreate.entityBareFromOrThrowUnchecked(string); - } -} diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/XmppAddressConverter.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/XmppAddressConverter.java deleted file mode 100644 index 14063ca..0000000 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/XmppAddressConverter.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.mercury_im.messenger.xmpp.converter; - -import org.jxmpp.jid.impl.JidCreate; - -import io.requery.Converter; - -public class XmppAddressConverter implements Converter { - @Override - public Class getMappedType() { - return XmppAddress.class; - } - - @Override - public Class getPersistedType() { - return String.class; - } - - @Override - public Integer getPersistedSize() { - return null; - } - - @Override - public String convertToPersisted(XmppAddress address) { - return address == null ? null : address.toString(); - } - - @Override - public XmppAddress convertToMapped(Class aClass, String string) { - return string == null ? null : new XmppAddress(JidCreate.entityBareFromOrThrowUnchecked(string)); - } -} diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java index eaed6b6..22746c7 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java @@ -4,7 +4,7 @@ import org.mercury_im.messenger.xmpp.repository.ReactiveXmppAccountRepository; import org.mercury_im.messenger.xmpp.repository.ChatRepository; import org.mercury_im.messenger.xmpp.repository.EntityCapsRepository; import org.mercury_im.messenger.xmpp.repository.RosterRepository; -import org.mercury_im.messenger.thread_utils.ThreadUtils; +import org.mercury_im.core.util.ThreadUtils; import javax.inject.Named; import javax.inject.Singleton; diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java index a517113..d6b0599 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java @@ -1,34 +1,34 @@ package org.mercury_im.messenger.xmpp.mapping; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; -import org.mercury_im.messenger.xmpp.entity.XmppAuthMethod; +import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.core.entity.IAccount; +import org.mercury_im.messenger.core.entity.PasswordAuthentication; import org.mercury_im.messenger.xmpp.model.AccountModel; public class AccountMapping { - public static XmppAccount modelToEntity(AccountModel model) { + public static Account modelToEntity(AccountModel model) { if (model == null) { return null; } - XmppAccount entity = new XmppAccount(); + IAccount entity = new IAccount(); entity.setId(model.getId()); - entity.setAddress(new XmppAddress.XmppUserAddress(model.getJid())); + entity.setAddress(model.getAddress()); entity.setEnabled(model.isEnabled()); - entity.setAuthentication(XmppAuthMethod.AuthPassword.fromPassword(model.getPassword())); + entity.setAuthentication(new PasswordAuthentication(model.getPassword())); return entity; } - public static AccountModel createModelFromEntity(XmppAccount entity) { + public static AccountModel createModelFromEntity(Account entity) { if (entity == null) { return null; } AccountModel model = new AccountModel(); - model.setPassword(((XmppAuthMethod.AuthPassword) entity.getAuthentication()).getPassword()); - model.setJid(entity.getAddress().getJid()); + model.setPassword(entity.getAuthentication().getPassword()); + model.setAddress(entity.getAddress()); model.setEnabled(entity.isEnabled()); return model; diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java index 5682316..36cbc8b 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java @@ -1,10 +1,6 @@ package org.mercury_im.messenger.xmpp.model; -import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.xmpp.converter.EntityBareJidConverter; - import io.requery.Column; -import io.requery.Convert; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; @@ -19,8 +15,7 @@ public abstract class AbstractAccountModel implements Persistable { long id; @Column(nullable = false) - @Convert(EntityBareJidConverter.class) - EntityBareJid address; + String address; @Column(nullable = false) String password; diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java index c21086a..197ab86 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java @@ -17,7 +17,7 @@ public abstract class AbstractChatModel implements Persistable { @OneToOne @ForeignKey - EntityModel peer; + PeerModel peer; boolean displayed; } diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java index 1bf8bd4..c18ad61 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java @@ -21,7 +21,7 @@ public abstract class AbstractContactModel implements Persistable { @OneToOne @ForeignKey(referencedColumn = "id") - EntityModel entity; + PeerModel entity; String rostername; diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java index 6a8eb52..809d14a 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java @@ -1,12 +1,8 @@ package org.mercury_im.messenger.xmpp.model; -import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.xmpp.converter.EntityBareJidConverter; - import java.util.Date; import io.requery.Column; -import io.requery.Convert; import io.requery.Entity; import io.requery.ForeignKey; import io.requery.Generated; @@ -31,13 +27,11 @@ public abstract class AbstractMessageModel implements Persistable { @Column(name = "\"timestamp\"", nullable = false) Date timestamp; - @Convert(EntityBareJidConverter.class) @Column(nullable = false) - EntityBareJid sender; + String sender; - @Convert(EntityBareJidConverter.class) @Column(nullable = false) - EntityBareJid recipient; + String recipient; boolean incoming; @@ -50,6 +44,5 @@ public abstract class AbstractMessageModel implements Persistable { String stanzaId; - @Convert(EntityBareJidConverter.class) - EntityBareJid stanzaIdBy; + String stanzaIdBy; } diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java similarity index 59% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityModel.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java index 192ed60..975be98 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java @@ -1,10 +1,6 @@ package org.mercury_im.messenger.xmpp.model; -import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.xmpp.converter.EntityBareJidConverter; - import io.requery.Column; -import io.requery.Convert; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; @@ -13,8 +9,8 @@ import io.requery.Persistable; import io.requery.Table; @Entity -@Table(name = "entities") -public abstract class AbstractEntityModel implements Persistable { +@Table(name = "peers") +public abstract class AbstractPeerModel implements Persistable { @Key @Generated long id; @@ -22,14 +18,13 @@ public abstract class AbstractEntityModel implements Persistable { @ManyToOne AccountModel account; - @Convert(EntityBareJidConverter.class) @Column(nullable = false) - EntityBareJid jid; + String address; @Override public String toString() { return "Entity[" + id + ", " + - jid + ", " + + address + ", " + account + "]"; } } diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java index 3d6c3ad..a4cd16b 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java @@ -1,6 +1,6 @@ package org.mercury_im.messenger.xmpp.repository; -import org.mercury_im.messenger.thread_utils.ThreadUtils; +import org.mercury_im.core.util.ThreadUtils; import javax.inject.Named; diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java index 0e50300..4c50845 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java @@ -1,11 +1,10 @@ package org.mercury_im.messenger.xmpp.repository; -import org.jxmpp.jid.EntityBareJid; +import org.mercury_im.core.util.ThreadUtils; 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.PeerModel; import org.mercury_im.messenger.xmpp.util.ChatAndPossiblyContact; -import org.mercury_im.messenger.thread_utils.ThreadUtils; import java.util.ArrayList; import java.util.List; @@ -32,13 +31,13 @@ public class ChatRepository extends AbstractRepository { super(ChatModel.class, data, subscriberScheduler, observerScheduler); } - public Observable> getChatWith(EntityModel entityModel) { - return getChatWith(entityModel.getAccount().getId(), entityModel.getJid()); + public Observable> getChatWith(PeerModel entityModel) { + return getChatWith(entityModel.getAccount().getId(), entityModel.getAddress()); } - public Observable> getChatWith(long accountId, EntityBareJid jid) { - return data().select(ChatModel.class).join(EntityModel.class).on(ChatModel.PEER_ID.eq(EntityModel.ID)) - .where(EntityModel.ACCOUNT_ID.eq(accountId).and(EntityModel.JID.eq(jid))) + public Observable> getChatWith(long accountId, String address) { + return data().select(ChatModel.class).join(PeerModel.class).on(ChatModel.PEER_ID.eq(PeerModel.ID)) + .where(PeerModel.ACCOUNT_ID.eq(accountId).and(PeerModel.ADDRESS.eq(address))) .get().observableResult() .doOnError(error -> LOGGER.log(Level.WARNING, "An error occurred while getting chat", error)) .subscribeOn(subscriberScheduler()) @@ -69,13 +68,13 @@ public class ChatRepository extends AbstractRepository { .observeOn(observerScheduler()); } - public Observable getChatAndContact(long accountId, EntityBareJid jid) { + public Observable getChatAndContact(long accountId, String address) { return Observable.fromCallable(() -> { ChatModel chat = data().select(ChatModel.class) - .from(ChatModel.class).join(EntityModel.class).on(ChatModel.PEER_ID.eq(EntityModel.ID)) - .leftJoin(ContactModel.class).on(EntityModel.ID.eq(ContactModel.ENTITY_ID)) - .where(EntityModel.ACCOUNT_ID.eq(accountId).and(EntityModel.JID.eq(jid))) + .from(ChatModel.class).join(PeerModel.class).on(ChatModel.PEER_ID.eq(PeerModel.ID)) + .leftJoin(ContactModel.class).on(PeerModel.ID.eq(ContactModel.ENTITY_ID)) + .where(PeerModel.ACCOUNT_ID.eq(accountId).and(PeerModel.ADDRESS.eq(address))) .get().firstOrNull(); if (chat == null) { return null; diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java index 8396c29..ec23568 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java @@ -1,7 +1,7 @@ package org.mercury_im.messenger.xmpp.repository; import org.mercury_im.messenger.xmpp.model.EntityCapsModel; -import org.mercury_im.messenger.thread_utils.ThreadUtils; +import org.mercury_im.core.util.ThreadUtils; import javax.inject.Inject; import javax.inject.Named; diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java index f2d9ed8..82ce0c4 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java @@ -2,9 +2,9 @@ package org.mercury_im.messenger.xmpp.repository; 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.PeerModel; import org.mercury_im.messenger.xmpp.model.MessageModel; -import org.mercury_im.messenger.thread_utils.ThreadUtils; +import org.mercury_im.core.util.ThreadUtils; import javax.inject.Inject; import javax.inject.Named; @@ -36,7 +36,7 @@ public class MessageRepository extends AbstractRepository { .observeOn(observerScheduler()); } - public Observable> getAllMessagesOfEntity(EntityModel entity) { + public Observable> getAllMessagesOfEntity(PeerModel entity) { return getAllMessagesOfEntity(entity.getId()); } @@ -56,8 +56,8 @@ public class MessageRepository extends AbstractRepository { public Observable> getAllMessagesOfContact(long contactId) { return data().select(MessageModel.class).join(ChatModel.class).on(MessageModel.CHAT_ID.eq(ChatModel.ID)) - .join(EntityModel.class).on(ChatModel.PEER_ID.eq(EntityModel.ID)) - .join(ContactModel.class).on(EntityModel.ID.eq(ContactModel.ENTITY_ID)) + .join(PeerModel.class).on(ChatModel.PEER_ID.eq(PeerModel.ID)) + .join(ContactModel.class).on(PeerModel.ID.eq(ContactModel.ENTITY_ID)) .orderBy(MessageModel.TIMESTAMP.asc()) .get().observableResult() .subscribeOn(subscriberScheduler()) diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java index 77911cb..80a225f 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java @@ -1,11 +1,9 @@ package org.mercury_im.messenger.xmpp.repository; +import org.mercury_im.messenger.core.entity.Account; import org.mercury_im.messenger.core.repository.AccountRepository; import org.mercury_im.messenger.core.util.Optional; -import org.mercury_im.messenger.thread_utils.ThreadUtils; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; -import org.mercury_im.messenger.xmpp.entity.XmppAuthMethod; +import org.mercury_im.core.util.ThreadUtils; import org.mercury_im.messenger.xmpp.mapping.AccountMapping; import org.mercury_im.messenger.xmpp.model.AccountModel; @@ -24,7 +22,9 @@ import io.requery.Persistable; import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; -public class ReactiveXmppAccountRepository extends RequeryRepository implements AccountRepository { +public class ReactiveXmppAccountRepository + extends RequeryRepository + implements AccountRepository { @Inject public ReactiveXmppAccountRepository(ReactiveEntityStore data, @@ -34,7 +34,7 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Single insertAccount(XmppAccount account) { + public Single insertAccount(Account account) { return data().insert(AccountMapping.createModelFromEntity(account)) .map(AccountMapping::modelToEntity) @@ -43,7 +43,7 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Observable> observeAccount(long accountId) { + public Observable> observeAccount(long accountId) { return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().observableResult() @@ -54,7 +54,7 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Maybe getAccount(long accountId) { + public Maybe getAccount(long accountId) { return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().maybe() @@ -64,9 +64,9 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Observable> observeAccountByAddress(XmppAddress.XmppUserAddress address) { + public Observable> observeAccountByAddress(String address) { return data().select(AccountModel.class) - .where(AccountModel.JID.eq(address.getJid())) + .where(AccountModel.ADDRESS.eq(address)) .get().observableResult() .map(result -> new Optional<>(AccountMapping.modelToEntity(result.firstOrNull()))) .subscribeOn(subscriberScheduler()) @@ -74,9 +74,9 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Maybe getAccountByAddress(XmppAddress.XmppUserAddress address) { + public Maybe getAccountByAddress(String address) { return data().select(AccountModel.class) - .where(AccountModel.JID.eq(address.getJid())) + .where(AccountModel.ADDRESS.eq(address)) .get().maybe() .map(AccountMapping::modelToEntity) .subscribeOn(subscriberScheduler()) @@ -84,12 +84,12 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Observable> observeAllAccounts() { + public Observable> observeAllAccounts() { return data().select(AccountModel.class) .get().observableResult() .map(ResultDelegate::toList) .map(list -> { - List entities = new ArrayList<>(list.size()); + List entities = new ArrayList<>(list.size()); list.forEach(model -> entities.add(AccountMapping.modelToEntity(model))); return entities; }) @@ -98,7 +98,7 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Single updateAccount(XmppAccount account) { + public Single updateAccount(Account account) { // Since we cannot access setId() of AccountModel, we have to query the model by ID and update it manually. // https://github.com/requery/requery/issues/616#issuecomment-315685460 @@ -109,8 +109,8 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements .map(model -> { // update it model.setEnabled(account.isEnabled()); - model.setPassword(((XmppAuthMethod.AuthPassword) account.getAuthentication()).getPassword()); - model.setJid(account.getAddress().getJid()); + model.setPassword(account.getAuthentication().getPassword()); + model.setAddress(account.getAddress()); // write the updated model back model = data().update(model).blockingGet(); return AccountMapping.modelToEntity(model); @@ -120,7 +120,7 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Single upsertAccount(XmppAccount account) { + public Single upsertAccount(Account account) { // Try to fetch model return data().select(AccountModel.class) .where(AccountModel.ID.eq(account.getId())) @@ -131,8 +131,8 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements .map(model -> { // update the model model.setEnabled(account.isEnabled()); - model.setPassword(((XmppAuthMethod.AuthPassword) account.getAuthentication()).getPassword()); - model.setJid(account.getAddress().getJid()); + model.setPassword(account.getAuthentication().getPassword()); + model.setAddress(account.getAddress()); // write the updated model back model = data().update(model).blockingGet(); return AccountMapping.modelToEntity(model); @@ -142,7 +142,7 @@ public class ReactiveXmppAccountRepository extends RequeryRepository implements } @Override - public Completable deleteAccount(XmppAccount account) { + public Completable deleteAccount(Account account) { return data().delete(AccountModel.class) .where(AccountModel.ID.eq(account.getId())) .get().single().ignoreElement() // to completable diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java index d73777f..3eeb99e 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java @@ -1,10 +1,9 @@ package org.mercury_im.messenger.xmpp.repository; -import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.xmpp.model.AccountModel; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.xmpp.model.EntityModel; -import org.mercury_im.messenger.thread_utils.ThreadUtils; +import org.mercury_im.messenger.xmpp.model.PeerModel; +import org.mercury_im.core.util.ThreadUtils; import javax.inject.Inject; import javax.inject.Named; @@ -35,8 +34,8 @@ public class RosterRepository extends RequeryRepository { } public Observable> getAllContactsOfAccount(long accountId) { - return data().select(ContactModel.class).join(EntityModel.class).on(ContactModel.ENTITY_ID.eq(EntityModel.ID)) - .where(EntityModel.ACCOUNT_ID.eq(accountId)) + return data().select(ContactModel.class).join(PeerModel.class).on(ContactModel.ENTITY_ID.eq(PeerModel.ID)) + .where(PeerModel.ACCOUNT_ID.eq(accountId)) .get().observableResult() .subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); } @@ -49,10 +48,10 @@ public class RosterRepository extends RequeryRepository { return data().delete(contact).subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); } - public Completable deleteContact(long accountId, EntityBareJid jid) { + public Completable deleteContact(long accountId, String address) { return data().delete(ContactModel.class).from(ContactModel.class) - .join(EntityModel.class).on(ContactModel.ENTITY_ID.eq(EntityModel.ID)) - .where(EntityModel.ACCOUNT_ID.eq(accountId).and(EntityModel.JID.eq(jid))) + .join(PeerModel.class).on(ContactModel.ENTITY_ID.eq(PeerModel.ID)) + .where(PeerModel.ACCOUNT_ID.eq(accountId).and(PeerModel.ADDRESS.eq(address))) .get().single().ignoreElement() .subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); } @@ -63,66 +62,66 @@ public class RosterRepository extends RequeryRepository { public Single deleteAllContactsOfAccount(long accountId) { return data().delete(ContactModel.class).from(ContactModel.class) - .join(EntityModel.class).on(ContactModel.ENTITY_ID.eq(EntityModel.ID)) - .where(EntityModel.ACCOUNT_ID.eq(accountId)) + .join(PeerModel.class).on(ContactModel.ENTITY_ID.eq(PeerModel.ID)) + .where(PeerModel.ACCOUNT_ID.eq(accountId)) .get().single() .subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); } /* - EntityModel related methods + PeerModel related methods */ - public Observable> getAllEntitiesOfAccount(AccountModel account) { + public Observable> getAllEntitiesOfAccount(AccountModel account) { return getAllEntitiesOfAccount(account.getId()); } - public Observable> getAllEntitiesOfAccount(long accountId) { - return data().select(EntityModel.class).where(EntityModel.ACCOUNT_ID.eq(accountId)) + public Observable> getAllEntitiesOfAccount(long accountId) { + return data().select(PeerModel.class).where(PeerModel.ACCOUNT_ID.eq(accountId)) .get().observableResult() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } - public Observable> getEntityById(long entityId) { - return data().select(EntityModel.class).where(EntityModel.ID.eq(entityId)) + public Observable> getEntityById(long entityId) { + return data().select(PeerModel.class).where(PeerModel.ID.eq(entityId)) .get().observableResult() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } - public Observable> getEntityByJid(AccountModel account, EntityBareJid jid) { - return getEntityByJid(account.getId(), jid); + public Observable> getEntityByJid(AccountModel account, String address) { + return getEntityByJid(account.getId(), address); } - public Observable> getEntityByJid(long accountId, EntityBareJid jid) { - return data().select(EntityModel.class) - .where(EntityModel.ACCOUNT_ID.eq(accountId).and(EntityModel.JID.eq(jid))) + public Observable> getEntityByJid(long accountId, String address) { + return data().select(PeerModel.class) + .where(PeerModel.ACCOUNT_ID.eq(accountId).and(PeerModel.ADDRESS.eq(address))) .get().observableResult() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } - public Single getOrCreateEntity(long accountId, EntityBareJid jid) { + public Single getOrCreateEntity(long accountId, String address) { return Single.fromCallable(() -> { AccountModel account = data().select(AccountModel.class).where(AccountModel.ID.eq(accountId)) .get().first(); - return getOrCreateEntity(account, jid).blockingGet(); + return getOrCreateEntity(account, address).blockingGet(); }) .observeOn(observerScheduler()) .subscribeOn(subscriberScheduler()); } - public Single getOrCreateEntity(AccountModel account, EntityBareJid jid) { + public Single getOrCreateEntity(AccountModel account, String address) { return Single.fromCallable(() -> { - EntityModel entity = data().select(EntityModel.class) - .where(EntityModel.ACCOUNT_ID.eq(account.getId()).and(EntityModel.JID.eq(jid))) + PeerModel entity = data().select(PeerModel.class) + .where(PeerModel.ACCOUNT_ID.eq(account.getId()).and(PeerModel.ADDRESS.eq(address))) .get().firstOrNull(); if (entity == null) { - entity = new EntityModel(); + entity = new PeerModel(); entity.setAccount(account); - entity.setJid(jid); + entity.setAddress(address); entity = data().insert(entity).blockingGet(); } return entity; @@ -132,13 +131,13 @@ public class RosterRepository extends RequeryRepository { } - public Single upsertEntity(EntityModel entity) { + public Single upsertEntity(PeerModel entity) { return data().upsert(entity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } - public Completable deleteEntity(EntityModel entity) { + public Completable deleteEntity(PeerModel entity) { return data().delete(entity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -180,14 +179,14 @@ public class RosterRepository extends RequeryRepository { .subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); } - public Observable> getContact(AccountModel account, EntityBareJid jid) { - return getContact(account.getId(), jid); + public Observable> getContact(AccountModel account, String address) { + return getContact(account.getId(), address); } - public Observable> getContact(long accountId, EntityBareJid jid) { + public Observable> getContact(long accountId, String address) { return data().select(ContactModel.class).from(ContactModel.class) - .join(EntityModel.class).on(ContactModel.ENTITY_ID.eq(EntityModel.ID)) - .where(EntityModel.ACCOUNT_ID.eq(accountId).and(EntityModel.JID.eq(jid))) + .join(PeerModel.class).on(ContactModel.ENTITY_ID.eq(PeerModel.ID)) + .where(PeerModel.ACCOUNT_ID.eq(accountId).and(PeerModel.ADDRESS.eq(address))) .get().observableResult() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); diff --git a/settings.gradle b/settings.gradle index b064df8..83c28a4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,12 +1,9 @@ include ':entity', - ':entity_xmpp', - ':repository', + ':data', ':repository_xmpp', - ':core', - ':transport', + ':domain', ':transport_xmpp', ':app', - ':thread_utils', ':core-old', ':view_entity' diff --git a/thread_utils/.gitignore b/thread_utils/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/thread_utils/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/thread_utils/README.md b/thread_utils/README.md deleted file mode 100644 index 2efbb17..0000000 --- a/thread_utils/README.md +++ /dev/null @@ -1,5 +0,0 @@ -The purpose of this module is to hold the `ThreadUtils` class, -on which both modules `persistence` as well as `core` depend. - -By moving that class into a separate module, we prevent a circular -dependency between `core` and `persistence`. \ No newline at end of file diff --git a/thread_utils/build.gradle b/thread_utils/build.gradle deleted file mode 100644 index d53d1be..0000000 --- a/thread_utils/build.gradle +++ /dev/null @@ -1,4 +0,0 @@ -apply plugin: 'java-library' - -sourceCompatibility = "8" -targetCompatibility = "8" diff --git a/transport/.gitignore b/transport/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/transport/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/transport/build.gradle b/transport/build.gradle deleted file mode 100644 index a723522..0000000 --- a/transport/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -apply plugin: 'java-library' - -dependencies { - - implementation project(':entity') - implementation project(':repository') - implementation project(":thread_utils") - - // RxJava2 - implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version" - - // Dagger 2 for dependency injection - implementation "com.google.dagger:dagger:$daggerVersion" - annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" - - // JUnit for testing - testImplementation "junit:junit:$junitVersion" -} - -sourceCompatibility = "8" -targetCompatibility = "8" diff --git a/transport/src/main/java/org/mercury_im/core/ConnectionFactory.java b/transport/src/main/java/org/mercury_im/core/ConnectionFactory.java deleted file mode 100644 index bdfe9ad..0000000 --- a/transport/src/main/java/org/mercury_im/core/ConnectionFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.mercury_im.core; - -import org.mercury_im.core.connection.ConnectionMethod; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; - -public interface ConnectionFactory< - CM extends ConnectionMethod, - AC extends Account, - AD extends Address.UserAddress, - AU extends Account.AuthMethod> { - - Messenger getMessenger(); - - CM provideConnection(AC account); - -} diff --git a/transport/src/main/java/org/mercury_im/core/connection/AbstractConnectionMethod.java b/transport/src/main/java/org/mercury_im/core/connection/AbstractConnectionMethod.java deleted file mode 100644 index 711b0af..0000000 --- a/transport/src/main/java/org/mercury_im/core/connection/AbstractConnectionMethod.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.mercury_im.core.connection; - -import org.mercury_im.core.Messenger; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; - -public abstract class AbstractConnectionMethod< - AC extends Account, - AD extends Address.UserAddress> - implements ConnectionMethod { - - protected final AC account; - protected final Messenger messenger; - - public AbstractConnectionMethod(AC account, Messenger messenger) { - this.account = account; - this.messenger = messenger; - } - - @Override - public AC getAccount() { - return account; - } - - @Override - public Messenger getMessenger() { - return messenger; - } -} diff --git a/transport/src/main/java/org/mercury_im/core/connection/ConnectionMethod.java b/transport/src/main/java/org/mercury_im/core/connection/ConnectionMethod.java deleted file mode 100644 index cf1b6b0..0000000 --- a/transport/src/main/java/org/mercury_im/core/connection/ConnectionMethod.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.mercury_im.core.connection; - -import org.mercury_im.core.Messenger; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; - -import io.reactivex.Completable; - -public interface ConnectionMethod< - AC extends Account, - AD extends Address.UserAddress> { - - AC getAccount(); - - Messenger getMessenger(); - - Completable connect(); - -} diff --git a/transport/src/main/java/org/mercury_im/core/listener/IncomingDirectMessageListener.java b/transport/src/main/java/org/mercury_im/core/listener/IncomingDirectMessageListener.java deleted file mode 100644 index 4dad85c..0000000 --- a/transport/src/main/java/org/mercury_im/core/listener/IncomingDirectMessageListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.mercury_im.core.listener; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.chat.DirectChat; -import org.mercury_im.messenger.core.entity.contact.Interlocutor; -import org.mercury_im.messenger.core.entity.message.AbstractMessage; - -public interface IncomingDirectMessageListener< - AC extends Account, - AD extends Address.UserAddress, - IL extends Interlocutor> { - - void onIncomingDirectMessage(AC account, DirectChat chat, AbstractMessage message); - -} diff --git a/transport/src/main/java/org/mercury_im/core/listener/IncomingGroupChatMessageListener.java b/transport/src/main/java/org/mercury_im/core/listener/IncomingGroupChatMessageListener.java deleted file mode 100644 index c8a48bf..0000000 --- a/transport/src/main/java/org/mercury_im/core/listener/IncomingGroupChatMessageListener.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.mercury_im.core.listener; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.chat.DirectChat; -import org.mercury_im.messenger.core.entity.chat.GroupChat; -import org.mercury_im.messenger.core.entity.contact.Interlocutor; -import org.mercury_im.messenger.core.entity.message.AbstractMessage; - -public interface IncomingGroupChatMessageListener< - AC extends Account, - AD extends Address.UserAddress, - RA extends Address.RoomAddress, - PA extends Address.RoomParticipantAddress, - IL extends Interlocutor> { - - void onIncomingDirectMessage(AC account, GroupChat chat, AbstractMessage message); - -} diff --git a/transport/src/main/java/org/mercury_im/core/listener/TypingEventListener.java b/transport/src/main/java/org/mercury_im/core/listener/TypingEventListener.java deleted file mode 100644 index 022ef11..0000000 --- a/transport/src/main/java/org/mercury_im/core/listener/TypingEventListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.mercury_im.core.listener; - -public interface TypingEventListener { - -} diff --git a/transport/src/main/java/org/mercury_im/core/message/MessageCenter.java b/transport/src/main/java/org/mercury_im/core/message/MessageCenter.java deleted file mode 100644 index 3b5592c..0000000 --- a/transport/src/main/java/org/mercury_im/core/message/MessageCenter.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.mercury_im.core.message; - -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.Address; -import org.mercury_im.messenger.core.entity.chat.Chat; -import org.mercury_im.messenger.core.entity.message.Message; -import org.mercury_im.messenger.core.entity.message.MessageMetadata; - -import io.reactivex.Completable; - -public interface MessageCenter< - M extends Message, - C extends Chat, - AD extends Address.UserAddress, - MM extends MessageMetadata, - AC extends Account> { - - Completable sendMessage(M message, C chat); - - void addIncomingMessageListener(); -} diff --git a/transport_xmpp/build.gradle b/transport_xmpp/build.gradle index 9831b1e..5de9efc 100644 --- a/transport_xmpp/build.gradle +++ b/transport_xmpp/build.gradle @@ -1,9 +1,9 @@ apply plugin: 'java-library' dependencies { + implementation project(":entity") + implementation project(':domain') implementation project(":repository_xmpp") - implementation project(":entity_xmpp") - implementation project(":transport") // Smack // Not all of those are needed, but it may be a good idea to define those versions explicitly diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionFactory.java b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionFactory.java index 76f2aa0..021c2c6 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionFactory.java +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionFactory.java @@ -2,13 +2,12 @@ package org.mercury_im.xmpp.connection; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.XMPPConnection; -import org.mercury_im.core.ConnectionFactory; import org.mercury_im.core.Messenger; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; -import org.mercury_im.messenger.xmpp.entity.XmppAuthMethod; +import org.mercury_im.core.transport.connection.ConnectionFactory; +import org.mercury_im.messenger.core.entity.Account; -public abstract class XmppConnectionFactory implements ConnectionFactory { +public abstract class XmppConnectionFactory + implements ConnectionFactory { protected final Messenger messenger; @@ -21,9 +20,11 @@ public abstract class XmppConnectionFactory implements ConnectionFactory { - - private XMPPConnection connection; - - public XmppConnectionMethod(XmppAccount account, Messenger messenger, XMPPConnection connection) { - super(account, messenger); - this.connection = connection; - } - - @Override - public Completable connect() { - if (connection.isConnected()) { - return Completable.complete(); - } - - return Completable.fromAction(() -> ((AbstractXMPPConnection) connection).connect().login()); - } -} diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionFactory.java b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionFactory.java index c27ce77..e5e3063 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionFactory.java +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionFactory.java @@ -1,20 +1,36 @@ package org.mercury_im.xmpp.connection; -import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.tcp.XMPPTCPConnection; import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; +import org.jxmpp.jid.EntityBareJid; +import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.core.Messenger; +import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.xmpp.entity.XmppAuthMethod; -public class XmppTcpConnectionFactory extends XmppConnectionFactory { +public class XmppTcpConnectionFactory extends XmppConnectionFactory { public XmppTcpConnectionFactory(Messenger messenger) { super(messenger); } @Override - protected XMPPConnection createXmppConnection(ConnectionConfiguration configuration) { - XMPPTCPConnectionConfiguration tcpConfiguration = (XMPPTCPConnectionConfiguration) configuration; - return new XMPPTCPConnection(tcpConfiguration); + protected XMPPTCPConnectionConfiguration getConfiguration(Account account) { + XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); + configBuilder.setConnectTimeout(20 * 1000); + + if (account.getAuthentication() instanceof XmppAuthMethod.AuthPassword) { + XmppAuthMethod.AuthPassword authPassword = (XmppAuthMethod.AuthPassword) account.getAuthentication(); + EntityBareJid accountAddress = JidCreate.entityBareFromOrThrowUnchecked(account.getAddress()); + configBuilder.setXmppAddressAndPassword(accountAddress, authPassword.getPassword()); + } + + return configBuilder.build(); + } + + @Override + protected XMPPConnection createXmppConnection(XMPPTCPConnectionConfiguration configuration) { + return new XMPPTCPConnection(configuration); } } diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionMethod.java b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionMethod.java new file mode 100644 index 0000000..8954cb5 --- /dev/null +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionMethod.java @@ -0,0 +1,59 @@ +package org.mercury_im.xmpp.connection; + +import org.jivesoftware.smack.AbstractXMPPConnection; +import org.jivesoftware.smack.XMPPConnection; +import org.mercury_im.core.Messenger; +import org.mercury_im.core.transport.ConnectionType; +import org.mercury_im.core.transport.connection.AbstractConnectionMethod; +import org.mercury_im.messenger.core.entity.Account; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import io.reactivex.Completable; + +public class XmppTcpConnectionMethod extends AbstractConnectionMethod { + + private static final Logger LOGGER = Logger.getLogger(XmppTcpConnectionMethod.class.getName()); + + private XMPPConnection connection; + + public XmppTcpConnectionMethod(Account account, Messenger messenger, XMPPConnection connection) { + super(account, messenger); + this.connection = connection; + } + + @Override + public Completable connect() { + if (connection.isConnected()) { + return Completable.complete(); + } + + return Completable.fromAction( + () -> { + AbstractXMPPConnection con = (AbstractXMPPConnection) connection; + try { + con.connect(); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Exception while connecting to XMPP account " + account.getId(), e); + throw e; + } + + try { + con.login(); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Exception while logging into XMPP account " + account.getId(), e); + throw e; + } + }); + } + + public XMPPConnection getConnection() { + return connection; + } + + @Override + public ConnectionType getConnectionType() { + return ConnectionType.SMACK_TCP; + } +} diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/message/XmppDirectMessageCenter.java b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/message/XmppDirectMessageCenter.java index dcad5b0..348c7d8 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/message/XmppDirectMessageCenter.java +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/message/XmppDirectMessageCenter.java @@ -2,49 +2,61 @@ package org.mercury_im.xmpp.connection.message; import org.jivesoftware.smack.chat2.Chat; import org.jivesoftware.smack.chat2.ChatManager; -import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smackx.sid.element.OriginIdElement; -import org.mercury_im.core.message.MessageCenter; -import org.mercury_im.messenger.xmpp.entity.XmppAccount; -import org.mercury_im.messenger.xmpp.entity.XmppAddress; -import org.mercury_im.messenger.xmpp.entity.chat.XmppDirectChat; -import org.mercury_im.messenger.xmpp.entity.message.XmppMessage; -import org.mercury_im.messenger.xmpp.entity.message.XmppMessageMetadata; +import org.jxmpp.jid.EntityBareJid; +import org.jxmpp.jid.impl.JidCreate; +import org.mercury_im.core.Messenger; +import org.mercury_im.core.transport.listener.IncomingDirectMessageListener; +import org.mercury_im.messenger.core.entity.message.Message; +import org.mercury_im.core.MessageCenter; +import org.mercury_im.messenger.core.entity.chat.DirectChat; +import org.mercury_im.xmpp.connection.XmppTcpConnectionMethod; import io.reactivex.Completable; public class XmppDirectMessageCenter - implements MessageCenter< - XmppMessage.DirectMessage, - XmppDirectChat, - XmppAddress.XmppUserAddress, - XmppMessageMetadata, - XmppAccount> { + implements MessageCenter { + private final Messenger messenger; + + public XmppDirectMessageCenter(Messenger messenger) { + this.messenger = messenger; + } @Override - public Completable sendMessage(XmppMessage.DirectMessage message, XmppDirectChat chat) { + public Messenger getMessenger() { + return messenger; + } + + @Override + public Completable sendMessage(Message message, DirectChat chat) { ChatManager chatManager = getChatManager(chat); - Message smackMessage = new Message(); - smackMessage.setFrom(chat.getAccount().getAddress().getJid()); - smackMessage.setTo(chat.getInterlocutor().getAddress().getJid()); - smackMessage.setType(Message.Type.chat); + EntityBareJid accountAddress = + JidCreate.entityBareFromOrThrowUnchecked(chat.getAccount().getAddress()); + EntityBareJid peerAddress = + JidCreate.entityBareFromOrThrowUnchecked(chat.getPeer().getAddress()); + + org.jivesoftware.smack.packet.Message smackMessage = new org.jivesoftware.smack.packet.Message(); + smackMessage.setFrom(accountAddress); + smackMessage.setTo(peerAddress); + smackMessage.setType(org.jivesoftware.smack.packet.Message.Type.chat); OriginIdElement.addOriginId(smackMessage); - Chat smackChat = chatManager.chatWith(chat.getInterlocutor().getAddress().getJid()); + Chat smackChat = chatManager.chatWith(peerAddress); return Completable.fromAction( () -> smackChat.send(smackMessage)); } @Override - public void addIncomingMessageListener() { + public void addIncomingMessageListener(IncomingDirectMessageListener listener) { } - protected ChatManager getChatManager(XmppDirectChat chat) { - return null; + protected ChatManager getChatManager(DirectChat chat) { + XmppTcpConnectionMethod connectionMethod = (XmppTcpConnectionMethod) getMessenger().getConnection(chat.getAccount()); + return ChatManager.getInstanceFor(connectionMethod.getConnection()); } } diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAuthMethod.java b/transport_xmpp/src/main/java/org/mercury_im/xmpp/entity/XmppAuthMethod.java similarity index 92% rename from entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAuthMethod.java rename to transport_xmpp/src/main/java/org/mercury_im/xmpp/entity/XmppAuthMethod.java index 4516ffe..64b0071 100644 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAuthMethod.java +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/entity/XmppAuthMethod.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.xmpp.entity; +package org.mercury_im.xmpp.entity; import org.mercury_im.messenger.core.entity.Account;