From baeabc06029e8ef7ccd83c4993ca1e2282a954c9 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 16 Nov 2019 09:58:00 +0100 Subject: [PATCH] Temporary commit --- .../core/usecase/SendDirectMessage.java | 33 +++++ .../xmpp/entity/message/XmppMessage.java | 4 +- settings.gradle | 3 +- .../core/message/MessageCenter.java | 21 +++ transport_xmpp/build.gradle | 8 ++ .../connection/XmppConnectionFactory.java | 14 +- .../xmpp/connection/XmppConnectionMethod.java | 13 +- .../connection/XmppTcpConnectionFactory.java | 20 +++ .../message/XmppDirectMessageCenter.java | 50 +++++++ view_entity/.gitignore | 1 + view_entity/build.gradle | 8 ++ .../view/entity/ViewInterlocutor.java | 134 ++++++++++++++++++ .../definition/InterlocutorViewEntity.java | 20 +++ 13 files changed, 320 insertions(+), 9 deletions(-) create mode 100644 core/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java create mode 100644 transport/src/main/java/org/mercury_im/core/message/MessageCenter.java create mode 100644 transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionFactory.java create mode 100644 transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/message/XmppDirectMessageCenter.java create mode 100644 view_entity/.gitignore create mode 100644 view_entity/build.gradle create mode 100644 view_entity/src/main/java/org/mercury_im/messenger/view/entity/ViewInterlocutor.java create mode 100644 view_entity/src/main/java/org/mercury_im/messenger/view/entity/definition/InterlocutorViewEntity.java 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 new file mode 100644 index 0000000..b642ace --- /dev/null +++ b/core/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java @@ -0,0 +1,33 @@ +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/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 index df185eb..e60ca64 100644 --- 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 @@ -3,9 +3,7 @@ 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 extends AbstractMessage< - XmppAddress, - XmppMessageMetadata> { +public final class XmppMessage { private XmppMessage() { diff --git a/settings.gradle b/settings.gradle index 55efc78..b064df8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,6 +7,7 @@ include ':entity', ':transport_xmpp', ':app', ':thread_utils', - ':core-old' + ':core-old', + ':view_entity' includeBuild 'libs/Smack' 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 new file mode 100644 index 0000000..3b5592c --- /dev/null +++ b/transport/src/main/java/org/mercury_im/core/message/MessageCenter.java @@ -0,0 +1,21 @@ +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 6995069..9831b1e 100644 --- a/transport_xmpp/build.gradle +++ b/transport_xmpp/build.gradle @@ -4,6 +4,14 @@ dependencies { 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 + api "org.igniterealtime.smack:smack-core:$smackCoreVersion" + api "org.igniterealtime.smack:smack-experimental:$smackExperimentalVersion" + api "org.igniterealtime.smack:smack-extensions:$smackExtensionsVersion" + api "org.igniterealtime.smack:smack-im:$smackImVersion" + api "org.igniterealtime.smack:smack-tcp:$smackTcpVersion" } sourceCompatibility = "8" 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 44a27e0..76f2aa0 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 @@ -1,14 +1,20 @@ 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; -public class XmppConnectionFactory implements ConnectionFactory { +public abstract class XmppConnectionFactory implements ConnectionFactory { - protected Messenger messenger; + protected final Messenger messenger; + + public XmppConnectionFactory(Messenger messenger) { + this.messenger = messenger; + } public Messenger getMessenger() { return messenger; @@ -16,6 +22,8 @@ public class XmppConnectionFactory implements ConnectionFactory { - public XmppConnectionMethod(XmppAccount account, Messenger messenger) { + private XMPPConnection connection; + + public XmppConnectionMethod(XmppAccount account, Messenger messenger, XMPPConnection connection) { super(account, messenger); + this.connection = connection; } @Override public Completable connect() { - return null; + 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 new file mode 100644 index 0000000..c27ce77 --- /dev/null +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionFactory.java @@ -0,0 +1,20 @@ +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.mercury_im.core.Messenger; + +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); + } +} 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 new file mode 100644 index 0000000..dcad5b0 --- /dev/null +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/message/XmppDirectMessageCenter.java @@ -0,0 +1,50 @@ +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 io.reactivex.Completable; + +public class XmppDirectMessageCenter + implements MessageCenter< + XmppMessage.DirectMessage, + XmppDirectChat, + XmppAddress.XmppUserAddress, + XmppMessageMetadata, + XmppAccount> { + + + @Override + public Completable sendMessage(XmppMessage.DirectMessage message, XmppDirectChat 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); + + OriginIdElement.addOriginId(smackMessage); + + + Chat smackChat = chatManager.chatWith(chat.getInterlocutor().getAddress().getJid()); + return Completable.fromAction( + () -> smackChat.send(smackMessage)); + } + + @Override + public void addIncomingMessageListener() { + + } + + protected ChatManager getChatManager(XmppDirectChat chat) { + return null; + } +} diff --git a/view_entity/.gitignore b/view_entity/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/view_entity/.gitignore @@ -0,0 +1 @@ +/build diff --git a/view_entity/build.gradle b/view_entity/build.gradle new file mode 100644 index 0000000..7fa7473 --- /dev/null +++ b/view_entity/build.gradle @@ -0,0 +1,8 @@ +apply plugin: 'java-library' + +dependencies { + implementation project(':entity') +} + +sourceCompatibility = "8" +targetCompatibility = "8" diff --git a/view_entity/src/main/java/org/mercury_im/messenger/view/entity/ViewInterlocutor.java b/view_entity/src/main/java/org/mercury_im/messenger/view/entity/ViewInterlocutor.java new file mode 100644 index 0000000..7103a61 --- /dev/null +++ b/view_entity/src/main/java/org/mercury_im/messenger/view/entity/ViewInterlocutor.java @@ -0,0 +1,134 @@ +package org.mercury_im.messenger.view.entity; + +import org.mercury_im.messenger.core.entity.contact.Contact; +import org.mercury_im.messenger.view.entity.definition.InterlocutorViewEntity; + +public class ViewInterlocutor implements InterlocutorViewEntity { + + private final String name; + private final String address; + private final String accountAddress; + private final Contact.SubscriptionMode subscriptionMode; + private final String lastActivity; + private final boolean isTyping; + private final String status; + private final A avatar; + + private ViewInterlocutor(String name, + String address, + String accountAddress, + Contact.SubscriptionMode subscriptionMode, + String lastActivity, + boolean isTyping, + String status, + A avatar) { + this.name = name; + this.address = address; + this.accountAddress = accountAddress; + this.subscriptionMode = subscriptionMode; + this.lastActivity = lastActivity; + this.isTyping = isTyping; + this.status = status; + this.avatar = avatar; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getAddress() { + return address; + } + + @Override + public String getAccountAddress() { + return accountAddress; + } + + @Override + public Contact.SubscriptionMode getSubscriptionMode() { + return subscriptionMode; + } + + @Override + public String getLastActivity() { + return lastActivity; + } + + @Override + public boolean isTyping() { + return isTyping; + } + + @Override + public String getStatus() { + return status; + } + + public A getAvatar() { + return avatar; + } + + public static Builder builder() { + return new Builder<>(); + } + + private static class Builder { + + private String name; + private String address; + private String accountAddress; + private Contact.SubscriptionMode subscriptionMode; + private String lastActivity; + private boolean isTyping; + private String status; + private A avatar; + + public Builder setName(String name) { + this.name = name; + return this; + } + + public Builder setAddress(String address) { + this.address = address; + return this; + } + + public Builder setAccountAddress(String accountAddress) { + this.accountAddress = accountAddress; + return this; + } + + public Builder setSubscriptionMode(Contact.SubscriptionMode subscriptionMode) { + this.subscriptionMode = subscriptionMode; + return this; + } + + public Builder setLastActivity(String lastActivity) { + this.lastActivity = lastActivity; + return this; + } + + public Builder setIsTyping(boolean isTyping) { + this.isTyping = isTyping; + return this; + } + + public Builder setStatus(String status) { + this.status = status; + return this; + } + + public Builder setAvatar(A avatar) { + this.avatar = avatar; + return this; + } + + public ViewInterlocutor build() { + return new ViewInterlocutor<>(name, address, accountAddress, subscriptionMode, + lastActivity, isTyping, status, avatar); + } + } +} diff --git a/view_entity/src/main/java/org/mercury_im/messenger/view/entity/definition/InterlocutorViewEntity.java b/view_entity/src/main/java/org/mercury_im/messenger/view/entity/definition/InterlocutorViewEntity.java new file mode 100644 index 0000000..3bc9359 --- /dev/null +++ b/view_entity/src/main/java/org/mercury_im/messenger/view/entity/definition/InterlocutorViewEntity.java @@ -0,0 +1,20 @@ +package org.mercury_im.messenger.view.entity.definition; + +import org.mercury_im.messenger.core.entity.contact.Contact; + +public interface InterlocutorViewEntity { + + String getName(); + + String getAddress(); + + String getAccountAddress(); + + Contact.SubscriptionMode getSubscriptionMode(); + + String getLastActivity(); + + boolean isTyping(); + + String getStatus(); +}