From da9179b0499ae6cffd327ae90c0dc6c8fc9822f0 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 3 Nov 2019 06:33:52 +0100 Subject: [PATCH 01/83] Begin work on stricter clean architecture. * Created modules entity, entity_xmpp, which contain entities and their respective XMPP implementations * Started process of inverting dependency between core and persistence layers --- .idea/encodings.xml | 4 - .idea/gradle.xml | 3 +- .idea/misc.xml | 4 +- .idea/vcs.xml | 2 +- .../messenger/RequeryDatabaseTest.java | 14 +- .../messenger/MercuryImApplication.java | 2 +- .../mercury_im/messenger/Notifications.java | 2 +- .../di/module/AndroidPersistenceModule.java | 2 +- .../messenger/di/module/AppModule.java | 2 +- .../mercury_im/messenger/ui/MainActivity.java | 4 +- .../messenger/ui/chat/ChatActivity.java | 4 +- .../messenger/ui/chat/ChatViewModel.java | 14 +- .../ui/chat/MessagesRecyclerViewAdapter.java | 2 +- .../chatlist/ChatListRecyclerViewAdapter.java | 2 +- .../ui/chatlist/ChatListViewModel.java | 6 +- .../messenger/ui/login/AccountsFragment.java | 2 +- .../ui/login/AccountsRecyclerViewAdapter.java | 2 +- .../messenger/ui/login/AccountsViewModel.java | 6 +- .../messenger/ui/login/LoginActivity.java | 2 +- .../messenger/ui/login/LoginViewModel.java | 6 +- .../contacts/ContactListItemViewModel.java | 4 +- .../ContactListRecyclerViewAdapter.java | 2 +- .../roster/contacts/ContactListViewModel.java | 4 +- core/build.gradle | 3 +- .../messenger/core/NotificationManager.java | 2 +- .../core/centers/ConnectionCenter.java | 12 +- .../messenger/core/di/CenterModule.java | 6 +- .../messenger/core/di/XmppComponent.java | 2 +- .../core/stores/EntityCapsStore.java | 5 +- .../core/stores/PlainMessageStore.java | 18 +-- .../messenger/core/stores/RosterStore.java | 18 +-- .../messenger/core/util/ContactNameUtil.java | 4 +- {persistence => entity}/.gitignore | 0 entity/README.md | 5 + entity/build.gradle | 8 + .../core/entity/AbstractAccount.java | 53 ++++++ .../core/entity/AbstractDirectChat.java | 42 +++++ .../core/entity/AbstractGroupChat.java | 53 ++++++ .../core/entity/AbstractInterlocutor.java | 52 ++++++ .../core/entity/AbstractMessage.java | 84 ++++++++++ .../messenger/core/entity/Account.java | 34 ++++ .../messenger/core/entity/Address.java | 24 +++ .../messenger/core/entity/Chat.java | 15 ++ .../messenger/core/entity/Contact.java | 43 +++++ .../messenger/core/entity/DirectChat.java | 13 ++ .../messenger/core/entity/GroupChat.java | 16 ++ .../messenger/core/entity/Interlocutor.java | 28 ++++ .../messenger/core/entity/Message.java | 35 ++++ .../core/entity/MessageDeliveryState.java | 10 ++ .../core/entity/MessageMetadata.java | 9 ++ entity_xmpp/.gitignore | 1 + entity_xmpp/build.gradle | 11 ++ .../messenger/xmpp/entity/XmppAccount.java | 7 + .../messenger/xmpp/entity/XmppAddress.java | 46 ++++++ .../messenger/xmpp/entity/XmppAuthMethod.java | 24 +++ .../messenger/xmpp/entity/XmppDirectChat.java | 7 + .../messenger/xmpp/entity/XmppGroupChat.java | 7 + .../xmpp/entity/XmppInterlocutor.java | 7 + .../messenger/xmpp/entity/XmppMessage.java | 7 + .../xmpp/entity/XmppMessageMetadata.java | 7 + .../repository/AccountRepository.java | 50 ------ repository/.gitignore | 1 + repository/build.gradle | 12 ++ .../core/repository/AccountRepository.java | 36 +++++ .../core/repository/ContactRepository.java | 37 +++++ .../core/repository/DirectChatRepository.java | 55 +++++++ .../core/repository/GroupChatRepository.java | 54 +++++++ .../messenger/core/util/Optional.java | 23 +++ repository_xmpp/.gitignore | 1 + {persistence => repository_xmpp}/build.gradle | 3 + .../converter/EntityBareJidConverter.java | 2 +- .../converter/SaslConditionConverter.java | 4 +- .../SubscriptionDirectionConverter.java | 4 +- .../xmpp/converter/XmppAddressConverter.java | 32 ++++ .../messenger/xmpp}/di/RequeryModule.java | 18 +-- .../messenger/xmpp}/enums/SaslCondition.java | 2 +- .../xmpp}/enums/SubscriptionDirection.java | 2 +- .../xmpp/mapping/AccountMapping.java | 36 +++++ .../xmpp/model}/AbstractAccountModel.java | 8 +- .../xmpp/model}/AbstractChatModel.java | 2 +- .../xmpp/model}/AbstractContactModel.java | 6 +- .../xmpp/model}/AbstractEntityCapsModel.java | 2 +- .../xmpp/model}/AbstractEntityModel.java | 4 +- .../AbstractLastChatMessageRelation.java | 2 +- .../AbstractLastReadChatMessageRelation.java | 2 +- .../xmpp/model}/AbstractMessageModel.java | 4 +- ...AbstractSaslAuthenticationResultModel.java | 4 +- .../xmpp}/repository/AbstractRepository.java | 2 +- .../xmpp}/repository/ChatRepository.java | 14 +- .../repository/EntityCapsRepository.java | 7 +- .../xmpp}/repository/MessageRepository.java | 13 +- .../ReactiveXmppAccountRepository.java | 152 ++++++++++++++++++ .../xmpp}/repository/RequeryRepository.java | 2 +- .../xmpp}/repository/RosterRepository.java | 8 +- .../xmpp}/util/ChatAndPossiblyContact.java | 6 +- settings.gradle | 10 +- 96 files changed, 1227 insertions(+), 206 deletions(-) delete mode 100644 .idea/encodings.xml rename {persistence => entity}/.gitignore (100%) create mode 100644 entity/README.md create mode 100644 entity/build.gradle create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractAccount.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractDirectChat.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractGroupChat.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractInterlocutor.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractMessage.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/Address.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/Contact.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/DirectChat.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/GroupChat.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/Interlocutor.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/MessageDeliveryState.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/MessageMetadata.java create mode 100644 entity_xmpp/.gitignore create mode 100644 entity_xmpp/build.gradle create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAccount.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAddress.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAuthMethod.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppDirectChat.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppGroupChat.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppInterlocutor.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessage.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessageMetadata.java delete mode 100644 persistence/src/main/java/org/mercury_im/messenger/persistence/repository/AccountRepository.java create mode 100644 repository/.gitignore create mode 100644 repository/build.gradle create mode 100644 repository/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java create mode 100644 repository/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java create mode 100644 repository/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java create mode 100644 repository/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java create mode 100644 repository/src/main/java/org/mercury_im/messenger/core/util/Optional.java create mode 100644 repository_xmpp/.gitignore rename {persistence => repository_xmpp}/build.gradle (92%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/converter/EntityBareJidConverter.java (93%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/converter/SaslConditionConverter.java (85%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/converter/SubscriptionDirectionConverter.java (86%) create mode 100644 repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/XmppAddressConverter.java rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/di/RequeryModule.java (68%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/enums/SaslCondition.java (98%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/enums/SubscriptionDirection.java (63%) create mode 100644 repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractAccountModel.java (79%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractChatModel.java (88%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractContactModel.java (81%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractEntityCapsModel.java (85%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractEntityModel.java (83%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractLastChatMessageRelation.java (88%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractLastReadChatMessageRelation.java (88%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractMessageModel.java (88%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence/entity => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model}/AbstractSaslAuthenticationResultModel.java (75%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/repository/AbstractRepository.java (98%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/repository/ChatRepository.java (89%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/repository/EntityCapsRepository.java (74%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/repository/MessageRepository.java (88%) create mode 100644 repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/repository/RequeryRepository.java (94%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/repository/RosterRepository.java (97%) rename {persistence/src/main/java/org/mercury_im/messenger/persistence => repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp}/util/ChatAndPossiblyContact.java (68%) diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 15a15b2..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 8567414..e478165 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -80,11 +80,12 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 2326c24..974f06a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,4 @@ - - - + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 194b1f0..d4e6d58 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/app/src/androidTest/java/org/mercury_im/messenger/RequeryDatabaseTest.java b/app/src/androidTest/java/org/mercury_im/messenger/RequeryDatabaseTest.java index 32ea850..44379e3 100644 --- a/app/src/androidTest/java/org/mercury_im/messenger/RequeryDatabaseTest.java +++ b/app/src/androidTest/java/org/mercury_im/messenger/RequeryDatabaseTest.java @@ -9,13 +9,13 @@ import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.jxmpp.jid.impl.JidCreate; -import org.mercury_im.messenger.persistence.requery.entity.AccountModel; -import org.mercury_im.messenger.persistence.requery.entity.ChatModel; -import org.mercury_im.messenger.persistence.requery.entity.ContactModel; -import org.mercury_im.messenger.persistence.requery.entity.EntityModel; -import org.mercury_im.messenger.persistence.requery.entity.LastReadChatMessageRelation; -import org.mercury_im.messenger.persistence.requery.entity.MessageModel; -import org.mercury_im.messenger.persistence.requery.entity.Models; +import org.mercury_im.messenger.xmpp.requery.entity.AccountModel; +import org.mercury_im.messenger.xmpp.requery.entity.ChatModel; +import org.mercury_im.messenger.xmpp.requery.entity.ContactModel; +import org.mercury_im.messenger.xmpp.requery.entity.EntityModel; +import org.mercury_im.messenger.xmpp.requery.entity.LastReadChatMessageRelation; +import org.mercury_im.messenger.xmpp.requery.entity.MessageModel; +import org.mercury_im.messenger.xmpp.requery.entity.Models; import org.mercury_im.messenger.core.requery.enums.SubscriptionDirection; import io.reactivex.disposables.Disposable; diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index 8f49cfa..ee2f0c2 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -11,7 +11,7 @@ import android.os.Build; import org.mercury_im.messenger.core.centers.ConnectionCenter; import org.mercury_im.messenger.core.connection.MercuryConfiguration; -import org.mercury_im.messenger.persistence.util.ChatAndPossiblyContact; +import org.mercury_im.messenger.xmpp.util.ChatAndPossiblyContact; import org.mercury_im.messenger.core.util.ContactNameUtil; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; diff --git a/app/src/main/java/org/mercury_im/messenger/Notifications.java b/app/src/main/java/org/mercury_im/messenger/Notifications.java index 702ab1f..8673aa9 100644 --- a/app/src/main/java/org/mercury_im/messenger/Notifications.java +++ b/app/src/main/java/org/mercury_im/messenger/Notifications.java @@ -7,7 +7,7 @@ import android.content.Intent; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; -import org.mercury_im.messenger.persistence.entity.ChatModel; +import org.mercury_im.messenger.xmpp.model.ChatModel; import org.mercury_im.messenger.ui.chat.ChatActivity; public class Notifications { diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java index 1598587..603423d 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java @@ -3,7 +3,7 @@ package org.mercury_im.messenger.di.module; import android.app.Application; import org.mercury_im.messenger.BuildConfig; -import org.mercury_im.messenger.persistence.entity.Models; +import org.mercury_im.messenger.xmpp.model.Models; import org.mercury_im.messenger.thread_utils.ThreadUtils; import javax.inject.Named; diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java index 81e8491..d3b0bd5 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java @@ -8,7 +8,7 @@ import dagger.Provides; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.di.CenterModule; -import org.mercury_im.messenger.persistence.di.RequeryModule; +import org.mercury_im.messenger.xmpp.di.RequeryModule; import javax.inject.Singleton; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index 7ec36ee..2e17196 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -15,8 +15,8 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.persistence.entity.AccountModel; -import org.mercury_im.messenger.persistence.repository.ChatRepository; +import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.xmpp.repository.ChatRepository; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; import org.mercury_im.messenger.ui.login.AccountsFragment; import org.mercury_im.messenger.ui.roster.RosterFragment; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java index 02b24b5..5981b24 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java @@ -11,7 +11,6 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; import androidx.lifecycle.ViewModelProvider; -import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -23,14 +22,13 @@ import io.reactivex.schedulers.Schedulers; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.chat2.ChatManager; -import org.jivesoftware.smack.packet.Message; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.persistence.repository.ChatRepository; +import org.mercury_im.messenger.xmpp.repository.ChatRepository; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 5629431..69f2799 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -7,13 +7,13 @@ import androidx.lifecycle.ViewModel; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.persistence.entity.ChatModel; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.entity.EntityModel; -import org.mercury_im.messenger.persistence.entity.MessageModel; -import org.mercury_im.messenger.persistence.repository.ChatRepository; -import org.mercury_im.messenger.persistence.repository.MessageRepository; -import org.mercury_im.messenger.persistence.repository.RosterRepository; +import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.xmpp.model.ContactModel; +import org.mercury_im.messenger.xmpp.model.EntityModel; +import org.mercury_im.messenger.xmpp.model.MessageModel; +import org.mercury_im.messenger.xmpp.repository.ChatRepository; +import org.mercury_im.messenger.xmpp.repository.MessageRepository; +import org.mercury_im.messenger.xmpp.repository.RosterRepository; import java.util.List; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java index 2bac3f8..67536f9 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java @@ -10,7 +10,7 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.persistence.entity.MessageModel; +import org.mercury_im.messenger.xmpp.model.MessageModel; import org.mercury_im.messenger.ui.util.MessageBackgroundDrawable; import java.util.ArrayList; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java index a29c9e0..1e082e8 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java @@ -16,7 +16,7 @@ import androidx.appcompat.view.ActionMode; import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.persistence.entity.ChatModel; +import org.mercury_im.messenger.xmpp.model.ChatModel; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter; import org.mercury_im.messenger.util.ColorUtil; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java index 1e06355..f09e91d 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java @@ -5,9 +5,9 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.persistence.entity.ChatModel; -import org.mercury_im.messenger.persistence.repository.ChatRepository; -import org.mercury_im.messenger.persistence.repository.MessageRepository; +import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.xmpp.repository.ChatRepository; +import org.mercury_im.messenger.xmpp.repository.MessageRepository; import java.util.List; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java index 29f11b7..d0e6db6 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java @@ -17,7 +17,7 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.persistence.entity.AccountModel; +import org.mercury_im.messenger.xmpp.model.AccountModel; import butterknife.BindView; import butterknife.ButterKnife; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java index 561687d..deba1d2 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java @@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.persistence.entity.AccountModel; +import org.mercury_im.messenger.xmpp.model.AccountModel; import org.mercury_im.messenger.ui.login.AccountsFragment.OnAccountListItemClickListener; import org.mercury_im.messenger.util.AbstractDiffCallback; import org.mercury_im.messenger.util.ColorUtil; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java index 9436a94..f9251a1 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java @@ -10,8 +10,8 @@ import androidx.lifecycle.MutableLiveData; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.core.centers.ConnectionCenter; import org.mercury_im.messenger.core.connection.MercuryConnection; -import org.mercury_im.messenger.persistence.entity.AccountModel; -import org.mercury_im.messenger.persistence.repository.AccountRepository; +import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.xmpp.repository.RequeryAccountRepository; import java.util.List; @@ -22,7 +22,7 @@ import io.reactivex.disposables.CompositeDisposable; public class AccountsViewModel extends AndroidViewModel { @Inject - AccountRepository repository; + RequeryAccountRepository repository; @Inject ConnectionCenter connectionCenter; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index 5e07325..db1a89a 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -15,7 +15,7 @@ import com.google.android.material.textfield.TextInputEditText; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.persistence.entity.AccountModel; +import org.mercury_im.messenger.xmpp.model.AccountModel; import org.mercury_im.messenger.util.TextChangedListener; import butterknife.BindView; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index 0420d28..bab6b2b 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -17,15 +17,15 @@ import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.persistence.entity.AccountModel; -import org.mercury_im.messenger.persistence.repository.AccountRepository; +import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.xmpp.repository.RequeryAccountRepository; import javax.inject.Inject; public class LoginViewModel extends ViewModel { @Inject - AccountRepository accountRepository; + RequeryAccountRepository accountRepository; @Inject ConnectionCenter connectionCenter; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java index bfa85f6..5a98b8a 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java @@ -6,8 +6,8 @@ import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.repository.RosterRepository; +import org.mercury_im.messenger.xmpp.model.ContactModel; +import org.mercury_im.messenger.xmpp.repository.RosterRepository; import javax.inject.Inject; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java index 515070f..352e9ab 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java @@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.persistence.entity.ContactModel; +import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter; import org.mercury_im.messenger.util.ColorUtil; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index c50666e..b3ecf8b 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -7,8 +7,8 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.repository.RosterRepository; +import org.mercury_im.messenger.xmpp.model.ContactModel; +import org.mercury_im.messenger.xmpp.repository.RosterRepository; import java.util.List; diff --git a/core/build.gradle b/core/build.gradle index 43bb7fc..6ecb6fa 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -8,8 +8,9 @@ sourceSets { dependencies { + api project(':entity') // Entities + api project(':repository') // Repository api project(":thread_utils") - api project(":persistence") // 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/messenger/core/NotificationManager.java b/core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java index d5f4f48..c645fd4 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java +++ b/core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java @@ -1,7 +1,7 @@ package org.mercury_im.messenger.core; -import org.mercury_im.messenger.persistence.util.ChatAndPossiblyContact; +import org.mercury_im.messenger.xmpp.util.ChatAndPossiblyContact; public interface NotificationManager { diff --git a/core/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java b/core/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java index 491daa0..3efd65e 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java +++ b/core/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java @@ -11,10 +11,10 @@ import org.jivesoftware.smackx.csi.ClientStateIndicationManager; import org.jivesoftware.smackx.mam.MamManager; import org.mercury_im.messenger.core.connection.MercuryConfiguration; import org.mercury_im.messenger.core.connection.MercuryConnection; -import org.mercury_im.messenger.persistence.entity.AccountModel; -import org.mercury_im.messenger.persistence.entity.ChatModel; -import org.mercury_im.messenger.persistence.repository.AccountRepository; -import org.mercury_im.messenger.persistence.repository.RosterRepository; +import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.xmpp.repository.RequeryAccountRepository; +import org.mercury_im.messenger.xmpp.repository.RosterRepository; import org.mercury_im.messenger.core.stores.EntityCapsStore; import org.mercury_im.messenger.core.stores.PlainMessageStore; import org.mercury_im.messenger.core.stores.RosterStore; @@ -41,7 +41,7 @@ public class ConnectionCenter { private static final Logger LOGGER = Logger.getLogger(ConnectionCenter.class.getName()); // Injected - private final AccountRepository accountRepository; + private final RequeryAccountRepository accountRepository; private final RosterRepository rosterRepository; private final PlainMessageStore messageStore; private final EntityCapsStore entityCapsStore; @@ -58,7 +58,7 @@ public class ConnectionCenter { @Inject public ConnectionCenter(EntityCapsStore capsStore, PlainMessageStore messageStore, - AccountRepository accountRepository, + RequeryAccountRepository accountRepository, RosterRepository rosterRepository) { LOGGER.log(Level.INFO, "ConnectionCenter initialized"); this.entityCapsStore = capsStore; diff --git a/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java b/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java index 3e445f1..82d1360 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java +++ b/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java @@ -2,11 +2,7 @@ package org.mercury_im.messenger.core.di; import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.persistence.repository.AccountRepository; -import org.mercury_im.messenger.persistence.repository.ChatRepository; -import org.mercury_im.messenger.persistence.repository.EntityCapsRepository; -import org.mercury_im.messenger.persistence.repository.MessageRepository; -import org.mercury_im.messenger.persistence.repository.RosterRepository; +import org.mercury_im.messenger.core.repository.AccountRepository; import org.mercury_im.messenger.core.stores.EntityCapsStore; import org.mercury_im.messenger.core.stores.PlainMessageStore; diff --git a/core/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java b/core/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java index a959cfc..4497b59 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java +++ b/core/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java @@ -1,6 +1,6 @@ package org.mercury_im.messenger.core.di; -import org.mercury_im.messenger.persistence.di.RequeryModule; +import org.mercury_im.messenger.xmpp.di.RequeryModule; import javax.inject.Singleton; diff --git a/core/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java b/core/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java index 7a1bcff..9d41c30 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java +++ b/core/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java @@ -4,13 +4,12 @@ import org.jivesoftware.smack.util.PacketParserUtils; import org.jivesoftware.smack.xml.XmlPullParser; import org.jivesoftware.smackx.caps.cache.EntityCapsPersistentCache; import org.jivesoftware.smackx.disco.packet.DiscoverInfo; -import org.mercury_im.messenger.persistence.entity.EntityCapsModel; -import org.mercury_im.messenger.persistence.repository.EntityCapsRepository; +import org.mercury_im.messenger.xmpp.model.EntityCapsModel; +import org.mercury_im.messenger.xmpp.repository.EntityCapsRepository; import java.io.StringReader; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.logging.Level; diff --git a/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java b/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java index b72ad47..87f3ada 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java +++ b/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java @@ -14,15 +14,15 @@ import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.connection.MercuryConnection; -import org.mercury_im.messenger.persistence.entity.ChatModel; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.entity.EntityModel; -import org.mercury_im.messenger.persistence.entity.LastChatMessageRelation; -import org.mercury_im.messenger.persistence.entity.MessageModel; -import org.mercury_im.messenger.persistence.repository.ChatRepository; -import org.mercury_im.messenger.persistence.repository.MessageRepository; -import org.mercury_im.messenger.persistence.repository.RosterRepository; -import org.mercury_im.messenger.persistence.util.ChatAndPossiblyContact; +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.LastChatMessageRelation; +import org.mercury_im.messenger.xmpp.model.MessageModel; +import org.mercury_im.messenger.xmpp.repository.ChatRepository; +import org.mercury_im.messenger.xmpp.repository.MessageRepository; +import org.mercury_im.messenger.xmpp.repository.RosterRepository; +import org.mercury_im.messenger.xmpp.util.ChatAndPossiblyContact; import java.util.ArrayList; import java.util.Date; diff --git a/core/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java b/core/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java index c1843c4..5966ec4 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java +++ b/core/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java @@ -2,12 +2,12 @@ package org.mercury_im.messenger.core.stores; import org.jivesoftware.smack.roster.packet.RosterPacket; import org.jxmpp.jid.Jid; -import org.mercury_im.messenger.persistence.entity.AccountModel; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.entity.EntityModel; -import org.mercury_im.messenger.persistence.repository.AccountRepository; -import org.mercury_im.messenger.persistence.repository.RosterRepository; -import org.mercury_im.messenger.persistence.enums.SubscriptionDirection; +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.xmpp.repository.RequeryAccountRepository; +import org.mercury_im.messenger.xmpp.repository.RosterRepository; +import org.mercury_im.messenger.xmpp.enums.SubscriptionDirection; import java.util.ArrayList; import java.util.Arrays; @@ -20,9 +20,7 @@ import java.util.logging.Logger; import javax.inject.Inject; -import io.reactivex.Scheduler; import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.functions.Action; import io.reactivex.schedulers.Schedulers; public class RosterStore implements org.jivesoftware.smack.roster.rosterstore.RosterStore { @@ -30,7 +28,7 @@ public class RosterStore implements org.jivesoftware.smack.roster.rosterstore.Ro private static final Logger LOGGER = Logger.getLogger(RosterStore.class.getName()); private final RosterRepository rosterRepository; - private final AccountRepository accountRepository; + private final RequeryAccountRepository accountRepository; private AccountModel account; private CompositeDisposable disposable = null; @@ -38,7 +36,7 @@ public class RosterStore implements org.jivesoftware.smack.roster.rosterstore.Ro private String rosterVersion; @Inject - public RosterStore(RosterRepository rosterRepository, AccountRepository accountRepository) { + public RosterStore(RosterRepository rosterRepository, RequeryAccountRepository accountRepository) { this.rosterRepository = rosterRepository; this.accountRepository = accountRepository; } diff --git a/core/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java b/core/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java index cb2893e..647c814 100644 --- a/core/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java +++ b/core/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java @@ -1,7 +1,7 @@ package org.mercury_im.messenger.core.util; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.entity.EntityModel; +import org.mercury_im.messenger.xmpp.model.ContactModel; +import org.mercury_im.messenger.xmpp.model.EntityModel; public class ContactNameUtil { diff --git a/persistence/.gitignore b/entity/.gitignore similarity index 100% rename from persistence/.gitignore rename to entity/.gitignore diff --git a/entity/README.md b/entity/README.md new file mode 100644 index 0000000..0a1719a --- /dev/null +++ b/entity/README.md @@ -0,0 +1,5 @@ +# Entity + +This module contains entity definitions for MercuryIM. +According to Robert C. Martins "Clean Architecture", entities form the inner most layer of the +program. \ No newline at end of file diff --git a/entity/build.gradle b/entity/build.gradle new file mode 100644 index 0000000..9029aa4 --- /dev/null +++ b/entity/build.gradle @@ -0,0 +1,8 @@ +apply plugin: 'java-library' + +dependencies { + +} + +sourceCompatibility = "8" +targetCompatibility = "8" diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractAccount.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractAccount.java new file mode 100644 index 0000000..b4ea5b2 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractAccount.java @@ -0,0 +1,53 @@ +package org.mercury_im.messenger.core.entity; + +public abstract class AbstractAccount< + AD extends Address.UserAddress, + AU extends Account.AuthMethod> + implements Account { + + protected long id; + protected AD address; + protected AU authentication; + protected boolean enabled; + + @Override + public void setId(long id) { + + this.id = id; + } + + @Override + public long getId() { + return id; + } + + @Override + public void setAddress(AD address) { + this.address = address; + } + + @Override + public AD getAddress() { + return address; + } + + @Override + public void setAuthentication(AU authentication) { + this.authentication = authentication; + } + + @Override + public AU getAuthentication() { + return authentication; + } + + @Override + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + @Override + public boolean isEnabled() { + return enabled; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractDirectChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractDirectChat.java new file mode 100644 index 0000000..0bcea11 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractDirectChat.java @@ -0,0 +1,42 @@ +package org.mercury_im.messenger.core.entity; + +public class AbstractDirectChat< + IL extends Interlocutor, + AC extends Account, + AD extends Address.UserAddress> + implements DirectChat { + + protected long id; + protected IL interlocutor; + protected AC account; + + @Override + public IL getInterlocutor() { + return interlocutor; + } + + @Override + public void setInterlocutor(IL interlocutor) { + this.interlocutor = interlocutor; + } + + @Override + public long getId() { + return id; + } + + @Override + public void setId(long id) { + this.id = id; + } + + @Override + public AC getAccount() { + return account; + } + + @Override + public void setAccount(AC account) { + this.account = account; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractGroupChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractGroupChat.java new file mode 100644 index 0000000..e6c99af --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractGroupChat.java @@ -0,0 +1,53 @@ +package org.mercury_im.messenger.core.entity; + +public class AbstractGroupChat< + AC extends Account, + AD extends Address.UserAddress, + RA extends Address.RoomAddress> + implements GroupChat { + + private long id; + private AC account; + private RA roomAddress; + private String roomName; + + @Override + public RA getRoomAddress() { + return roomAddress; + } + + @Override + public void setRoomAddress(RA roomAddress) { + this.roomAddress = roomAddress; + } + + @Override + public String getRoomName() { + return roomName; + } + + @Override + public void setRoomName(String roomName) { + this.roomName = roomName; + } + + @Override + public long getId() { + return id; + } + + @Override + public void setId(long id) { + this.id = id; + } + + @Override + public AC getAccount() { + return account; + } + + @Override + public void setAccount(AC account) { + this.account = account; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractInterlocutor.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractInterlocutor.java new file mode 100644 index 0000000..b10ea15 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractInterlocutor.java @@ -0,0 +1,52 @@ +package org.mercury_im.messenger.core.entity; + +public class AbstractInterlocutor< + AC extends Account, + AD extends Address.UserAddress> + implements Interlocutor { + + protected long id; + protected AC account; + protected AD address; + protected String name; + + @Override + public long getId() { + return id; + } + + @Override + public void setId(long id) { + this.id = id; + } + + @Override + public AC getAccount() { + return account; + } + + @Override + public void setAccount(AC account) { + this.account = account; + } + + @Override + public AD getAddress() { + return address; + } + + @Override + public void setAddress(AD 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/AbstractMessage.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractMessage.java new file mode 100644 index 0000000..7111c47 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractMessage.java @@ -0,0 +1,84 @@ +package org.mercury_im.messenger.core.entity; + +import java.util.Date; + +public class AbstractMessage implements Message { + + protected long id; + protected AD sender; + protected AD recipient; + protected Date timestamp; + protected String body; + protected MessageDeliveryState deliveryState; + protected MM metadata; + + @Override + public long getId() { + return id; + } + + @Override + public void setId(long id) { + this.id = id; + } + + @Override + public AD getSender() { + return sender; + } + + @Override + public void setSender(AD address) { + this.sender = address; + } + + @Override + public AD getRecipient() { + return recipient; + } + + @Override + public void setRecipient(AD recipient) { + this.recipient = recipient; + } + + @Override + public Date getTimestamp() { + return timestamp; + } + + @Override + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } + + @Override + public String getBody() { + return body; + } + + @Override + public void setBody(String body) { + this.body = body; + } + + @Override + public MessageDeliveryState getDeliveryState() { + return deliveryState; + } + + @Override + public void setDeliveryState(MessageDeliveryState deliveryState) { + this.deliveryState = deliveryState; + } + + @Override + public MM getMetadata() { + return metadata; + } + + @Override + public void setMetadata(MM metadata) { + this.metadata = metadata; + } +} 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 new file mode 100644 index 0000000..09ddf56 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java @@ -0,0 +1,34 @@ +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 { + + void setId(long id); + + long getId(); + + void setAddress(AD address); + + AD getAddress(); + + void setAuthentication(AU authentication); + + AU getAuthentication(); + + void setEnabled(boolean enabled); + + boolean isEnabled(); + + /** + * Interface to allow protocol-specific authentication information, like passwords, parameters, + * certificates etc. + */ + interface AuthMethod { + + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Address.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Address.java new file mode 100644 index 0000000..7607a70 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Address.java @@ -0,0 +1,24 @@ +package org.mercury_im.messenger.core.entity; + +public interface Address { + + String toString(); + + /** + * Address of a user. + */ + interface UserAddress extends Address { + + } + + /** + * Address of a chat room / group chat. + */ + interface RoomAddress extends Address { + + } + + interface RoomParticipantAddress extends Address { + + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java new file mode 100644 index 0000000..aac37fc --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java @@ -0,0 +1,15 @@ +package org.mercury_im.messenger.core.entity; + +public interface Chat< + AC extends Account, + AD extends Address.UserAddress> { + + long getId(); + + void setId(long id); + + AC getAccount(); + + void setAccount(AC account); + +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Contact.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Contact.java new file mode 100644 index 0000000..d28db10 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Contact.java @@ -0,0 +1,43 @@ +package org.mercury_im.messenger.core.entity; + +public interface Contact< + AC extends Account, + AD extends Address.UserAddress> + extends Interlocutor { + + SubscriptionMode getSubscriptionMode(); + + void setSubscriptionMode(SubscriptionMode mode); + + enum SubscriptionMode { + /** + * No subscription between us an them. + */ + NONE, + + /** + * We sent a subscription request, which is now pending to be accepted. + */ + TO_THEM_PENDING, + + /** + * We sent a subscription request and they accepted it. + */ + TO_THEM_ACCEPTED, + + /** + * They sent us a subscription request, but we did not yet accept it. + */ + FROM_THEM_PENDING, + + /** + * They sent us a subscription request and we accepted it. + */ + FROM_THEM_ACCEPTED, + + /** + * They accepted us and we accepted them. + */ + BIDIRECTIONAL + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/DirectChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/DirectChat.java new file mode 100644 index 0000000..2e03482 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/DirectChat.java @@ -0,0 +1,13 @@ +package org.mercury_im.messenger.core.entity; + +public interface DirectChat< + IL extends Interlocutor, + AC extends Account, + AD extends Address.UserAddress> + extends Chat { + + IL getInterlocutor(); + + void setInterlocutor(IL interlocutor); + +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/GroupChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/GroupChat.java new file mode 100644 index 0000000..21bfd0d --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/GroupChat.java @@ -0,0 +1,16 @@ +package org.mercury_im.messenger.core.entity; + +public interface GroupChat< + AC extends Account, + AD extends Address.UserAddress, + RA extends Address.RoomAddress> + extends Chat { + + RA getRoomAddress(); + + void setRoomAddress(RA roomAddress); + + String getRoomName(); + + void setRoomName(String roomName); +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Interlocutor.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Interlocutor.java new file mode 100644 index 0000000..2e1072a --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Interlocutor.java @@ -0,0 +1,28 @@ +package org.mercury_im.messenger.core.entity; + +/** + * Defines a user on the network (eg. a contact, chat partner etc). + * + * @param Account Type + * @param UserAddress Type + */ +public interface Interlocutor< + AC extends Account, + AD extends Address.UserAddress> { + + long getId(); + + void setId(long id); + + AC getAccount(); + + void setAccount(AC account); + + AD getAddress(); + + void setAddress(AD address); + + String getName(); + + void setName(String name); +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java new file mode 100644 index 0000000..3cfe37e --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java @@ -0,0 +1,35 @@ +package org.mercury_im.messenger.core.entity; + +import java.util.Date; + +public interface Message { + + long getId(); + + void setId(long id); + + MA getSender(); + + void setSender(MA address); + + MA getRecipient(); + + void setRecipient(MA recipient); + + Date getTimestamp(); + + void setTimestamp(Date timestamp); + + String getBody(); + + void setBody(String body); + + MessageDeliveryState getDeliveryState(); + + void setDeliveryState(MessageDeliveryState deliveryState); + + MM getMetadata(); + + void setMetadata(MM metadata); + +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageDeliveryState.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageDeliveryState.java new file mode 100644 index 0000000..4b9a30e --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageDeliveryState.java @@ -0,0 +1,10 @@ +package org.mercury_im.messenger.core.entity; + +public enum MessageDeliveryState { + pending_delivery, + delivered_to_server, + delivered_to_peer, + read, + delivery_error, + ; +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageMetadata.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageMetadata.java new file mode 100644 index 0000000..877b642 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageMetadata.java @@ -0,0 +1,9 @@ +package org.mercury_im.messenger.core.entity; + +/** + * Interface to allow additional, protocol specific metadata to be attached to the message. + * In case of XMPP this might be origin/stanza id, encryption information etc. + */ +public interface MessageMetadata { + +} \ No newline at end of file diff --git a/entity_xmpp/.gitignore b/entity_xmpp/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/entity_xmpp/.gitignore @@ -0,0 +1 @@ +/build diff --git a/entity_xmpp/build.gradle b/entity_xmpp/build.gradle new file mode 100644 index 0000000..826c7a1 --- /dev/null +++ b/entity_xmpp/build.gradle @@ -0,0 +1,11 @@ +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 new file mode 100644 index 0000000..a707254 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAccount.java @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..fb4e9c7 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAddress.java @@ -0,0 +1,46 @@ +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/XmppAuthMethod.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAuthMethod.java new file mode 100644 index 0000000..4516ffe --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAuthMethod.java @@ -0,0 +1,24 @@ +package org.mercury_im.messenger.xmpp.entity; + +import org.mercury_im.messenger.core.entity.Account; + +public abstract class XmppAuthMethod implements Account.AuthMethod { + + public static class AuthPassword extends XmppAuthMethod { + private String password; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public static AuthPassword fromPassword(String password) { + AuthPassword auth = new AuthPassword(); + auth.setPassword(password); + return auth; + } + } +} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppDirectChat.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppDirectChat.java new file mode 100644 index 0000000..08f905c --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppDirectChat.java @@ -0,0 +1,7 @@ +package org.mercury_im.messenger.xmpp.entity; + +import org.mercury_im.messenger.core.entity.AbstractDirectChat; + +public class XmppDirectChat extends AbstractDirectChat { + +} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppGroupChat.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppGroupChat.java new file mode 100644 index 0000000..74a8690 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppGroupChat.java @@ -0,0 +1,7 @@ +package org.mercury_im.messenger.xmpp.entity; + +import org.mercury_im.messenger.core.entity.AbstractGroupChat; + +public class XmppGroupChat extends AbstractGroupChat { + +} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppInterlocutor.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppInterlocutor.java new file mode 100644 index 0000000..aae1fb5 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppInterlocutor.java @@ -0,0 +1,7 @@ +package org.mercury_im.messenger.xmpp.entity; + +import org.mercury_im.messenger.core.entity.AbstractInterlocutor; + +public class XmppInterlocutor extends AbstractInterlocutor { + +} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessage.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessage.java new file mode 100644 index 0000000..5da2232 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessage.java @@ -0,0 +1,7 @@ +package org.mercury_im.messenger.xmpp.entity; + +import org.mercury_im.messenger.core.entity.AbstractMessage; + +public class XmppMessage extends AbstractMessage { + +} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessageMetadata.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessageMetadata.java new file mode 100644 index 0000000..6362abe --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessageMetadata.java @@ -0,0 +1,7 @@ +package org.mercury_im.messenger.xmpp.entity; + +import org.mercury_im.messenger.core.entity.MessageMetadata; + +public class XmppMessageMetadata implements MessageMetadata { + +} diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/AccountRepository.java b/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/AccountRepository.java deleted file mode 100644 index fbb2d3e..0000000 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/AccountRepository.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.mercury_im.messenger.persistence.repository; - -import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.persistence.entity.AccountModel; -import org.mercury_im.messenger.thread_utils.ThreadUtils; - -import javax.inject.Inject; -import javax.inject.Named; - -import io.reactivex.Completable; -import io.reactivex.Observable; -import io.reactivex.Scheduler; -import io.requery.Persistable; -import io.requery.reactivex.ReactiveEntityStore; -import io.requery.reactivex.ReactiveResult; - -public class AccountRepository extends AbstractRepository { - - @Inject - public AccountRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { - super(AccountModel.class, data, subscriberScheduler, observerScheduler); - } - - public Observable> getAccountByJid(EntityBareJid jid) { - return data().select(AccountModel.class) - .where(AccountModel.JID.eq(jid)) - .get() - .observableResult() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Observable> getAccount(long accountId) { - return data().select(AccountModel.class).where(AccountModel.ID.eq(accountId)) - .get().observableResult() - .subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); - } - - public Completable delete(long accountId) { - return data().delete(AccountModel.class) - .where(AccountModel.ID.eq(accountId)) - .get() - .single() - .ignoreElement() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } -} diff --git a/repository/.gitignore b/repository/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/repository/.gitignore @@ -0,0 +1 @@ +/build diff --git a/repository/build.gradle b/repository/build.gradle new file mode 100644 index 0000000..295beca --- /dev/null +++ b/repository/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'java-library' + +dependencies { + api project(":entity") + api project(":thread_utils") + + // RxJava 2 + api "io.reactivex.rxjava2:rxjava:$rxJava2Version" +} + +sourceCompatibility = "8" +targetCompatibility = "8" 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 new file mode 100644 index 0000000..f2d4621 --- /dev/null +++ b/repository/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java @@ -0,0 +1,36 @@ +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 new file mode 100644 index 0000000..ce8f651 --- /dev/null +++ b/repository/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java @@ -0,0 +1,37 @@ +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; +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 new file mode 100644 index 0000000..0aeefa3 --- /dev/null +++ b/repository/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java @@ -0,0 +1,55 @@ +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.DirectChat; +import org.mercury_im.messenger.core.entity.Interlocutor; +import org.mercury_im.messenger.core.entity.Message; +import org.mercury_im.messenger.core.entity.MessageMetadata; +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> { + + 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 new file mode 100644 index 0000000..5a512dc --- /dev/null +++ b/repository/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java @@ -0,0 +1,54 @@ +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.GroupChat; +import org.mercury_im.messenger.core.entity.Message; +import org.mercury_im.messenger.core.entity.MessageMetadata; +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> { + + 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/src/main/java/org/mercury_im/messenger/core/util/Optional.java b/repository/src/main/java/org/mercury_im/messenger/core/util/Optional.java new file mode 100644 index 0000000..12336e7 --- /dev/null +++ b/repository/src/main/java/org/mercury_im/messenger/core/util/Optional.java @@ -0,0 +1,23 @@ +package org.mercury_im.messenger.core.util; + +/** + * Since j.u.Optional is only available on Android since API lvl 24, we need this utility class. + * + * @param type of wrapped object. + */ +public class Optional { + + private final T item; + + public Optional(T item) { + this.item = item; + } + + public T getItem() { + return item; + } + + public boolean isPresent() { + return item != null; + } +} diff --git a/repository_xmpp/.gitignore b/repository_xmpp/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/repository_xmpp/.gitignore @@ -0,0 +1 @@ +/build diff --git a/persistence/build.gradle b/repository_xmpp/build.gradle similarity index 92% rename from persistence/build.gradle rename to repository_xmpp/build.gradle index a44cfb2..4c865c2 100644 --- a/persistence/build.gradle +++ b/repository_xmpp/build.gradle @@ -8,6 +8,9 @@ sourceSets { dependencies { + implementation project(":core") + implementation project(":entity_xmpp") + // JXMPP for Jid types. Version comes from smacks version.gradle api("org.jxmpp:jxmpp-jid:$jxmppVersion") diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/converter/EntityBareJidConverter.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/EntityBareJidConverter.java similarity index 93% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/converter/EntityBareJidConverter.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/EntityBareJidConverter.java index 77c66d5..eac74da 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/converter/EntityBareJidConverter.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/EntityBareJidConverter.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.converter; +package org.mercury_im.messenger.xmpp.converter; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/converter/SaslConditionConverter.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java similarity index 85% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/converter/SaslConditionConverter.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java index 1de9950..cd90fb6 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/converter/SaslConditionConverter.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.persistence.converter; +package org.mercury_im.messenger.xmpp.converter; -import org.mercury_im.messenger.persistence.enums.SaslCondition; +import org.mercury_im.messenger.xmpp.enums.SaslCondition; import io.requery.Converter; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/converter/SubscriptionDirectionConverter.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java similarity index 86% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/converter/SubscriptionDirectionConverter.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java index 5e23414..d516b49 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/converter/SubscriptionDirectionConverter.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.persistence.converter; +package org.mercury_im.messenger.xmpp.converter; -import org.mercury_im.messenger.persistence.enums.SubscriptionDirection; +import org.mercury_im.messenger.xmpp.enums.SubscriptionDirection; import io.requery.Converter; 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 new file mode 100644 index 0000000..14063ca --- /dev/null +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/XmppAddressConverter.java @@ -0,0 +1,32 @@ +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/persistence/src/main/java/org/mercury_im/messenger/persistence/di/RequeryModule.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java similarity index 68% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/di/RequeryModule.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java index 6ba1219..eaed6b6 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/di/RequeryModule.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java @@ -1,9 +1,9 @@ -package org.mercury_im.messenger.persistence.di; +package org.mercury_im.messenger.xmpp.di; -import org.mercury_im.messenger.persistence.repository.AccountRepository; -import org.mercury_im.messenger.persistence.repository.ChatRepository; -import org.mercury_im.messenger.persistence.repository.EntityCapsRepository; -import org.mercury_im.messenger.persistence.repository.RosterRepository; +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 javax.inject.Named; @@ -20,10 +20,10 @@ public class RequeryModule { @Provides @Singleton - public static AccountRepository provideAccountRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new AccountRepository(data, ioScheduler, uiScheduler); + public static ReactiveXmppAccountRepository provideAccountRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + return new ReactiveXmppAccountRepository(data, ioScheduler, uiScheduler); } @Provides diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/enums/SaslCondition.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java similarity index 98% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/enums/SaslCondition.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java index 43026a6..ebc2de0 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/enums/SaslCondition.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.enums; +package org.mercury_im.messenger.xmpp.enums; public enum SaslCondition { diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/enums/SubscriptionDirection.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java similarity index 63% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/enums/SubscriptionDirection.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java index b640987..daf77f8 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/enums/SubscriptionDirection.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.enums; +package org.mercury_im.messenger.xmpp.enums; public enum SubscriptionDirection { none, 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 new file mode 100644 index 0000000..a517113 --- /dev/null +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java @@ -0,0 +1,36 @@ +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.xmpp.model.AccountModel; + +public class AccountMapping { + + public static XmppAccount modelToEntity(AccountModel model) { + if (model == null) { + return null; + } + + XmppAccount entity = new XmppAccount(); + entity.setId(model.getId()); + entity.setAddress(new XmppAddress.XmppUserAddress(model.getJid())); + entity.setEnabled(model.isEnabled()); + entity.setAuthentication(XmppAuthMethod.AuthPassword.fromPassword(model.getPassword())); + + return entity; + } + + public static AccountModel createModelFromEntity(XmppAccount entity) { + if (entity == null) { + return null; + } + + AccountModel model = new AccountModel(); + model.setPassword(((XmppAuthMethod.AuthPassword) entity.getAuthentication()).getPassword()); + model.setJid(entity.getAddress().getJid()); + model.setEnabled(entity.isEnabled()); + + return model; + } +} diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractAccountModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java similarity index 79% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractAccountModel.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java index 5af7a4c..5682316 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractAccountModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.persistence.converter.EntityBareJidConverter; +import org.mercury_im.messenger.xmpp.converter.EntityBareJidConverter; import io.requery.Column; import io.requery.Convert; @@ -20,7 +20,7 @@ public abstract class AbstractAccountModel implements Persistable { @Column(nullable = false) @Convert(EntityBareJidConverter.class) - EntityBareJid jid; + EntityBareJid address; @Column(nullable = false) String password; @@ -32,7 +32,7 @@ public abstract class AbstractAccountModel implements Persistable { @Override public String toString() { return "Account[" + id + ", " + - jid + ", " + + address + ", " + (enabled ? "enabled" : "disabled") + "]"; } } diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractChatModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java similarity index 88% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractChatModel.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java index 068618a..c21086a 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractChatModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; import io.requery.Entity; import io.requery.ForeignKey; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractContactModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java similarity index 81% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractContactModel.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java index 17b36b3..1bf8bd4 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractContactModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; -import org.mercury_im.messenger.persistence.converter.SubscriptionDirectionConverter; -import org.mercury_im.messenger.persistence.enums.SubscriptionDirection; +import org.mercury_im.messenger.xmpp.converter.SubscriptionDirectionConverter; +import org.mercury_im.messenger.xmpp.enums.SubscriptionDirection; import io.requery.Convert; import io.requery.Entity; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractEntityCapsModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java similarity index 85% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractEntityCapsModel.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java index fa3b20e..4ff1ebf 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractEntityCapsModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; import io.requery.Column; import io.requery.Entity; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractEntityModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityModel.java similarity index 83% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractEntityModel.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityModel.java index 44c25fc..192ed60 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractEntityModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityModel.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.persistence.converter.EntityBareJidConverter; +import org.mercury_im.messenger.xmpp.converter.EntityBareJidConverter; import io.requery.Column; import io.requery.Convert; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractLastChatMessageRelation.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java similarity index 88% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractLastChatMessageRelation.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java index b7f8f65..da4b0c3 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractLastChatMessageRelation.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; import io.requery.Entity; import io.requery.ForeignKey; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractLastReadChatMessageRelation.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java similarity index 88% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractLastReadChatMessageRelation.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java index 5fb86d4..236d819 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractLastReadChatMessageRelation.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; import io.requery.Entity; import io.requery.ForeignKey; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractMessageModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java similarity index 88% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractMessageModel.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java index 144024f..6a8eb52 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractMessageModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.persistence.converter.EntityBareJidConverter; +import org.mercury_im.messenger.xmpp.converter.EntityBareJidConverter; import java.util.Date; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractSaslAuthenticationResultModel.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java similarity index 75% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractSaslAuthenticationResultModel.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java index 1753071..a8b7397 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/entity/AbstractSaslAuthenticationResultModel.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.persistence.entity; +package org.mercury_im.messenger.xmpp.model; -import org.mercury_im.messenger.persistence.enums.SaslCondition; +import org.mercury_im.messenger.xmpp.enums.SaslCondition; import io.requery.Entity; import io.requery.Key; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/AbstractRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java similarity index 98% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/repository/AbstractRepository.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java index 1e764b5..3d6c3ad 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/AbstractRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.repository; +package org.mercury_im.messenger.xmpp.repository; import org.mercury_im.messenger.thread_utils.ThreadUtils; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ChatRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java similarity index 89% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ChatRepository.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java index 943846b..0e50300 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/ChatRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java @@ -1,27 +1,23 @@ -package org.mercury_im.messenger.persistence.repository; +package org.mercury_im.messenger.xmpp.repository; import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.persistence.entity.ChatModel; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.entity.EntityModel; -import org.mercury_im.messenger.persistence.util.ChatAndPossiblyContact; +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.util.ChatAndPossiblyContact; import org.mercury_im.messenger.thread_utils.ThreadUtils; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.Callable; import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; import javax.inject.Named; -import io.reactivex.Completable; import io.reactivex.Observable; import io.reactivex.Scheduler; -import io.reactivex.functions.Function; import io.requery.Persistable; -import io.requery.query.Tuple; import io.requery.reactivex.ReactiveEntityStore; import io.requery.reactivex.ReactiveResult; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/EntityCapsRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java similarity index 74% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/repository/EntityCapsRepository.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java index 55db16a..8396c29 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/EntityCapsRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java @@ -1,17 +1,14 @@ -package org.mercury_im.messenger.persistence.repository; +package org.mercury_im.messenger.xmpp.repository; -import org.mercury_im.messenger.persistence.entity.EntityCapsModel; +import org.mercury_im.messenger.xmpp.model.EntityCapsModel; import org.mercury_im.messenger.thread_utils.ThreadUtils; import javax.inject.Inject; import javax.inject.Named; -import io.reactivex.Completable; -import io.reactivex.Observable; import io.reactivex.Scheduler; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; -import io.requery.reactivex.ReactiveResult; public class EntityCapsRepository extends AbstractRepository { diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/MessageRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java similarity index 88% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/repository/MessageRepository.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java index 1de183e..f2d9ed8 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/MessageRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java @@ -1,19 +1,16 @@ -package org.mercury_im.messenger.persistence.repository; +package org.mercury_im.messenger.xmpp.repository; -import org.mercury_im.messenger.persistence.entity.ChatModel; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.entity.EntityModel; -import org.mercury_im.messenger.persistence.entity.MessageModel; +import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.xmpp.model.ContactModel; +import org.mercury_im.messenger.xmpp.model.EntityModel; +import org.mercury_im.messenger.xmpp.model.MessageModel; import org.mercury_im.messenger.thread_utils.ThreadUtils; -import java.util.List; - import javax.inject.Inject; import javax.inject.Named; import io.reactivex.Observable; import io.reactivex.Scheduler; -import io.reactivex.Single; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; import io.requery.reactivex.ReactiveResult; 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 new file mode 100644 index 0000000..77911cb --- /dev/null +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java @@ -0,0 +1,152 @@ +package org.mercury_im.messenger.xmpp.repository; + +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.messenger.xmpp.mapping.AccountMapping; +import org.mercury_im.messenger.xmpp.model.AccountModel; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.query.ResultDelegate; +import io.requery.reactivex.ReactiveEntityStore; + +public class ReactiveXmppAccountRepository extends RequeryRepository implements AccountRepository { + + @Inject + public ReactiveXmppAccountRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + super(data, subscriberScheduler, observerScheduler); + } + + @Override + public Single insertAccount(XmppAccount account) { + + return data().insert(AccountMapping.createModelFromEntity(account)) + .map(AccountMapping::modelToEntity) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Observable> observeAccount(long accountId) { + return data().select(AccountModel.class) + .where(AccountModel.ID.eq(accountId)) + .get().observableResult() + .map(result -> new Optional<>(AccountMapping.modelToEntity(result.firstOrNull()))) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + + } + + @Override + public Maybe getAccount(long accountId) { + return data().select(AccountModel.class) + .where(AccountModel.ID.eq(accountId)) + .get().maybe() + .map(AccountMapping::modelToEntity) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Observable> observeAccountByAddress(XmppAddress.XmppUserAddress address) { + return data().select(AccountModel.class) + .where(AccountModel.JID.eq(address.getJid())) + .get().observableResult() + .map(result -> new Optional<>(AccountMapping.modelToEntity(result.firstOrNull()))) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Maybe getAccountByAddress(XmppAddress.XmppUserAddress address) { + return data().select(AccountModel.class) + .where(AccountModel.JID.eq(address.getJid())) + .get().maybe() + .map(AccountMapping::modelToEntity) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Observable> observeAllAccounts() { + return data().select(AccountModel.class) + .get().observableResult() + .map(ResultDelegate::toList) + .map(list -> { + List entities = new ArrayList<>(list.size()); + list.forEach(model -> entities.add(AccountMapping.modelToEntity(model))); + return entities; + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Single updateAccount(XmppAccount 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 + + // fetch model + return data().select(AccountModel.class) + .where(AccountModel.ID.eq(account.getId())) + .get().maybe().toSingle() // to single + .map(model -> { + // update it + model.setEnabled(account.isEnabled()); + model.setPassword(((XmppAuthMethod.AuthPassword) account.getAuthentication()).getPassword()); + model.setJid(account.getAddress().getJid()); + // write the updated model back + model = data().update(model).blockingGet(); + return AccountMapping.modelToEntity(model); + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Single upsertAccount(XmppAccount account) { + // Try to fetch model + return data().select(AccountModel.class) + .where(AccountModel.ID.eq(account.getId())) + .get().maybe() + // If it does not exist, create a new model from the entity + .switchIfEmpty(data().insert(AccountMapping.createModelFromEntity(account))) + // finally + .map(model -> { + // update the model + model.setEnabled(account.isEnabled()); + model.setPassword(((XmppAuthMethod.AuthPassword) account.getAuthentication()).getPassword()); + model.setJid(account.getAddress().getJid()); + // write the updated model back + model = data().update(model).blockingGet(); + return AccountMapping.modelToEntity(model); + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Completable deleteAccount(XmppAccount account) { + return data().delete(AccountModel.class) + .where(AccountModel.ID.eq(account.getId())) + .get().single().ignoreElement() // to completable + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } +} diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/RequeryRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java similarity index 94% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/repository/RequeryRepository.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java index 4cf203d..8e7f029 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/RequeryRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.persistence.repository; +package org.mercury_im.messenger.xmpp.repository; import io.reactivex.Scheduler; import io.requery.Persistable; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/RosterRepository.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java similarity index 97% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/repository/RosterRepository.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java index ea050eb..d73777f 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/repository/RosterRepository.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java @@ -1,9 +1,9 @@ -package org.mercury_im.messenger.persistence.repository; +package org.mercury_im.messenger.xmpp.repository; import org.jxmpp.jid.EntityBareJid; -import org.mercury_im.messenger.persistence.entity.AccountModel; -import org.mercury_im.messenger.persistence.entity.ContactModel; -import org.mercury_im.messenger.persistence.entity.EntityModel; +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 javax.inject.Inject; diff --git a/persistence/src/main/java/org/mercury_im/messenger/persistence/util/ChatAndPossiblyContact.java b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java similarity index 68% rename from persistence/src/main/java/org/mercury_im/messenger/persistence/util/ChatAndPossiblyContact.java rename to repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java index 1b5d13b..2805f43 100644 --- a/persistence/src/main/java/org/mercury_im/messenger/persistence/util/ChatAndPossiblyContact.java +++ b/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.persistence.util; +package org.mercury_im.messenger.xmpp.util; -import org.mercury_im.messenger.persistence.entity.ChatModel; -import org.mercury_im.messenger.persistence.entity.ContactModel; +import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.xmpp.model.ContactModel; public class ChatAndPossiblyContact { diff --git a/settings.gradle b/settings.gradle index 36f15fb..da3baf5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,9 @@ -include ':app', ':thread_utils', - ':core', - ':persistence' +include ':entity', + ':entity_xmpp', + ':repository', + ':repository_xmpp', + ':app', + ':thread_utils', + ':core' includeBuild 'libs/Smack' From b23fd0daf0607d2f1e0fe4efa4d6b4a8b0a69e5c Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 3 Nov 2019 20:33:36 +0100 Subject: [PATCH 02/83] Add more modules --- repository_xmpp/build.gradle | 2 +- settings.gradle | 1 + thread_utils/build.gradle | 4 ---- transport_xmpp/.gitignore | 1 + transport_xmpp/build.gradle | 9 +++++++++ 5 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 transport_xmpp/.gitignore create mode 100644 transport_xmpp/build.gradle diff --git a/repository_xmpp/build.gradle b/repository_xmpp/build.gradle index 4c865c2..933be74 100644 --- a/repository_xmpp/build.gradle +++ b/repository_xmpp/build.gradle @@ -8,7 +8,7 @@ sourceSets { dependencies { - implementation project(":core") + // implementation project(":core") implementation project(":entity_xmpp") // JXMPP for Jid types. Version comes from smacks version.gradle diff --git a/settings.gradle b/settings.gradle index da3baf5..ac12fbe 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,6 +2,7 @@ include ':entity', ':entity_xmpp', ':repository', ':repository_xmpp', + ':transport_xmpp', ':app', ':thread_utils', ':core' diff --git a/thread_utils/build.gradle b/thread_utils/build.gradle index 82292e2..d53d1be 100644 --- a/thread_utils/build.gradle +++ b/thread_utils/build.gradle @@ -1,8 +1,4 @@ apply plugin: 'java-library' -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) -} - sourceCompatibility = "8" targetCompatibility = "8" diff --git a/transport_xmpp/.gitignore b/transport_xmpp/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/transport_xmpp/.gitignore @@ -0,0 +1 @@ +/build diff --git a/transport_xmpp/build.gradle b/transport_xmpp/build.gradle new file mode 100644 index 0000000..f5d8c22 --- /dev/null +++ b/transport_xmpp/build.gradle @@ -0,0 +1,9 @@ +apply plugin: 'java-library' + +dependencies { + implementation project(":repository_xmpp") + implementation project(":entity_xmpp") +} + +sourceCompatibility = "8" +targetCompatibility = "8" From 605fccf18d3e4923e7e76bf7e2052fed8202765a Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 7 Nov 2019 00:59:56 +0100 Subject: [PATCH 03/83] Add more entities --- .../messenger/core/entity/Chat.java | 3 ++ .../core/entity/ChatPreferences.java | 36 +++++++++++++++++++ .../messenger/core/entity/Message.java | 1 - .../messenger/core/entity/MessageContent.java | 8 +++++ repository_xmpp/build.gradle | 1 + 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/ChatPreferences.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/MessageContent.java diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java index aac37fc..d5a858c 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java @@ -12,4 +12,7 @@ public interface Chat< void setAccount(AC account); + ChatPreferences getChatPreferences(); + + void setChatPreferences(ChatPreferences chatPreferences); } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/ChatPreferences.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/ChatPreferences.java new file mode 100644 index 0000000..af7db4b --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/ChatPreferences.java @@ -0,0 +1,36 @@ +package org.mercury_im.messenger.core.entity; + +public interface ChatPreferences { + + NotificationPreferences getNotificationPreference(); + + boolean setNotificationPreference(NotificationPreferences notificationPreferences); + + boolean isTypingNotificationsSupported(); + + void setTypingNotificationsSupported(boolean typingNotificationsSupported); + + boolean isSendTypingNotifications(); + + void setSendTypingNotifications(boolean sendTypingNotifications); + + boolean isReadNotificationsSupported(); + + void setReadNotificationsSupported(boolean readNotificationsSupported); + + boolean isSendReadNotifications(); + + void setSendReadNotifications(boolean sendReadNotifications); + + + interface NotificationPreferences { + + boolean isNotifyOnMessage(); + + void setNotifyOnMessage(boolean notify); + + boolean isNotifyOnMention(); + + void setNotifyOnMention(boolean notify); + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java index 3cfe37e..0184db8 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java @@ -31,5 +31,4 @@ public interface Message { MM getMetadata(); void setMetadata(MM metadata); - } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageContent.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageContent.java new file mode 100644 index 0000000..2bb7133 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageContent.java @@ -0,0 +1,8 @@ +package org.mercury_im.messenger.core.entity; + +public interface MessageContent { + + String getBody(); + + void setBody(String body); +} diff --git a/repository_xmpp/build.gradle b/repository_xmpp/build.gradle index 933be74..48eb0b9 100644 --- a/repository_xmpp/build.gradle +++ b/repository_xmpp/build.gradle @@ -10,6 +10,7 @@ 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") From 4a72937f04771cbfb3c7f1a299ee18a6276616eb Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 8 Nov 2019 00:47:17 +0100 Subject: [PATCH 04/83] Add more modules and entites --- app/build.gradle | 2 +- core-old/.gitignore | 1 + core-old/build.gradle | 45 +++++++++++++++++++ .../messenger/core/NotificationManager.java | 0 .../core/centers/ConnectionCenter.java | 0 .../messenger/core/centers/ContactCenter.java | 0 .../messenger/core/centers/MessageCenter.java | 0 .../core/connection/ConnectionState.java | 0 .../core/connection/MercuryConfiguration.java | 0 .../core/connection/MercuryConnection.java | 0 .../messenger/core/di/CenterModule.java | 0 .../messenger/core/di/XmppComponent.java | 0 .../core/stores/EntityCapsStore.java | 0 .../core/stores/PlainMessageStore.java | 0 .../messenger/core/stores/RosterStore.java | 0 .../messenger/core/util/ContactNameUtil.java | 0 core/build.gradle | 32 ++----------- .../IncomingDirectMessageListener.java | 16 +++++++ .../IncomingGroupChatMessageListener.java | 19 ++++++++ .../messenger/core/entity/DirectChat.java | 13 ------ .../messenger/core/entity/GroupChat.java | 16 ------- .../messenger/core/entity/Interlocutor.java | 28 ------------ .../messenger/core/entity/MessageContent.java | 8 ---- .../entity/{ => chat}/AbstractDirectChat.java | 19 +++++++- .../entity/{ => chat}/AbstractGroupChat.java | 20 ++++++++- .../core/entity/{ => chat}/Chat.java | 5 ++- .../entity/{ => chat}/ChatPreferences.java | 2 +- .../core/entity/chat/DirectChat.java | 17 +++++++ .../messenger/core/entity/chat/GroupChat.java | 28 ++++++++++++ .../{ => contact}/AbstractInterlocutor.java | 16 ++++--- .../core/entity/{ => contact}/Contact.java | 7 ++- .../core/entity/contact/Interlocutor.java | 34 ++++++++++++++ .../entity/{ => message}/AbstractMessage.java | 20 ++++++--- .../core/entity/{ => message}/Message.java | 9 ++-- .../core/entity/message/MessageContent.java | 12 +++++ .../{ => message}/MessageDeliveryState.java | 2 +- .../entity/{ => message}/MessageMetadata.java | 2 +- .../core/entity/message/MessagePayload.java | 11 +++++ .../entity/message/TextMessageContent.java | 16 +++++++ .../messenger/xmpp/entity/XmppDirectChat.java | 7 --- .../messenger/xmpp/entity/XmppGroupChat.java | 7 --- .../xmpp/entity/XmppInterlocutor.java | 7 --- .../messenger/xmpp/entity/XmppMessage.java | 7 --- .../xmpp/entity/XmppMessageMetadata.java | 7 --- .../xmpp/entity/chat/XmppDirectChat.java | 10 +++++ .../messenger/xmpp/entity/chat/XmppMuc.java | 9 ++++ .../xmpp/entity/contact/XmppContact.java | 12 +++++ .../contact/XmppDirectInterlocutor.java | 12 +++++ .../entity/contact/XmppMucParticipant.java | 12 +++++ .../xmpp/entity/message/XmppMessage.java | 32 +++++++++++++ .../entity/message/XmppMessageMetadata.java | 7 +++ .../core/repository/ContactRepository.java | 2 +- .../core/repository/DirectChatRepository.java | 14 +++--- .../core/repository/GroupChatRepository.java | 12 ++--- settings.gradle | 4 +- transport/.gitignore | 1 + transport/build.gradle | 21 +++++++++ .../java/org/mercury_im/core/Messenger.java | 4 ++ .../core/connection/ConnectionMethod.java | 14 ++++++ .../exception/ConnectionFailedException.java | 6 +++ 60 files changed, 439 insertions(+), 168 deletions(-) create mode 100644 core-old/.gitignore create mode 100644 core-old/build.gradle rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/NotificationManager.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/centers/ContactCenter.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/centers/MessageCenter.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/connection/ConnectionState.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/connection/MercuryConfiguration.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/connection/MercuryConnection.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java (100%) rename {core => core-old}/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java (100%) create mode 100644 core/src/main/java/org/mercury_im/core/connection/IncomingDirectMessageListener.java create mode 100644 core/src/main/java/org/mercury_im/core/connection/IncomingGroupChatMessageListener.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/DirectChat.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/GroupChat.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/Interlocutor.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/MessageContent.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => chat}/AbstractDirectChat.java (58%) rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => chat}/AbstractGroupChat.java (66%) rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => chat}/Chat.java (66%) rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => chat}/ChatPreferences.java (94%) create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/chat/GroupChat.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => contact}/AbstractInterlocutor.java (65%) rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => contact}/Contact.java (81%) create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Interlocutor.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => message}/AbstractMessage.java (73%) rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => message}/Message.java (67%) create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageContent.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => message}/MessageDeliveryState.java (72%) rename entity/src/main/java/org/mercury_im/messenger/core/entity/{ => message}/MessageMetadata.java (79%) create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessagePayload.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/message/TextMessageContent.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppDirectChat.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppGroupChat.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppInterlocutor.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessage.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessageMetadata.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppDirectChat.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppMuc.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppContact.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppDirectInterlocutor.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppMucParticipant.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessage.java create mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessageMetadata.java create mode 100644 transport/.gitignore create mode 100644 transport/build.gradle create mode 100644 transport/src/main/java/org/mercury_im/core/Messenger.java create mode 100644 transport/src/main/java/org/mercury_im/core/connection/ConnectionMethod.java create mode 100644 transport/src/main/java/org/mercury_im/core/connection/exception/ConnectionFailedException.java diff --git a/app/build.gradle b/app/build.gradle index d5e0dd5..ff60256 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,7 +73,7 @@ check.configure { dependencies { // Depend on the core project for XMPP related stuff - implementation project(':core') + implementation project(':core-old') implementation "io.requery:requery-android:$requeryVersion" implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41' diff --git a/core-old/.gitignore b/core-old/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/core-old/.gitignore @@ -0,0 +1 @@ +/build diff --git a/core-old/build.gradle b/core-old/build.gradle new file mode 100644 index 0000000..6ecb6fa --- /dev/null +++ b/core-old/build.gradle @@ -0,0 +1,45 @@ +apply plugin: 'java-library' + +// Add the generated folder to the source directories so that we can work with generated classes +// This is apparently necessary for use with requery. +sourceSets { + main.java.srcDirs += "${buildDir}/generated/sources/annotationProcessor/java/main/" +} + +dependencies { + + api project(':entity') // Entities + api project(':repository') // Repository + api project(":thread_utils") + + // 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" + + // api "org.igniterealtime.smack:smack-omemo:$smackOmemoVersion" + // api "org.igniterealtime.smack:smack-omemo-signal:$smackOmemoSignalVersion" + // api "org.igniterealtime.smack:smack-openpgp:$smackOpenpgpVersion" + // api "org.igniterealtime.smack:smack-resolver-minidns:$smackResolverMiniDnsVersion" + + + // RxJava2 + api "io.reactivex.rxjava2:rxjava:$rxJava2Version" + + // Dagger 2 for dependency injection + implementation "com.google.dagger:dagger:$daggerVersion" + annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" + + // Requery ORM + api "io.requery:requery:$requeryVersion" + annotationProcessor "io.requery:requery-processor:$requeryVersion" + + // JUnit for testing + testImplementation "junit:junit:$junitVersion" +} + +sourceCompatibility = "8" +targetCompatibility = "8" diff --git a/core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java b/core-old/src/main/java/org/mercury_im/messenger/core/NotificationManager.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/NotificationManager.java rename to core-old/src/main/java/org/mercury_im/messenger/core/NotificationManager.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java b/core-old/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java rename to core-old/src/main/java/org/mercury_im/messenger/core/centers/ConnectionCenter.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/centers/ContactCenter.java b/core-old/src/main/java/org/mercury_im/messenger/core/centers/ContactCenter.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/centers/ContactCenter.java rename to core-old/src/main/java/org/mercury_im/messenger/core/centers/ContactCenter.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/centers/MessageCenter.java b/core-old/src/main/java/org/mercury_im/messenger/core/centers/MessageCenter.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/centers/MessageCenter.java rename to core-old/src/main/java/org/mercury_im/messenger/core/centers/MessageCenter.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/connection/ConnectionState.java b/core-old/src/main/java/org/mercury_im/messenger/core/connection/ConnectionState.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/connection/ConnectionState.java rename to core-old/src/main/java/org/mercury_im/messenger/core/connection/ConnectionState.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/connection/MercuryConfiguration.java b/core-old/src/main/java/org/mercury_im/messenger/core/connection/MercuryConfiguration.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/connection/MercuryConfiguration.java rename to core-old/src/main/java/org/mercury_im/messenger/core/connection/MercuryConfiguration.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/connection/MercuryConnection.java b/core-old/src/main/java/org/mercury_im/messenger/core/connection/MercuryConnection.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/connection/MercuryConnection.java rename to core-old/src/main/java/org/mercury_im/messenger/core/connection/MercuryConnection.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java b/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java rename to core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java b/core-old/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java rename to core-old/src/main/java/org/mercury_im/messenger/core/di/XmppComponent.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java b/core-old/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java rename to core-old/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java b/core-old/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java rename to core-old/src/main/java/org/mercury_im/messenger/core/stores/PlainMessageStore.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java b/core-old/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java rename to core-old/src/main/java/org/mercury_im/messenger/core/stores/RosterStore.java diff --git a/core/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java b/core-old/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java similarity index 100% rename from core/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java rename to core-old/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java diff --git a/core/build.gradle b/core/build.gradle index 6ecb6fa..a723522 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,42 +1,18 @@ apply plugin: 'java-library' -// Add the generated folder to the source directories so that we can work with generated classes -// This is apparently necessary for use with requery. -sourceSets { - main.java.srcDirs += "${buildDir}/generated/sources/annotationProcessor/java/main/" -} - dependencies { - api project(':entity') // Entities - api project(':repository') // Repository - api project(":thread_utils") - - // 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" - - // api "org.igniterealtime.smack:smack-omemo:$smackOmemoVersion" - // api "org.igniterealtime.smack:smack-omemo-signal:$smackOmemoSignalVersion" - // api "org.igniterealtime.smack:smack-openpgp:$smackOpenpgpVersion" - // api "org.igniterealtime.smack:smack-resolver-minidns:$smackResolverMiniDnsVersion" - + implementation project(':entity') + implementation project(':repository') + implementation project(":thread_utils") // RxJava2 - api "io.reactivex.rxjava2:rxjava:$rxJava2Version" + implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version" // Dagger 2 for dependency injection implementation "com.google.dagger:dagger:$daggerVersion" annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" - // Requery ORM - api "io.requery:requery:$requeryVersion" - annotationProcessor "io.requery:requery-processor:$requeryVersion" - // JUnit for testing testImplementation "junit:junit:$junitVersion" } diff --git a/core/src/main/java/org/mercury_im/core/connection/IncomingDirectMessageListener.java b/core/src/main/java/org/mercury_im/core/connection/IncomingDirectMessageListener.java new file mode 100644 index 0000000..eabbea5 --- /dev/null +++ b/core/src/main/java/org/mercury_im/core/connection/IncomingDirectMessageListener.java @@ -0,0 +1,16 @@ +package org.mercury_im.core.connection; + +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/core/src/main/java/org/mercury_im/core/connection/IncomingGroupChatMessageListener.java b/core/src/main/java/org/mercury_im/core/connection/IncomingGroupChatMessageListener.java new file mode 100644 index 0000000..5a73d66 --- /dev/null +++ b/core/src/main/java/org/mercury_im/core/connection/IncomingGroupChatMessageListener.java @@ -0,0 +1,19 @@ +package org.mercury_im.core.connection; + +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/entity/src/main/java/org/mercury_im/messenger/core/entity/DirectChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/DirectChat.java deleted file mode 100644 index 2e03482..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/DirectChat.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.mercury_im.messenger.core.entity; - -public interface DirectChat< - IL extends Interlocutor, - AC extends Account, - AD extends Address.UserAddress> - extends Chat { - - IL getInterlocutor(); - - void setInterlocutor(IL interlocutor); - -} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/GroupChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/GroupChat.java deleted file mode 100644 index 21bfd0d..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/GroupChat.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.mercury_im.messenger.core.entity; - -public interface GroupChat< - AC extends Account, - AD extends Address.UserAddress, - RA extends Address.RoomAddress> - extends Chat { - - RA getRoomAddress(); - - void setRoomAddress(RA roomAddress); - - String getRoomName(); - - void setRoomName(String roomName); -} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Interlocutor.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/Interlocutor.java deleted file mode 100644 index 2e1072a..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/Interlocutor.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.mercury_im.messenger.core.entity; - -/** - * Defines a user on the network (eg. a contact, chat partner etc). - * - * @param Account Type - * @param UserAddress Type - */ -public interface Interlocutor< - AC extends Account, - AD extends Address.UserAddress> { - - long getId(); - - void setId(long id); - - AC getAccount(); - - void setAccount(AC account); - - AD getAddress(); - - void setAddress(AD address); - - String getName(); - - void setName(String name); -} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageContent.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageContent.java deleted file mode 100644 index 2bb7133..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageContent.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.mercury_im.messenger.core.entity; - -public interface MessageContent { - - String getBody(); - - void setBody(String body); -} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractDirectChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractDirectChat.java similarity index 58% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractDirectChat.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractDirectChat.java index 0bcea11..aa11194 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractDirectChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractDirectChat.java @@ -1,6 +1,10 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.core.entity.chat; -public class AbstractDirectChat< +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; + +public abstract class AbstractDirectChat< IL extends Interlocutor, AC extends Account, AD extends Address.UserAddress> @@ -9,6 +13,7 @@ public class AbstractDirectChat< protected long id; protected IL interlocutor; protected AC account; + protected ChatPreferences preferences; @Override public IL getInterlocutor() { @@ -39,4 +44,14 @@ public class AbstractDirectChat< public void setAccount(AC account) { this.account = account; } + + @Override + public ChatPreferences getChatPreferences() { + return preferences; + } + + @Override + public void setChatPreferences(ChatPreferences chatPreferences) { + this.preferences = chatPreferences; + } } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractGroupChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractGroupChat.java similarity index 66% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractGroupChat.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractGroupChat.java index e6c99af..13d6d79 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractGroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/AbstractGroupChat.java @@ -1,6 +1,9 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.core.entity.chat; -public class AbstractGroupChat< +import org.mercury_im.messenger.core.entity.Address; +import org.mercury_im.messenger.core.entity.Account; + +public abstract class AbstractGroupChat< AC extends Account, AD extends Address.UserAddress, RA extends Address.RoomAddress> @@ -10,6 +13,7 @@ public class AbstractGroupChat< private AC account; private RA roomAddress; private String roomName; + protected ChatPreferences preferences; @Override public RA getRoomAddress() { @@ -50,4 +54,16 @@ public class AbstractGroupChat< public void setAccount(AC account) { this.account = account; } + + + @Override + public ChatPreferences getChatPreferences() { + return preferences; + } + + @Override + public void setChatPreferences(ChatPreferences chatPreferences) { + this.preferences = preferences; + } + } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java similarity index 66% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java index d5a858c..175891a 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/Chat.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java @@ -1,4 +1,7 @@ -package org.mercury_im.messenger.core.entity; +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, diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/ChatPreferences.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java similarity index 94% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/ChatPreferences.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java index af7db4b..c364525 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/ChatPreferences.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.core.entity.chat; public interface ChatPreferences { 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 new file mode 100644 index 0000000..088b4b7 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java @@ -0,0 +1,17 @@ +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; + +public interface DirectChat< + IL extends Interlocutor, + AC extends Account, + AD extends Address.UserAddress> + extends Chat { + + IL getInterlocutor(); + + void setInterlocutor(IL interlocutor); + +} 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 new file mode 100644 index 0000000..dcf8806 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/GroupChat.java @@ -0,0 +1,28 @@ +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 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 { + + Set getParticipants(); + + void setParticipants(Set participants); + + RA getRoomAddress(); + + void setRoomAddress(RA roomAddress); + + String getRoomName(); + + void setRoomName(String roomName); +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractInterlocutor.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/AbstractInterlocutor.java similarity index 65% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractInterlocutor.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/contact/AbstractInterlocutor.java index b10ea15..22fe69b 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractInterlocutor.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/AbstractInterlocutor.java @@ -1,13 +1,17 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.core.entity.contact; -public class AbstractInterlocutor< +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 { + implements Interlocutor { protected long id; protected AC account; - protected AD address; + protected IA address; protected String name; @Override @@ -31,12 +35,12 @@ public class AbstractInterlocutor< } @Override - public AD getAddress() { + public IA getAddress() { return address; } @Override - public void setAddress(AD address) { + public void setAddress(IA address) { this.address = address; } diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Contact.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java similarity index 81% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/Contact.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java index d28db10..deff2e9 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/Contact.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java @@ -1,9 +1,12 @@ -package org.mercury_im.messenger.core.entity; +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 { + extends Interlocutor { SubscriptionMode getSubscriptionMode(); 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 new file mode 100644 index 0000000..ae2aea7 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Interlocutor.java @@ -0,0 +1,34 @@ +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/AbstractMessage.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/AbstractMessage.java similarity index 73% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractMessage.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/message/AbstractMessage.java index 7111c47..d492ce5 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/AbstractMessage.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/AbstractMessage.java @@ -1,14 +1,20 @@ -package org.mercury_im.messenger.core.entity; +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 class AbstractMessage implements Message { +public abstract class AbstractMessage< + AD extends Address, + MM extends MessageMetadata> + implements Message { protected long id; protected AD sender; protected AD recipient; protected Date timestamp; - protected String body; + protected List payloads; protected MessageDeliveryState deliveryState; protected MM metadata; @@ -53,13 +59,13 @@ public class AbstractMessage imp } @Override - public String getBody() { - return body; + public List getMessagePayloads() { + return payloads; } @Override - public void setBody(String body) { - this.body = body; + public void setMessagePayloads(List list) { + this.payloads = list; } @Override diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java similarity index 67% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java index 0184db8..8db0112 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/Message.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java @@ -1,6 +1,9 @@ -package org.mercury_im.messenger.core.entity; +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 { @@ -20,9 +23,9 @@ public interface Message { void setTimestamp(Date timestamp); - String getBody(); + List getMessagePayloads(); - void setBody(String body); + void setMessagePayloads(List messagePayloads); MessageDeliveryState getDeliveryState(); 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/MessageContent.java new file mode 100644 index 0000000..ad462c5 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageContent.java @@ -0,0 +1,12 @@ +package org.mercury_im.messenger.core.entity.message; + +public interface MessageContent { + + interface Body extends MessageContent { + + String getBody(); + + void setBody(String body); + + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageDeliveryState.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageDeliveryState.java similarity index 72% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/MessageDeliveryState.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageDeliveryState.java index 4b9a30e..dfeb33d 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageDeliveryState.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageDeliveryState.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.core.entity.message; public enum MessageDeliveryState { pending_delivery, diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageMetadata.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageMetadata.java similarity index 79% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/MessageMetadata.java rename to entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageMetadata.java index 877b642..3f8b225 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/MessageMetadata.java +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageMetadata.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.core.entity.message; /** * Interface to allow additional, protocol specific metadata to be attached to the message. 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 new file mode 100644 index 0000000..125086b --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessagePayload.java @@ -0,0 +1,11 @@ +package org.mercury_im.messenger.core.entity.message; + +import java.util.List; + +public interface MessagePayload { + + List getMessageContents(); + + void setMessageContents(List messageContents); + +} 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/TextMessageContent.java new file mode 100644 index 0000000..f013524 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/core/entity/message/TextMessageContent.java @@ -0,0 +1,16 @@ +package org.mercury_im.messenger.core.entity.message; + +public class TextMessageContent implements MessageContent.Body { + + private String body; + + @Override + public String getBody() { + return body; + } + + @Override + public void setBody(String body) { + this.body = body; + } +} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppDirectChat.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppDirectChat.java deleted file mode 100644 index 08f905c..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppDirectChat.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity; - -import org.mercury_im.messenger.core.entity.AbstractDirectChat; - -public class XmppDirectChat extends AbstractDirectChat { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppGroupChat.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppGroupChat.java deleted file mode 100644 index 74a8690..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppGroupChat.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity; - -import org.mercury_im.messenger.core.entity.AbstractGroupChat; - -public class XmppGroupChat extends AbstractGroupChat { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppInterlocutor.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppInterlocutor.java deleted file mode 100644 index aae1fb5..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppInterlocutor.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity; - -import org.mercury_im.messenger.core.entity.AbstractInterlocutor; - -public class XmppInterlocutor extends AbstractInterlocutor { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessage.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessage.java deleted file mode 100644 index 5da2232..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessage.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity; - -import org.mercury_im.messenger.core.entity.AbstractMessage; - -public class XmppMessage extends AbstractMessage { - -} diff --git a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessageMetadata.java b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessageMetadata.java deleted file mode 100644 index 6362abe..0000000 --- a/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppMessageMetadata.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.mercury_im.messenger.xmpp.entity; - -import org.mercury_im.messenger.core.entity.MessageMetadata; - -public class XmppMessageMetadata implements MessageMetadata { - -} 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 new file mode 100644 index 0000000..07d12aa --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppDirectChat.java @@ -0,0 +1,10 @@ +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 new file mode 100644 index 0000000..a726c01 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppMuc.java @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..35db795 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppContact.java @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..b38df70 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppDirectInterlocutor.java @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..b85f9ae --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppMucParticipant.java @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..df185eb --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessage.java @@ -0,0 +1,32 @@ +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> { + + 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 new file mode 100644 index 0000000..b607e28 --- /dev/null +++ b/entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessageMetadata.java @@ -0,0 +1,7 @@ +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/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java b/repository/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java index ce8f651..73c4d98 100644 --- 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 @@ -2,7 +2,7 @@ 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; +import org.mercury_im.messenger.core.entity.contact.Contact; import org.mercury_im.messenger.core.util.Optional; import java.util.List; 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 index 0aeefa3..2266b56 100644 --- 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 @@ -2,10 +2,11 @@ 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.DirectChat; -import org.mercury_im.messenger.core.entity.Interlocutor; -import org.mercury_im.messenger.core.entity.Message; -import org.mercury_im.messenger.core.entity.MessageMetadata; +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; @@ -20,8 +21,9 @@ public interface DirectChatRepository< IL extends Interlocutor, AC extends Account, AD extends Address.UserAddress, - M extends Message, - MM extends MessageMetadata> { + M extends Message, + MM extends MessageMetadata, + MP extends MessagePayload> { Single insertDirectChat(DC chat); 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 index 5a512dc..460a00c 100644 --- 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 @@ -2,9 +2,10 @@ 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.GroupChat; -import org.mercury_im.messenger.core.entity.Message; -import org.mercury_im.messenger.core.entity.MessageMetadata; +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; @@ -19,8 +20,9 @@ public interface GroupChatRepository< AC extends Account, AD extends Address.UserAddress, RA extends Address.RoomAddress, - M extends Message, - MM extends MessageMetadata> { + M extends Message, + MM extends MessageMetadata, + MP extends MessagePayload> { Single insertGroupChat(GC chat); diff --git a/settings.gradle b/settings.gradle index ac12fbe..55efc78 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,9 +2,11 @@ include ':entity', ':entity_xmpp', ':repository', ':repository_xmpp', + ':core', + ':transport', ':transport_xmpp', ':app', ':thread_utils', - ':core' + ':core-old' includeBuild 'libs/Smack' diff --git a/transport/.gitignore b/transport/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/transport/.gitignore @@ -0,0 +1 @@ +/build diff --git a/transport/build.gradle b/transport/build.gradle new file mode 100644 index 0000000..a723522 --- /dev/null +++ b/transport/build.gradle @@ -0,0 +1,21 @@ +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/Messenger.java b/transport/src/main/java/org/mercury_im/core/Messenger.java new file mode 100644 index 0000000..6ad89fd --- /dev/null +++ b/transport/src/main/java/org/mercury_im/core/Messenger.java @@ -0,0 +1,4 @@ +package org.mercury_im.core; + +public class 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 new file mode 100644 index 0000000..96dbdcf --- /dev/null +++ b/transport/src/main/java/org/mercury_im/core/connection/ConnectionMethod.java @@ -0,0 +1,14 @@ +package org.mercury_im.core.connection; + +import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.core.entity.Address; + +public interface ConnectionMethod< + AC extends Account, + AD extends Address.UserAddress> { + + AC getAccount(); + + void setAccount(AC account); + +} diff --git a/transport/src/main/java/org/mercury_im/core/connection/exception/ConnectionFailedException.java b/transport/src/main/java/org/mercury_im/core/connection/exception/ConnectionFailedException.java new file mode 100644 index 0000000..1c64385 --- /dev/null +++ b/transport/src/main/java/org/mercury_im/core/connection/exception/ConnectionFailedException.java @@ -0,0 +1,6 @@ +package org.mercury_im.core.connection.exception; + +public class ConnectionFailedException extends Exception { + + private static final long serialVersionUID = 1L; +} From 78d53767248dbad880d574de3e7046e9bfc5a5c7 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Tue, 12 Nov 2019 00:07:57 +0100 Subject: [PATCH 05/83] Start work on connection stuff --- .../mercury_im/core/ConnectionFactory.java | 17 +++++++++++ .../java/org/mercury_im/core/Messenger.java | 13 +++++++++ .../connection/AbstractConnectionMethod.java | 29 +++++++++++++++++++ .../core/connection/ConnectionMethod.java | 7 ++++- .../IncomingDirectMessageListener.java | 4 +-- .../IncomingGroupChatMessageListener.java | 6 ++-- .../core/listener/TypingEventListener.java | 5 ++++ transport_xmpp/build.gradle | 1 + .../connection/XmppConnectionFactory.java | 21 ++++++++++++++ .../xmpp/connection/XmppConnectionMethod.java | 20 +++++++++++++ 10 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 transport/src/main/java/org/mercury_im/core/ConnectionFactory.java create mode 100644 transport/src/main/java/org/mercury_im/core/connection/AbstractConnectionMethod.java rename {core/src/main/java/org/mercury_im/core/connection => transport/src/main/java/org/mercury_im/core/listener}/IncomingDirectMessageListener.java (86%) rename {core/src/main/java/org/mercury_im/core/connection => transport/src/main/java/org/mercury_im/core/listener}/IncomingGroupChatMessageListener.java (82%) create mode 100644 transport/src/main/java/org/mercury_im/core/listener/TypingEventListener.java create mode 100644 transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionFactory.java create mode 100644 transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionMethod.java diff --git a/transport/src/main/java/org/mercury_im/core/ConnectionFactory.java b/transport/src/main/java/org/mercury_im/core/ConnectionFactory.java new file mode 100644 index 0000000..bdfe9ad --- /dev/null +++ b/transport/src/main/java/org/mercury_im/core/ConnectionFactory.java @@ -0,0 +1,17 @@ +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/Messenger.java b/transport/src/main/java/org/mercury_im/core/Messenger.java index 6ad89fd..ab0cbeb 100644 --- a/transport/src/main/java/org/mercury_im/core/Messenger.java +++ b/transport/src/main/java/org/mercury_im/core/Messenger.java @@ -1,4 +1,17 @@ package org.mercury_im.core; +import org.mercury_im.core.connection.ConnectionMethod; + +import java.util.HashMap; +import java.util.Map; + public class Messenger { + + private final Map connections = new HashMap<>(); + + public void addConnection(ConnectionMethod connection) { + connections.put(connection.getAccount().getId(), connection); + } + + } 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 new file mode 100644 index 0000000..711b0af --- /dev/null +++ b/transport/src/main/java/org/mercury_im/core/connection/AbstractConnectionMethod.java @@ -0,0 +1,29 @@ +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 index 96dbdcf..cf1b6b0 100644 --- a/transport/src/main/java/org/mercury_im/core/connection/ConnectionMethod.java +++ b/transport/src/main/java/org/mercury_im/core/connection/ConnectionMethod.java @@ -1,14 +1,19 @@ 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(); - void setAccount(AC account); + Messenger getMessenger(); + + Completable connect(); } diff --git a/core/src/main/java/org/mercury_im/core/connection/IncomingDirectMessageListener.java b/transport/src/main/java/org/mercury_im/core/listener/IncomingDirectMessageListener.java similarity index 86% rename from core/src/main/java/org/mercury_im/core/connection/IncomingDirectMessageListener.java rename to transport/src/main/java/org/mercury_im/core/listener/IncomingDirectMessageListener.java index eabbea5..4dad85c 100644 --- a/core/src/main/java/org/mercury_im/core/connection/IncomingDirectMessageListener.java +++ b/transport/src/main/java/org/mercury_im/core/listener/IncomingDirectMessageListener.java @@ -1,4 +1,4 @@ -package org.mercury_im.core.connection; +package org.mercury_im.core.listener; import org.mercury_im.messenger.core.entity.Account; import org.mercury_im.messenger.core.entity.Address; @@ -9,7 +9,7 @@ import org.mercury_im.messenger.core.entity.message.AbstractMessage; public interface IncomingDirectMessageListener< AC extends Account, AD extends Address.UserAddress, - IL extends Interlocutor> { + IL extends Interlocutor> { void onIncomingDirectMessage(AC account, DirectChat chat, AbstractMessage message); diff --git a/core/src/main/java/org/mercury_im/core/connection/IncomingGroupChatMessageListener.java b/transport/src/main/java/org/mercury_im/core/listener/IncomingGroupChatMessageListener.java similarity index 82% rename from core/src/main/java/org/mercury_im/core/connection/IncomingGroupChatMessageListener.java rename to transport/src/main/java/org/mercury_im/core/listener/IncomingGroupChatMessageListener.java index 5a73d66..c8a48bf 100644 --- a/core/src/main/java/org/mercury_im/core/connection/IncomingGroupChatMessageListener.java +++ b/transport/src/main/java/org/mercury_im/core/listener/IncomingGroupChatMessageListener.java @@ -1,4 +1,4 @@ -package org.mercury_im.core.connection; +package org.mercury_im.core.listener; import org.mercury_im.messenger.core.entity.Account; import org.mercury_im.messenger.core.entity.Address; @@ -12,8 +12,8 @@ public interface IncomingGroupChatMessageListener< AD extends Address.UserAddress, RA extends Address.RoomAddress, PA extends Address.RoomParticipantAddress, - IL extends Interlocutor> { + IL extends Interlocutor> { - void onIncomingDirectMessage(AC account, GroupChat chat, AbstractMessage message); + 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 new file mode 100644 index 0000000..022ef11 --- /dev/null +++ b/transport/src/main/java/org/mercury_im/core/listener/TypingEventListener.java @@ -0,0 +1,5 @@ +package org.mercury_im.core.listener; + +public interface TypingEventListener { + +} diff --git a/transport_xmpp/build.gradle b/transport_xmpp/build.gradle index f5d8c22..6995069 100644 --- a/transport_xmpp/build.gradle +++ b/transport_xmpp/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'java-library' dependencies { implementation project(":repository_xmpp") implementation project(":entity_xmpp") + implementation project(":transport") } 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 new file mode 100644 index 0000000..44a27e0 --- /dev/null +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionFactory.java @@ -0,0 +1,21 @@ +package org.mercury_im.xmpp.connection; + +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 { + + protected Messenger messenger; + + public Messenger getMessenger() { + return messenger; + } + + @Override + public XmppConnectionMethod provideConnection(XmppAccount account) { + return new XmppConnectionMethod(account, getMessenger()); + } +} diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionMethod.java b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionMethod.java new file mode 100644 index 0000000..07d16de --- /dev/null +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionMethod.java @@ -0,0 +1,20 @@ +package org.mercury_im.xmpp.connection; + +import org.mercury_im.core.Messenger; +import org.mercury_im.core.connection.AbstractConnectionMethod; +import org.mercury_im.messenger.xmpp.entity.XmppAccount; +import org.mercury_im.messenger.xmpp.entity.XmppAddress; + +import io.reactivex.Completable; + +public class XmppConnectionMethod extends AbstractConnectionMethod { + + public XmppConnectionMethod(XmppAccount account, Messenger messenger) { + super(account, messenger); + } + + @Override + public Completable connect() { + return null; + } +} From baeabc06029e8ef7ccd83c4993ca1e2282a954c9 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 16 Nov 2019 09:58:00 +0100 Subject: [PATCH 06/83] 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(); +} From 2755b2de8fbf2ee2cf89177e61c8678fc6f992c2 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 18 Nov 2019 00:04:28 +0100 Subject: [PATCH 07/83] Restructure modules, remove generics hell from entities --- build.gradle | 2 +- core-old/build.gradle | 3 +- .../core/usecase/SendDirectMessage.java | 33 --------- {core => data}/.gitignore | 0 {repository => data}/build.gradle | 1 - .../core/repository/AccountRepository.java | 33 +++++++++ .../core/repository/ContactRepository.java | 32 +++++++++ .../core/repository/DirectChatRepository.java | 46 +++++++++++++ .../core/repository/GroupChatRepository.java | 45 ++++++++++++ .../messenger/core/util/Optional.java | 0 {entity_xmpp => domain}/.gitignore | 0 {core => domain}/build.gradle | 3 +- .../org/mercury_im/core/MessageCenter.java | 17 +++++ .../java/org/mercury_im/core/Messenger.java | 6 +- .../core/transport/ConnectionType.java | 22 ++++++ .../connection/AbstractConnectionMethod.java | 26 +++++++ .../connection/ConnectionFactory.java | 13 ++++ .../connection/ConnectionMethod.java | 18 +++++ .../exception/ConnectionFailedException.java | 2 +- .../IncomingDirectMessageListener.java | 11 +++ .../IncomingGroupChatMessageListener.java | 11 +++ .../listener/TypingEventListener.java | 9 +++ .../core/usecase/SendDirectMessage.java | 23 +++++++ .../mercury_im/core/util}/ThreadUtils.java | 2 +- .../messenger/core/entity/Account.java | 14 ++-- .../messenger/core/entity/Address.java | 24 ------- .../{AbstractAccount.java => IAccount.java} | 17 ++--- .../core/entity/PasswordAuthentication.java | 15 ++++ .../messenger/core/entity/chat/Chat.java | 9 +-- .../core/entity/chat/ChatPreferences.java | 6 +- .../core/entity/chat/DirectChat.java | 14 ++-- .../messenger/core/entity/chat/GroupChat.java | 20 ++---- .../core/entity/chat/IChatPreferences.java | 60 ++++++++++++++++ ...stractDirectChat.java => IDirectChat.java} | 25 +++---- ...AbstractGroupChat.java => IGroupChat.java} | 35 ++++++---- .../entity/chat/INotificationPreferences.java | 27 ++++++++ .../core/entity/contact/Contact.java | 8 +-- .../core/entity/contact/IContact.java | 62 +++++++++++++++++ .../{AbstractInterlocutor.java => IPeer.java} | 19 ++--- .../core/entity/contact/Interlocutor.java | 34 --------- .../messenger/core/entity/contact/Peer.java | 26 +++++++ .../core/entity/event/ITypingEvent.java | 20 ++++++ .../core/entity/event/TypingEvent.java | 12 ++++ .../core/entity/event/TypingState.java | 24 +++++++ .../{AbstractMessage.java => IMessage.java} | 25 +++---- .../core/entity/message/IMessagePayload.java | 20 ++++++ .../core/entity/message/Message.java | 16 ++--- .../core/entity/message/MessagePayload.java | 10 +++ .../message/{ => content}/MessageContent.java | 2 +- .../{ => content}/TextMessageContent.java | 2 +- entity_xmpp/build.gradle | 11 --- .../messenger/xmpp/entity/XmppAccount.java | 7 -- .../messenger/xmpp/entity/XmppAddress.java | 46 ------------- .../xmpp/entity/chat/XmppDirectChat.java | 10 --- .../messenger/xmpp/entity/chat/XmppMuc.java | 9 --- .../xmpp/entity/contact/XmppContact.java | 12 ---- .../contact/XmppDirectInterlocutor.java | 12 ---- .../entity/contact/XmppMucParticipant.java | 12 ---- .../xmpp/entity/message/XmppMessage.java | 30 -------- .../entity/message/XmppMessageMetadata.java | 7 -- repository/.gitignore | 1 - .../core/repository/AccountRepository.java | 36 ---------- .../core/repository/ContactRepository.java | 37 ---------- .../core/repository/DirectChatRepository.java | 57 --------------- .../core/repository/GroupChatRepository.java | 56 --------------- repository_xmpp/build.gradle | 10 +-- .../converter/EntityBareJidConverter.java | 33 --------- .../xmpp/converter/XmppAddressConverter.java | 32 --------- .../messenger/xmpp/di/RequeryModule.java | 2 +- .../xmpp/mapping/AccountMapping.java | 20 +++--- .../xmpp/model/AbstractAccountModel.java | 7 +- .../xmpp/model/AbstractChatModel.java | 2 +- .../xmpp/model/AbstractContactModel.java | 2 +- .../xmpp/model/AbstractMessageModel.java | 13 +--- ...ntityModel.java => AbstractPeerModel.java} | 13 ++-- .../xmpp/repository/AbstractRepository.java | 2 +- .../xmpp/repository/ChatRepository.java | 23 +++---- .../xmpp/repository/EntityCapsRepository.java | 2 +- .../xmpp/repository/MessageRepository.java | 10 +-- .../ReactiveXmppAccountRepository.java | 42 +++++------ .../xmpp/repository/RosterRepository.java | 69 +++++++++---------- settings.gradle | 7 +- thread_utils/.gitignore | 1 - thread_utils/README.md | 5 -- thread_utils/build.gradle | 4 -- transport/.gitignore | 1 - transport/build.gradle | 21 ------ .../mercury_im/core/ConnectionFactory.java | 17 ----- .../connection/AbstractConnectionMethod.java | 29 -------- .../core/connection/ConnectionMethod.java | 19 ----- .../IncomingDirectMessageListener.java | 16 ----- .../IncomingGroupChatMessageListener.java | 19 ----- .../core/listener/TypingEventListener.java | 5 -- .../core/message/MessageCenter.java | 21 ------ transport_xmpp/build.gradle | 4 +- .../connection/XmppConnectionFactory.java | 17 ++--- .../xmpp/connection/XmppConnectionMethod.java | 29 -------- .../connection/XmppTcpConnectionFactory.java | 26 +++++-- .../connection/XmppTcpConnectionMethod.java | 59 ++++++++++++++++ .../message/XmppDirectMessageCenter.java | 56 +++++++++------ .../xmpp/entity/XmppAuthMethod.java | 2 +- 101 files changed, 905 insertions(+), 982 deletions(-) delete mode 100644 core/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java rename {core => data}/.gitignore (100%) rename {repository => data}/build.gradle (85%) create mode 100644 data/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java create mode 100644 data/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java create mode 100644 data/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java create mode 100644 data/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java rename {repository => data}/src/main/java/org/mercury_im/messenger/core/util/Optional.java (100%) rename {entity_xmpp => domain}/.gitignore (100%) rename {core => domain}/build.gradle (84%) create mode 100644 domain/src/main/java/org/mercury_im/core/MessageCenter.java rename {transport => domain}/src/main/java/org/mercury_im/core/Messenger.java (58%) create mode 100644 domain/src/main/java/org/mercury_im/core/transport/ConnectionType.java create mode 100644 domain/src/main/java/org/mercury_im/core/transport/connection/AbstractConnectionMethod.java create mode 100644 domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionFactory.java create mode 100644 domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionMethod.java rename {transport/src/main/java/org/mercury_im/core => domain/src/main/java/org/mercury_im/core/transport}/connection/exception/ConnectionFailedException.java (65%) create mode 100644 domain/src/main/java/org/mercury_im/core/transport/listener/IncomingDirectMessageListener.java create mode 100644 domain/src/main/java/org/mercury_im/core/transport/listener/IncomingGroupChatMessageListener.java create mode 100644 domain/src/main/java/org/mercury_im/core/transport/listener/TypingEventListener.java create mode 100644 domain/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java rename {thread_utils/src/main/java/org/mercury_im/messenger/thread_utils => domain/src/main/java/org/mercury_im/core/util}/ThreadUtils.java (88%) delete mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/Address.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/{AbstractAccount.java => IAccount.java} (63%) create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/PasswordAuthentication.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IChatPreferences.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/chat/{AbstractDirectChat.java => IDirectChat.java} (53%) rename entity/src/main/java/org/mercury_im/messenger/core/entity/chat/{AbstractGroupChat.java => IGroupChat.java} (58%) create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/chat/INotificationPreferences.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IContact.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/contact/{AbstractInterlocutor.java => IPeer.java} (60%) delete mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Interlocutor.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Peer.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/event/ITypingEvent.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingEvent.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingState.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/message/{AbstractMessage.java => IMessage.java} (73%) create mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessagePayload.java rename entity/src/main/java/org/mercury_im/messenger/core/entity/message/{ => content}/MessageContent.java (71%) rename entity/src/main/java/org/mercury_im/messenger/core/entity/message/{ => content}/TextMessageContent.java (80%) delete mode 100644 entity_xmpp/build.gradle delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAccount.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/XmppAddress.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppDirectChat.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/chat/XmppMuc.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppContact.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppDirectInterlocutor.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/contact/XmppMucParticipant.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessage.java delete mode 100644 entity_xmpp/src/main/java/org/mercury_im/messenger/xmpp/entity/message/XmppMessageMetadata.java delete mode 100644 repository/.gitignore delete mode 100644 repository/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java delete mode 100644 repository/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java delete mode 100644 repository/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java delete mode 100644 repository/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java delete mode 100644 repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/EntityBareJidConverter.java delete mode 100644 repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/XmppAddressConverter.java rename repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/{AbstractEntityModel.java => AbstractPeerModel.java} (59%) delete mode 100644 thread_utils/.gitignore delete mode 100644 thread_utils/README.md delete mode 100644 thread_utils/build.gradle delete mode 100644 transport/.gitignore delete mode 100644 transport/build.gradle delete mode 100644 transport/src/main/java/org/mercury_im/core/ConnectionFactory.java delete mode 100644 transport/src/main/java/org/mercury_im/core/connection/AbstractConnectionMethod.java delete mode 100644 transport/src/main/java/org/mercury_im/core/connection/ConnectionMethod.java delete mode 100644 transport/src/main/java/org/mercury_im/core/listener/IncomingDirectMessageListener.java delete mode 100644 transport/src/main/java/org/mercury_im/core/listener/IncomingGroupChatMessageListener.java delete mode 100644 transport/src/main/java/org/mercury_im/core/listener/TypingEventListener.java delete mode 100644 transport/src/main/java/org/mercury_im/core/message/MessageCenter.java delete mode 100644 transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionMethod.java create mode 100644 transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionMethod.java rename {entity_xmpp/src/main/java/org/mercury_im/messenger => transport_xmpp/src/main/java/org/mercury_im}/xmpp/entity/XmppAuthMethod.java (92%) 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; From cf034939b43147b2f43f7414e5d953fd9d57ec19 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 18 Nov 2019 18:39:35 +0100 Subject: [PATCH 08/83] More code-plowing. Moved interfaces from data to domain and renamed repository_xmpp to data --- .../messenger/MercuryImApplication.java | 2 +- core-old/build.gradle | 1 - .../data}/util/ContactNameUtil.java | 2 +- .../messenger/core/di/CenterModule.java | 2 +- data/build.gradle | 27 +++++++++++++--- .../converter/SaslConditionConverter.java | 0 .../SubscriptionDirectionConverter.java | 0 .../messenger/xmpp/di/RequeryModule.java | 0 .../messenger/xmpp/enums/SaslCondition.java | 0 .../xmpp/enums/SubscriptionDirection.java | 0 .../xmpp/mapping/AccountMapping.java | 0 .../xmpp/model/AbstractAccountModel.java | 0 .../xmpp/model/AbstractChatModel.java | 0 .../xmpp/model/AbstractContactModel.java | 0 .../xmpp/model/AbstractEntityCapsModel.java | 0 .../AbstractLastChatMessageRelation.java | 0 .../AbstractLastReadChatMessageRelation.java | 0 .../xmpp/model/AbstractMessageModel.java | 0 .../xmpp/model/AbstractPeerModel.java | 0 ...AbstractSaslAuthenticationResultModel.java | 0 .../xmpp/repository/AbstractRepository.java | 0 .../xmpp/repository/ChatRepository.java | 0 .../xmpp/repository/EntityCapsRepository.java | 0 .../xmpp/repository/MessageRepository.java | 0 .../ReactiveXmppAccountRepository.java | 5 ++- .../xmpp/repository/RequeryRepository.java | 0 .../xmpp/repository/RosterRepository.java | 0 .../xmpp/util/ChatAndPossiblyContact.java | 0 domain/build.gradle | 1 - .../data}/repository/AccountRepository.java | 4 +-- .../data}/repository/ContactRepository.java | 4 +-- .../repository/DirectChatRepository.java | 4 +-- .../data}/repository/GroupChatRepository.java | 4 +-- .../mercury_im/core/data}/util/Optional.java | 2 +- repository_xmpp/.gitignore | 1 - repository_xmpp/build.gradle | 31 ------------------- settings.gradle | 1 - transport_xmpp/build.gradle | 4 ++- .../connection/XmppConnectionFactory.java | 2 +- .../connection/XmppTcpConnectionFactory.java | 8 ++--- .../connection/XmppTcpConnectionMethod.java | 2 +- .../message/XmppDirectMessageCenter.java | 4 +-- .../xmpp/entity/XmppAuthMethod.java | 24 -------------- 43 files changed, 48 insertions(+), 87 deletions(-) rename core-old/src/main/java/org/mercury_im/{messenger/core => core/data}/util/ContactNameUtil.java (94%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java (98%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java (100%) rename {repository_xmpp => data}/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java (100%) rename {data/src/main/java/org/mercury_im/messenger/core => domain/src/main/java/org/mercury_im/core/data}/repository/AccountRepository.java (88%) rename {data/src/main/java/org/mercury_im/messenger/core => domain/src/main/java/org/mercury_im/core/data}/repository/ContactRepository.java (88%) rename {data/src/main/java/org/mercury_im/messenger/core => domain/src/main/java/org/mercury_im/core/data}/repository/DirectChatRepository.java (92%) rename {data/src/main/java/org/mercury_im/messenger/core => domain/src/main/java/org/mercury_im/core/data}/repository/GroupChatRepository.java (92%) rename {data/src/main/java/org/mercury_im/messenger/core => domain/src/main/java/org/mercury_im/core/data}/util/Optional.java (89%) delete mode 100644 repository_xmpp/.gitignore delete mode 100644 repository_xmpp/build.gradle rename transport_xmpp/src/main/java/org/mercury_im/xmpp/{ => domain}/connection/XmppConnectionFactory.java (95%) rename transport_xmpp/src/main/java/org/mercury_im/xmpp/{ => domain}/connection/XmppTcpConnectionFactory.java (80%) rename transport_xmpp/src/main/java/org/mercury_im/xmpp/{ => domain}/connection/XmppTcpConnectionMethod.java (97%) rename transport_xmpp/src/main/java/org/mercury_im/xmpp/{ => domain}/connection/message/XmppDirectMessageCenter.java (94%) delete mode 100644 transport_xmpp/src/main/java/org/mercury_im/xmpp/entity/XmppAuthMethod.java diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index ee2f0c2..e3e475b 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -12,7 +12,7 @@ import android.os.Build; import org.mercury_im.messenger.core.centers.ConnectionCenter; import org.mercury_im.messenger.core.connection.MercuryConfiguration; import org.mercury_im.messenger.xmpp.util.ChatAndPossiblyContact; -import org.mercury_im.messenger.core.util.ContactNameUtil; +import org.mercury_im.core.data.util.ContactNameUtil; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; diff --git a/core-old/build.gradle b/core-old/build.gradle index c7ecd80..03b0732 100644 --- a/core-old/build.gradle +++ b/core-old/build.gradle @@ -9,7 +9,6 @@ sourceSets { dependencies { api project(':entity') // Entities - 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-old/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java b/core-old/src/main/java/org/mercury_im/core/data/util/ContactNameUtil.java similarity index 94% rename from core-old/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java rename to core-old/src/main/java/org/mercury_im/core/data/util/ContactNameUtil.java index 647c814..cf6c932 100644 --- a/core-old/src/main/java/org/mercury_im/messenger/core/util/ContactNameUtil.java +++ b/core-old/src/main/java/org/mercury_im/core/data/util/ContactNameUtil.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.util; +package org.mercury_im.core.data.util; import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.xmpp.model.EntityModel; diff --git a/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java b/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java index 82d1360..6a295a1 100644 --- a/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java +++ b/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java @@ -2,7 +2,7 @@ package org.mercury_im.messenger.core.di; import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.core.repository.AccountRepository; +import org.mercury_im.core.data.repository.AccountRepository; import org.mercury_im.messenger.core.stores.EntityCapsStore; import org.mercury_im.messenger.core.stores.PlainMessageStore; diff --git a/data/build.gradle b/data/build.gradle index f8d2ebb..b480c15 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -1,10 +1,29 @@ apply plugin: 'java-library' -dependencies { - api project(":entity") +// Add the generated folder to the source directories so that we can work with generated classes +// This is apparently necessary for use with requery. +sourceSets { + main.java.srcDirs += "${buildDir}/generated/sources/annotationProcessor/java/main/" +} - // RxJava 2 - api "io.reactivex.rxjava2:rxjava:$rxJava2Version" +dependencies { + + implementation project(":entity") + implementation project(':domain') + + // 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" + + // Requery ORM + api "io.requery:requery:$requeryVersion" + annotationProcessor "io.requery:requery-processor:$requeryVersion" + + // JUnit for testing + testImplementation "junit:junit:$junitVersion" } sourceCompatibility = "8" diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java b/data/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java b/data/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java b/data/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java b/data/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java b/data/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java b/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java b/data/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java b/data/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java b/data/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java b/data/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java similarity index 98% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java index 80a225f..620b7e0 100644 --- a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java @@ -1,8 +1,8 @@ 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.core.data.repository.AccountRepository; +import org.mercury_im.core.data.util.Optional; import org.mercury_im.core.util.ThreadUtils; import org.mercury_im.messenger.xmpp.mapping.AccountMapping; import org.mercury_im.messenger.xmpp.model.AccountModel; @@ -50,7 +50,6 @@ public class ReactiveXmppAccountRepository .map(result -> new Optional<>(AccountMapping.modelToEntity(result.firstOrNull()))) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); - } @Override diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java b/data/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java b/data/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java diff --git a/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java b/data/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java similarity index 100% rename from repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java rename to data/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java diff --git a/domain/build.gradle b/domain/build.gradle index e520b65..608afd2 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -3,7 +3,6 @@ apply plugin: 'java-library' dependencies { implementation project(':entity') - implementation project(':data') // RxJava2 implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version" diff --git a/data/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java b/domain/src/main/java/org/mercury_im/core/data/repository/AccountRepository.java similarity index 88% rename from data/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java rename to domain/src/main/java/org/mercury_im/core/data/repository/AccountRepository.java index 85429cd..53bad4c 100644 --- a/data/src/main/java/org/mercury_im/messenger/core/repository/AccountRepository.java +++ b/domain/src/main/java/org/mercury_im/core/data/repository/AccountRepository.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.core.repository; +package org.mercury_im.core.data.repository; import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.util.Optional; +import org.mercury_im.core.data.util.Optional; import java.util.List; diff --git a/data/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java b/domain/src/main/java/org/mercury_im/core/data/repository/ContactRepository.java similarity index 88% rename from data/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java rename to domain/src/main/java/org/mercury_im/core/data/repository/ContactRepository.java index 19daaf7..8fd754e 100644 --- a/data/src/main/java/org/mercury_im/messenger/core/repository/ContactRepository.java +++ b/domain/src/main/java/org/mercury_im/core/data/repository/ContactRepository.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.core.repository; +package org.mercury_im.core.data.repository; import org.mercury_im.messenger.core.entity.contact.Contact; -import org.mercury_im.messenger.core.util.Optional; +import org.mercury_im.core.data.util.Optional; import java.util.List; diff --git a/data/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/core/data/repository/DirectChatRepository.java similarity index 92% rename from data/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java rename to domain/src/main/java/org/mercury_im/core/data/repository/DirectChatRepository.java index 2cca016..77f4dbf 100644 --- a/data/src/main/java/org/mercury_im/messenger/core/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/core/data/repository/DirectChatRepository.java @@ -1,9 +1,9 @@ -package org.mercury_im.messenger.core.repository; +package org.mercury_im.core.data.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 org.mercury_im.core.data.util.Optional; import java.util.List; diff --git a/data/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java b/domain/src/main/java/org/mercury_im/core/data/repository/GroupChatRepository.java similarity index 92% rename from data/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java rename to domain/src/main/java/org/mercury_im/core/data/repository/GroupChatRepository.java index a5e1271..ad79bf2 100644 --- a/data/src/main/java/org/mercury_im/messenger/core/repository/GroupChatRepository.java +++ b/domain/src/main/java/org/mercury_im/core/data/repository/GroupChatRepository.java @@ -1,8 +1,8 @@ -package org.mercury_im.messenger.core.repository; +package org.mercury_im.core.data.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 org.mercury_im.core.data.util.Optional; import java.util.List; diff --git a/data/src/main/java/org/mercury_im/messenger/core/util/Optional.java b/domain/src/main/java/org/mercury_im/core/data/util/Optional.java similarity index 89% rename from data/src/main/java/org/mercury_im/messenger/core/util/Optional.java rename to domain/src/main/java/org/mercury_im/core/data/util/Optional.java index 12336e7..786661b 100644 --- a/data/src/main/java/org/mercury_im/messenger/core/util/Optional.java +++ b/domain/src/main/java/org/mercury_im/core/data/util/Optional.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.util; +package org.mercury_im.core.data.util; /** * Since j.u.Optional is only available on Android since API lvl 24, we need this utility class. diff --git a/repository_xmpp/.gitignore b/repository_xmpp/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/repository_xmpp/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/repository_xmpp/build.gradle b/repository_xmpp/build.gradle deleted file mode 100644 index 8c68c29..0000000 --- a/repository_xmpp/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -apply plugin: 'java-library' - -// Add the generated folder to the source directories so that we can work with generated classes -// This is apparently necessary for use with requery. -sourceSets { - main.java.srcDirs += "${buildDir}/generated/sources/annotationProcessor/java/main/" -} - -dependencies { - - implementation project(":entity") - implementation project(':domain') - implementation project(':data') - - // RxJava2 - api "io.reactivex.rxjava2:rxjava:$rxJava2Version" - - // Dagger 2 for dependency injection - implementation "com.google.dagger:dagger:$daggerVersion" - annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" - - // Requery ORM - api "io.requery:requery:$requeryVersion" - annotationProcessor "io.requery:requery-processor:$requeryVersion" - - // JUnit for testing - testImplementation "junit:junit:$junitVersion" -} - -sourceCompatibility = "8" -targetCompatibility = "8" diff --git a/settings.gradle b/settings.gradle index 83c28a4..cf4c43f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,5 @@ include ':entity', ':data', - ':repository_xmpp', ':domain', ':transport_xmpp', ':app', diff --git a/transport_xmpp/build.gradle b/transport_xmpp/build.gradle index 5de9efc..b59ea59 100644 --- a/transport_xmpp/build.gradle +++ b/transport_xmpp/build.gradle @@ -3,7 +3,9 @@ apply plugin: 'java-library' dependencies { implementation project(":entity") implementation project(':domain') - implementation project(":repository_xmpp") + + // RxJava2 + implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version" // 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/domain/connection/XmppConnectionFactory.java similarity index 95% rename from transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionFactory.java rename to transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppConnectionFactory.java index 021c2c6..1442c84 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppConnectionFactory.java +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppConnectionFactory.java @@ -1,4 +1,4 @@ -package org.mercury_im.xmpp.connection; +package org.mercury_im.xmpp.domain.connection; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.XMPPConnection; 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/domain/connection/XmppTcpConnectionFactory.java similarity index 80% rename from transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionFactory.java rename to transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppTcpConnectionFactory.java index e5e3063..9834a32 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/connection/XmppTcpConnectionFactory.java +++ b/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppTcpConnectionFactory.java @@ -1,4 +1,4 @@ -package org.mercury_im.xmpp.connection; +package org.mercury_im.xmpp.domain.connection; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.tcp.XMPPTCPConnection; @@ -7,7 +7,7 @@ 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; +import org.mercury_im.messenger.core.entity.PasswordAuthentication; public class XmppTcpConnectionFactory extends XmppConnectionFactory { @@ -20,8 +20,8 @@ public class XmppTcpConnectionFactory extends XmppConnectionFactory Date: Mon, 18 Nov 2019 23:51:27 +0100 Subject: [PATCH 09/83] More package renaming shenaningans --- app/build.gradle | 3 +- .../messenger/MercuryImApplication.java | 11 +-- .../mercury_im/messenger/Notifications.java | 4 +- ...celableXMPPTCPConnectionConfiguration.java | 86 ------------------- .../di/module/AndroidPersistenceModule.java | 2 +- .../messenger/di/module/AppModule.java | 15 +--- .../mercury_im/messenger/ui/MainActivity.java | 2 +- .../messenger/ui/chat/ChatActivity.java | 2 +- .../messenger/ui/chat/ChatViewModel.java | 6 +- .../ui/chatlist/ChatListViewModel.java | 4 +- .../contacts/ContactListItemViewModel.java | 2 +- .../roster/contacts/ContactListViewModel.java | 2 +- .../data/util/ContactNameUtil.java | 2 +- .../messenger/core/di/CenterModule.java | 1 - .../converter/SaslConditionConverter.java | 4 +- .../SubscriptionDirectionConverter.java | 4 +- .../{xmpp => data}/di/RequeryModule.java | 12 +-- .../{xmpp => data}/enums/SaslCondition.java | 2 +- .../enums/SubscriptionDirection.java | 2 +- .../mapping/AccountMapping.java | 8 +- .../model/AbstractAccountModel.java | 2 +- .../model/AbstractChatModel.java | 4 +- .../model/AbstractContactModel.java | 7 +- .../model/AbstractEntityCapsModel.java | 2 +- .../AbstractLastChatMessageRelation.java | 5 +- .../AbstractLastReadChatMessageRelation.java | 5 +- .../model/AbstractMessageModel.java | 4 +- .../model/AbstractPeerModel.java | 4 +- ...AbstractSaslAuthenticationResultModel.java | 5 +- .../repository/AbstractRepository.java | 4 +- .../repository/ChatRepository.java | 6 +- .../repository/EntityCapsRepository.java | 4 +- .../repository/MessageRepository.java | 4 +- .../ReactiveXmppAccountRepository.java | 11 ++- .../repository/RequeryRepository.java | 2 +- .../repository/RosterRepository.java | 4 +- .../util/ChatAndPossiblyContact.java | 2 +- .../org/mercury_im/core/MessageCenter.java | 17 ---- .../connection/ConnectionMethod.java | 18 ---- .../IncomingDirectMessageListener.java | 11 --- .../IncomingGroupChatMessageListener.java | 11 --- .../listener/TypingEventListener.java | 9 -- .../mercury_im/messenger/MessageCenter.java | 16 ++++ .../{core => messenger}/Messenger.java | 6 +- .../data/repository/AccountRepository.java | 6 +- .../data/repository/ContactRepository.java | 6 +- .../data/repository/DirectChatRepository.java | 10 +-- .../data/repository/GroupChatRepository.java | 8 +- .../data/util/Optional.java | 2 +- .../transport/ConnectionType.java | 2 +- .../connection/AbstractConnectionMethod.java | 6 +- .../connection/ConnectionFactory.java | 6 +- .../connection/ConnectionMethod.java | 18 ++++ .../exception/ConnectionFailedException.java | 2 +- .../IncomingDirectMessageListener.java | 11 +++ .../IncomingGroupChatMessageListener.java | 11 +++ .../listener/TypingEventListener.java | 9 ++ .../usecase/SendDirectMessage.java | 6 +- .../{core => messenger}/util/ThreadUtils.java | 2 +- .../core/entity/chat/DirectChat.java | 11 --- .../messenger/{core => }/entity/Account.java | 2 +- .../messenger/{core => }/entity/IAccount.java | 2 +- .../entity/PasswordAuthentication.java | 2 +- .../{core => }/entity/chat/Chat.java | 4 +- .../entity/chat/ChatPreferences.java | 2 +- .../messenger/entity/chat/DirectChat.java | 11 +++ .../{core => }/entity/chat/GroupChat.java | 4 +- .../entity/chat/IChatPreferences.java | 2 +- .../{core => }/entity/chat/IDirectChat.java | 6 +- .../{core => }/entity/chat/IGroupChat.java | 6 +- .../entity/chat/INotificationPreferences.java | 2 +- .../{core => }/entity/contact/Contact.java | 2 +- .../{core => }/entity/contact/IContact.java | 4 +- .../{core => }/entity/contact/IPeer.java | 4 +- .../{core => }/entity/contact/Peer.java | 4 +- .../{core => }/entity/event/ITypingEvent.java | 4 +- .../{core => }/entity/event/TypingEvent.java | 4 +- .../{core => }/entity/event/TypingState.java | 2 +- .../{core => }/entity/message/IMessage.java | 2 +- .../entity/message/IMessagePayload.java | 4 +- .../{core => }/entity/message/Message.java | 2 +- .../entity/message/MessageDeliveryState.java | 2 +- .../entity/message/MessageMetadata.java | 2 +- .../entity/message/MessagePayload.java | 4 +- .../message/content/MessageContent.java | 2 +- .../message/content/TextMessageContent.java | 2 +- settings.gradle | 2 +- .../view/entity/ViewInterlocutor.java | 2 +- .../definition/InterlocutorViewEntity.java | 2 +- {transport_xmpp => xmpp}/.gitignore | 0 {transport_xmpp => xmpp}/build.gradle | 0 .../domain/xmpp}/XmppDirectMessageCenter.java | 14 +-- .../xmpp}/XmppConnectionFactory.java | 8 +- .../xmpp}/XmppTcpConnectionFactory.java | 8 +- .../xmpp}/XmppTcpConnectionMethod.java | 10 +-- 95 files changed, 248 insertions(+), 338 deletions(-) delete mode 100644 app/src/main/java/org/mercury_im/messenger/ParcelableXMPPTCPConnectionConfiguration.java rename core-old/src/main/java/org/mercury_im/{core => domain}/data/util/ContactNameUtil.java (95%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/converter/SaslConditionConverter.java (87%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/converter/SubscriptionDirectionConverter.java (88%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/di/RequeryModule.java (85%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/enums/SaslCondition.java (99%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/enums/SubscriptionDirection.java (66%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/mapping/AccountMapping.java (79%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractAccountModel.java (93%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractChatModel.java (80%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractContactModel.java (80%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractEntityCapsModel.java (87%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractLastChatMessageRelation.java (71%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractLastReadChatMessageRelation.java (72%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractMessageModel.java (89%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractPeerModel.java (84%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/model/AbstractSaslAuthenticationResultModel.java (69%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/repository/AbstractRepository.java (96%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/repository/ChatRepository.java (96%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/repository/EntityCapsRepository.java (87%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/repository/MessageRepository.java (96%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/repository/ReactiveXmppAccountRepository.java (94%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/repository/RequeryRepository.java (94%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/repository/RosterRepository.java (98%) rename data/src/main/java/org/mercury_im/messenger/{xmpp => data}/util/ChatAndPossiblyContact.java (91%) delete mode 100644 domain/src/main/java/org/mercury_im/core/MessageCenter.java delete mode 100644 domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionMethod.java delete mode 100644 domain/src/main/java/org/mercury_im/core/transport/listener/IncomingDirectMessageListener.java delete mode 100644 domain/src/main/java/org/mercury_im/core/transport/listener/IncomingGroupChatMessageListener.java delete mode 100644 domain/src/main/java/org/mercury_im/core/transport/listener/TypingEventListener.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/MessageCenter.java rename domain/src/main/java/org/mercury_im/{core => messenger}/Messenger.java (72%) rename domain/src/main/java/org/mercury_im/{core => messenger}/data/repository/AccountRepository.java (82%) rename domain/src/main/java/org/mercury_im/{core => messenger}/data/repository/ContactRepository.java (81%) rename domain/src/main/java/org/mercury_im/{core => messenger}/data/repository/DirectChatRepository.java (79%) rename domain/src/main/java/org/mercury_im/{core => messenger}/data/repository/GroupChatRepository.java (83%) rename domain/src/main/java/org/mercury_im/{core => messenger}/data/util/Optional.java (89%) rename domain/src/main/java/org/mercury_im/{core => messenger}/transport/ConnectionType.java (91%) rename domain/src/main/java/org/mercury_im/{core => messenger}/transport/connection/AbstractConnectionMethod.java (76%) rename domain/src/main/java/org/mercury_im/{core => messenger}/transport/connection/ConnectionFactory.java (51%) create mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionMethod.java rename domain/src/main/java/org/mercury_im/{core => messenger}/transport/connection/exception/ConnectionFailedException.java (64%) create mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingDirectMessageListener.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingGroupChatMessageListener.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/listener/TypingEventListener.java rename domain/src/main/java/org/mercury_im/{core => messenger}/usecase/SendDirectMessage.java (69%) rename domain/src/main/java/org/mercury_im/{core => messenger}/util/ThreadUtils.java (89%) delete mode 100644 entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/Account.java (92%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/IAccount.java (95%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/PasswordAuthentication.java (85%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/chat/Chat.java (70%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/chat/ChatPreferences.java (94%) create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/chat/DirectChat.java rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/chat/GroupChat.java (73%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/chat/IChatPreferences.java (97%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/chat/IDirectChat.java (84%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/chat/IGroupChat.java (89%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/chat/INotificationPreferences.java (92%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/contact/Contact.java (94%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/contact/IContact.java (91%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/contact/IPeer.java (88%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/contact/Peer.java (79%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/event/ITypingEvent.java (76%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/event/TypingEvent.java (60%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/event/TypingState.java (87%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/message/IMessage.java (96%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/message/IMessagePayload.java (73%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/message/Message.java (92%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/message/MessageDeliveryState.java (72%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/message/MessageMetadata.java (79%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/message/MessagePayload.java (78%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/message/content/MessageContent.java (71%) rename entity/src/main/java/org/mercury_im/messenger/{core => }/entity/message/content/TextMessageContent.java (80%) rename {transport_xmpp => xmpp}/.gitignore (100%) rename {transport_xmpp => xmpp}/build.gradle (100%) rename {transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/message => xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp}/XmppDirectMessageCenter.java (81%) rename {transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection => xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp}/XmppConnectionFactory.java (79%) rename {transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection => xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp}/XmppTcpConnectionFactory.java (86%) rename {transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection => xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp}/XmppTcpConnectionMethod.java (85%) diff --git a/app/build.gradle b/app/build.gradle index ff60256..4c1f862 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,7 +73,8 @@ check.configure { dependencies { // Depend on the core project for XMPP related stuff - implementation project(':core-old') + implementation project(":domain") + implementation project(":data") implementation "io.requery:requery-android:$requeryVersion" implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41' diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index e3e475b..0198b74 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -11,8 +11,6 @@ import android.os.Build; import org.mercury_im.messenger.core.centers.ConnectionCenter; import org.mercury_im.messenger.core.connection.MercuryConfiguration; -import org.mercury_im.messenger.xmpp.util.ChatAndPossiblyContact; -import org.mercury_im.core.data.util.ContactNameUtil; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; @@ -24,7 +22,7 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.inject.Inject; -public class MercuryImApplication extends Application implements org.mercury_im.messenger.core.NotificationManager { +public class MercuryImApplication extends Application { public static final String TAG = "Mercury-IM"; @@ -117,13 +115,6 @@ public class MercuryImApplication extends Application implements org.mercury_im. notificationManager.createNotificationChannel(messages); } - @Override - public int chatMessageReceived(ChatAndPossiblyContact chatAndPossiblyContact, String body) { - return Notifications.chatMessageReceived(this, - chatAndPossiblyContact.getChat(), - ContactNameUtil.displayableNameFrom(chatAndPossiblyContact.getContact()), body); - } - public AppComponent getAppComponent() { return appComponent; } diff --git a/app/src/main/java/org/mercury_im/messenger/Notifications.java b/app/src/main/java/org/mercury_im/messenger/Notifications.java index 8673aa9..bdab127 100644 --- a/app/src/main/java/org/mercury_im/messenger/Notifications.java +++ b/app/src/main/java/org/mercury_im/messenger/Notifications.java @@ -7,7 +7,7 @@ import android.content.Intent; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; -import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.entity.chat.Chat; import org.mercury_im.messenger.ui.chat.ChatActivity; public class Notifications { @@ -20,7 +20,7 @@ public class Notifications { // Notification IDs public static final int FOREGROUND_SERVICE_ID = 1; // must not be 0 - public static int chatMessageReceived(Context context, ChatModel chat, String contactName, String body) { + public static int chatMessageReceived(Context context, Chat chat, String contactName, String body) { NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); int id = (int) chat.getId(); diff --git a/app/src/main/java/org/mercury_im/messenger/ParcelableXMPPTCPConnectionConfiguration.java b/app/src/main/java/org/mercury_im/messenger/ParcelableXMPPTCPConnectionConfiguration.java deleted file mode 100644 index e59013f..0000000 --- a/app/src/main/java/org/mercury_im/messenger/ParcelableXMPPTCPConnectionConfiguration.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.mercury_im.messenger; - -import android.os.Parcel; -import android.os.Parcelable; - -import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; -import org.jxmpp.stringprep.XmppStringprepException; - -public class ParcelableXMPPTCPConnectionConfiguration implements Parcelable { - - private final String username; - private final String password; - private final String xmppDomain; - private final String resourcePart; - private final String host; - private final int port; - - private XMPPTCPConnectionConfiguration configuration; - - public static final Creator CREATOR = new Creator() { - @Override - public ParcelableXMPPTCPConnectionConfiguration createFromParcel(Parcel in) { - return new ParcelableXMPPTCPConnectionConfiguration(in); - } - - @Override - public ParcelableXMPPTCPConnectionConfiguration[] newArray(int size) { - return new ParcelableXMPPTCPConnectionConfiguration[size]; - } - }; - - public ParcelableXMPPTCPConnectionConfiguration(String username, - String password, - String xmppDomain, - String resourcePart, - String host, - int port) { - this.username = username; - this.password = password; - this.xmppDomain = xmppDomain; - this.resourcePart = resourcePart; - this.host = host; - this.port = port; - } - - private ParcelableXMPPTCPConnectionConfiguration(Parcel in) { - this(in.readString(), // username - in.readString(), // password - in.readString(), // xmppDomain - in.readString(), // resourcePart - in.readString(), // host - in.readInt()); // port - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeString(username); - parcel.writeString(password); - parcel.writeString(xmppDomain); - parcel.writeString(resourcePart); - parcel.writeString(host); - parcel.writeInt(port); - } - - public XMPPTCPConnectionConfiguration getConfiguration() throws XmppStringprepException { - if (configuration != null) { - return configuration; - } - - XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder(); - - builder.setUsernameAndPassword(username, password); - if (xmppDomain != null) builder.setXmppDomain(xmppDomain); - if (resourcePart != null) builder.setResource(resourcePart); - if (host != null) builder.setHost(host); - if (port != -1) builder.setPort(port); - - configuration = builder.build(); - return configuration; - } -} diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java index 603423d..a306090 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java @@ -2,9 +2,9 @@ package org.mercury_im.messenger.di.module; import android.app.Application; +import org.mercury_im.messenger.util.ThreadUtils; import org.mercury_im.messenger.BuildConfig; import org.mercury_im.messenger.xmpp.model.Models; -import org.mercury_im.messenger.thread_utils.ThreadUtils; import javax.inject.Named; import javax.inject.Singleton; diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java index d3b0bd5..0c27fb3 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java @@ -2,16 +2,15 @@ package org.mercury_im.messenger.di.module; import android.app.Application; -import dagger.Module; -import dagger.Provides; - import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.di.CenterModule; -import org.mercury_im.messenger.xmpp.di.RequeryModule; +import org.mercury_im.messenger.data.di.RequeryModule; import javax.inject.Singleton; +import dagger.Module; +import dagger.Provides; + @Module(includes = { CenterModule.class, RequeryModule.class @@ -29,10 +28,4 @@ public class AppModule { Application provideApplication() { return mApplication; } - - @Provides - @Singleton - NotificationManager providerNotificationManager() { - return mApplication; - } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index 2e17196..f63dcb8 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -16,7 +16,7 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.xmpp.model.AccountModel; -import org.mercury_im.messenger.xmpp.repository.ChatRepository; +import org.mercury_im.messenger.data.repository.ChatRepository; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; import org.mercury_im.messenger.ui.login.AccountsFragment; import org.mercury_im.messenger.ui.roster.RosterFragment; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java index 5981b24..dcba39e 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java @@ -28,7 +28,7 @@ import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.xmpp.repository.ChatRepository; +import org.mercury_im.messenger.data.repository.ChatRepository; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 69f2799..570767a 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -11,9 +11,9 @@ import org.mercury_im.messenger.xmpp.model.ChatModel; import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.xmpp.model.EntityModel; import org.mercury_im.messenger.xmpp.model.MessageModel; -import org.mercury_im.messenger.xmpp.repository.ChatRepository; -import org.mercury_im.messenger.xmpp.repository.MessageRepository; -import org.mercury_im.messenger.xmpp.repository.RosterRepository; +import org.mercury_im.messenger.data.repository.ChatRepository; +import org.mercury_im.messenger.data.repository.MessageRepository; +import org.mercury_im.messenger.data.repository.RosterRepository; import java.util.List; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java index f09e91d..c0bb5be 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java @@ -6,8 +6,8 @@ import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.xmpp.model.ChatModel; -import org.mercury_im.messenger.xmpp.repository.ChatRepository; -import org.mercury_im.messenger.xmpp.repository.MessageRepository; +import org.mercury_im.messenger.data.repository.ChatRepository; +import org.mercury_im.messenger.data.repository.MessageRepository; import java.util.List; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java index 5a98b8a..622fd2b 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java @@ -7,7 +7,7 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.xmpp.repository.RosterRepository; +import org.mercury_im.messenger.data.repository.RosterRepository; import javax.inject.Inject; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index b3ecf8b..cf05994 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -8,7 +8,7 @@ import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.xmpp.repository.RosterRepository; +import org.mercury_im.messenger.data.repository.RosterRepository; import java.util.List; diff --git a/core-old/src/main/java/org/mercury_im/core/data/util/ContactNameUtil.java b/core-old/src/main/java/org/mercury_im/domain/data/util/ContactNameUtil.java similarity index 95% rename from core-old/src/main/java/org/mercury_im/core/data/util/ContactNameUtil.java rename to core-old/src/main/java/org/mercury_im/domain/data/util/ContactNameUtil.java index cf6c932..43c538a 100644 --- a/core-old/src/main/java/org/mercury_im/core/data/util/ContactNameUtil.java +++ b/core-old/src/main/java/org/mercury_im/domain/data/util/ContactNameUtil.java @@ -1,4 +1,4 @@ -package org.mercury_im.core.data.util; +package org.mercury_im.domain.data.util; import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.xmpp.model.EntityModel; diff --git a/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java b/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java index 6a295a1..4c9f2a4 100644 --- a/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java +++ b/core-old/src/main/java/org/mercury_im/messenger/core/di/CenterModule.java @@ -2,7 +2,6 @@ package org.mercury_im.messenger.core.di; import org.mercury_im.messenger.core.NotificationManager; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.core.data.repository.AccountRepository; import org.mercury_im.messenger.core.stores.EntityCapsStore; import org.mercury_im.messenger.core.stores.PlainMessageStore; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java b/data/src/main/java/org/mercury_im/messenger/data/converter/SaslConditionConverter.java similarity index 87% rename from data/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java rename to data/src/main/java/org/mercury_im/messenger/data/converter/SaslConditionConverter.java index cd90fb6..0b93393 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/converter/SaslConditionConverter.java +++ b/data/src/main/java/org/mercury_im/messenger/data/converter/SaslConditionConverter.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.xmpp.converter; +package org.mercury_im.messenger.data.converter; -import org.mercury_im.messenger.xmpp.enums.SaslCondition; +import org.mercury_im.messenger.data.enums.SaslCondition; import io.requery.Converter; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java b/data/src/main/java/org/mercury_im/messenger/data/converter/SubscriptionDirectionConverter.java similarity index 88% rename from data/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java rename to data/src/main/java/org/mercury_im/messenger/data/converter/SubscriptionDirectionConverter.java index d516b49..af84446 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/converter/SubscriptionDirectionConverter.java +++ b/data/src/main/java/org/mercury_im/messenger/data/converter/SubscriptionDirectionConverter.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.xmpp.converter; +package org.mercury_im.messenger.data.converter; -import org.mercury_im.messenger.xmpp.enums.SubscriptionDirection; +import org.mercury_im.messenger.data.enums.SubscriptionDirection; import io.requery.Converter; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RequeryModule.java similarity index 85% rename from data/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java rename to data/src/main/java/org/mercury_im/messenger/data/di/RequeryModule.java index 22746c7..0f90be9 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/di/RequeryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RequeryModule.java @@ -1,10 +1,10 @@ -package org.mercury_im.messenger.xmpp.di; +package org.mercury_im.messenger.data.di; -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.core.util.ThreadUtils; +import org.mercury_im.messenger.data.repository.ChatRepository; +import org.mercury_im.messenger.data.repository.EntityCapsRepository; +import org.mercury_im.messenger.data.repository.ReactiveXmppAccountRepository; +import org.mercury_im.messenger.data.repository.RosterRepository; +import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Named; import javax.inject.Singleton; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java b/data/src/main/java/org/mercury_im/messenger/data/enums/SaslCondition.java similarity index 99% rename from data/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java rename to data/src/main/java/org/mercury_im/messenger/data/enums/SaslCondition.java index ebc2de0..df23da2 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/enums/SaslCondition.java +++ b/data/src/main/java/org/mercury_im/messenger/data/enums/SaslCondition.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.xmpp.enums; +package org.mercury_im.messenger.data.enums; public enum SaslCondition { diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java b/data/src/main/java/org/mercury_im/messenger/data/enums/SubscriptionDirection.java similarity index 66% rename from data/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java rename to data/src/main/java/org/mercury_im/messenger/data/enums/SubscriptionDirection.java index daf77f8..38ea670 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/enums/SubscriptionDirection.java +++ b/data/src/main/java/org/mercury_im/messenger/data/enums/SubscriptionDirection.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.xmpp.enums; +package org.mercury_im.messenger.data.enums; public enum SubscriptionDirection { none, diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java similarity index 79% rename from data/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java rename to data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index d6b0599..703f021 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -1,8 +1,8 @@ -package org.mercury_im.messenger.xmpp.mapping; +package org.mercury_im.messenger.data.mapping; -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.entity.Account; +import org.mercury_im.messenger.entity.IAccount; +import org.mercury_im.messenger.entity.PasswordAuthentication; import org.mercury_im.messenger.xmpp.model.AccountModel; public class AccountMapping { diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java similarity index 93% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java index 36cbc8b..bc653e5 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractAccountModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; import io.requery.Column; import io.requery.Entity; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java similarity index 80% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java index 197ab86..62dab4a 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java @@ -1,4 +1,6 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; + +import org.mercury_im.messenger.xmpp.model.PeerModel; import io.requery.Entity; import io.requery.ForeignKey; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java similarity index 80% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java index c18ad61..0c8f5ee 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractContactModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java @@ -1,7 +1,8 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; -import org.mercury_im.messenger.xmpp.converter.SubscriptionDirectionConverter; -import org.mercury_im.messenger.xmpp.enums.SubscriptionDirection; +import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; +import org.mercury_im.messenger.data.enums.SubscriptionDirection; +import org.mercury_im.messenger.xmpp.model.PeerModel; import io.requery.Convert; import io.requery.Entity; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java similarity index 87% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java index 4ff1ebf..165f568 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractEntityCapsModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; import io.requery.Column; import io.requery.Entity; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java similarity index 71% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java index da4b0c3..cbc6691 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastChatMessageRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java @@ -1,4 +1,7 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; + +import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.xmpp.model.MessageModel; import io.requery.Entity; import io.requery.ForeignKey; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java similarity index 72% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java index 236d819..3d052b3 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractLastReadChatMessageRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java @@ -1,4 +1,7 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; + +import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.xmpp.model.MessageModel; import io.requery.Entity; import io.requery.ForeignKey; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java similarity index 89% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index 809d14a..5012a93 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -1,4 +1,6 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; + +import org.mercury_im.messenger.xmpp.model.ChatModel; import java.util.Date; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java similarity index 84% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index 975be98..02fe61d 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -1,4 +1,6 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; + +import org.mercury_im.messenger.xmpp.model.AccountModel; import io.requery.Column; import io.requery.Entity; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java similarity index 69% rename from data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java index a8b7397..f1b98a6 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/model/AbstractSaslAuthenticationResultModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java @@ -1,6 +1,7 @@ -package org.mercury_im.messenger.xmpp.model; +package org.mercury_im.messenger.data.model; -import org.mercury_im.messenger.xmpp.enums.SaslCondition; +import org.mercury_im.messenger.data.enums.SaslCondition; +import org.mercury_im.messenger.xmpp.model.AccountModel; import io.requery.Entity; import io.requery.Key; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/AbstractRepository.java similarity index 96% rename from data/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/AbstractRepository.java index a4cd16b..5a6505c 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/AbstractRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/AbstractRepository.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.xmpp.repository; +package org.mercury_im.messenger.data.repository; -import org.mercury_im.core.util.ThreadUtils; +import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Named; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java similarity index 96% rename from data/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java index 4c50845..eaeee8b 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/ChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java @@ -1,10 +1,10 @@ -package org.mercury_im.messenger.xmpp.repository; +package org.mercury_im.messenger.data.repository; -import org.mercury_im.core.util.ThreadUtils; +import org.mercury_im.messenger.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.PeerModel; -import org.mercury_im.messenger.xmpp.util.ChatAndPossiblyContact; +import org.mercury_im.messenger.data.util.ChatAndPossiblyContact; import java.util.ArrayList; import java.util.List; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java similarity index 87% rename from data/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java index ec23568..63e5c0a 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/EntityCapsRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.xmpp.repository; +package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.xmpp.model.EntityCapsModel; -import org.mercury_im.core.util.ThreadUtils; +import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Inject; import javax.inject.Named; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java similarity index 96% rename from data/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java index 82ce0c4..c2df8a4 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/MessageRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java @@ -1,10 +1,10 @@ -package org.mercury_im.messenger.xmpp.repository; +package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.xmpp.model.ChatModel; import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.xmpp.model.PeerModel; import org.mercury_im.messenger.xmpp.model.MessageModel; -import org.mercury_im.core.util.ThreadUtils; +import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Inject; import javax.inject.Named; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java similarity index 94% rename from data/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java index 620b7e0..9f31d15 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/ReactiveXmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java @@ -1,10 +1,9 @@ -package org.mercury_im.messenger.xmpp.repository; +package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.core.data.repository.AccountRepository; -import org.mercury_im.core.data.util.Optional; -import org.mercury_im.core.util.ThreadUtils; -import org.mercury_im.messenger.xmpp.mapping.AccountMapping; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.ThreadUtils; +import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.xmpp.model.AccountModel; import java.util.ArrayList; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/RequeryRepository.java similarity index 94% rename from data/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/RequeryRepository.java index 8e7f029..1e93c3f 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/RequeryRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/RequeryRepository.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.xmpp.repository; +package org.mercury_im.messenger.data.repository; import io.reactivex.Scheduler; import io.requery.Persistable; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java similarity index 98% rename from data/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java index 3eeb99e..81a6fe8 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java @@ -1,9 +1,9 @@ -package org.mercury_im.messenger.xmpp.repository; +package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.xmpp.model.AccountModel; import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.xmpp.model.PeerModel; -import org.mercury_im.core.util.ThreadUtils; +import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Inject; import javax.inject.Named; diff --git a/data/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java b/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java similarity index 91% rename from data/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java rename to data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java index 2805f43..0245f8c 100644 --- a/data/src/main/java/org/mercury_im/messenger/xmpp/util/ChatAndPossiblyContact.java +++ b/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.xmpp.util; +package org.mercury_im.messenger.data.util; import org.mercury_im.messenger.xmpp.model.ChatModel; import org.mercury_im.messenger.xmpp.model.ContactModel; diff --git a/domain/src/main/java/org/mercury_im/core/MessageCenter.java b/domain/src/main/java/org/mercury_im/core/MessageCenter.java deleted file mode 100644 index 8baeb10..0000000 --- a/domain/src/main/java/org/mercury_im/core/MessageCenter.java +++ /dev/null @@ -1,17 +0,0 @@ -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/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 deleted file mode 100644 index 3aceba6..0000000 --- a/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionMethod.java +++ /dev/null @@ -1,18 +0,0 @@ -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/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 deleted file mode 100644 index 153f084..0000000 --- a/domain/src/main/java/org/mercury_im/core/transport/listener/IncomingDirectMessageListener.java +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 2e8a116..0000000 --- a/domain/src/main/java/org/mercury_im/core/transport/listener/IncomingGroupChatMessageListener.java +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 48489e8..0000000 --- a/domain/src/main/java/org/mercury_im/core/transport/listener/TypingEventListener.java +++ /dev/null @@ -1,9 +0,0 @@ -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/messenger/MessageCenter.java b/domain/src/main/java/org/mercury_im/messenger/MessageCenter.java new file mode 100644 index 0000000..fe5ab2c --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/MessageCenter.java @@ -0,0 +1,16 @@ +package org.mercury_im.messenger; + +import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; +import org.mercury_im.messenger.entity.chat.Chat; +import org.mercury_im.messenger.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/domain/src/main/java/org/mercury_im/core/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java similarity index 72% rename from domain/src/main/java/org/mercury_im/core/Messenger.java rename to domain/src/main/java/org/mercury_im/messenger/Messenger.java index 32f65ec..a6753e7 100644 --- a/domain/src/main/java/org/mercury_im/core/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -1,7 +1,7 @@ -package org.mercury_im.core; +package org.mercury_im.messenger; -import org.mercury_im.core.transport.connection.ConnectionMethod; -import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.transport.connection.ConnectionMethod; +import org.mercury_im.messenger.entity.Account; import java.util.HashMap; import java.util.Map; diff --git a/domain/src/main/java/org/mercury_im/core/data/repository/AccountRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java similarity index 82% rename from domain/src/main/java/org/mercury_im/core/data/repository/AccountRepository.java rename to domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java index 53bad4c..f24af5c 100644 --- a/domain/src/main/java/org/mercury_im/core/data/repository/AccountRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java @@ -1,7 +1,7 @@ -package org.mercury_im.core.data.repository; +package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.core.data.util.Optional; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.data.util.Optional; import java.util.List; diff --git a/domain/src/main/java/org/mercury_im/core/data/repository/ContactRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java similarity index 81% rename from domain/src/main/java/org/mercury_im/core/data/repository/ContactRepository.java rename to domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java index 8fd754e..9681eeb 100644 --- a/domain/src/main/java/org/mercury_im/core/data/repository/ContactRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java @@ -1,7 +1,7 @@ -package org.mercury_im.core.data.repository; +package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.core.entity.contact.Contact; -import org.mercury_im.core.data.util.Optional; +import org.mercury_im.messenger.entity.contact.Contact; +import org.mercury_im.messenger.data.util.Optional; import java.util.List; diff --git a/domain/src/main/java/org/mercury_im/core/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java similarity index 79% rename from domain/src/main/java/org/mercury_im/core/data/repository/DirectChatRepository.java rename to domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index 77f4dbf..6cfaeb7 100644 --- a/domain/src/main/java/org/mercury_im/core/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -1,9 +1,9 @@ -package org.mercury_im.core.data.repository; +package org.mercury_im.messenger.data.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.core.data.util.Optional; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.data.util.Optional; import java.util.List; diff --git a/domain/src/main/java/org/mercury_im/core/data/repository/GroupChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java similarity index 83% rename from domain/src/main/java/org/mercury_im/core/data/repository/GroupChatRepository.java rename to domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java index ad79bf2..643c527 100644 --- a/domain/src/main/java/org/mercury_im/core/data/repository/GroupChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java @@ -1,8 +1,8 @@ -package org.mercury_im.core.data.repository; +package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.core.entity.chat.GroupChat; -import org.mercury_im.messenger.core.entity.message.Message; -import org.mercury_im.core.data.util.Optional; +import org.mercury_im.messenger.entity.chat.GroupChat; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.data.util.Optional; import java.util.List; diff --git a/domain/src/main/java/org/mercury_im/core/data/util/Optional.java b/domain/src/main/java/org/mercury_im/messenger/data/util/Optional.java similarity index 89% rename from domain/src/main/java/org/mercury_im/core/data/util/Optional.java rename to domain/src/main/java/org/mercury_im/messenger/data/util/Optional.java index 786661b..c334483 100644 --- a/domain/src/main/java/org/mercury_im/core/data/util/Optional.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/util/Optional.java @@ -1,4 +1,4 @@ -package org.mercury_im.core.data.util; +package org.mercury_im.messenger.data.util; /** * Since j.u.Optional is only available on Android since API lvl 24, we need this utility class. diff --git a/domain/src/main/java/org/mercury_im/core/transport/ConnectionType.java b/domain/src/main/java/org/mercury_im/messenger/transport/ConnectionType.java similarity index 91% rename from domain/src/main/java/org/mercury_im/core/transport/ConnectionType.java rename to domain/src/main/java/org/mercury_im/messenger/transport/ConnectionType.java index c9b4acb..aa04e7f 100644 --- a/domain/src/main/java/org/mercury_im/core/transport/ConnectionType.java +++ b/domain/src/main/java/org/mercury_im/messenger/transport/ConnectionType.java @@ -1,4 +1,4 @@ -package org.mercury_im.core.transport; +package org.mercury_im.messenger.transport; public enum ConnectionType { // Smack Connection Types from module transport_xmpp. diff --git a/domain/src/main/java/org/mercury_im/core/transport/connection/AbstractConnectionMethod.java b/domain/src/main/java/org/mercury_im/messenger/transport/connection/AbstractConnectionMethod.java similarity index 76% rename from domain/src/main/java/org/mercury_im/core/transport/connection/AbstractConnectionMethod.java rename to domain/src/main/java/org/mercury_im/messenger/transport/connection/AbstractConnectionMethod.java index 69ba923..7d7383f 100644 --- a/domain/src/main/java/org/mercury_im/core/transport/connection/AbstractConnectionMethod.java +++ b/domain/src/main/java/org/mercury_im/messenger/transport/connection/AbstractConnectionMethod.java @@ -1,7 +1,7 @@ -package org.mercury_im.core.transport.connection; +package org.mercury_im.messenger.transport.connection; -import org.mercury_im.core.Messenger; -import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.entity.Account; public abstract class AbstractConnectionMethod implements ConnectionMethod { diff --git a/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionFactory.java b/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionFactory.java similarity index 51% rename from domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionFactory.java rename to domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionFactory.java index 395410b..7c9369a 100644 --- a/domain/src/main/java/org/mercury_im/core/transport/connection/ConnectionFactory.java +++ b/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionFactory.java @@ -1,7 +1,7 @@ -package org.mercury_im.core.transport.connection; +package org.mercury_im.messenger.transport.connection; -import org.mercury_im.core.Messenger; -import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.entity.Account; public interface ConnectionFactory< CM extends ConnectionMethod> { diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionMethod.java b/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionMethod.java new file mode 100644 index 0000000..f8c0fbb --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionMethod.java @@ -0,0 +1,18 @@ +package org.mercury_im.messenger.transport.connection; + +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.transport.ConnectionType; +import org.mercury_im.messenger.entity.Account; + +import io.reactivex.Completable; + +public interface ConnectionMethod { + + Account getAccount(); + + Messenger getMessenger(); + + Completable connect(); + + ConnectionType getConnectionType(); +} diff --git a/domain/src/main/java/org/mercury_im/core/transport/connection/exception/ConnectionFailedException.java b/domain/src/main/java/org/mercury_im/messenger/transport/connection/exception/ConnectionFailedException.java similarity index 64% rename from domain/src/main/java/org/mercury_im/core/transport/connection/exception/ConnectionFailedException.java rename to domain/src/main/java/org/mercury_im/messenger/transport/connection/exception/ConnectionFailedException.java index a97fca7..add6a2c 100644 --- a/domain/src/main/java/org/mercury_im/core/transport/connection/exception/ConnectionFailedException.java +++ b/domain/src/main/java/org/mercury_im/messenger/transport/connection/exception/ConnectionFailedException.java @@ -1,4 +1,4 @@ -package org.mercury_im.core.transport.connection.exception; +package org.mercury_im.messenger.transport.connection.exception; public class ConnectionFailedException extends Exception { diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingDirectMessageListener.java b/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingDirectMessageListener.java new file mode 100644 index 0000000..9e7a8d2 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingDirectMessageListener.java @@ -0,0 +1,11 @@ +package org.mercury_im.messenger.transport.listener; + +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.message.Message; + +public interface IncomingDirectMessageListener { + + void onIncomingDirectMessage(Account account, DirectChat chat, Message message); + +} diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingGroupChatMessageListener.java b/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingGroupChatMessageListener.java new file mode 100644 index 0000000..b6932f3 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingGroupChatMessageListener.java @@ -0,0 +1,11 @@ +package org.mercury_im.messenger.transport.listener; + +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.chat.GroupChat; +import org.mercury_im.messenger.entity.message.Message; + +public interface IncomingGroupChatMessageListener { + + void onIncomingDirectMessage(Account account, GroupChat chat, Message message); + +} diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/listener/TypingEventListener.java b/domain/src/main/java/org/mercury_im/messenger/transport/listener/TypingEventListener.java new file mode 100644 index 0000000..7662eac --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/transport/listener/TypingEventListener.java @@ -0,0 +1,9 @@ +package org.mercury_im.messenger.transport.listener; + +import org.mercury_im.messenger.entity.chat.Chat; +import org.mercury_im.messenger.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/messenger/usecase/SendDirectMessage.java similarity index 69% rename from domain/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java rename to domain/src/main/java/org/mercury_im/messenger/usecase/SendDirectMessage.java index 827a0b7..9fd0c42 100644 --- a/domain/src/main/java/org/mercury_im/core/usecase/SendDirectMessage.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/SendDirectMessage.java @@ -1,7 +1,7 @@ -package org.mercury_im.core.usecase; +package org.mercury_im.messenger.usecase; -import org.mercury_im.messenger.core.entity.chat.DirectChat; -import org.mercury_im.messenger.core.entity.message.Message; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.message.Message; public class SendDirectMessage { diff --git a/domain/src/main/java/org/mercury_im/core/util/ThreadUtils.java b/domain/src/main/java/org/mercury_im/messenger/util/ThreadUtils.java similarity index 89% rename from domain/src/main/java/org/mercury_im/core/util/ThreadUtils.java rename to domain/src/main/java/org/mercury_im/messenger/util/ThreadUtils.java index c8615b1..6a5d196 100644 --- a/domain/src/main/java/org/mercury_im/core/util/ThreadUtils.java +++ b/domain/src/main/java/org/mercury_im/messenger/util/ThreadUtils.java @@ -1,4 +1,4 @@ -package org.mercury_im.core.util; +package org.mercury_im.messenger.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/chat/DirectChat.java b/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java deleted file mode 100644 index c13b637..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/DirectChat.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.mercury_im.messenger.core.entity.chat; - -import org.mercury_im.messenger.core.entity.contact.Peer; - -public interface DirectChat extends Chat { - - Peer getPeer(); - - void setPeer(Peer peer); - -} diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java similarity index 92% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java rename to entity/src/main/java/org/mercury_im/messenger/entity/Account.java index a58d562..251ce19 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.entity; /** * User Account entity. diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/IAccount.java b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java similarity index 95% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/IAccount.java rename to entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java index 74d51ad..9af4a5e 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/IAccount.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.entity; public class IAccount implements Account { diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/PasswordAuthentication.java b/entity/src/main/java/org/mercury_im/messenger/entity/PasswordAuthentication.java similarity index 85% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/PasswordAuthentication.java rename to entity/src/main/java/org/mercury_im/messenger/entity/PasswordAuthentication.java index 62da690..e08d2e8 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/PasswordAuthentication.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/PasswordAuthentication.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity; +package org.mercury_im.messenger.entity; public class PasswordAuthentication implements Account.AuthMethod { 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/entity/chat/Chat.java similarity index 70% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java rename to entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java index b059a83..7882224 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/Chat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.chat; +package org.mercury_im.messenger.entity.chat; -import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.entity.Account; public interface Chat { 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/entity/chat/ChatPreferences.java similarity index 94% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java rename to entity/src/main/java/org/mercury_im/messenger/entity/chat/ChatPreferences.java index 77abeaf..aebc4a3 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/ChatPreferences.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/ChatPreferences.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.chat; +package org.mercury_im.messenger.entity.chat; public interface ChatPreferences { diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/DirectChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/DirectChat.java new file mode 100644 index 0000000..c2ab095 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/DirectChat.java @@ -0,0 +1,11 @@ +package org.mercury_im.messenger.entity.chat; + +import org.mercury_im.messenger.entity.contact.Peer; + +public interface DirectChat extends Chat { + + Peer getPeer(); + + 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/entity/chat/GroupChat.java similarity index 73% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/GroupChat.java rename to entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java index a41d85d..c825991 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/GroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.chat; +package org.mercury_im.messenger.entity.chat; -import org.mercury_im.messenger.core.entity.contact.Peer; +import org.mercury_im.messenger.entity.contact.Peer; import java.util.Set; 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/entity/chat/IChatPreferences.java similarity index 97% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IChatPreferences.java rename to entity/src/main/java/org/mercury_im/messenger/entity/chat/IChatPreferences.java index 73e3558..adc1020 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IChatPreferences.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IChatPreferences.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.chat; +package org.mercury_im.messenger.entity.chat; public class IChatPreferences implements ChatPreferences { diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IDirectChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java similarity index 84% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IDirectChat.java rename to entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java index 5b35ed0..5a37e9c 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IDirectChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.core.entity.chat; +package org.mercury_im.messenger.entity.chat; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.contact.Peer; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.Peer; public class IDirectChat implements DirectChat { diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IGroupChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java similarity index 89% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IGroupChat.java rename to entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java index b641906..b7e87f6 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/IGroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java @@ -1,7 +1,7 @@ -package org.mercury_im.messenger.core.entity.chat; +package org.mercury_im.messenger.entity.chat; -import org.mercury_im.messenger.core.entity.Account; -import org.mercury_im.messenger.core.entity.contact.Peer; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.Peer; import java.util.Set; 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/entity/chat/INotificationPreferences.java similarity index 92% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/chat/INotificationPreferences.java rename to entity/src/main/java/org/mercury_im/messenger/entity/chat/INotificationPreferences.java index e6cce4e..dfffcd2 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/chat/INotificationPreferences.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/INotificationPreferences.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.chat; +package org.mercury_im.messenger.entity.chat; public class INotificationPreferences implements ChatPreferences.NotificationPreferences { 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/entity/contact/Contact.java similarity index 94% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java rename to entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java index cde9ae3..86968b8 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Contact.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.contact; +package org.mercury_im.messenger.entity.contact; public interface Contact extends Peer { 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/entity/contact/IContact.java similarity index 91% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IContact.java rename to entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java index a579ff3..6f9c449 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IContact.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.contact; +package org.mercury_im.messenger.entity.contact; -import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.entity.Account; public class IContact implements Contact { diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IPeer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java similarity index 88% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IPeer.java rename to entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java index 847d94a..389236a 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/IPeer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.contact; +package org.mercury_im.messenger.entity.contact; -import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.entity.Account; public class IPeer implements Peer { 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/entity/contact/Peer.java similarity index 79% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Peer.java rename to entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java index 5f39fc2..1b1b7e7 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/contact/Peer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.contact; +package org.mercury_im.messenger.entity.contact; -import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.entity.Account; /** * Defines a user on the network (eg. a contact, chat partner, group chat member etc). 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/entity/event/ITypingEvent.java similarity index 76% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/event/ITypingEvent.java rename to entity/src/main/java/org/mercury_im/messenger/entity/event/ITypingEvent.java index fd02b77..bc5d4eb 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/event/ITypingEvent.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/event/ITypingEvent.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.event; +package org.mercury_im.messenger.entity.event; -import org.mercury_im.messenger.core.entity.contact.Peer; +import org.mercury_im.messenger.entity.contact.Peer; import java.util.Map; 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/entity/event/TypingEvent.java similarity index 60% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingEvent.java rename to entity/src/main/java/org/mercury_im/messenger/entity/event/TypingEvent.java index a85d364..c0db012 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingEvent.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/event/TypingEvent.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.event; +package org.mercury_im.messenger.entity.event; -import org.mercury_im.messenger.core.entity.contact.Peer; +import org.mercury_im.messenger.entity.contact.Peer; import java.util.Map; 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/entity/event/TypingState.java similarity index 87% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingState.java rename to entity/src/main/java/org/mercury_im/messenger/entity/event/TypingState.java index 5c6a14e..f27c125 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/event/TypingState.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/event/TypingState.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.event; +package org.mercury_im.messenger.entity.event; public enum TypingState { /** diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessage.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java similarity index 96% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessage.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java index 4ded303..66c6bcf 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessage.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.message; +package org.mercury_im.messenger.entity.message; import java.util.Date; import java.util.List; 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/entity/message/IMessagePayload.java similarity index 73% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessagePayload.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java index 30c7811..d2321bb 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/IMessagePayload.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.message; +package org.mercury_im.messenger.entity.message; -import org.mercury_im.messenger.core.entity.message.content.MessageContent; +import org.mercury_im.messenger.entity.message.content.MessageContent; import java.util.List; 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/entity/message/Message.java similarity index 92% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java index ce85330..c5bcc44 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/Message.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.message; +package org.mercury_im.messenger.entity.message; import java.util.Date; import java.util.List; diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageDeliveryState.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessageDeliveryState.java similarity index 72% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageDeliveryState.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/MessageDeliveryState.java index dfeb33d..2485638 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageDeliveryState.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessageDeliveryState.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.message; +package org.mercury_im.messenger.entity.message; public enum MessageDeliveryState { pending_delivery, diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageMetadata.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessageMetadata.java similarity index 79% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageMetadata.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/MessageMetadata.java index 3f8b225..03e7ac7 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessageMetadata.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessageMetadata.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.message; +package org.mercury_im.messenger.entity.message; /** * Interface to allow additional, protocol specific metadata to be attached to the message. 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/entity/message/MessagePayload.java similarity index 78% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessagePayload.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java index 24bc2b2..886a00c 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/MessagePayload.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java @@ -1,6 +1,6 @@ -package org.mercury_im.messenger.core.entity.message; +package org.mercury_im.messenger.entity.message; -import org.mercury_im.messenger.core.entity.message.content.MessageContent; +import org.mercury_im.messenger.entity.message.content.MessageContent; import java.util.List; diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/MessageContent.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java similarity index 71% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/MessageContent.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java index 4b9f9f0..c6bce51 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/MessageContent.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.message.content; +package org.mercury_im.messenger.entity.message.content; public interface MessageContent { diff --git a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/TextMessageContent.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java similarity index 80% rename from entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/TextMessageContent.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java index 64c5940..7177b60 100644 --- a/entity/src/main/java/org/mercury_im/messenger/core/entity/message/content/TextMessageContent.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.core.entity.message.content; +package org.mercury_im.messenger.entity.message.content; public class TextMessageContent implements MessageContent.Body { diff --git a/settings.gradle b/settings.gradle index cf4c43f..afa6a4f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ include ':entity', ':data', ':domain', - ':transport_xmpp', + ':xmpp', ':app', ':core-old', ':view_entity' 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 index 7103a61..cc7585b 100644 --- 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 @@ -1,6 +1,6 @@ package org.mercury_im.messenger.view.entity; -import org.mercury_im.messenger.core.entity.contact.Contact; +import org.mercury_im.messenger.entity.contact.Contact; import org.mercury_im.messenger.view.entity.definition.InterlocutorViewEntity; public class ViewInterlocutor implements InterlocutorViewEntity { 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 index 3bc9359..d619132 100644 --- 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 @@ -1,6 +1,6 @@ package org.mercury_im.messenger.view.entity.definition; -import org.mercury_im.messenger.core.entity.contact.Contact; +import org.mercury_im.messenger.entity.contact.Contact; public interface InterlocutorViewEntity { diff --git a/transport_xmpp/.gitignore b/xmpp/.gitignore similarity index 100% rename from transport_xmpp/.gitignore rename to xmpp/.gitignore diff --git a/transport_xmpp/build.gradle b/xmpp/build.gradle similarity index 100% rename from transport_xmpp/build.gradle rename to xmpp/build.gradle diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/message/XmppDirectMessageCenter.java b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java similarity index 81% rename from transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/message/XmppDirectMessageCenter.java rename to xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java index 76a61dc..b0ecd30 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/message/XmppDirectMessageCenter.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java @@ -1,16 +1,16 @@ -package org.mercury_im.xmpp.domain.connection.message; +package org.mercury_im.messenger.domain.xmpp; import org.jivesoftware.smack.chat2.Chat; import org.jivesoftware.smack.chat2.ChatManager; import org.jivesoftware.smackx.sid.element.OriginIdElement; 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.domain.connection.XmppTcpConnectionMethod; +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.MessageCenter; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.transport.xmpp.XmppTcpConnectionMethod; import io.reactivex.Completable; diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppConnectionFactory.java b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppConnectionFactory.java similarity index 79% rename from transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppConnectionFactory.java rename to xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppConnectionFactory.java index 1442c84..5f07e73 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppConnectionFactory.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppConnectionFactory.java @@ -1,10 +1,10 @@ -package org.mercury_im.xmpp.domain.connection; +package org.mercury_im.messenger.transport.xmpp; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.XMPPConnection; -import org.mercury_im.core.Messenger; -import org.mercury_im.core.transport.connection.ConnectionFactory; -import org.mercury_im.messenger.core.entity.Account; +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.transport.connection.ConnectionFactory; +import org.mercury_im.messenger.entity.Account; public abstract class XmppConnectionFactory implements ConnectionFactory { diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppTcpConnectionFactory.java b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionFactory.java similarity index 86% rename from transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppTcpConnectionFactory.java rename to xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionFactory.java index 9834a32..2fa9808 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppTcpConnectionFactory.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionFactory.java @@ -1,13 +1,13 @@ -package org.mercury_im.xmpp.domain.connection; +package org.mercury_im.messenger.transport.xmpp; 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.messenger.core.entity.PasswordAuthentication; +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.PasswordAuthentication; public class XmppTcpConnectionFactory extends XmppConnectionFactory { diff --git a/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppTcpConnectionMethod.java b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionMethod.java similarity index 85% rename from transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppTcpConnectionMethod.java rename to xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionMethod.java index 4808af8..585008b 100644 --- a/transport_xmpp/src/main/java/org/mercury_im/xmpp/domain/connection/XmppTcpConnectionMethod.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionMethod.java @@ -1,11 +1,11 @@ -package org.mercury_im.xmpp.domain.connection; +package org.mercury_im.messenger.transport.xmpp; 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 org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.transport.ConnectionType; +import org.mercury_im.messenger.transport.connection.AbstractConnectionMethod; +import org.mercury_im.messenger.entity.Account; import java.util.logging.Level; import java.util.logging.Logger; From c1538bc04cd11a30dc1c1d585dd63c2fec455d27 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 22 Nov 2019 23:35:14 +0100 Subject: [PATCH 10/83] Package name fixes --- .../mercury_im/messenger/MercuryImApplication.java | 11 ++--------- .../messenger/di/component/AppComponent.java | 9 +-------- .../org/mercury_im/messenger/di/module/AppModule.java | 2 -- .../org/mercury_im/messenger/ui/MainActivity.java | 2 +- .../messenger/ui/login/AccountsFragment.java | 2 +- .../mercury_im/messenger/ui/login/LoginActivity.java | 6 +++--- .../mercury_im/messenger/ui/login/LoginViewModel.java | 6 +++--- .../messenger/data/mapping/AccountMapping.java | 2 +- .../messenger/data/model/AbstractChatModel.java | 2 -- .../messenger/data/model/AbstractContactModel.java | 1 - .../data/model/AbstractLastChatMessageRelation.java | 3 --- .../model/AbstractLastReadChatMessageRelation.java | 3 --- .../messenger/data/model/AbstractMessageModel.java | 2 -- .../messenger/data/model/AbstractPeerModel.java | 2 -- .../model/AbstractSaslAuthenticationResultModel.java | 1 - .../messenger/data/repository/ChatRepository.java | 6 +++--- .../data/repository/EntityCapsRepository.java | 2 +- .../messenger/data/repository/MessageRepository.java | 8 ++++---- .../repository/ReactiveXmppAccountRepository.java | 6 ++++-- .../messenger/data/repository/RosterRepository.java | 7 +++---- .../messenger/data/util/ChatAndPossiblyContact.java | 5 +++-- 21 files changed, 30 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index 0198b74..a50bc02 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -9,10 +9,7 @@ import android.content.Context; import android.content.Intent; import android.os.Build; -import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.core.connection.MercuryConfiguration; import org.mercury_im.messenger.di.component.AppComponent; -import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; import org.mercury_im.messenger.service.XmppConnectionService; import org.mercury_im.messenger.util.AbstractActivityLifecycleCallbacks; @@ -20,7 +17,6 @@ import org.mercury_im.messenger.util.AbstractActivityLifecycleCallbacks; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import javax.inject.Inject; public class MercuryImApplication extends Application { @@ -40,9 +36,6 @@ public class MercuryImApplication extends Application { private AtomicInteger activityReferences = new AtomicInteger(0); private AtomicBoolean isActivityChangingConfiguration = new AtomicBoolean(false); - @Inject - ConnectionCenter connectionCenter; - public static MercuryImApplication getApplication() { return INSTANCE; } @@ -125,7 +118,7 @@ public class MercuryImApplication extends Application { public void onActivityStarted(Activity activity) { if (activityReferences.incrementAndGet() == 1 && !isActivityChangingConfiguration.get()) { // App enters foreground - connectionCenter.clientStateActive(); + //connectionCenter.clientStateActive(); } } @@ -134,7 +127,7 @@ public class MercuryImApplication extends Application { isActivityChangingConfiguration.set(activity.isChangingConfigurations()); if (activityReferences.decrementAndGet() == 0 && !isActivityChangingConfiguration.get()) { // App enters background - connectionCenter.clientStateInactive(); + //connectionCenter.clientStateInactive(); } } }; diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index 939f4cb..c1a4b62 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -1,10 +1,8 @@ package org.mercury_im.messenger.di.component; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.core.di.XmppComponent; -import org.mercury_im.messenger.core.stores.PlainMessageStore; -import org.mercury_im.messenger.di.module.AppModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; +import org.mercury_im.messenger.di.module.AppModule; import org.mercury_im.messenger.service.XmppConnectionService; import org.mercury_im.messenger.ui.MainActivity; import org.mercury_im.messenger.ui.chat.ChatActivity; @@ -68,9 +66,4 @@ public interface AppComponent { void inject(XmppConnectionService service); - - // Connectors - - void inject(PlainMessageStore messageHandler); - } diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java index 0c27fb3..31ba383 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java @@ -3,7 +3,6 @@ package org.mercury_im.messenger.di.module; import android.app.Application; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.core.di.CenterModule; import org.mercury_im.messenger.data.di.RequeryModule; import javax.inject.Singleton; @@ -12,7 +11,6 @@ import dagger.Module; import dagger.Provides; @Module(includes = { - CenterModule.class, RequeryModule.class }) public class AppModule { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index f63dcb8..3d6ea52 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -15,7 +15,7 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.repository.ChatRepository; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; import org.mercury_im.messenger.ui.login.AccountsFragment; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java index d0e6db6..9440ae8 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java @@ -17,7 +17,7 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.data.model.AccountModel; import butterknife.BindView; import butterknife.ButterKnife; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index db1a89a..54a0bab 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -15,7 +15,7 @@ import com.google.android.material.textfield.TextInputEditText; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.util.TextChangedListener; import butterknife.BindView; @@ -127,8 +127,8 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito return; } - if (accountModel.getJid() != null) { - mJidView.setText(accountModel.getJid().toString()); + if (accountModel.getAddress() != null) { + mJidView.setText(accountModel.getAddress()); } if (accountModel.getPassword() != null) { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index bab6b2b..115a101 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -17,15 +17,15 @@ import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.xmpp.model.AccountModel; -import org.mercury_im.messenger.xmpp.repository.RequeryAccountRepository; +import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.data.repository.AccountRepository; import javax.inject.Inject; public class LoginViewModel extends ViewModel { @Inject - RequeryAccountRepository accountRepository; + AccountRepository accountRepository; @Inject ConnectionCenter connectionCenter; diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index 703f021..aaeb32d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -1,9 +1,9 @@ package org.mercury_im.messenger.data.mapping; +import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.entity.PasswordAuthentication; -import org.mercury_im.messenger.xmpp.model.AccountModel; public class AccountMapping { diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java index 62dab4a..55fcb84 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java @@ -1,7 +1,5 @@ package org.mercury_im.messenger.data.model; -import org.mercury_im.messenger.xmpp.model.PeerModel; - import io.requery.Entity; import io.requery.ForeignKey; import io.requery.Generated; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java index 0c8f5ee..2779bcc 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java @@ -2,7 +2,6 @@ package org.mercury_im.messenger.data.model; import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; import org.mercury_im.messenger.data.enums.SubscriptionDirection; -import org.mercury_im.messenger.xmpp.model.PeerModel; import io.requery.Convert; import io.requery.Entity; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java index cbc6691..78f6426 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java @@ -1,8 +1,5 @@ package org.mercury_im.messenger.data.model; -import org.mercury_im.messenger.xmpp.model.ChatModel; -import org.mercury_im.messenger.xmpp.model.MessageModel; - import io.requery.Entity; import io.requery.ForeignKey; import io.requery.Key; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java index 3d052b3..3518884 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java @@ -1,8 +1,5 @@ package org.mercury_im.messenger.data.model; -import org.mercury_im.messenger.xmpp.model.ChatModel; -import org.mercury_im.messenger.xmpp.model.MessageModel; - import io.requery.Entity; import io.requery.ForeignKey; import io.requery.Key; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index 5012a93..ac475bd 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -1,7 +1,5 @@ package org.mercury_im.messenger.data.model; -import org.mercury_im.messenger.xmpp.model.ChatModel; - import java.util.Date; import io.requery.Column; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index 02fe61d..089565f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -1,7 +1,5 @@ package org.mercury_im.messenger.data.model; -import org.mercury_im.messenger.xmpp.model.AccountModel; - import io.requery.Column; import io.requery.Entity; import io.requery.Generated; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java index f1b98a6..f13b416 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java @@ -1,7 +1,6 @@ package org.mercury_im.messenger.data.model; import org.mercury_im.messenger.data.enums.SaslCondition; -import org.mercury_im.messenger.xmpp.model.AccountModel; import io.requery.Entity; import io.requery.Key; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java index eaeee8b..7484865 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java @@ -1,9 +1,9 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.data.model.ChatModel; +import org.mercury_im.messenger.data.model.ContactModel; +import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.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.PeerModel; import org.mercury_im.messenger.data.util.ChatAndPossiblyContact; import java.util.ArrayList; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java index 63e5c0a..de6468d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java @@ -1,6 +1,6 @@ package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.xmpp.model.EntityCapsModel; +import org.mercury_im.messenger.data.model.EntityCapsModel; import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Inject; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java index c2df8a4..05b88b6 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java @@ -1,9 +1,9 @@ package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.xmpp.model.ChatModel; -import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.xmpp.model.PeerModel; -import org.mercury_im.messenger.xmpp.model.MessageModel; +import org.mercury_im.messenger.data.model.ChatModel; +import org.mercury_im.messenger.data.model.ContactModel; +import org.mercury_im.messenger.data.model.MessageModel; +import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Inject; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java index 9f31d15..5850270 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java @@ -1,10 +1,10 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.data.util.Optional; import org.mercury_im.messenger.util.ThreadUtils; import org.mercury_im.messenger.data.mapping.AccountMapping; -import org.mercury_im.messenger.xmpp.model.AccountModel; import java.util.ArrayList; import java.util.List; @@ -88,7 +88,9 @@ public class ReactiveXmppAccountRepository .map(ResultDelegate::toList) .map(list -> { List entities = new ArrayList<>(list.size()); - list.forEach(model -> entities.add(AccountMapping.modelToEntity(model))); + for (AccountModel model : list) { + entities.add(AccountMapping.modelToEntity(model)); + } return entities; }) .subscribeOn(subscriberScheduler()) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java index 81a6fe8..93cb50a 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java @@ -1,8 +1,7 @@ package org.mercury_im.messenger.data.repository; - -import org.mercury_im.messenger.xmpp.model.AccountModel; -import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.xmpp.model.PeerModel; +import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.data.model.ContactModel; +import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Inject; diff --git a/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java b/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java index 0245f8c..fc3effb 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java +++ b/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java @@ -1,7 +1,8 @@ package org.mercury_im.messenger.data.util; -import org.mercury_im.messenger.xmpp.model.ChatModel; -import org.mercury_im.messenger.xmpp.model.ContactModel; + +import org.mercury_im.messenger.data.model.ChatModel; +import org.mercury_im.messenger.data.model.ContactModel; public class ChatAndPossiblyContact { From dc6d9f106e88b2bc95bd8dac26ce95c716189547 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 23 Nov 2019 21:16:03 +0100 Subject: [PATCH 11/83] More small changes --- .../messenger/di/module/AppModule.java | 4 +- .../mercury_im/messenger/ui/MainActivity.java | 1 - .../messenger/ui/chat/ChatActivity.java | 1 - .../messenger/ui/chat/ChatViewModel.java | 10 +- .../ui/chatlist/ChatListViewModel.java | 2 - .../contacts/ContactListItemViewModel.java | 4 +- .../roster/contacts/ContactListViewModel.java | 6 +- build.gradle | 5 +- data/build.gradle | 3 + .../messenger/data/di/MappingModule.java | 32 +++ .../messenger/data/di/RepositoryModule.java | 55 +++++ .../messenger/data/di/RequeryModule.java | 52 ----- .../data/mapping/AccountMapping.java | 33 +-- .../data/mapping/DirectChatMapping.java | 35 +++ .../messenger/data/mapping/Mapping.java | 8 + .../messenger/data/mapping/PeerMapping.java | 31 +++ .../data/model/AbstractAccountModel.java | 6 +- .../data/model/AbstractContactModel.java | 5 +- ...odel.java => AbstractDirectChatModel.java} | 6 +- .../model/AbstractDirectMessagesRelation.java | 27 +++ .../data/model/AbstractEntityCapsModel.java | 4 + .../data/model/AbstractGroupChatModel.java | 29 +++ .../model/AbstractGroupMessagesRelation.java | 27 +++ .../AbstractLastChatMessageRelation.java | 22 -- .../AbstractLastReadChatMessageRelation.java | 22 -- .../data/model/AbstractMessageModel.java | 6 +- .../data/model/AbstractPeerModel.java | 4 + ...AbstractSaslAuthenticationResultModel.java | 2 + .../data/repository/AbstractRepository.java | 89 -------- .../data/repository/ChatRepository.java | 91 -------- .../data/repository/EntityCapsRepository.java | 5 +- .../data/repository/MessageRepository.java | 66 ------ .../data/repository/RosterRepository.java | 200 ------------------ ...sitory.java => XmppAccountRepository.java} | 32 +-- .../repository/XmppContactRepository.java | 75 +++++++ .../repository/XmppDirectChatRepository.java | 99 +++++++++ .../data/util/ChatAndPossiblyContact.java | 24 --- .../di/component/MessengerComponent.java | 14 ++ .../messenger/di/module/MessengerModule.java | 5 + 39 files changed, 514 insertions(+), 628 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/di/RequeryModule.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java rename data/src/main/java/org/mercury_im/messenger/data/model/{AbstractChatModel.java => AbstractDirectChatModel.java} (71%) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/AbstractRepository.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java rename data/src/main/java/org/mercury_im/messenger/data/repository/{ReactiveXmppAccountRepository.java => XmppAccountRepository.java} (82%) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/di/module/MessengerModule.java diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java index 31ba383..21d04dc 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java @@ -3,7 +3,7 @@ package org.mercury_im.messenger.di.module; import android.app.Application; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.data.di.RequeryModule; +import org.mercury_im.messenger.data.di.RepositoryModule; import javax.inject.Singleton; @@ -11,7 +11,7 @@ import dagger.Module; import dagger.Provides; @Module(includes = { - RequeryModule.class + RepositoryModule.class }) public class AppModule { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index 3d6ea52..a974333 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -16,7 +16,6 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.data.model.AccountModel; -import org.mercury_im.messenger.data.repository.ChatRepository; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; import org.mercury_im.messenger.ui.login.AccountsFragment; import org.mercury_im.messenger.ui.roster.RosterFragment; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java index dcba39e..b53b524 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java @@ -28,7 +28,6 @@ import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.data.repository.ChatRepository; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 570767a..45f2851 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -11,9 +11,7 @@ import org.mercury_im.messenger.xmpp.model.ChatModel; import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.xmpp.model.EntityModel; import org.mercury_im.messenger.xmpp.model.MessageModel; -import org.mercury_im.messenger.data.repository.ChatRepository; -import org.mercury_im.messenger.data.repository.MessageRepository; -import org.mercury_im.messenger.data.repository.RosterRepository; +import org.mercury_im.messenger.data.repository.XmppContactRepository; import java.util.List; @@ -31,7 +29,7 @@ public class ChatViewModel extends ViewModel { MessageRepository messageRepository; @Inject - RosterRepository rosterRepository; + XmppContactRepository xmppContactRepository; @Inject ChatRepository chatRepository; @@ -51,13 +49,13 @@ public class ChatViewModel extends ViewModel { } public void init(long accountId, EntityBareJid jid) { - disposable.add(rosterRepository.getOrCreateEntity(accountId, jid) + disposable.add(xmppContactRepository.getOrCreateEntity(accountId, jid) .subscribe((Consumer) this::init)); } public void init(EntityModel entityModel) { - disposable.add(rosterRepository.getContact(entityModel.getAccount().getId(), entityModel.getJid()) + disposable.add(xmppContactRepository.getContact(entityModel.getAccount().getId(), entityModel.getJid()) .subscribe(reactiveResult -> { ContactModel model = reactiveResult.first(); ChatViewModel.this.contact.setValue(model); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java index c0bb5be..f9df7d8 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java @@ -6,8 +6,6 @@ import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.xmpp.model.ChatModel; -import org.mercury_im.messenger.data.repository.ChatRepository; -import org.mercury_im.messenger.data.repository.MessageRepository; import java.util.List; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java index 622fd2b..73f9e88 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java @@ -7,14 +7,14 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.data.repository.RosterRepository; +import org.mercury_im.messenger.data.repository.XmppContactRepository; import javax.inject.Inject; public class ContactListItemViewModel extends AndroidViewModel { @Inject - RosterRepository contactRepository; + XmppContactRepository contactRepository; private LiveData contact; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index cf05994..9192f04 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -8,7 +8,7 @@ import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.data.repository.RosterRepository; +import org.mercury_im.messenger.data.repository.XmppContactRepository; import java.util.List; @@ -22,7 +22,7 @@ import io.reactivex.schedulers.Schedulers; public class ContactListViewModel extends ViewModel { @Inject - RosterRepository rosterRepository; + XmppContactRepository xmppContactRepository; private final MutableLiveData> rosterEntryList = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); @@ -32,7 +32,7 @@ public class ContactListViewModel extends ViewModel { MercuryImApplication.getApplication().getAppComponent().inject(this); Log.d("ContactListViewModel", "Start observing database"); // Subscribe to changes to the contacts table and update the LiveData object for the UI. - compositeDisposable.add(rosterRepository.getAllContacts() + compositeDisposable.add(xmppContactRepository.getAllContacts() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(o -> { diff --git a/build.gradle b/build.gradle index 7f3eb3c..5e4e892 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - + repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.5.2' - // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -30,7 +29,7 @@ allprojects { // Smack nightly unique snapshots repo //maven { // url 'https://igniterealtime.org/repo/' - // } + // } } configurations { diff --git a/data/build.gradle b/data/build.gradle index b480c15..d591ac1 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -11,6 +11,9 @@ dependencies { implementation project(":entity") implementation project(':domain') + compileOnly 'org.projectlombok:lombok:1.18.10' + annotationProcessor 'org.projectlombok:lombok:1.18.10' + // RxJava2 implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version" diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java new file mode 100644 index 0000000..3087471 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java @@ -0,0 +1,32 @@ +package org.mercury_im.messenger.data.di; + +import org.mercury_im.messenger.data.mapping.AccountMapping; +import org.mercury_im.messenger.data.mapping.DirectChatMapping; +import org.mercury_im.messenger.data.mapping.PeerMapping; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class MappingModule { + + @Provides + @Singleton + public static AccountMapping accountMapping() { + return new AccountMapping(); + } + + @Provides + @Singleton + public static PeerMapping peerMapping() { + return new PeerMapping(); + } + + @Provides + @Singleton + public static DirectChatMapping directChatMapping() { + return new DirectChatMapping(); + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java new file mode 100644 index 0000000..d24600a --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -0,0 +1,55 @@ +package org.mercury_im.messenger.data.di; + +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.ContactRepository; +import org.mercury_im.messenger.data.repository.DirectChatRepository; +import org.mercury_im.messenger.data.repository.EntityCapsRepository; +import org.mercury_im.messenger.data.repository.XmppAccountRepository; +import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; +import org.mercury_im.messenger.data.repository.XmppContactRepository; +import org.mercury_im.messenger.util.ThreadUtils; + +import javax.inject.Named; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import io.reactivex.Scheduler; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +@Module +public class RepositoryModule { + + @Provides + @Singleton + public static AccountRepository provideAccountRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + return new XmppAccountRepository(data, ioScheduler, uiScheduler); + } + + @Provides + @Singleton + public static DirectChatRepository provideChatRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + return new XmppDirectChatRepository(data, ioScheduler, uiScheduler); + } + + @Provides + @Singleton + public static EntityCapsRepository provideCapsRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + return new EntityCapsRepository(data, ioScheduler, uiScheduler); + } + + @Provides + @Singleton + public static ContactRepository provideRosterRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + return new XmppContactRepository(data, ioScheduler, uiScheduler); + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RequeryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RequeryModule.java deleted file mode 100644 index 0f90be9..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RequeryModule.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.mercury_im.messenger.data.di; - -import org.mercury_im.messenger.data.repository.ChatRepository; -import org.mercury_im.messenger.data.repository.EntityCapsRepository; -import org.mercury_im.messenger.data.repository.ReactiveXmppAccountRepository; -import org.mercury_im.messenger.data.repository.RosterRepository; -import org.mercury_im.messenger.util.ThreadUtils; - -import javax.inject.Named; -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import io.reactivex.Scheduler; -import io.requery.Persistable; -import io.requery.reactivex.ReactiveEntityStore; - -@Module -public class RequeryModule { - - @Provides - @Singleton - public static ReactiveXmppAccountRepository provideAccountRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new ReactiveXmppAccountRepository(data, ioScheduler, uiScheduler); - } - - @Provides - @Singleton - public static ChatRepository provideChatRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new ChatRepository(data, ioScheduler, uiScheduler); - } - - @Provides - @Singleton - public static EntityCapsRepository provideCapsRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new EntityCapsRepository(data, ioScheduler, uiScheduler); - } - - @Provides - @Singleton - public static RosterRepository provideRosterRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new RosterRepository(data, ioScheduler, uiScheduler); - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index aaeb32d..404a30a 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -5,9 +5,25 @@ import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.entity.PasswordAuthentication; -public class AccountMapping { +public class AccountMapping implements Mapping { - public static Account modelToEntity(AccountModel model) { + @Override + public AccountModel entityToData(Account entity) { + if (entity == null) { + return null; + } + + AccountModel model = new AccountModel(); + model.setId(entity.getId()); + model.setPassword(entity.getAuthentication().getPassword()); + model.setAddress(entity.getAddress()); + model.setEnabled(entity.isEnabled()); + + return model; + } + + @Override + public Account dataToEntity(AccountModel model) { if (model == null) { return null; } @@ -20,17 +36,4 @@ public class AccountMapping { return entity; } - - public static AccountModel createModelFromEntity(Account entity) { - if (entity == null) { - return null; - } - - AccountModel model = new AccountModel(); - model.setPassword(entity.getAuthentication().getPassword()); - model.setAddress(entity.getAddress()); - model.setEnabled(entity.isEnabled()); - - return model; - } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java new file mode 100644 index 0000000..6b8bb96 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java @@ -0,0 +1,35 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.model.DirectChatModel; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.chat.IDirectChat; +import org.mercury_im.messenger.entity.contact.Peer; + +import javax.inject.Inject; + +public class DirectChatMapping implements Mapping { + + @Inject + AccountMapping accountMapping; + + @Inject + PeerMapping peerMapping; + + @Override + public DirectChatModel entityToData(DirectChat entity) { + DirectChatModel model = new DirectChatModel(); + model.setPeer(peerMapping.entityToData(entity.getPeer())); + //TODO: set iD + return model; + } + + @Override + public DirectChat dataToEntity(DirectChatModel data) { + IDirectChat entity = new IDirectChat(); + entity.setId(data.getId()); + Peer peer = peerMapping.dataToEntity(data.getPeer()); + entity.setPeer(peer); + entity.setAccount(peer.getAccount()); + return entity; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java new file mode 100644 index 0000000..6aa516b --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java @@ -0,0 +1,8 @@ +package org.mercury_im.messenger.data.mapping; + +public interface Mapping { + + D entityToData(E entity); + + E dataToEntity(D data); +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java new file mode 100644 index 0000000..9baf42f --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -0,0 +1,31 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.model.PeerModel; +import org.mercury_im.messenger.entity.contact.IPeer; +import org.mercury_im.messenger.entity.contact.Peer; + +import javax.inject.Inject; + +public class PeerMapping implements Mapping { + + @Inject + AccountMapping accountMapping; + + @Override + public PeerModel entityToData(Peer entity) { + PeerModel model = new PeerModel(); + model.setAccount(accountMapping.entityToData(entity.getAccount())); + model.setAddress(entity.getAddress()); + return model; + } + + @Override + public Peer dataToEntity(PeerModel data) { + Peer peer = new IPeer(); + peer.setAccount(accountMapping.dataToEntity(data.getAccount())); + peer.setAddress(data.getAddress()); + peer.setId(data.getId()); + + return peer; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java index bc653e5..a080876 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java @@ -6,12 +6,14 @@ import io.requery.Generated; import io.requery.Key; import io.requery.Persistable; import io.requery.Table; +import lombok.Getter; +import lombok.Setter; @Table(name = "accounts") @Entity public abstract class AbstractAccountModel implements Persistable { - @Key @Generated + @Key long id; @Column(nullable = false) @@ -21,7 +23,7 @@ public abstract class AbstractAccountModel implements Persistable { String password; boolean enabled; - + String rosterVersion; @Override diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java index 2779bcc..bb99002 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java @@ -11,12 +11,15 @@ import io.requery.Key; import io.requery.OneToOne; import io.requery.Persistable; import io.requery.Table; +import lombok.Setter; @Entity @Table(name = "contacts") public abstract class AbstractContactModel implements Persistable { - @Key @Generated + @Key + @Generated + @Setter long id; @OneToOne diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java similarity index 71% rename from data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java rename to data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java index 55fcb84..0458ee7 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java @@ -7,16 +7,18 @@ import io.requery.Key; import io.requery.OneToOne; import io.requery.Persistable; import io.requery.Table; +import lombok.Setter; @Entity @Table(name = "chats") -public abstract class AbstractChatModel implements Persistable { +public abstract class AbstractDirectChatModel implements Persistable { @Key @Generated + @Setter long id; @OneToOne - @ForeignKey + @ForeignKey(referencedColumn = "id") PeerModel peer; boolean displayed; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java new file mode 100644 index 0000000..7291309 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java @@ -0,0 +1,27 @@ +package org.mercury_im.messenger.data.model; + +import io.requery.Entity; +import io.requery.ForeignKey; +import io.requery.Generated; +import io.requery.Key; +import io.requery.ManyToOne; +import io.requery.OneToOne; +import io.requery.Table; +import lombok.Setter; + +@Entity +@Table(name = "direct_messages") +public class AbstractDirectMessagesRelation { + + @Key @Generated + @Setter + long id; + + @OneToOne + @ForeignKey(referencedColumn = "id") + DirectChatModel chat; + + @ManyToOne + @ForeignKey(referencedColumn = "id") + MessageModel message; +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java index 165f568..670a227 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java @@ -2,15 +2,19 @@ package org.mercury_im.messenger.data.model; import io.requery.Column; import io.requery.Entity; +import io.requery.Generated; import io.requery.Key; import io.requery.Persistable; import io.requery.Table; +import lombok.Setter; @Table(name = "entity_caps") @Entity public abstract class AbstractEntityCapsModel implements Persistable { @Key + @Generated + @Setter String nodeVer; @Column(nullable = false) diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java new file mode 100644 index 0000000..ace1169 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java @@ -0,0 +1,29 @@ +package org.mercury_im.messenger.data.model; + +import io.requery.Column; +import io.requery.Entity; +import io.requery.Generated; +import io.requery.Key; +import io.requery.Persistable; +import io.requery.Table; +import lombok.Setter; + +@Entity +@Table(name = "groupchats") +public abstract class AbstractGroupChatModel implements Persistable { + + @Key @Generated + @Setter + long id; + + // TODO: Add Account? + + @Column(nullable = false) + String address; + + @Column + String name; + + @Column + boolean auto_join; +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java new file mode 100644 index 0000000..19cd7a8 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java @@ -0,0 +1,27 @@ +package org.mercury_im.messenger.data.model; + +import io.requery.Entity; +import io.requery.ForeignKey; +import io.requery.Generated; +import io.requery.Key; +import io.requery.ManyToOne; +import io.requery.OneToOne; +import io.requery.Table; +import lombok.Setter; + +@Entity +@Table(name = "group_messages") +public class AbstractGroupMessagesRelation { + + @Key @Generated + @Setter + long id; + + @OneToOne + @ForeignKey(referencedColumn = "id") + GroupChatModel chat; + + @ManyToOne + @ForeignKey(referencedColumn = "id") + MessageModel message; +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java deleted file mode 100644 index 78f6426..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastChatMessageRelation.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.mercury_im.messenger.data.model; - -import io.requery.Entity; -import io.requery.ForeignKey; -import io.requery.Key; -import io.requery.OneToOne; -import io.requery.Persistable; -import io.requery.Table; - -@Entity -@Table(name = "last_messages") -public abstract class AbstractLastChatMessageRelation implements Persistable { - - @Key - @OneToOne - @ForeignKey - ChatModel chat; - - @OneToOne - @ForeignKey - MessageModel message; -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java deleted file mode 100644 index 3518884..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractLastReadChatMessageRelation.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.mercury_im.messenger.data.model; - -import io.requery.Entity; -import io.requery.ForeignKey; -import io.requery.Key; -import io.requery.OneToOne; -import io.requery.Persistable; -import io.requery.Table; - -@Entity -@Table(name = "last_read_messages") -public abstract class AbstractLastReadChatMessageRelation implements Persistable { - - @Key - @OneToOne - @ForeignKey - ChatModel chat; - - @OneToOne - @ForeignKey - MessageModel message; -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index ac475bd..63cc50c 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -10,18 +10,16 @@ import io.requery.Key; import io.requery.ManyToOne; import io.requery.Persistable; import io.requery.Table; +import lombok.Setter; @Entity @Table(name = "messages") public abstract class AbstractMessageModel implements Persistable { @Key @Generated + @Setter long id; - @ForeignKey(referencedColumn = "id") - @ManyToOne - ChatModel chat; - String body; @Column(name = "\"timestamp\"", nullable = false) diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index 089565f..8ecff83 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -2,20 +2,24 @@ package org.mercury_im.messenger.data.model; import io.requery.Column; import io.requery.Entity; +import io.requery.ForeignKey; import io.requery.Generated; import io.requery.Key; import io.requery.ManyToOne; import io.requery.Persistable; import io.requery.Table; +import lombok.Setter; @Entity @Table(name = "peers") public abstract class AbstractPeerModel implements Persistable { @Key @Generated + @Setter long id; @ManyToOne + @ForeignKey(referencedColumn = "id") AccountModel account; @Column(nullable = false) diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java index f13b416..e3c8fae 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java @@ -7,6 +7,7 @@ import io.requery.Key; import io.requery.ManyToOne; import io.requery.Persistable; import io.requery.Table; +import lombok.Setter; @Entity @Table(name = "sasl_auth") @@ -14,6 +15,7 @@ public abstract class AbstractSaslAuthenticationResultModel implements Persistab @Key @ManyToOne + @Setter AccountModel account; SaslCondition saslCondition; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/AbstractRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/AbstractRepository.java deleted file mode 100644 index 5a6505c..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/AbstractRepository.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.mercury_im.messenger.data.repository; - -import org.mercury_im.messenger.util.ThreadUtils; - -import javax.inject.Named; - -import io.reactivex.Completable; -import io.reactivex.Observable; -import io.reactivex.Scheduler; -import io.reactivex.Single; -import io.requery.Persistable; -import io.requery.reactivex.ReactiveEntityStore; -import io.requery.reactivex.ReactiveResult; - -public abstract class AbstractRepository extends RequeryRepository { - - - private final Class modelType; - - protected AbstractRepository(Class modelType, - ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { - super(data, subscriberScheduler, observerScheduler); - this.modelType = modelType; - } - - // CRUD - - public Single insert(E model) { - return data().insert(model) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Single> insert(Iterable models) { - return data().insert(models) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Single upsert(E model) { - return data().upsert(model) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Single> upsert(Iterable models) { - return data().upsert(models) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Single update(E model) { - return data().update(model) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Single> update(Iterable models) { - return data().update(models) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Observable> getAll() { - return data().select(modelType) - .get().observableResult() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Completable delete(E model) { - return data().delete(model) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Completable delete(Iterable models) { - return data().delete(models) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Single deleteAll() { - return data().delete(modelType) - .get().single(); - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java deleted file mode 100644 index 7484865..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/ChatRepository.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.mercury_im.messenger.data.repository; - -import org.mercury_im.messenger.data.model.ChatModel; -import org.mercury_im.messenger.data.model.ContactModel; -import org.mercury_im.messenger.data.model.PeerModel; -import org.mercury_im.messenger.util.ThreadUtils; -import org.mercury_im.messenger.data.util.ChatAndPossiblyContact; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.inject.Inject; -import javax.inject.Named; - -import io.reactivex.Observable; -import io.reactivex.Scheduler; -import io.requery.Persistable; -import io.requery.reactivex.ReactiveEntityStore; -import io.requery.reactivex.ReactiveResult; - -public class ChatRepository extends AbstractRepository { - - private final Logger LOGGER = Logger.getLogger(ChatRepository.class.getName()); - - @Inject - public ChatRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { - super(ChatModel.class, data, subscriberScheduler, observerScheduler); - } - - public Observable> getChatWith(PeerModel entityModel) { - return getChatWith(entityModel.getAccount().getId(), entityModel.getAddress()); - } - - 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()) - .observeOn(observerScheduler()); - } - - public Observable> getVisibleChats() { - return data().select(ChatModel.class).where(ChatModel.DISPLAYED.eq(true)) - .get().observableResult() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Observable> getChatsAndContacts() { - return Observable.fromCallable(() -> { - List chats = data().select(ChatModel.class) - .from(ChatModel.class).leftJoin(ContactModel.class).on(ChatModel.PEER_ID.eq(ContactModel.ENTITY_ID)) - .get().toList(); - List chatsAndContacts = new ArrayList<>(chats.size()); - for (ChatModel chatModel : chats) { - ContactModel contactModel = data().select(ContactModel.class).from(ContactModel.class).where(ContactModel.ENTITY_ID.eq(chatModel.getPeer().getId())) - .get().first(); - chatsAndContacts.add(new ChatAndPossiblyContact(chatModel, contactModel)); - } - return chatsAndContacts; - }) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Observable getChatAndContact(long accountId, String address) { - - return Observable.fromCallable(() -> { - ChatModel chat = data().select(ChatModel.class) - .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; - } - - ContactModel contactModel = data().select(ContactModel.class).from(ContactModel.class) - .where(ContactModel.ENTITY_ID.eq(chat.getPeer().getId())) - .get().firstOrNull(); - return new ChatAndPossiblyContact(chat, contactModel); - }) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java index de6468d..e0f90c9 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java @@ -1,6 +1,5 @@ package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.data.model.EntityCapsModel; import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Inject; @@ -10,12 +9,12 @@ import io.reactivex.Scheduler; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; -public class EntityCapsRepository extends AbstractRepository { +public class EntityCapsRepository extends RequeryRepository { @Inject public EntityCapsRepository(ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { - super(EntityCapsModel.class, data, subscriberScheduler, observerScheduler); + super(data, subscriberScheduler, observerScheduler); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java deleted file mode 100644 index 05b88b6..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.mercury_im.messenger.data.repository; - -import org.mercury_im.messenger.data.model.ChatModel; -import org.mercury_im.messenger.data.model.ContactModel; -import org.mercury_im.messenger.data.model.MessageModel; -import org.mercury_im.messenger.data.model.PeerModel; -import org.mercury_im.messenger.util.ThreadUtils; - -import javax.inject.Inject; -import javax.inject.Named; - -import io.reactivex.Observable; -import io.reactivex.Scheduler; -import io.requery.Persistable; -import io.requery.reactivex.ReactiveEntityStore; -import io.requery.reactivex.ReactiveResult; - -public class MessageRepository extends AbstractRepository { - - @Inject - public MessageRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { - super(MessageModel.class, data, subscriberScheduler, observerScheduler); - } - - public Observable> getAllMessagesOfChat(ChatModel chat) { - return getAllMessagesOfChat(chat.getId()); - } - - public Observable> getAllMessagesOfChat(long chatId) { - return data().select(MessageModel.class).where(MessageModel.CHAT_ID.eq(chatId)) - .orderBy(MessageModel.TIMESTAMP.asc()) - .get().observableResult() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Observable> getAllMessagesOfEntity(PeerModel entity) { - return getAllMessagesOfEntity(entity.getId()); - } - - public Observable> getAllMessagesOfEntity(long entityId) { - return data().select(MessageModel.class).from(MessageModel.class) - .join(ChatModel.class).on(MessageModel.CHAT_ID.eq(ChatModel.ID)) - .where(ChatModel.PEER_ID.eq(entityId)) - .orderBy(MessageModel.TIMESTAMP.asc()) - .get().observableResult() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Observable> getAllMessagesOfContact(ContactModel contact) { - return getAllMessagesOfContact(contact.getId()); - } - - public Observable> getAllMessagesOfContact(long contactId) { - return data().select(MessageModel.class).join(ChatModel.class).on(MessageModel.CHAT_ID.eq(ChatModel.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()) - .observeOn(observerScheduler()); - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java deleted file mode 100644 index 93cb50a..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/RosterRepository.java +++ /dev/null @@ -1,200 +0,0 @@ -package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.data.model.AccountModel; -import org.mercury_im.messenger.data.model.ContactModel; -import org.mercury_im.messenger.data.model.PeerModel; -import org.mercury_im.messenger.util.ThreadUtils; - -import javax.inject.Inject; -import javax.inject.Named; - -import io.reactivex.Completable; -import io.reactivex.Observable; -import io.reactivex.Scheduler; -import io.reactivex.Single; -import io.requery.Persistable; -import io.requery.reactivex.ReactiveEntityStore; -import io.requery.reactivex.ReactiveResult; - -public class RosterRepository extends RequeryRepository { - - @Inject - public RosterRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { - super(data, subscriberScheduler, observerScheduler); - } - - /* - ContactModel related methods - */ - - public Observable> getAllContactsOfAccount(AccountModel accountModel) { - return getAllContactsOfAccount(accountModel.getId()); - } - - public Observable> getAllContactsOfAccount(long 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()); - } - - public Single upsertContact(ContactModel contact) { - return data().upsert(contact).subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); - } - - public Completable deleteContact(ContactModel contact) { - return data().delete(contact).subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); - } - - public Completable deleteContact(long accountId, String address) { - return data().delete(ContactModel.class).from(ContactModel.class) - .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()); - } - - public Single deleteAllContactsOfAccount(AccountModel account) { - return deleteAllContactsOfAccount(account.getId()); - } - - public Single deleteAllContactsOfAccount(long accountId) { - return data().delete(ContactModel.class).from(ContactModel.class) - .join(PeerModel.class).on(ContactModel.ENTITY_ID.eq(PeerModel.ID)) - .where(PeerModel.ACCOUNT_ID.eq(accountId)) - .get().single() - .subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); - } - - - /* - PeerModel related methods - */ - - public Observable> getAllEntitiesOfAccount(AccountModel account) { - return getAllEntitiesOfAccount(account.getId()); - } - - 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(PeerModel.class).where(PeerModel.ID.eq(entityId)) - .get().observableResult() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Observable> getEntityByJid(AccountModel account, String address) { - return getEntityByJid(account.getId(), address); - } - - 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, String address) { - return Single.fromCallable(() -> { - AccountModel account = data().select(AccountModel.class).where(AccountModel.ID.eq(accountId)) - .get().first(); - return getOrCreateEntity(account, address).blockingGet(); - }) - .observeOn(observerScheduler()) - .subscribeOn(subscriberScheduler()); - } - - public Single getOrCreateEntity(AccountModel account, String address) { - return Single.fromCallable(() -> { - 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 PeerModel(); - entity.setAccount(account); - entity.setAddress(address); - entity = data().insert(entity).blockingGet(); - } - return entity; - }) - .observeOn(observerScheduler()) - .subscribeOn(subscriberScheduler()); - - } - - public Single upsertEntity(PeerModel entity) { - return data().upsert(entity) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Completable deleteEntity(PeerModel entity) { - return data().delete(entity) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - /* - RosterVersion related methods - */ - - public Single updateRosterVersion(long accountId, String rosterVer) { - return data().update(AccountModel.class).set(AccountModel.ROSTER_VERSION, rosterVer) - .where(AccountModel.ID.eq(accountId)) - .get().single() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - - public Observable getRosterVersion(AccountModel account) { - return getRosterVersion(account.getId()); - } - - public Observable getRosterVersion(long accountId) { - return data().select(AccountModel.class).where(AccountModel.ID.eq(accountId)) - .get().observableResult() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()) - .map(accountModels -> { - AccountModel accountModel = accountModels.firstOrNull(); - if (accountModel == null || accountModel.getRosterVersion() == null) { - return ""; - } - return accountModel.getRosterVersion(); - }); - } - - public Single updateRosterVersion(AccountModel account, String rosterVersion) { - account.setRosterVersion(rosterVersion); - return data().upsert(account) - .subscribeOn(subscriberScheduler()).observeOn(observerScheduler()); - } - - public Observable> getContact(AccountModel account, String address) { - return getContact(account.getId(), address); - } - - public Observable> getContact(long accountId, String address) { - return data().select(ContactModel.class).from(ContactModel.class) - .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()); - } - - public Observable> getAllContacts() { - return data().select(ContactModel.class) - .get().observableResult() - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java similarity index 82% rename from data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 5850270..4391245 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/ReactiveXmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -21,22 +21,24 @@ import io.requery.Persistable; import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; -public class ReactiveXmppAccountRepository +public class XmppAccountRepository extends RequeryRepository implements AccountRepository { @Inject - public ReactiveXmppAccountRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + AccountMapping mapping; + + @Inject + public XmppAccountRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { super(data, subscriberScheduler, observerScheduler); } @Override public Single insertAccount(Account account) { - - return data().insert(AccountMapping.createModelFromEntity(account)) - .map(AccountMapping::modelToEntity) + return data().insert(mapping.entityToData(account)) + .map(mapping::dataToEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -46,7 +48,7 @@ public class ReactiveXmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().observableResult() - .map(result -> new Optional<>(AccountMapping.modelToEntity(result.firstOrNull()))) + .map(result -> new Optional<>(mapping.dataToEntity(result.firstOrNull()))) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -56,7 +58,7 @@ public class ReactiveXmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().maybe() - .map(AccountMapping::modelToEntity) + .map(mapping::dataToEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -66,7 +68,7 @@ public class ReactiveXmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ADDRESS.eq(address)) .get().observableResult() - .map(result -> new Optional<>(AccountMapping.modelToEntity(result.firstOrNull()))) + .map(result -> new Optional<>(mapping.dataToEntity(result.firstOrNull()))) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -76,7 +78,7 @@ public class ReactiveXmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ADDRESS.eq(address)) .get().maybe() - .map(AccountMapping::modelToEntity) + .map(mapping::dataToEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -89,7 +91,7 @@ public class ReactiveXmppAccountRepository .map(list -> { List entities = new ArrayList<>(list.size()); for (AccountModel model : list) { - entities.add(AccountMapping.modelToEntity(model)); + entities.add(mapping.dataToEntity(model)); } return entities; }) @@ -113,7 +115,7 @@ public class ReactiveXmppAccountRepository model.setAddress(account.getAddress()); // write the updated model back model = data().update(model).blockingGet(); - return AccountMapping.modelToEntity(model); + return mapping.dataToEntity(model); }) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -126,7 +128,7 @@ public class ReactiveXmppAccountRepository .where(AccountModel.ID.eq(account.getId())) .get().maybe() // If it does not exist, create a new model from the entity - .switchIfEmpty(data().insert(AccountMapping.createModelFromEntity(account))) + .switchIfEmpty(data().insert(mapping.entityToData(account))) // finally .map(model -> { // update the model @@ -135,7 +137,7 @@ public class ReactiveXmppAccountRepository model.setAddress(account.getAddress()); // write the updated model back model = data().update(model).blockingGet(); - return AccountMapping.modelToEntity(model); + return mapping.dataToEntity(model); }) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java new file mode 100644 index 0000000..8bf876b --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java @@ -0,0 +1,75 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.contact.Contact; +import org.mercury_im.messenger.util.ThreadUtils; + +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +public class XmppContactRepository + extends RequeryRepository + implements ContactRepository { + + @Inject + public XmppContactRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + super(data, subscriberScheduler, observerScheduler); + } + + @Override + public Single insertContact(Contact contact) { + return null; + } + + @Override + public Observable> observeContact(long contactId) { + return null; + } + + @Override + public Maybe getContact(long contactId) { + return null; + } + + @Override + public Observable> observeContactByAddress(String address) { + return null; + } + + @Override + public Maybe getContactByAddress(String address) { + return null; + } + + @Override + public Observable> observeAllContacts() { + return null; + } + + @Override + public Single updateContact(Contact contact) { + return null; + } + + @Override + public Single upsertContact(Contact contact) { + return null; + } + + @Override + public Completable deleteContact(Contact contact) { + return null; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java new file mode 100644 index 0000000..248341a --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -0,0 +1,99 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.message.Message; + +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +public class XmppDirectChatRepository + extends RequeryRepository + implements DirectChatRepository { + + + public XmppDirectChatRepository( + ReactiveEntityStore data, + Scheduler subscriberScheduler, + Scheduler observerScheduler) { + super(data, subscriberScheduler, observerScheduler); + } + + @Override + public Single insertDirectChat(DirectChat chat) { + return null; + } + + @Override + public Observable> observeDirectChat(long chatId) { + return null; + } + + @Override + public Maybe getDirectChat(long chatId) { + return null; + } + + @Override + public Observable> observeDirectChatByInterlocutor(Peer peer) { + return null; + } + + @Override + public Maybe getDirectChatByInterlocutor(Peer peer) { + return null; + } + + @Override + public Observable> observeAllDirectChats() { + return null; + } + + @Override + public Single updateDirectChat(DirectChat chat) { + return null; + } + + @Override + public Single upsertDirectChat(DirectChat chat) { + return null; + } + + @Override + public Completable deleteDirectChat(DirectChat chat) { + return null; + } + + @Override + public Single insertMessage(DirectChat chat, Message message) { + return null; + } + + @Override + public Observable> observeMessages(DirectChat chat) { + return null; + } + + @Override + public Single updateMessage(Message message) { + return null; + } + + @Override + public Single upsertMessage(DirectChat chat, Message message) { + return null; + } + + @Override + public Completable deleteMessage(Message message) { + return null; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java b/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java deleted file mode 100644 index fc3effb..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/util/ChatAndPossiblyContact.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.mercury_im.messenger.data.util; - - -import org.mercury_im.messenger.data.model.ChatModel; -import org.mercury_im.messenger.data.model.ContactModel; - -public class ChatAndPossiblyContact { - - private final ChatModel chat; - private final ContactModel contact; - - public ChatAndPossiblyContact(ChatModel chat, ContactModel contact) { - this.chat = chat; - this.contact = contact; - } - - public ChatModel getChat() { - return chat; - } - - public ContactModel getContact() { - return contact; - } -} diff --git a/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java b/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java new file mode 100644 index 0000000..e06803d --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java @@ -0,0 +1,14 @@ +package org.mercury_im.messenger.di.component; + +import org.mercury_im.messenger.Messenger; + +import javax.inject.Singleton; + +import dagger.Component; + +@Singleton +@Component +public interface MessengerComponent { + + void inject(Messenger messenger); +} diff --git a/domain/src/main/java/org/mercury_im/messenger/di/module/MessengerModule.java b/domain/src/main/java/org/mercury_im/messenger/di/module/MessengerModule.java new file mode 100644 index 0000000..76fe55d --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/di/module/MessengerModule.java @@ -0,0 +1,5 @@ +package org.mercury_im.messenger.di.module; + +public class MessengerModule { + +} From 788c58c3a9d9b8902d07982bda78de8d2be39e0d Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 25 Nov 2019 15:17:49 +0100 Subject: [PATCH 12/83] Rework around missing setId in mapping and start adding junit tests --- data/build.gradle | 2 + .../data/mapping/AccountMapping.java | 8 +-- .../data/mapping/DirectChatMapping.java | 14 ++--- .../messenger/data/mapping/Mapping.java | 24 +++++++- .../messenger/data/mapping/PeerMapping.java | 17 +++--- .../repository/XmppAccountRepository.java | 21 +++---- .../repository/AccountRepositoryTest.java | 59 +++++++++++++++++++ 7 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java diff --git a/data/build.gradle b/data/build.gradle index d591ac1..27dba19 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -27,6 +27,8 @@ dependencies { // JUnit for testing testImplementation "junit:junit:$junitVersion" + + testImplementation "org.xerial:sqlite-jdbc:3.28.0" } sourceCompatibility = "8" diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index 404a30a..995033e 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -2,19 +2,16 @@ package org.mercury_im.messenger.data.mapping; import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.entity.PasswordAuthentication; public class AccountMapping implements Mapping { @Override - public AccountModel entityToData(Account entity) { + public AccountModel entityToModel(Account entity, AccountModel model) { if (entity == null) { return null; } - AccountModel model = new AccountModel(); - model.setId(entity.getId()); model.setPassword(entity.getAuthentication().getPassword()); model.setAddress(entity.getAddress()); model.setEnabled(entity.isEnabled()); @@ -23,12 +20,11 @@ public class AccountMapping implements Mapping { } @Override - public Account dataToEntity(AccountModel model) { + public Account modelToEntity(AccountModel model, Account entity) { if (model == null) { return null; } - IAccount entity = new IAccount(); entity.setId(model.getId()); entity.setAddress(model.getAddress()); entity.setEnabled(model.isEnabled()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java index 6b8bb96..dbc5ca5 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java @@ -2,7 +2,6 @@ package org.mercury_im.messenger.data.mapping; import org.mercury_im.messenger.data.model.DirectChatModel; import org.mercury_im.messenger.entity.chat.DirectChat; -import org.mercury_im.messenger.entity.chat.IDirectChat; import org.mercury_im.messenger.entity.contact.Peer; import javax.inject.Inject; @@ -16,18 +15,15 @@ public class DirectChatMapping implements Mapping { PeerMapping peerMapping; @Override - public DirectChatModel entityToData(DirectChat entity) { - DirectChatModel model = new DirectChatModel(); - model.setPeer(peerMapping.entityToData(entity.getPeer())); - //TODO: set iD + public DirectChatModel entityToModel(DirectChat entity, DirectChatModel model) { + model.setPeer(peerMapping.entityToModel(entity.getPeer(), model.getPeer())); return model; } @Override - public DirectChat dataToEntity(DirectChatModel data) { - IDirectChat entity = new IDirectChat(); - entity.setId(data.getId()); - Peer peer = peerMapping.dataToEntity(data.getPeer()); + public DirectChat modelToEntity(DirectChatModel model, DirectChat entity) { + entity.setId(model.getId()); + Peer peer = peerMapping.modelToEntity(model.getPeer(), entity.getPeer()); entity.setPeer(peer); entity.setAccount(peer.getAccount()); return entity; diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java index 6aa516b..b3665e6 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java @@ -1,8 +1,26 @@ package org.mercury_im.messenger.data.mapping; -public interface Mapping { +/** + * Interface that defines a mapping between entities and database models. + * + * @param Entity + * @param Model + */ +public interface Mapping { - D entityToData(E entity); + /** + * Copy data from the entity to the model. + * + * @param entity application entity + * @param model database model + */ + M entityToModel(E entity, M model); - E dataToEntity(D data); + /** + * Copy data from the database model to the entity. + * + * @param model database model + * @param entity entity + */ + E modelToEntity(M model, E entity); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java index 9baf42f..afe53d2 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -12,20 +12,17 @@ public class PeerMapping implements Mapping { AccountMapping accountMapping; @Override - public PeerModel entityToData(Peer entity) { - PeerModel model = new PeerModel(); - model.setAccount(accountMapping.entityToData(entity.getAccount())); + public PeerModel entityToModel(Peer entity, PeerModel model) { + model.setAccount(accountMapping.entityToModel(entity.getAccount(), model.getAccount())); model.setAddress(entity.getAddress()); return model; } @Override - public Peer dataToEntity(PeerModel data) { - Peer peer = new IPeer(); - peer.setAccount(accountMapping.dataToEntity(data.getAccount())); - peer.setAddress(data.getAddress()); - peer.setId(data.getId()); - - return peer; + public Peer modelToEntity(PeerModel model, Peer entity) { + entity.setAccount(accountMapping.modelToEntity(model.getAccount(), entity.getAccount())); + entity.setAddress(model.getAddress()); + entity.setId(model.getId()); + return entity; } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 4391245..8a45b23 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -3,6 +3,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.util.ThreadUtils; import org.mercury_im.messenger.data.mapping.AccountMapping; @@ -37,8 +38,8 @@ public class XmppAccountRepository @Override public Single insertAccount(Account account) { - return data().insert(mapping.entityToData(account)) - .map(mapping::dataToEntity) + return data().insert(mapping.entityToModel(account, new AccountModel())) + .map(model -> mapping.modelToEntity(model, account)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -48,7 +49,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().observableResult() - .map(result -> new Optional<>(mapping.dataToEntity(result.firstOrNull()))) + .map(result -> new Optional<>(mapping.modelToEntity(result.firstOrNull(), new IAccount()))) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -58,7 +59,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().maybe() - .map(mapping::dataToEntity) + .map(model -> mapping.modelToEntity(model, new IAccount())) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -68,7 +69,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ADDRESS.eq(address)) .get().observableResult() - .map(result -> new Optional<>(mapping.dataToEntity(result.firstOrNull()))) + .map(result -> new Optional<>(mapping.modelToEntity(result.firstOrNull(), new IAccount()))) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -78,7 +79,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ADDRESS.eq(address)) .get().maybe() - .map(mapping::dataToEntity) + .map(model -> mapping.modelToEntity(model, new IAccount())) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -91,7 +92,7 @@ public class XmppAccountRepository .map(list -> { List entities = new ArrayList<>(list.size()); for (AccountModel model : list) { - entities.add(mapping.dataToEntity(model)); + entities.add(mapping.modelToEntity(model, new IAccount())); } return entities; }) @@ -115,7 +116,7 @@ public class XmppAccountRepository model.setAddress(account.getAddress()); // write the updated model back model = data().update(model).blockingGet(); - return mapping.dataToEntity(model); + return mapping.modelToEntity(model, account); }) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -128,7 +129,7 @@ public class XmppAccountRepository .where(AccountModel.ID.eq(account.getId())) .get().maybe() // If it does not exist, create a new model from the entity - .switchIfEmpty(data().insert(mapping.entityToData(account))) + .switchIfEmpty(data().insert(mapping.entityToModel(account, new AccountModel()))) // finally .map(model -> { // update the model @@ -137,7 +138,7 @@ public class XmppAccountRepository model.setAddress(account.getAddress()); // write the updated model back model = data().update(model).blockingGet(); - return mapping.dataToEntity(model); + return mapping.modelToEntity(model, account); }) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java new file mode 100644 index 0000000..01244bb --- /dev/null +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -0,0 +1,59 @@ +package org.mercury_im.messenger.data.repository; + +import org.junit.Before; +import org.junit.Test; +import org.mercury_im.messenger.data.mapping.AccountMapping; +import org.mercury_im.messenger.data.model.Models; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.IAccount; +import org.mercury_im.messenger.entity.PasswordAuthentication; +import org.sqlite.SQLiteDataSource; + +import io.reactivex.observers.TestObserver; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subscribers.TestSubscriber; +import io.requery.Persistable; +import io.requery.cache.EntityCacheBuilder; +import io.requery.meta.EntityModel; +import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveSupport; +import io.requery.sql.Configuration; +import io.requery.sql.ConfigurationBuilder; +import io.requery.sql.EntityDataStore; +import io.requery.sql.TransactionMode; + +public class AccountRepositoryTest { + + ReactiveEntityStore dataStore; + + XmppAccountRepository accountRepository; + + @Before + public void setup() { + SQLiteDataSource dataSource = new SQLiteDataSource(); + dataSource.setUrl("jdbc:sqlite::memory:"); + EntityModel model = Models.DEFAULT; + Configuration configuration = new ConfigurationBuilder(dataSource, model) + .useDefaultLogging() + .setTransactionMode(TransactionMode.AUTO) + .build(); + dataStore = ReactiveSupport.toReactiveStore(new EntityDataStore<>(configuration)); + + accountRepository = new XmppAccountRepository(dataStore, Schedulers.io(), Schedulers.computation()); + accountRepository.mapping = new AccountMapping(); + + } + + @Test + public void test() { + Account account = new IAccount(); + account.setAddress("test@test.test"); + account.setEnabled(true); + account.setAuthentication(new PasswordAuthentication("swordfish")); + + TestObserver testObserver = accountRepository.insertAccount(account) + .subscribeWith(new TestObserver<>()); + + testObserver.getEvents(); + } +} From 610fd68e915a37388fb2ae3da3955a122be29cb8 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 29 Nov 2019 00:43:17 +0100 Subject: [PATCH 13/83] Remove .idea stuff --- .idea/gradle.xml | 92 ------------------------------------- .idea/misc.xml | 4 -- .idea/runConfigurations.xml | 12 ----- .idea/vcs.xml | 7 --- 4 files changed, 115 deletions(-) delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index e478165..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 974f06a..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index d4e6d58..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file From 787484ebdd4bf07716c91b59232554d8091e1117 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 29 Nov 2019 00:43:32 +0100 Subject: [PATCH 14/83] Fix primary key annotations of models --- .../mercury_im/messenger/data/model/AbstractAccountModel.java | 1 + .../mercury_im/messenger/data/model/AbstractContactModel.java | 1 - .../messenger/data/model/AbstractDirectChatModel.java | 1 - .../messenger/data/model/AbstractDirectMessagesRelation.java | 1 - .../messenger/data/model/AbstractEntityCapsModel.java | 2 -- .../mercury_im/messenger/data/model/AbstractGroupChatModel.java | 1 - .../messenger/data/model/AbstractGroupMessagesRelation.java | 1 - .../mercury_im/messenger/data/model/AbstractMessageModel.java | 1 - .../org/mercury_im/messenger/data/model/AbstractPeerModel.java | 1 - .../data/model/AbstractSaslAuthenticationResultModel.java | 1 - 10 files changed, 1 insertion(+), 10 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java index a080876..c59773c 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java @@ -14,6 +14,7 @@ import lombok.Setter; public abstract class AbstractAccountModel implements Persistable { @Key + @Generated long id; @Column(nullable = false) diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java index bb99002..f60a63d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java @@ -19,7 +19,6 @@ public abstract class AbstractContactModel implements Persistable { @Key @Generated - @Setter long id; @OneToOne diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java index 0458ee7..e9c630f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java @@ -14,7 +14,6 @@ import lombok.Setter; public abstract class AbstractDirectChatModel implements Persistable { @Key @Generated - @Setter long id; @OneToOne diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java index 7291309..8caa63f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java @@ -14,7 +14,6 @@ import lombok.Setter; public class AbstractDirectMessagesRelation { @Key @Generated - @Setter long id; @OneToOne diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java index 670a227..89aac23 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java @@ -13,8 +13,6 @@ import lombok.Setter; public abstract class AbstractEntityCapsModel implements Persistable { @Key - @Generated - @Setter String nodeVer; @Column(nullable = false) diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java index ace1169..8042957 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java @@ -13,7 +13,6 @@ import lombok.Setter; public abstract class AbstractGroupChatModel implements Persistable { @Key @Generated - @Setter long id; // TODO: Add Account? diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java index 19cd7a8..e427b2a 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java @@ -14,7 +14,6 @@ import lombok.Setter; public class AbstractGroupMessagesRelation { @Key @Generated - @Setter long id; @OneToOne diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index 63cc50c..8a9e9d0 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -17,7 +17,6 @@ import lombok.Setter; public abstract class AbstractMessageModel implements Persistable { @Key @Generated - @Setter long id; String body; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index 8ecff83..0623cb0 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -15,7 +15,6 @@ import lombok.Setter; public abstract class AbstractPeerModel implements Persistable { @Key @Generated - @Setter long id; @ManyToOne diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java index e3c8fae..fab6c07 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java @@ -15,7 +15,6 @@ public abstract class AbstractSaslAuthenticationResultModel implements Persistab @Key @ManyToOne - @Setter AccountModel account; SaslCondition saslCondition; From abf4b59500a00656a97804b02fd5a14fd6c585e0 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 29 Nov 2019 00:43:41 +0100 Subject: [PATCH 15/83] Tinker with junit database test --- .../repository/AccountRepositoryTest.java | 67 +++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 01244bb..35f2549 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -1,5 +1,6 @@ package org.mercury_im.messenger.data.repository; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mercury_im.messenger.data.mapping.AccountMapping; @@ -7,41 +8,79 @@ import org.mercury_im.messenger.data.model.Models; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.entity.PasswordAuthentication; +import org.mercury_im.messenger.entity.chat.Chat; +import org.mercury_im.messenger.entity.chat.ChatPreferences; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.chat.IChatPreferences; +import org.mercury_im.messenger.entity.chat.IDirectChat; +import org.mercury_im.messenger.entity.contact.IPeer; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.message.IMessage; +import org.mercury_im.messenger.entity.message.IMessagePayload; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.entity.message.MessageDeliveryState; +import org.mercury_im.messenger.entity.message.content.MessageContent; +import org.mercury_im.messenger.entity.message.content.TextMessageContent; +import org.sqlite.SQLiteConfig; import org.sqlite.SQLiteDataSource; +import java.util.Collections; +import java.util.List; + +import io.reactivex.functions.Predicate; import io.reactivex.observers.TestObserver; import io.reactivex.schedulers.Schedulers; import io.reactivex.subscribers.TestSubscriber; import io.requery.Persistable; import io.requery.cache.EntityCacheBuilder; +import io.requery.cache.WeakEntityCache; import io.requery.meta.EntityModel; import io.requery.reactivex.ReactiveEntityStore; import io.requery.reactivex.ReactiveSupport; import io.requery.sql.Configuration; import io.requery.sql.ConfigurationBuilder; import io.requery.sql.EntityDataStore; +import io.requery.sql.SchemaModifier; +import io.requery.sql.TableCreationMode; import io.requery.sql.TransactionMode; +import static junit.framework.TestCase.assertEquals; + public class AccountRepositoryTest { ReactiveEntityStore dataStore; XmppAccountRepository accountRepository; + XmppDirectChatRepository directChatRepository; + @Before public void setup() { SQLiteDataSource dataSource = new SQLiteDataSource(); - dataSource.setUrl("jdbc:sqlite::memory:"); + dataSource.setUrl("jdbc:sqlite::memory:test"); + SQLiteConfig config = new SQLiteConfig(); + config.setDateClass("TEXT"); + dataSource.setConfig(config); + // Turn on foreign keys support. + // NOTE: Do it after setConfig, or setConfig will overwrite this setting + dataSource.setEnforceForeignKeys(true); + EntityModel model = Models.DEFAULT; Configuration configuration = new ConfigurationBuilder(dataSource, model) + .setEntityCache(new WeakEntityCache()) .useDefaultLogging() - .setTransactionMode(TransactionMode.AUTO) .build(); + + SchemaModifier modifier = new SchemaModifier(dataSource, model); + modifier.createTables(TableCreationMode.DROP_CREATE); + dataStore = ReactiveSupport.toReactiveStore(new EntityDataStore<>(configuration)); - accountRepository = new XmppAccountRepository(dataStore, Schedulers.io(), Schedulers.computation()); + accountRepository = new XmppAccountRepository(dataStore, Schedulers.io(), Schedulers.trampoline()); accountRepository.mapping = new AccountMapping(); + directChatRepository = new XmppDirectChatRepository(dataStore, Schedulers.io(), Schedulers.trampoline()); + } @Test @@ -51,9 +90,25 @@ public class AccountRepositoryTest { account.setEnabled(true); account.setAuthentication(new PasswordAuthentication("swordfish")); - TestObserver testObserver = accountRepository.insertAccount(account) - .subscribeWith(new TestObserver<>()); + Peer peer = new IPeer(); + peer.setName("Test Peer"); + peer.setAddress("peer@peer.peer"); + peer.setAccount(account); - testObserver.getEvents(); + DirectChat directChat = new IDirectChat(); + directChat.setPeer(peer); + directChat.setAccount(account); + + //Account model = accountRepository.insertAccount(account).blockingGet(); + //assertEquals(1, model.getId()); + + DirectChat model = directChatRepository.insertDirectChat(directChat) + .blockingGet(); + assertEquals(1, model.getId()); + } + + @After + public void teardown() { + dataStore.close(); } } From 2ecc28ed8d0410e59e1df7b82e29c37b3233c426 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 19:55:04 +0100 Subject: [PATCH 16/83] Update kotlin-stdlib-jdk7 to 1.3.50 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4c1f862..d2781f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,7 +77,7 @@ dependencies { implementation project(":data") implementation "io.requery:requery-android:$requeryVersion" - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50' // Dagger 2 for dependency injection implementation "com.google.dagger:dagger:$daggerVersion" From f58b8accfa59f0a74763623c6f8319c2080f9751 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 19:55:50 +0100 Subject: [PATCH 17/83] Enable dagger in data/test --- data/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/build.gradle b/data/build.gradle index 27dba19..5cc048d 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -4,6 +4,7 @@ apply plugin: 'java-library' // This is apparently necessary for use with requery. sourceSets { main.java.srcDirs += "${buildDir}/generated/sources/annotationProcessor/java/main/" + test.java.srcDirs += "${buildDir}/generated/sources/annotationProcessor/java/test/" } dependencies { @@ -20,6 +21,7 @@ dependencies { // Dagger 2 for dependency injection implementation "com.google.dagger:dagger:$daggerVersion" annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" + testAnnotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" // Requery ORM api "io.requery:requery:$requeryVersion" From df68ccb600517c5f019dabf8f10ece00f0d4dbe4 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 19:56:13 +0100 Subject: [PATCH 18/83] Improve test components --- .../messenger/data/di/MappingModule.java | 4 +- .../messenger/data/di/RepositoryModule.java | 28 ++++--- .../data/mapping/AccountMapping.java | 11 ++- .../data/mapping/DirectChatMapping.java | 16 +++- .../messenger/data/mapping/PeerMapping.java | 15 +++- .../data/repository/EntityCapsRepository.java | 7 +- .../repository/XmppAccountRepository.java | 22 ++--- .../repository/XmppDirectChatRepository.java | 52 ++++++++++-- .../data/di/RepositoryTestComponent.java | 19 +++++ .../messenger/data/di/TestDatabaseModule.java | 59 ++++++++++++++ .../data/di/TestingSchedulerModule.java | 29 +++++++ .../repository/AccountRepositoryTest.java | 81 ++++--------------- 12 files changed, 239 insertions(+), 104 deletions(-) create mode 100644 data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java create mode 100644 data/src/test/java/org/mercury_im/messenger/data/di/TestDatabaseModule.java create mode 100644 data/src/test/java/org/mercury_im/messenger/data/di/TestingSchedulerModule.java diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java index 3087471..323d76e 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java @@ -21,12 +21,12 @@ public class MappingModule { @Provides @Singleton public static PeerMapping peerMapping() { - return new PeerMapping(); + return new PeerMapping(accountMapping()); } @Provides @Singleton public static DirectChatMapping directChatMapping() { - return new DirectChatMapping(); + return new DirectChatMapping(accountMapping(), peerMapping()); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index d24600a..fb55e72 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -23,33 +23,37 @@ public class RepositoryModule { @Provides @Singleton - public static AccountRepository provideAccountRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + public static AccountRepository provideAccountRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { return new XmppAccountRepository(data, ioScheduler, uiScheduler); } @Provides @Singleton - public static DirectChatRepository provideChatRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + public static DirectChatRepository provideChatRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { return new XmppDirectChatRepository(data, ioScheduler, uiScheduler); } @Provides @Singleton - public static EntityCapsRepository provideCapsRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + public static EntityCapsRepository provideCapsRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { return new EntityCapsRepository(data, ioScheduler, uiScheduler); } @Provides @Singleton - public static ContactRepository provideRosterRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { + public static ContactRepository provideRosterRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { return new XmppContactRepository(data, ioScheduler, uiScheduler); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index 995033e..46acf60 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -4,14 +4,23 @@ import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.PasswordAuthentication; +import javax.inject.Inject; + public class AccountMapping implements Mapping { + @Inject + public AccountMapping() { + + } + @Override public AccountModel entityToModel(Account entity, AccountModel model) { if (entity == null) { return null; } - + if (model == null) { + model = new AccountModel(); + } model.setPassword(entity.getAuthentication().getPassword()); model.setAddress(entity.getAddress()); model.setEnabled(entity.isEnabled()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java index dbc5ca5..f793968 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java @@ -8,20 +8,30 @@ import javax.inject.Inject; public class DirectChatMapping implements Mapping { - @Inject - AccountMapping accountMapping; + private final AccountMapping accountMapping; + + private final PeerMapping peerMapping; @Inject - PeerMapping peerMapping; + public DirectChatMapping(AccountMapping accountMapping, PeerMapping peerMapping) { + this.accountMapping = accountMapping; + this.peerMapping = peerMapping; + } @Override public DirectChatModel entityToModel(DirectChat entity, DirectChatModel model) { + if (entity == null) { + return null; + } model.setPeer(peerMapping.entityToModel(entity.getPeer(), model.getPeer())); return model; } @Override public DirectChat modelToEntity(DirectChatModel model, DirectChat entity) { + if (model == null) { + return null; + } entity.setId(model.getId()); Peer peer = peerMapping.modelToEntity(model.getPeer(), entity.getPeer()); entity.setPeer(peer); diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java index afe53d2..045675b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -8,11 +8,21 @@ import javax.inject.Inject; public class PeerMapping implements Mapping { + private final AccountMapping accountMapping; + @Inject - AccountMapping accountMapping; + public PeerMapping(AccountMapping accountMapping) { + this.accountMapping = accountMapping; + } @Override public PeerModel entityToModel(Peer entity, PeerModel model) { + if (entity == null) { + return null; + } + if (model == null) { + model = new PeerModel(); + } model.setAccount(accountMapping.entityToModel(entity.getAccount(), model.getAccount())); model.setAddress(entity.getAddress()); return model; @@ -20,6 +30,9 @@ public class PeerMapping implements Mapping { @Override public Peer modelToEntity(PeerModel model, Peer entity) { + if (model == null) { + return null; + } entity.setAccount(accountMapping.modelToEntity(model.getAccount(), entity.getAccount())); entity.setAddress(model.getAddress()); entity.setId(model.getId()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java index e0f90c9..feccee5 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java @@ -12,9 +12,10 @@ import io.requery.reactivex.ReactiveEntityStore; public class EntityCapsRepository extends RequeryRepository { @Inject - public EntityCapsRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + public EntityCapsRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { super(data, subscriberScheduler, observerScheduler); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 8a45b23..a258328 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -27,7 +27,7 @@ public class XmppAccountRepository implements AccountRepository { @Inject - AccountMapping mapping; + AccountMapping accountMapping; @Inject public XmppAccountRepository(ReactiveEntityStore data, @@ -38,8 +38,8 @@ public class XmppAccountRepository @Override public Single insertAccount(Account account) { - return data().insert(mapping.entityToModel(account, new AccountModel())) - .map(model -> mapping.modelToEntity(model, account)) + return data().insert(accountMapping.entityToModel(account, new AccountModel())) + .map(model -> accountMapping.modelToEntity(model, account)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -49,7 +49,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().observableResult() - .map(result -> new Optional<>(mapping.modelToEntity(result.firstOrNull(), new IAccount()))) + .map(result -> new Optional<>(accountMapping.modelToEntity(result.firstOrNull(), new IAccount()))) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -59,7 +59,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().maybe() - .map(model -> mapping.modelToEntity(model, new IAccount())) + .map(model -> accountMapping.modelToEntity(model, new IAccount())) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -69,7 +69,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ADDRESS.eq(address)) .get().observableResult() - .map(result -> new Optional<>(mapping.modelToEntity(result.firstOrNull(), new IAccount()))) + .map(result -> new Optional<>(accountMapping.modelToEntity(result.firstOrNull(), new IAccount()))) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -79,7 +79,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ADDRESS.eq(address)) .get().maybe() - .map(model -> mapping.modelToEntity(model, new IAccount())) + .map(model -> accountMapping.modelToEntity(model, new IAccount())) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -92,7 +92,7 @@ public class XmppAccountRepository .map(list -> { List entities = new ArrayList<>(list.size()); for (AccountModel model : list) { - entities.add(mapping.modelToEntity(model, new IAccount())); + entities.add(accountMapping.modelToEntity(model, new IAccount())); } return entities; }) @@ -116,7 +116,7 @@ public class XmppAccountRepository model.setAddress(account.getAddress()); // write the updated model back model = data().update(model).blockingGet(); - return mapping.modelToEntity(model, account); + return accountMapping.modelToEntity(model, account); }) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -129,7 +129,7 @@ public class XmppAccountRepository .where(AccountModel.ID.eq(account.getId())) .get().maybe() // If it does not exist, create a new model from the entity - .switchIfEmpty(data().insert(mapping.entityToModel(account, new AccountModel()))) + .switchIfEmpty(data().insert(accountMapping.entityToModel(account, new AccountModel()))) // finally .map(model -> { // update the model @@ -138,7 +138,7 @@ public class XmppAccountRepository model.setAddress(account.getAddress()); // write the updated model back model = data().update(model).blockingGet(); - return mapping.modelToEntity(model, account); + return accountMapping.modelToEntity(model, account); }) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index 248341a..906e23c 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -1,12 +1,21 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.data.mapping.AccountMapping; +import org.mercury_im.messenger.data.mapping.DirectChatMapping; +import org.mercury_im.messenger.data.mapping.PeerMapping; +import org.mercury_im.messenger.data.model.DirectChatModel; import org.mercury_im.messenger.data.util.Optional; import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.chat.IDirectChat; import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.util.ThreadUtils; import java.util.List; +import javax.inject.Inject; +import javax.inject.Named; + import io.reactivex.Completable; import io.reactivex.Maybe; import io.reactivex.Observable; @@ -19,32 +28,63 @@ public class XmppDirectChatRepository extends RequeryRepository implements DirectChatRepository { + @Inject + AccountMapping accountMapping; + @Inject + PeerMapping peerMapping; + + @Inject + DirectChatMapping directChatMapping; + + @Inject public XmppDirectChatRepository( ReactiveEntityStore data, - Scheduler subscriberScheduler, - Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { super(data, subscriberScheduler, observerScheduler); } + + @Override public Single insertDirectChat(DirectChat chat) { - return null; + return data().insert(directChatMapping.entityToModel(chat, new DirectChatModel())) + .map(model -> directChatMapping.modelToEntity(model, chat)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> observeDirectChat(long chatId) { - return null; + return data().select(DirectChatModel.class) + .where(DirectChatModel.ID.eq(chatId)) + .get().observableResult() + .map(result -> new Optional<>( + directChatMapping.modelToEntity(result.firstOrNull(), new IDirectChat()))) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Maybe getDirectChat(long chatId) { - return null; + return data().select(DirectChatModel.class) + .where(DirectChatModel.ID.eq(chatId)) + .get().maybe() + .map(result -> directChatMapping.modelToEntity(result, new IDirectChat())) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> observeDirectChatByInterlocutor(Peer peer) { - return null; + return data().select(DirectChatModel.class) + .where(DirectChatModel.PEER_ID.eq(peer.getId())) + .get().observableResult() + .map(result -> new Optional<>( + directChatMapping.modelToEntity(result.firstOrNull(), new IDirectChat()))) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override diff --git a/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java b/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java new file mode 100644 index 0000000..b40ee68 --- /dev/null +++ b/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java @@ -0,0 +1,19 @@ +package org.mercury_im.messenger.data.di; + +import org.mercury_im.messenger.data.repository.AccountRepositoryTest; + +import javax.inject.Singleton; + +import dagger.Component; + +@Component(modules = { + RepositoryModule.class, + MappingModule.class, + TestDatabaseModule.class, + TestingSchedulerModule.class +}) +@Singleton +public interface RepositoryTestComponent { + + void inject(AccountRepositoryTest test); +} diff --git a/data/src/test/java/org/mercury_im/messenger/data/di/TestDatabaseModule.java b/data/src/test/java/org/mercury_im/messenger/data/di/TestDatabaseModule.java new file mode 100644 index 0000000..e16e621 --- /dev/null +++ b/data/src/test/java/org/mercury_im/messenger/data/di/TestDatabaseModule.java @@ -0,0 +1,59 @@ +package org.mercury_im.messenger.data.di; + +import org.mercury_im.messenger.data.model.Models; +import org.sqlite.SQLiteConfig; +import org.sqlite.SQLiteDataSource; + +import java.io.PrintWriter; +import java.sql.SQLException; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import io.requery.Persistable; +import io.requery.cache.WeakEntityCache; +import io.requery.meta.EntityModel; +import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveSupport; +import io.requery.sql.Configuration; +import io.requery.sql.ConfigurationBuilder; +import io.requery.sql.EntityDataStore; +import io.requery.sql.SchemaModifier; +import io.requery.sql.TableCreationMode; + +@Module +public class TestDatabaseModule { + + @Provides + @Singleton + public static ReactiveEntityStore provideInMemoryEntityStore() { + EntityModel model = Models.DEFAULT; + + SQLiteDataSource dataSource = new SQLiteDataSource(); + try { + dataSource.setLogWriter(new PrintWriter(System.out)); + } catch (SQLException e) { + e.printStackTrace(); + } + dataSource.setUrl("jdbc:sqlite:/tmp/mercury_testing.db"); + dataSource.setDatabaseName("testing"); + SQLiteConfig config = new SQLiteConfig(); + config.setDateClass("TEXT"); + dataSource.setConfig(config); + // Turn on foreign keys support. + // NOTE: Do it after setConfig, or setConfig will overwrite this setting + dataSource.setEnforceForeignKeys(true); + + SchemaModifier modifier = new SchemaModifier(dataSource, model); + modifier.createTables(TableCreationMode.DROP_CREATE); + + Configuration configuration = new ConfigurationBuilder(dataSource, model) + .setEntityCache(new WeakEntityCache()) + .useDefaultLogging() + .build(); + + EntityDataStore dataStore = new EntityDataStore<>(configuration); + return ReactiveSupport.toReactiveStore(dataStore); + } +} diff --git a/data/src/test/java/org/mercury_im/messenger/data/di/TestingSchedulerModule.java b/data/src/test/java/org/mercury_im/messenger/data/di/TestingSchedulerModule.java new file mode 100644 index 0000000..4216a43 --- /dev/null +++ b/data/src/test/java/org/mercury_im/messenger/data/di/TestingSchedulerModule.java @@ -0,0 +1,29 @@ +package org.mercury_im.messenger.data.di; + +import org.mercury_im.messenger.util.ThreadUtils; + +import javax.inject.Named; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import io.reactivex.Scheduler; +import io.reactivex.schedulers.Schedulers; + +@Module +public class TestingSchedulerModule { + + @Provides + @Singleton + @Named(value = ThreadUtils.SCHEDULER_IO) + public static Scheduler provideSubscriberScheduler() { + return Schedulers.io(); + } + + @Provides + @Singleton + @Named(value = ThreadUtils.SCHEDULER_UI) + public static Scheduler provideObserverScheduler() { + return Schedulers.trampoline(); + } +} diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 35f2549..3747d35 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -1,86 +1,42 @@ package org.mercury_im.messenger.data.repository; -import org.junit.After; -import org.junit.Before; import org.junit.Test; -import org.mercury_im.messenger.data.mapping.AccountMapping; -import org.mercury_im.messenger.data.model.Models; +import org.mercury_im.messenger.data.di.DaggerRepositoryTestComponent; +import org.mercury_im.messenger.data.di.RepositoryTestComponent; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.entity.PasswordAuthentication; -import org.mercury_im.messenger.entity.chat.Chat; -import org.mercury_im.messenger.entity.chat.ChatPreferences; import org.mercury_im.messenger.entity.chat.DirectChat; -import org.mercury_im.messenger.entity.chat.IChatPreferences; import org.mercury_im.messenger.entity.chat.IDirectChat; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; -import org.mercury_im.messenger.entity.message.IMessage; -import org.mercury_im.messenger.entity.message.IMessagePayload; -import org.mercury_im.messenger.entity.message.Message; -import org.mercury_im.messenger.entity.message.MessageDeliveryState; -import org.mercury_im.messenger.entity.message.content.MessageContent; -import org.mercury_im.messenger.entity.message.content.TextMessageContent; -import org.sqlite.SQLiteConfig; -import org.sqlite.SQLiteDataSource; -import java.util.Collections; -import java.util.List; +import javax.inject.Inject; -import io.reactivex.functions.Predicate; -import io.reactivex.observers.TestObserver; -import io.reactivex.schedulers.Schedulers; -import io.reactivex.subscribers.TestSubscriber; import io.requery.Persistable; -import io.requery.cache.EntityCacheBuilder; -import io.requery.cache.WeakEntityCache; -import io.requery.meta.EntityModel; import io.requery.reactivex.ReactiveEntityStore; -import io.requery.reactivex.ReactiveSupport; -import io.requery.sql.Configuration; -import io.requery.sql.ConfigurationBuilder; -import io.requery.sql.EntityDataStore; -import io.requery.sql.SchemaModifier; -import io.requery.sql.TableCreationMode; -import io.requery.sql.TransactionMode; import static junit.framework.TestCase.assertEquals; public class AccountRepositoryTest { + @Inject ReactiveEntityStore dataStore; + @Inject XmppAccountRepository accountRepository; + @Inject XmppDirectChatRepository directChatRepository; - @Before - public void setup() { - SQLiteDataSource dataSource = new SQLiteDataSource(); - dataSource.setUrl("jdbc:sqlite::memory:test"); - SQLiteConfig config = new SQLiteConfig(); - config.setDateClass("TEXT"); - dataSource.setConfig(config); - // Turn on foreign keys support. - // NOTE: Do it after setConfig, or setConfig will overwrite this setting - dataSource.setEnforceForeignKeys(true); + @Inject + XmppContactRepository contactRepository; - EntityModel model = Models.DEFAULT; - Configuration configuration = new ConfigurationBuilder(dataSource, model) - .setEntityCache(new WeakEntityCache()) - .useDefaultLogging() + @Inject + public AccountRepositoryTest() { + RepositoryTestComponent testComponent = DaggerRepositoryTestComponent.builder() .build(); - - SchemaModifier modifier = new SchemaModifier(dataSource, model); - modifier.createTables(TableCreationMode.DROP_CREATE); - - dataStore = ReactiveSupport.toReactiveStore(new EntityDataStore<>(configuration)); - - accountRepository = new XmppAccountRepository(dataStore, Schedulers.io(), Schedulers.trampoline()); - accountRepository.mapping = new AccountMapping(); - - directChatRepository = new XmppDirectChatRepository(dataStore, Schedulers.io(), Schedulers.trampoline()); - + testComponent.inject(this); } @Test @@ -99,16 +55,11 @@ public class AccountRepositoryTest { directChat.setPeer(peer); directChat.setAccount(account); - //Account model = accountRepository.insertAccount(account).blockingGet(); - //assertEquals(1, model.getId()); + //Account accountModel = accountRepository.insertAccount(account).blockingGet(); + //assertEquals(1, accountModel.getId()); - DirectChat model = directChatRepository.insertDirectChat(directChat) + DirectChat chatModel = directChatRepository.insertDirectChat(directChat) .blockingGet(); - assertEquals(1, model.getId()); - } - - @After - public void teardown() { - dataStore.close(); + assertEquals(1, chatModel.getId()); } } From b9c88b8ca536a786d068f202ca3197b12c5473e2 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 21:16:01 +0100 Subject: [PATCH 19/83] More work on data component --- .../messenger/data/di/MappingModule.java | 2 +- .../data/mapping/AccountMapping.java | 5 +- .../data/mapping/ContactMapping.java | 24 +++ .../data/mapping/DirectChatMapping.java | 12 +- .../data/mapping/GroupChatMapping.java | 46 +++++ .../messenger/data/mapping/PeerMapping.java | 3 + .../data/model/AbstractAccountModel.java | 2 - .../data/model/AbstractContactModel.java | 1 - .../data/model/AbstractDirectChatModel.java | 1 - .../model/AbstractDirectMessagesRelation.java | 1 - .../data/model/AbstractEntityCapsModel.java | 2 - .../data/model/AbstractGroupChatModel.java | 6 +- .../model/AbstractGroupMessagesRelation.java | 1 - .../data/model/AbstractMessageModel.java | 3 - .../data/model/AbstractPeerModel.java | 1 - ...AbstractSaslAuthenticationResultModel.java | 1 - .../repository/XmppAccountRepository.java | 10 +- .../repository/XmppDirectChatRepository.java | 55 +++++- .../repository/XmppGroupChatRepository.java | 176 ++++++++++++++++++ .../data/repository/DirectChatRepository.java | 4 +- 20 files changed, 319 insertions(+), 37 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/GroupChatMapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java index 323d76e..a865f3d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java @@ -27,6 +27,6 @@ public class MappingModule { @Provides @Singleton public static DirectChatMapping directChatMapping() { - return new DirectChatMapping(accountMapping(), peerMapping()); + return new DirectChatMapping(peerMapping()); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index 46acf60..9960f13 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -2,6 +2,7 @@ package org.mercury_im.messenger.data.mapping; import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.entity.PasswordAuthentication; import javax.inject.Inject; @@ -33,7 +34,9 @@ public class AccountMapping implements Mapping { if (model == null) { return null; } - + if (entity == null) { + entity = new IAccount(); + } entity.setId(model.getId()); entity.setAddress(model.getAddress()); entity.setEnabled(model.isEnabled()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java new file mode 100644 index 0000000..e8de5f2 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java @@ -0,0 +1,24 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.model.ContactModel; +import org.mercury_im.messenger.entity.contact.Contact; + +public class ContactMapping implements Mapping { + + @Override + public ContactModel entityToModel(Contact entity, ContactModel model) { + if (entity == null) { + return null; + } + if (model == null) { + model = new ContactModel(); + } + + return null; + } + + @Override + public Contact modelToEntity(ContactModel model, Contact entity) { + return null; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java index f793968..48098b6 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java @@ -2,19 +2,17 @@ package org.mercury_im.messenger.data.mapping; import org.mercury_im.messenger.data.model.DirectChatModel; import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.chat.IDirectChat; import org.mercury_im.messenger.entity.contact.Peer; import javax.inject.Inject; public class DirectChatMapping implements Mapping { - private final AccountMapping accountMapping; - private final PeerMapping peerMapping; @Inject - public DirectChatMapping(AccountMapping accountMapping, PeerMapping peerMapping) { - this.accountMapping = accountMapping; + public DirectChatMapping(PeerMapping peerMapping) { this.peerMapping = peerMapping; } @@ -23,6 +21,9 @@ public class DirectChatMapping implements Mapping { if (entity == null) { return null; } + if (model == null) { + model = new DirectChatModel(); + } model.setPeer(peerMapping.entityToModel(entity.getPeer(), model.getPeer())); return model; } @@ -32,6 +33,9 @@ public class DirectChatMapping implements Mapping { if (model == null) { return null; } + if (entity == null) { + entity = new IDirectChat(); + } entity.setId(model.getId()); Peer peer = peerMapping.modelToEntity(model.getPeer(), entity.getPeer()); entity.setPeer(peer); diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/GroupChatMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/GroupChatMapping.java new file mode 100644 index 0000000..204ebed --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/GroupChatMapping.java @@ -0,0 +1,46 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.model.GroupChatModel; +import org.mercury_im.messenger.entity.chat.GroupChat; +import org.mercury_im.messenger.entity.chat.IGroupChat; + +import javax.inject.Inject; + +public class GroupChatMapping implements Mapping { + + private final AccountMapping accountMapping; + + @Inject + public GroupChatMapping(AccountMapping accountMapping) { + this.accountMapping = accountMapping; + } + + @Override + public GroupChatModel entityToModel(GroupChat entity, GroupChatModel model) { + if (entity == null) { + return null; + } + if (model == null) { + model = new GroupChatModel(); + } + model.setAccount(accountMapping.entityToModel(entity.getAccount(), model.getAccount())); + model.setAddress(entity.getRoomAddress()); + model.setName(entity.getRoomName()); + return model; + } + + @Override + public GroupChat modelToEntity(GroupChatModel model, GroupChat entity) { + if (model == null) { + return null; + } + if (entity == null) { + entity = new IGroupChat(); + } + entity.setId(model.getId()); + entity.setAccount(accountMapping.modelToEntity(model.getAccount(), entity.getAccount())); + entity.setRoomAddress(model.getAddress()); + entity.setRoomName(model.getName()); + return entity; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java index 045675b..8118a84 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -33,6 +33,9 @@ public class PeerMapping implements Mapping { if (model == null) { return null; } + if (entity == null) { + entity = new IPeer(); + } entity.setAccount(accountMapping.modelToEntity(model.getAccount(), entity.getAccount())); entity.setAddress(model.getAddress()); entity.setId(model.getId()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java index c59773c..943e7f1 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java @@ -6,8 +6,6 @@ import io.requery.Generated; import io.requery.Key; import io.requery.Persistable; import io.requery.Table; -import lombok.Getter; -import lombok.Setter; @Table(name = "accounts") @Entity diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java index f60a63d..352350d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java @@ -11,7 +11,6 @@ import io.requery.Key; import io.requery.OneToOne; import io.requery.Persistable; import io.requery.Table; -import lombok.Setter; @Entity @Table(name = "contacts") diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java index e9c630f..b9137a8 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java @@ -7,7 +7,6 @@ import io.requery.Key; import io.requery.OneToOne; import io.requery.Persistable; import io.requery.Table; -import lombok.Setter; @Entity @Table(name = "chats") diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java index 8caa63f..5a6cc3d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java @@ -7,7 +7,6 @@ import io.requery.Key; import io.requery.ManyToOne; import io.requery.OneToOne; import io.requery.Table; -import lombok.Setter; @Entity @Table(name = "direct_messages") diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java index 89aac23..165f568 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractEntityCapsModel.java @@ -2,11 +2,9 @@ package org.mercury_im.messenger.data.model; import io.requery.Column; import io.requery.Entity; -import io.requery.Generated; import io.requery.Key; import io.requery.Persistable; import io.requery.Table; -import lombok.Setter; @Table(name = "entity_caps") @Entity diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java index 8042957..ff66520 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java @@ -4,9 +4,9 @@ import io.requery.Column; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; +import io.requery.ManyToOne; import io.requery.Persistable; import io.requery.Table; -import lombok.Setter; @Entity @Table(name = "groupchats") @@ -15,7 +15,9 @@ public abstract class AbstractGroupChatModel implements Persistable { @Key @Generated long id; - // TODO: Add Account? + @Column(nullable = false) + @ManyToOne + AccountModel account; @Column(nullable = false) String address; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java index e427b2a..802e711 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java @@ -7,7 +7,6 @@ import io.requery.Key; import io.requery.ManyToOne; import io.requery.OneToOne; import io.requery.Table; -import lombok.Setter; @Entity @Table(name = "group_messages") diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index 8a9e9d0..d9de44f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -4,13 +4,10 @@ import java.util.Date; import io.requery.Column; import io.requery.Entity; -import io.requery.ForeignKey; import io.requery.Generated; import io.requery.Key; -import io.requery.ManyToOne; import io.requery.Persistable; import io.requery.Table; -import lombok.Setter; @Entity @Table(name = "messages") diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index 0623cb0..b445601 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -8,7 +8,6 @@ import io.requery.Key; import io.requery.ManyToOne; import io.requery.Persistable; import io.requery.Table; -import lombok.Setter; @Entity @Table(name = "peers") diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java index fab6c07..f13b416 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractSaslAuthenticationResultModel.java @@ -7,7 +7,6 @@ import io.requery.Key; import io.requery.ManyToOne; import io.requery.Persistable; import io.requery.Table; -import lombok.Setter; @Entity @Table(name = "sasl_auth") diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index a258328..0d4039b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -110,10 +110,8 @@ public class XmppAccountRepository .where(AccountModel.ID.eq(account.getId())) .get().maybe().toSingle() // to single .map(model -> { - // update it - model.setEnabled(account.isEnabled()); - model.setPassword(account.getAuthentication().getPassword()); - model.setAddress(account.getAddress()); + // copy changes from the entity to the model + model = accountMapping.entityToModel(account, model); // write the updated model back model = data().update(model).blockingGet(); return accountMapping.modelToEntity(model, account); @@ -133,9 +131,7 @@ public class XmppAccountRepository // finally .map(model -> { // update the model - model.setEnabled(account.isEnabled()); - model.setPassword(account.getAuthentication().getPassword()); - model.setAddress(account.getAddress()); + model = accountMapping.entityToModel(account, model); // write the updated model back model = data().update(model).blockingGet(); return accountMapping.modelToEntity(model, account); diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index 906e23c..ad3139f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -11,6 +11,7 @@ import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.util.ThreadUtils; +import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -22,6 +23,7 @@ import io.reactivex.Observable; import io.reactivex.Scheduler; import io.reactivex.Single; import io.requery.Persistable; +import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; public class XmppDirectChatRepository @@ -77,7 +79,7 @@ public class XmppDirectChatRepository } @Override - public Observable> observeDirectChatByInterlocutor(Peer peer) { + public Observable> observeDirectChatByPeer(Peer peer) { return data().select(DirectChatModel.class) .where(DirectChatModel.PEER_ID.eq(peer.getId())) .get().observableResult() @@ -88,28 +90,67 @@ public class XmppDirectChatRepository } @Override - public Maybe getDirectChatByInterlocutor(Peer peer) { - return null; + public Maybe getDirectChatByPeer(Peer peer) { + return data().select(DirectChatModel.class) + .where(DirectChatModel.PEER_ID.eq(peer.getId())) + .get().maybe() + .map(model -> directChatMapping.modelToEntity(model, new IDirectChat())) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> observeAllDirectChats() { - return null; + return data().select(DirectChatModel.class) + .get().observableResult() + .map(ResultDelegate::toList) + .map(list -> { + List entities = new ArrayList<>(list.size()); + for (DirectChatModel model : list) { + entities.add(directChatMapping.modelToEntity(model, new IDirectChat())); + } + return entities; + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Single updateDirectChat(DirectChat chat) { - return null; + return data().select(DirectChatModel.class) + .where(DirectChatModel.ID.eq(chat.getId())) + .get().maybe().toSingle() + .map(model -> { + model = directChatMapping.entityToModel(chat, model); + model = data().update(model).blockingGet(); + return directChatMapping.modelToEntity(model, chat); + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Single upsertDirectChat(DirectChat chat) { - return null; + return data().select(DirectChatModel.class) + .where(DirectChatModel.ID.eq(chat.getId())) + .get().maybe() + .switchIfEmpty(data().insert(directChatMapping.entityToModel(chat, new DirectChatModel()))) + .map(model -> { + model = directChatMapping.entityToModel(chat, model); + model = data().update(model).blockingGet(); + return directChatMapping.modelToEntity(model, chat); + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Completable deleteDirectChat(DirectChat chat) { - return null; + return data().delete(DirectChatModel.class) + .where(DirectChatModel.ID.eq(chat.getId())) + .get().single().ignoreElement() + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java new file mode 100644 index 0000000..dc81b16 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -0,0 +1,176 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.data.mapping.GroupChatMapping; +import org.mercury_im.messenger.data.model.GroupChatModel; +import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.chat.GroupChat; +import org.mercury_im.messenger.entity.chat.IGroupChat; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.util.ThreadUtils; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.query.ResultDelegate; +import io.requery.reactivex.ReactiveEntityStore; + +public class XmppGroupChatRepository + extends RequeryRepository + implements GroupChatRepository { + + @Inject + GroupChatMapping groupChatMapping; + + @Inject + public XmppGroupChatRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + super(data, subscriberScheduler, observerScheduler); + } + + @Override + public Single insertGroupChat(GroupChat chat) { + return data().insert(groupChatMapping.entityToModel(chat, new GroupChatModel())) + .map(model -> groupChatMapping.modelToEntity(model, chat)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Observable> observeGroupChat(long chatId) { + return data().select(GroupChatModel.class) + .where(GroupChatModel.ID.eq(chatId)) + .get().observableResult() + .map(result -> new Optional<>( + groupChatMapping.modelToEntity(result.firstOrNull(), new IGroupChat()))) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Maybe getGroupChat(long chatId) { + return data().select(GroupChatModel.class) + .where(GroupChatModel.ID.eq(chatId)) + .get().maybe() + .map(model -> groupChatMapping.modelToEntity(model, new IGroupChat())) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Observable> observeGroupChatByRoomAddress(String roomAddress) { + return data().select(GroupChatModel.class) + .where(GroupChatModel.ADDRESS.eq(roomAddress)) + .get().observableResult() + .map(result -> new Optional<>( + groupChatMapping.modelToEntity(result.firstOrNull(), new IGroupChat()))) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Maybe getGroupChatByRoomAddress(String roomAddress) { + return data().select(GroupChatModel.class) + .where(GroupChatModel.ADDRESS.eq(roomAddress)) + .get().maybe() + .map(model -> groupChatMapping.modelToEntity(model, new IGroupChat())) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Observable> observeAllGroupChats() { + return data().select(GroupChatModel.class) + .get().observableResult() + .map(ResultDelegate::toList) + .map(list -> { + List entities = new ArrayList<>(list.size()); + for (GroupChatModel model : list) { + entities.add(groupChatMapping.modelToEntity(model, new IGroupChat())); + } + return entities; + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Single updateGroupChat(GroupChat chat) { + return data().select(GroupChatModel.class) + .where(GroupChatModel.ID.eq(chat.getId())) + .get().maybe().toSingle() // to single + .map(model -> { + // copy changes from entity to the model + model = groupChatMapping.entityToModel(chat, model); + // write the updated model back + model = data().update(model).blockingGet(); + return groupChatMapping.modelToEntity(model, chat); + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Single upsertGroupChat(GroupChat chat) { + // Try to fetch model + return data().select(GroupChatModel.class) + .where(GroupChatModel.ID.eq(chat.getId())) + .get().maybe() + // If it does not exist, create a new model from the entity + .switchIfEmpty(data().insert(groupChatMapping.entityToModel(chat, new GroupChatModel()))) + // finally + .map(model -> { + // update the model + model = groupChatMapping.entityToModel(chat, model); + // write the updated model back + model = data().update(model).blockingGet(); + return groupChatMapping.modelToEntity(model, chat); + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Completable deleteGroupChat(GroupChat chat) { + return data().delete(GroupChatModel.class) + .where(GroupChatModel.ID.eq(chat.getId())) + .get().single().ignoreElement() + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Single insertMessage(GroupChat chat, Message message) { + return null; + } + + @Override + public Observable> observeMessages(GroupChat chat) { + return null; + } + + @Override + public Single updateMessage(Message message) { + return null; + } + + @Override + public Single upsertMessage(GroupChat chat, Message message) { + return null; + } + + @Override + public Completable deleteMessage(Message message) { + return null; + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index 6cfaeb7..5b04a74 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -20,9 +20,9 @@ public interface DirectChatRepository { Maybe getDirectChat(long chatId); - Observable> observeDirectChatByInterlocutor(Peer peer); + Observable> observeDirectChatByPeer(Peer peer); - Maybe getDirectChatByInterlocutor(Peer peer); + Maybe getDirectChatByPeer(Peer peer); Observable> observeAllDirectChats(); From 855d1be3fd17332f8deb5328e37d10e0d096f99a Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 21:25:37 +0100 Subject: [PATCH 20/83] Make message relations abstract --- .../messenger/data/model/AbstractDirectMessagesRelation.java | 2 +- .../messenger/data/model/AbstractGroupMessagesRelation.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java index 5a6cc3d..a754d1b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectMessagesRelation.java @@ -10,7 +10,7 @@ import io.requery.Table; @Entity @Table(name = "direct_messages") -public class AbstractDirectMessagesRelation { +public abstract class AbstractDirectMessagesRelation { @Key @Generated long id; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java index 802e711..944e080 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupMessagesRelation.java @@ -10,7 +10,7 @@ import io.requery.Table; @Entity @Table(name = "group_messages") -public class AbstractGroupMessagesRelation { +public abstract class AbstractGroupMessagesRelation { @Key @Generated long id; From a07f12d63b6d417704fed762bf8309fb6ad6482e Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 21:26:02 +0100 Subject: [PATCH 21/83] Add dagger named annotations to RequeryRepository base class --- .../messenger/data/repository/RequeryRepository.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/RequeryRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/RequeryRepository.java index 1e93c3f..8b814b2 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/RequeryRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/RequeryRepository.java @@ -1,5 +1,9 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.util.ThreadUtils; + +import javax.inject.Named; + import io.reactivex.Scheduler; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; @@ -12,8 +16,8 @@ public abstract class RequeryRepository { private final ReactiveEntityStore data; protected RequeryRepository(ReactiveEntityStore data, - Scheduler subscriberScheduler, - Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { this.data = data; this.subscriberScheduler = subscriberScheduler; this.observerScheduler = observerScheduler; From 7a216fed9d94ef5cf23fc930ab287e609a235f01 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 23:13:25 +0100 Subject: [PATCH 22/83] Map message payload/content --- .../messenger/data/di/MappingModule.java | 45 ++++++++++++-- .../data/enums/MessageContentType.java | 8 +++ .../data/mapping/ContactMapping.java | 10 ++- .../data/mapping/MessageContentMapping.java | 45 ++++++++++++++ .../data/mapping/MessageMapping.java | 52 ++++++++++++++++ .../data/mapping/MessagePayloadMapping.java | 62 +++++++++++++++++++ .../model/AbstractMessageContentModel.java | 27 ++++++++ .../data/model/AbstractMessageModel.java | 13 ++-- .../model/AbstractMessagePayloadModel.java | 24 +++++++ .../entity/message/IMessagePayload.java | 11 ++++ .../entity/message/MessagePayload.java | 4 ++ .../message/content/MessageContent.java | 4 ++ .../message/content/TextMessageContent.java | 11 ++++ 13 files changed, 303 insertions(+), 13 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/enums/MessageContentType.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/MessageContentMapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageContentModel.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadModel.java diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java index a865f3d..4c949b9 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java @@ -1,7 +1,12 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.mapping.AccountMapping; +import org.mercury_im.messenger.data.mapping.ContactMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; +import org.mercury_im.messenger.data.mapping.GroupChatMapping; +import org.mercury_im.messenger.data.mapping.MessageContentMapping; +import org.mercury_im.messenger.data.mapping.MessageMapping; +import org.mercury_im.messenger.data.mapping.MessagePayloadMapping; import org.mercury_im.messenger.data.mapping.PeerMapping; import javax.inject.Singleton; @@ -14,19 +19,49 @@ public class MappingModule { @Provides @Singleton - public static AccountMapping accountMapping() { + static AccountMapping provideAccountMapping() { return new AccountMapping(); } @Provides @Singleton - public static PeerMapping peerMapping() { - return new PeerMapping(accountMapping()); + static PeerMapping providePeerMapping() { + return new PeerMapping(provideAccountMapping()); } @Provides @Singleton - public static DirectChatMapping directChatMapping() { - return new DirectChatMapping(peerMapping()); + static ContactMapping provideContactMapping() { + return new ContactMapping(provideAccountMapping()); + } + + @Provides + @Singleton + static DirectChatMapping provideDirectChatMapping() { + return new DirectChatMapping(providePeerMapping()); + } + + @Provides + @Singleton + static GroupChatMapping provideGroupChatMapping() { + return new GroupChatMapping(provideAccountMapping()); + } + + @Provides + @Singleton + static MessageMapping provideMessageMapping() { + return new MessageMapping(provideMessagePayloadMapping()); + } + + @Provides + @Singleton + static MessagePayloadMapping provideMessagePayloadMapping() { + return new MessagePayloadMapping(provideMessageContentMapping()); + } + + @Provides + @Singleton + static MessageContentMapping provideMessageContentMapping() { + return new MessageContentMapping(); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/enums/MessageContentType.java b/data/src/main/java/org/mercury_im/messenger/data/enums/MessageContentType.java new file mode 100644 index 0000000..19367eb --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/enums/MessageContentType.java @@ -0,0 +1,8 @@ +package org.mercury_im.messenger.data.enums; + +public enum MessageContentType { + /** + * Content is a message body. + */ + body +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java index e8de5f2..d9acd1b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java @@ -3,8 +3,17 @@ package org.mercury_im.messenger.data.mapping; import org.mercury_im.messenger.data.model.ContactModel; import org.mercury_im.messenger.entity.contact.Contact; +import javax.inject.Inject; + public class ContactMapping implements Mapping { + private final AccountMapping accountMapping; + + @Inject + public ContactMapping(AccountMapping accountMapping) { + this.accountMapping = accountMapping; + } + @Override public ContactModel entityToModel(Contact entity, ContactModel model) { if (entity == null) { @@ -13,7 +22,6 @@ public class ContactMapping implements Mapping { if (model == null) { model = new ContactModel(); } - return null; } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageContentMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageContentMapping.java new file mode 100644 index 0000000..d56af7f --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageContentMapping.java @@ -0,0 +1,45 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.enums.MessageContentType; +import org.mercury_im.messenger.data.model.MessageContentModel; +import org.mercury_im.messenger.entity.message.content.MessageContent; +import org.mercury_im.messenger.entity.message.content.TextMessageContent; + +import static org.mercury_im.messenger.data.enums.MessageContentType.body; + +public class MessageContentMapping implements Mapping { + + @Override + public MessageContentModel entityToModel(MessageContent entity, MessageContentModel model) { + if (entity == null) { + return null; + } + if (model == null) { + model = new MessageContentModel(); + } + + if (entity instanceof TextMessageContent) { + model.setType(body); + model.setBody(((TextMessageContent) entity).getBody()); + } + // else if (...) + return model; + } + + @Override + public MessageContent modelToEntity(MessageContentModel model, MessageContent entity) { + if (model == null) { + model = new MessageContentModel(); + } + switch (model.getType()) { + case body: + if (entity == null) { + TextMessageContent body = new TextMessageContent(); + body.setId(model.getId()); + body.setBody(model.getBody()); + entity = body; + } + } + return entity; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java new file mode 100644 index 0000000..c69089a --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java @@ -0,0 +1,52 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.model.MessageModel; +import org.mercury_im.messenger.data.model.MessagePayloadModel; +import org.mercury_im.messenger.entity.message.IMessage; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.entity.message.MessagePayload; + +import javax.inject.Inject; + +public class MessageMapping implements Mapping { + + private final MessagePayloadMapping messagePayloadMapping; + + @Inject + public MessageMapping(MessagePayloadMapping messagePayloadMapping) { + this.messagePayloadMapping = messagePayloadMapping; + } + + @Override + public MessageModel entityToModel(Message entity, MessageModel model) { + if (entity == null) { + return null; + } + if (model == null) { + model = new MessageModel(); + } + model.setSender(entity.getSender()); + model.setRecipient(entity.getRecipient()); + model.setTimestamp(entity.getTimestamp()); + + model.getPayloads().clear(); + for (MessagePayload payload : entity.getMessagePayloads()) { + MessagePayloadModel payloadModel = messagePayloadMapping.entityToModel(payload, new MessagePayloadModel()); + payloadModel.setMessage(model); + model.getPayloads().add(payloadModel); + } + + return model; + } + + @Override + public Message modelToEntity(MessageModel model, Message entity) { + if (model == null) { + return null; + } + if (entity == null) { + entity = new IMessage(); + } + return null; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java new file mode 100644 index 0000000..32cac4a --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java @@ -0,0 +1,62 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.model.MessageContentModel; +import org.mercury_im.messenger.data.model.MessagePayloadModel; +import org.mercury_im.messenger.entity.message.IMessagePayload; +import org.mercury_im.messenger.entity.message.MessagePayload; +import org.mercury_im.messenger.entity.message.content.MessageContent; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +public class MessagePayloadMapping implements Mapping { + + private final MessageContentMapping messageContentMapping; + + @Inject + public MessagePayloadMapping(MessageContentMapping messageContentMapping) { + this.messageContentMapping = messageContentMapping; + } + + @Override + public MessagePayloadModel entityToModel(MessagePayload entity, MessagePayloadModel model) { + if (entity == null) { + return null; + } + if (model == null) { + model = new MessagePayloadModel(); + } + + model.getContents().clear(); + for (MessageContent contentEntity : entity.getMessageContents()) { + MessageContentModel contentModel = messageContentMapping.entityToModel(contentEntity, new MessageContentModel()); + contentModel.setPayload(model); + model.getContents().add(contentModel); + } + + return model; + } + + @Override + public MessagePayload modelToEntity(MessagePayloadModel model, MessagePayload entity) { + if (model == null) { + return null; + } + if (entity == null) { + entity = new IMessagePayload(); + } + + entity.setId(model.getId()); + + List contents = new ArrayList<>(model.getContents().size()); + for (MessageContentModel contentModel : model.getContents()) { + MessageContent contentEntity = messageContentMapping.modelToEntity(contentModel, null); + contents.add(contentEntity); + } + entity.setMessageContents(contents); + + return entity; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageContentModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageContentModel.java new file mode 100644 index 0000000..2f48e26 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageContentModel.java @@ -0,0 +1,27 @@ +package org.mercury_im.messenger.data.model; + +import org.mercury_im.messenger.data.enums.MessageContentType; + +import io.requery.Column; +import io.requery.Entity; +import io.requery.Generated; +import io.requery.Key; +import io.requery.ManyToOne; +import io.requery.Table; + +@Entity +@Table(name = "message_contents") +public abstract class AbstractMessageContentModel { + + @Key @Generated + long id; + + @ManyToOne + MessagePayloadModel payload; + + @Column + String body; + + @Column(nullable = false) + MessageContentType type; +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index d9de44f..b8e495d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -1,11 +1,13 @@ package org.mercury_im.messenger.data.model; import java.util.Date; +import java.util.Set; import io.requery.Column; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; +import io.requery.OneToMany; import io.requery.Persistable; import io.requery.Table; @@ -16,20 +18,17 @@ public abstract class AbstractMessageModel implements Persistable { @Key @Generated long id; - String body; - - @Column(name = "\"timestamp\"", nullable = false) - Date timestamp; - @Column(nullable = false) String sender; @Column(nullable = false) String recipient; - boolean incoming; + @Column(name = "\"timestamp\"", nullable = false) + Date timestamp; - String thread; + @OneToMany + Set payloads; @Column(nullable = false) String legacyId; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadModel.java new file mode 100644 index 0000000..e1ad512 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadModel.java @@ -0,0 +1,24 @@ +package org.mercury_im.messenger.data.model; + +import java.util.Set; + +import io.requery.Entity; +import io.requery.Generated; +import io.requery.Key; +import io.requery.ManyToOne; +import io.requery.OneToMany; +import io.requery.Table; + +@Entity +@Table(name = "message_payloads") +public abstract class AbstractMessagePayloadModel { + + @Key @Generated + long id; + + @ManyToOne + MessageModel message; + + @OneToMany + Set contents; +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java index d2321bb..677616a 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java @@ -6,8 +6,19 @@ import java.util.List; public class IMessagePayload implements MessagePayload { + protected long id; protected List contents; + @Override + public long getId() { + return id; + } + + @Override + public void setId(long id) { + this.id = id; + } + @Override public List getMessageContents() { return contents; diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java index 886a00c..d2263b8 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java @@ -13,6 +13,10 @@ import java.util.List; */ public interface MessagePayload { + long getId(); + + void setId(long id); + List getMessageContents(); void setMessageContents(List messageContents); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java index c6bce51..7502077 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java @@ -2,6 +2,10 @@ package org.mercury_im.messenger.entity.message.content; public interface MessageContent { + long getId(); + + void setId(long id); + interface Body extends MessageContent { String getBody(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java index 7177b60..ba09517 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java @@ -2,8 +2,19 @@ package org.mercury_im.messenger.entity.message.content; public class TextMessageContent implements MessageContent.Body { + private long id; private String body; + @Override + public long getId() { + return id; + } + + @Override + public void setId(long id) { + this.id = id; + } + @Override public String getBody() { return body; From 4b951dcb7592189337104056d98fa733acccee19 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 23:13:35 +0100 Subject: [PATCH 23/83] Add package-info documentation --- .../messenger/data/mapping/package-info.java | 11 +++++++++++ .../messenger/data/model/package-info.java | 12 ++++++++++++ .../messenger/data/repository/package-info.java | 11 +++++++++++ 3 files changed, 34 insertions(+) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/package-info.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/package-info.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/package-info.java diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/package-info.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/package-info.java new file mode 100644 index 0000000..83aa1c8 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/package-info.java @@ -0,0 +1,11 @@ +/** + * The mapping package contains mapper classes that map database models to entities. + * The models can be found in {@link org.mercury_im.messenger.data.model} in this module, + * while the entity classes are located in the
entity
module. + * + * The mapper classes define an architectural boundary that separates the entities from + * their database model counterparts. This is done in order to keep the database logic separated + * from the domain logic and to allow for quick replacement of the database implementation. + * + */ +package org.mercury_im.messenger.data.mapping; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/package-info.java b/data/src/main/java/org/mercury_im/messenger/data/model/package-info.java new file mode 100644 index 0000000..77cc9dd --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/model/package-info.java @@ -0,0 +1,12 @@ +/** + * The model package contains requery model definitions. + * All of those classes are abstract, since the requery framework generates concrete implementations + * during compilation. Those files can later be found in + *
build/generated/sources/annotationProcessor/java/main/...
. + * + * The structure of the model classes closely mimics the structure of their entity pendants + * declared in the
entity
module. + * + * @see
requery wiki on model definitions + */ +package org.mercury_im.messenger.data.model; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/package-info.java b/data/src/main/java/org/mercury_im/messenger/data/repository/package-info.java new file mode 100644 index 0000000..3dfd22e --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/package-info.java @@ -0,0 +1,11 @@ +/** + * The repository package contains implementations of the repositories defined in the domain + * module. + * + * While the data module uses requery to store data in an SQL database, the repositories use + * mappers defined in the mapping package to map the requery models to entities. + * + * Since the application itself only ever uses entities, it doesn't have to know about the database + * at all. + */ +package org.mercury_im.messenger.data.repository; From 3cb2d797240f44348ff81371f29a2cc3e77f7a3d Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 1 Dec 2019 23:21:07 +0100 Subject: [PATCH 24/83] Update readme --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0dc92bf..21b4cd4 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,11 @@ ## Used Design Methods: -* The app is developed using the MVVM (Model View Viewmodel) pattern using LifeCycle aware ViewModels -* Components are wired together using Dependency Injection (DI) with Dagger 2 -* Data is persisted using Googles Room database library -* UI is notified by updates to the data through the use of LiveData +* Mercury IM's development follows architectural principles know from +[Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html). +* The app is developed using the MVVM (Model View Viewmodel) pattern +* Components are wired together using Dependency Injection (DI) with [Dagger 2](https://dagger.dev) +* Data is persisted using [requery](https://github.com/requery/requery) ## Building @@ -20,5 +21,5 @@ gradle assembleDebug * I want to develop, but lots of `org.jivesoftware.smackx.*` classes cannot be found! * You forgot to type `git submodule init && git submodule update` as mentioned above -* I'm missing `org.mercury_im.messenger.persistence.requery.*` classes??? - * In Android Studio select the `persistence-requery` module and then click "Build -> Make Module 'persistence-requery'". \ No newline at end of file +* It looks like I'm missing `org.mercury_im.messenger.data.*` classes??? + * In Android Studio select the `data` module and then click "Build -> Make Module 'data'". \ No newline at end of file From d4de49e25b6f61c09ee16e768b6fa4e717556ed6 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Dec 2019 00:37:35 +0100 Subject: [PATCH 25/83] Remove Contact classes in favor of extended Peer logic --- .../messenger/ui/chat/ChatViewModel.java | 4 +- .../contacts/ContactListItemViewModel.java | 4 +- .../roster/contacts/ContactListViewModel.java | 4 +- .../messenger/data/di/MappingModule.java | 7 -- .../messenger/data/di/RepositoryModule.java | 8 +- .../data/mapping/ContactMapping.java | 32 -------- .../messenger/data/mapping/PeerMapping.java | 75 +++++++++++++++++++ .../data/model/AbstractContactModel.java | 45 ----------- .../data/model/AbstractPeerModel.java | 19 ++++- .../repository/XmppContactRepository.java | 75 ------------------- .../data/repository/XmppPeerRepository.java | 75 +++++++++++++++++++ .../repository/AccountRepositoryTest.java | 2 +- .../org/mercury_im/messenger/DataStore.java | 22 ++++++ .../org/mercury_im/messenger/Messenger.java | 1 - .../data/repository/ContactRepository.java | 32 -------- .../data/repository/PeerRepository.java | 32 ++++++++ .../messenger/entity/contact/Contact.java | 40 ---------- .../messenger/entity/contact/IContact.java | 62 --------------- .../messenger/entity/contact/IPeer.java | 17 +++++ .../messenger/entity/contact/Peer.java | 6 ++ .../entity/contact/SubscriptionMode.java | 52 +++++++++++++ .../domain/xmpp/XmppDirectMessageCenter.java | 22 +++++- 22 files changed, 327 insertions(+), 309 deletions(-) delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/DataStore.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 45f2851..17066fe 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -11,7 +11,7 @@ import org.mercury_im.messenger.xmpp.model.ChatModel; import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.xmpp.model.EntityModel; import org.mercury_im.messenger.xmpp.model.MessageModel; -import org.mercury_im.messenger.data.repository.XmppContactRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; import java.util.List; @@ -29,7 +29,7 @@ public class ChatViewModel extends ViewModel { MessageRepository messageRepository; @Inject - XmppContactRepository xmppContactRepository; + XmppPeerRepository xmppContactRepository; @Inject ChatRepository chatRepository; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java index 73f9e88..baa12ad 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java @@ -7,14 +7,14 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.data.repository.XmppContactRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; import javax.inject.Inject; public class ContactListItemViewModel extends AndroidViewModel { @Inject - XmppContactRepository contactRepository; + XmppPeerRepository contactRepository; private LiveData contact; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index 9192f04..1c04349 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -8,7 +8,7 @@ import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.data.repository.XmppContactRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; import java.util.List; @@ -22,7 +22,7 @@ import io.reactivex.schedulers.Schedulers; public class ContactListViewModel extends ViewModel { @Inject - XmppContactRepository xmppContactRepository; + XmppPeerRepository xmppContactRepository; private final MutableLiveData> rosterEntryList = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java index 4c949b9..c9086b1 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java @@ -1,7 +1,6 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.mapping.AccountMapping; -import org.mercury_im.messenger.data.mapping.ContactMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.mapping.MessageContentMapping; @@ -29,12 +28,6 @@ public class MappingModule { return new PeerMapping(provideAccountMapping()); } - @Provides - @Singleton - static ContactMapping provideContactMapping() { - return new ContactMapping(provideAccountMapping()); - } - @Provides @Singleton static DirectChatMapping provideDirectChatMapping() { diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index fb55e72..fbd9572 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -1,12 +1,12 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.repository.AccountRepository; -import org.mercury_im.messenger.data.repository.ContactRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; import org.mercury_im.messenger.data.repository.EntityCapsRepository; import org.mercury_im.messenger.data.repository.XmppAccountRepository; import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; -import org.mercury_im.messenger.data.repository.XmppContactRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; import org.mercury_im.messenger.util.ThreadUtils; import javax.inject.Named; @@ -50,10 +50,10 @@ public class RepositoryModule { @Provides @Singleton - public static ContactRepository provideRosterRepository( + public static PeerRepository provideRosterRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppContactRepository(data, ioScheduler, uiScheduler); + return new XmppPeerRepository(data, ioScheduler, uiScheduler); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java deleted file mode 100644 index d9acd1b..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/ContactMapping.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.mercury_im.messenger.data.mapping; - -import org.mercury_im.messenger.data.model.ContactModel; -import org.mercury_im.messenger.entity.contact.Contact; - -import javax.inject.Inject; - -public class ContactMapping implements Mapping { - - private final AccountMapping accountMapping; - - @Inject - public ContactMapping(AccountMapping accountMapping) { - this.accountMapping = accountMapping; - } - - @Override - public ContactModel entityToModel(Contact entity, ContactModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new ContactModel(); - } - return null; - } - - @Override - public Contact modelToEntity(ContactModel model, Contact entity) { - return null; - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java index 8118a84..b25bcdd 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -1,5 +1,6 @@ package org.mercury_im.messenger.data.mapping; +import org.mercury_im.messenger.data.enums.SubscriptionDirection; import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; @@ -25,6 +26,10 @@ public class PeerMapping implements Mapping { } model.setAccount(accountMapping.entityToModel(entity.getAccount(), model.getAccount())); model.setAddress(entity.getAddress()); + model.setName(entity.getName()); + + // TODO: sub direction + return model; } @@ -39,6 +44,76 @@ public class PeerMapping implements Mapping { entity.setAccount(accountMapping.modelToEntity(model.getAccount(), entity.getAccount())); entity.setAddress(model.getAddress()); entity.setId(model.getId()); + + // TODO: Sub direction return entity; } + + private void setSubscriptionDirectionInModel(PeerModel model, Peer entity) { + switch (entity.getSubscriptionMode()) { + case NONE: + model.setSubscriptionDirection(SubscriptionDirection.none); + model.setSubscriptionPreApproved(false); + model.setSubscriptionPending(false); + break; + + case NONE_PREAPPROVED: + model.setSubscriptionDirection(SubscriptionDirection.none); + model.setSubscriptionPreApproved(true); + model.setSubscriptionPending(false); + break; + + case TO_THEM_PENDING: + model.setSubscriptionDirection(SubscriptionDirection.to); + model.setSubscriptionPending(true); + model.setSubscriptionPreApproved(false); + break; + case TO_THEM_PENDING_PREAPPROVED: + model.setSubscriptionDirection(SubscriptionDirection.to); + model.setSubscriptionPending(true); + model.setSubscriptionPreApproved(true); + break; + case TO_THEM_ACCEPTED: + model.setSubscriptionDirection(SubscriptionDirection.to); + model.setSubscriptionPending(false); + model.setSubscriptionPreApproved(false); + break; + case TO_THEM_ACCEPTED_PREAPPROVED: + model.setSubscriptionDirection(SubscriptionDirection.to); + model.setSubscriptionPending(false); + model.setSubscriptionPreApproved(true); + break; + case FROM_THEM_PENDING: + model.setSubscriptionDirection(SubscriptionDirection.from); + model.setSubscriptionPending(true); + model.setSubscriptionPreApproved(false); + break; + case FROM_THEM_ACCEPTED: + model.setSubscriptionDirection(SubscriptionDirection.from); + model.setSubscriptionPending(false); + model.setSubscriptionPreApproved(false); + break; + case BIDIRECTIONAL: + model.setSubscriptionDirection(SubscriptionDirection.both); + model.setSubscriptionPending(false); + model.setSubscriptionPreApproved(false); + break; + } + } + + private void setSubscriptionDirectionInEntity(Peer entity, PeerModel model) { + + switch (model.getSubscriptionDirection()) { + case none: + break; + case to: + break; + case from: + break; + case both: + break; + case remove: + break; + } + } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java deleted file mode 100644 index 352350d..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractContactModel.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.mercury_im.messenger.data.model; - -import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; -import org.mercury_im.messenger.data.enums.SubscriptionDirection; - -import io.requery.Convert; -import io.requery.Entity; -import io.requery.ForeignKey; -import io.requery.Generated; -import io.requery.Key; -import io.requery.OneToOne; -import io.requery.Persistable; -import io.requery.Table; - -@Entity -@Table(name = "contacts") -public abstract class AbstractContactModel implements Persistable { - - @Key - @Generated - long id; - - @OneToOne - @ForeignKey(referencedColumn = "id") - PeerModel entity; - - String rostername; - - @Convert(SubscriptionDirectionConverter.class) - SubscriptionDirection sub_direction; - - boolean sub_pending; - - boolean sub_approved; - - @Override - public String toString() { - return "Contact[" + id + ", " + - rostername + ", " + - entity + ", " + - sub_direction + ", " + - (sub_pending ? "pending" : "not pending") + ", " + - (sub_approved ? "approved" : "not approved") + "]"; - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index b445601..12b82fb 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -1,6 +1,10 @@ package org.mercury_im.messenger.data.model; +import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; +import org.mercury_im.messenger.data.enums.SubscriptionDirection; + import io.requery.Column; +import io.requery.Convert; import io.requery.Entity; import io.requery.ForeignKey; import io.requery.Generated; @@ -10,7 +14,7 @@ import io.requery.Persistable; import io.requery.Table; @Entity -@Table(name = "peers") +@Table(name = "contacts") public abstract class AbstractPeerModel implements Persistable { @Key @Generated @@ -23,9 +27,20 @@ public abstract class AbstractPeerModel implements Persistable { @Column(nullable = false) String address; + @Column + String name; + + @Convert(SubscriptionDirectionConverter.class) + SubscriptionDirection subscriptionDirection; + + boolean subscriptionPending; + + boolean subscriptionPreApproved; + @Override public String toString() { - return "Entity[" + id + ", " + + return "Peer[" + id + ", " + + name + ", " + address + ", " + account + "]"; } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java deleted file mode 100644 index 8bf876b..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppContactRepository.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.mercury_im.messenger.data.repository; - -import org.mercury_im.messenger.data.util.Optional; -import org.mercury_im.messenger.entity.contact.Contact; -import org.mercury_im.messenger.util.ThreadUtils; - -import java.util.List; - -import javax.inject.Inject; -import javax.inject.Named; - -import io.reactivex.Completable; -import io.reactivex.Maybe; -import io.reactivex.Observable; -import io.reactivex.Scheduler; -import io.reactivex.Single; -import io.requery.Persistable; -import io.requery.reactivex.ReactiveEntityStore; - -public class XmppContactRepository - extends RequeryRepository - implements ContactRepository { - - @Inject - public XmppContactRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { - super(data, subscriberScheduler, observerScheduler); - } - - @Override - public Single insertContact(Contact contact) { - return null; - } - - @Override - public Observable> observeContact(long contactId) { - return null; - } - - @Override - public Maybe getContact(long contactId) { - return null; - } - - @Override - public Observable> observeContactByAddress(String address) { - return null; - } - - @Override - public Maybe getContactByAddress(String address) { - return null; - } - - @Override - public Observable> observeAllContacts() { - return null; - } - - @Override - public Single updateContact(Contact contact) { - return null; - } - - @Override - public Single upsertContact(Contact contact) { - return null; - } - - @Override - public Completable deleteContact(Contact contact) { - return null; - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java new file mode 100644 index 0000000..cae0e87 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -0,0 +1,75 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.util.ThreadUtils; + +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +public class XmppPeerRepository + extends RequeryRepository + implements PeerRepository { + + @Inject + public XmppPeerRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + super(data, subscriberScheduler, observerScheduler); + } + + @Override + public Single insertPeer(Peer contact) { + return null; + } + + @Override + public Observable> observePeer(long contactId) { + return null; + } + + @Override + public Maybe getPeer(long contactId) { + return null; + } + + @Override + public Observable> observePeerByAddress(String address) { + return null; + } + + @Override + public Maybe getPeerByAddress(String address) { + return null; + } + + @Override + public Observable> observeAllPeers() { + return null; + } + + @Override + public Single updatePeer(Peer contact) { + return null; + } + + @Override + public Single upsertPeer(Peer contact) { + return null; + } + + @Override + public Completable deletePeer(Peer contact) { + return null; + } +} diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 3747d35..8611389 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -30,7 +30,7 @@ public class AccountRepositoryTest { XmppDirectChatRepository directChatRepository; @Inject - XmppContactRepository contactRepository; + XmppPeerRepository contactRepository; @Inject public AccountRepositoryTest() { diff --git a/domain/src/main/java/org/mercury_im/messenger/DataStore.java b/domain/src/main/java/org/mercury_im/messenger/DataStore.java new file mode 100644 index 0000000..9a1bd6f --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/DataStore.java @@ -0,0 +1,22 @@ +package org.mercury_im.messenger; + +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.Peer; + +import javax.inject.Inject; + +public class DataStore { + + @Inject + PeerRepository peerRepository; + + @Inject + public DataStore() { + + } + + public Peer getPeer(Account account, String address) { + return null; + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index a6753e7..427a156 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -17,5 +17,4 @@ public class Messenger { public ConnectionMethod getConnection(Account account) { return connections.get(account.getId()); } - } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java deleted file mode 100644 index 9681eeb..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/ContactRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.mercury_im.messenger.data.repository; - -import org.mercury_im.messenger.entity.contact.Contact; -import org.mercury_im.messenger.data.util.Optional; - -import java.util.List; - -import io.reactivex.Completable; -import io.reactivex.Maybe; -import io.reactivex.Observable; -import io.reactivex.Single; - -public interface ContactRepository { - - Single insertContact(Contact contact); - - Observable> observeContact(long contactId); - - Maybe getContact(long contactId); - - Observable> observeContactByAddress(String address); - - Maybe getContactByAddress(String address); - - Observable> observeAllContacts(); - - Single updateContact(Contact contact); - - Single upsertContact(Contact contact); - - Completable deleteContact(Contact contact); -} diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java new file mode 100644 index 0000000..7d422e3 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java @@ -0,0 +1,32 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.data.util.Optional; + +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; +import io.reactivex.Single; + +public interface PeerRepository { + + Single insertPeer(Peer Peer); + + Observable> observePeer(long PeerId); + + Maybe getPeer(long PeerId); + + Observable> observePeerByAddress(String address); + + Maybe getPeerByAddress(String address); + + Observable> observeAllPeers(); + + Single updatePeer(Peer Peer); + + Single upsertPeer(Peer Peer); + + Completable deletePeer(Peer Peer); +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java deleted file mode 100644 index 86968b8..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Contact.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.mercury_im.messenger.entity.contact; - -public interface Contact extends Peer { - - SubscriptionMode getSubscriptionMode(); - - void setSubscriptionMode(SubscriptionMode mode); - - enum SubscriptionMode { - /** - * No subscription between us an them. - */ - NONE, - - /** - * We sent a subscription request, which is now pending to be accepted. - */ - TO_THEM_PENDING, - - /** - * We sent a subscription request and they accepted it. - */ - TO_THEM_ACCEPTED, - - /** - * They sent us a subscription request, but we did not yet accept it. - */ - FROM_THEM_PENDING, - - /** - * They sent us a subscription request and we accepted it. - */ - FROM_THEM_ACCEPTED, - - /** - * They accepted us and we accepted them. - */ - BIDIRECTIONAL - } -} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java deleted file mode 100644 index 6f9c449..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IContact.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.mercury_im.messenger.entity.contact; - -import org.mercury_im.messenger.entity.Account; - -public class IContact implements Contact { - - protected long id; - protected Account account; - protected String address; - protected String name; - protected SubscriptionMode subscriptionMode; - - @Override - public SubscriptionMode getSubscriptionMode() { - return subscriptionMode; - } - - @Override - public void setSubscriptionMode(SubscriptionMode mode) { - this.subscriptionMode = mode; - } - - @Override - public long getId() { - return id; - } - - @Override - public void setId(long id) { - this.id = id; - } - - @Override - public Account getAccount() { - return account; - } - - @Override - public void setAccount(Account account) { - this.account = account; - } - - @Override - public String getAddress() { - return address; - } - - @Override - public void setAddress(String address) { - this.address = address; - } - - @Override - public String getName() { - return name; - } - - @Override - public void setName(String name) { - this.name = name; - } -} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java index 389236a..f461042 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java @@ -8,6 +8,7 @@ public class IPeer implements Peer { protected Account account; protected String address; protected String name; + protected SubscriptionMode subscriptionMode; @Override public long getId() { @@ -48,4 +49,20 @@ public class IPeer implements Peer { public void setName(String name) { this.name = name; } + + @Override + public SubscriptionMode getSubscriptionMode() { + return subscriptionMode; + } + + @Override + public void setSubscriptionMode(SubscriptionMode mode) { + this.subscriptionMode = mode; + } + + @Override + public boolean isContact() { + return subscriptionMode != SubscriptionMode.NONE + && subscriptionMode != SubscriptionMode.FROM_THEM_PENDING; + } } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java index 1b1b7e7..c0ea28a 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java @@ -23,4 +23,10 @@ public interface Peer { String getName(); void setName(String name); + + SubscriptionMode getSubscriptionMode(); + + void setSubscriptionMode(SubscriptionMode mode); + + boolean isContact(); } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java new file mode 100644 index 0000000..9eb1f2c --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java @@ -0,0 +1,52 @@ +package org.mercury_im.messenger.entity.contact; + +public enum SubscriptionMode { + /** + * No subscription between us an them. + */ + NONE, + + /** + * No subscription between us and them. + * However, we pre-approved their subscription, should they decide to subscribe to us. + */ + NONE_PREAPPROVED, + + /** + * We sent a subscription request, which is now pending to be accepted. + * We do not pre-approve their subscription to us. + */ + TO_THEM_PENDING, + + /** + * We sent a subscription request, which is now pending to be accepted. + * Also, we pre-approved their subscription to us. + */ + TO_THEM_PENDING_PREAPPROVED, + + /** + * We sent a subscription request and they approved it. + */ + TO_THEM_ACCEPTED, + + /** + * We sent a subscription request and they approved it. + * Also, we pre-approved their subscription, should they decide to subscribe back. + */ + TO_THEM_ACCEPTED_PREAPPROVED, + + /** + * They sent us a subscription request, but we did not yet accept it. + */ + FROM_THEM_PENDING, + + /** + * They sent us a subscription request and we accepted it. + */ + FROM_THEM_ACCEPTED, + + /** + * They accepted us and we accepted them. + */ + BIDIRECTIONAL +} diff --git a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java index b0ecd30..abaa683 100644 --- a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java @@ -1,26 +1,44 @@ package org.mercury_im.messenger.domain.xmpp; +import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.chat2.Chat; import org.jivesoftware.smack.chat2.ChatManager; +import org.jivesoftware.smack.chat2.IncomingChatMessageListener; import org.jivesoftware.smackx.sid.element.OriginIdElement; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.MessageCenter; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.transport.xmpp.XmppTcpConnectionMethod; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + import io.reactivex.Completable; +import sun.reflect.generics.tree.Tree; public class XmppDirectMessageCenter implements MessageCenter { private final Messenger messenger; + private final Account account; - public XmppDirectMessageCenter(Messenger messenger) { + private Set messageListeners = new LinkedHashSet<>(); + + public XmppDirectMessageCenter(Account account, Messenger messenger) { this.messenger = messenger; + this.account = account; + XMPPConnection connection = ((XmppTcpConnectionMethod) getMessenger() + .getConnection(account)).getConnection(); + } @Override @@ -52,7 +70,7 @@ public class XmppDirectMessageCenter @Override public void addIncomingMessageListener(IncomingDirectMessageListener listener) { - + messageListeners.add(listener); } protected ChatManager getChatManager(DirectChat chat) { From 39da2174605f42a9e5ff25e58188746db2371f5f Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Dec 2019 02:25:48 +0100 Subject: [PATCH 26/83] Improve update/upsert methods of repos using flatmap --- .../data/repository/XmppAccountRepository.java | 14 ++++++-------- .../data/repository/XmppDirectChatRepository.java | 12 ++++++------ .../data/repository/XmppGroupChatRepository.java | 13 ++++++------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 0d4039b..274bcd8 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -109,13 +109,12 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(account.getId())) .get().maybe().toSingle() // to single - .map(model -> { + .flatMap(model -> { // copy changes from the entity to the model model = accountMapping.entityToModel(account, model); // write the updated model back - model = data().update(model).blockingGet(); - return accountMapping.modelToEntity(model, account); - }) + return data().update(model); + }).map(model -> accountMapping.modelToEntity(model, account)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -128,14 +127,13 @@ public class XmppAccountRepository .get().maybe() // If it does not exist, create a new model from the entity .switchIfEmpty(data().insert(accountMapping.entityToModel(account, new AccountModel()))) - // finally - .map(model -> { + .flatMap(model -> { // update the model model = accountMapping.entityToModel(account, model); // write the updated model back - model = data().update(model).blockingGet(); - return accountMapping.modelToEntity(model, account); + return data().update(model); }) + .map(model -> accountMapping.modelToEntity(model, account)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index ad3139f..825a066 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -120,11 +120,11 @@ public class XmppDirectChatRepository return data().select(DirectChatModel.class) .where(DirectChatModel.ID.eq(chat.getId())) .get().maybe().toSingle() - .map(model -> { + .flatMap(model -> { model = directChatMapping.entityToModel(chat, model); - model = data().update(model).blockingGet(); - return directChatMapping.modelToEntity(model, chat); + return data().update(model); }) + .map(model -> directChatMapping.modelToEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -135,11 +135,11 @@ public class XmppDirectChatRepository .where(DirectChatModel.ID.eq(chat.getId())) .get().maybe() .switchIfEmpty(data().insert(directChatMapping.entityToModel(chat, new DirectChatModel()))) - .map(model -> { + .flatMap(model -> { model = directChatMapping.entityToModel(chat, model); - model = data().update(model).blockingGet(); - return directChatMapping.modelToEntity(model, chat); + return data().update(model); }) + .map(model -> directChatMapping.modelToEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index dc81b16..f5b58a3 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -109,13 +109,13 @@ public class XmppGroupChatRepository return data().select(GroupChatModel.class) .where(GroupChatModel.ID.eq(chat.getId())) .get().maybe().toSingle() // to single - .map(model -> { + .flatMap(model -> { // copy changes from entity to the model model = groupChatMapping.entityToModel(chat, model); // write the updated model back - model = data().update(model).blockingGet(); - return groupChatMapping.modelToEntity(model, chat); + return data().update(model); }) + .map(model -> groupChatMapping.modelToEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -128,14 +128,13 @@ public class XmppGroupChatRepository .get().maybe() // If it does not exist, create a new model from the entity .switchIfEmpty(data().insert(groupChatMapping.entityToModel(chat, new GroupChatModel()))) - // finally - .map(model -> { + .flatMap(model -> { // update the model model = groupChatMapping.entityToModel(chat, model); // write the updated model back - model = data().update(model).blockingGet(); - return groupChatMapping.modelToEntity(model, chat); + return data().update(model); }) + .map(model -> groupChatMapping.modelToEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } From 8d7dd5687e3bf4ea6a8f960fafb3221ae05ae81f Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Dec 2019 02:27:32 +0100 Subject: [PATCH 27/83] Improve PeerRepository + impl --- .../data/repository/XmppPeerRepository.java | 120 +++++++++++++++--- .../data/repository/PeerRepository.java | 17 ++- 2 files changed, 117 insertions(+), 20 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index cae0e87..f054069 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -1,9 +1,14 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.data.mapping.PeerMapping; +import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.util.ThreadUtils; +import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -21,6 +26,9 @@ public class XmppPeerRepository extends RequeryRepository implements PeerRepository { + @Inject + PeerMapping peerMapping; + @Inject public XmppPeerRepository(ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, @@ -29,47 +37,125 @@ public class XmppPeerRepository } @Override - public Single insertPeer(Peer contact) { - return null; + public Single insertPeer(Peer peer) { + return data().insert(peerMapping.entityToModel(peer, new PeerModel())) + .map(model -> peerMapping.modelToEntity(model, peer)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override - public Observable> observePeer(long contactId) { - return null; + public Observable> observePeer(long peerId) { + return data().select(PeerModel.class) + .where(PeerModel.ID.eq(peerId)) + .get().observableResult() + .map(result -> new Optional<>(peerMapping.modelToEntity(result.firstOrNull(), new IPeer()))) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override - public Maybe getPeer(long contactId) { - return null; + public Maybe getPeer(long peerId) { + return data().select(PeerModel.class) + .where(PeerModel.ID.eq(peerId)) + .get().maybe() + .map(model -> peerMapping.modelToEntity(model, new IPeer())) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override - public Observable> observePeerByAddress(String address) { - return null; + public Observable> observePeerByAddress(long accountId, String address) { + return data().select(PeerModel.class) + .where(PeerModel.ACCOUNT_ID.eq(accountId)) + .and(PeerModel.ADDRESS.eq(address)) + .get().observableResult() + .map(result -> new Optional<>(peerMapping.modelToEntity(result.firstOrNull(), new IPeer()))) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override - public Maybe getPeerByAddress(String address) { - return null; + public Maybe getPeerByAddress(long accountId, String address) { + return data().select(PeerModel.class) + .where(PeerModel.ACCOUNT_ID.eq(accountId)) + .and(PeerModel.ADDRESS.eq(address)) + .get().maybe() + .map(model -> peerMapping.modelToEntity(model, new IPeer())) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Single getOrCreatePeer(Account _account, String _address) { + return getPeerByAddress(_account, _address) + .switchIfEmpty(insertPeer(new IPeer(){ + { + setAccount(_account); + setAddress(_address); + } + })) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> observeAllPeers() { - return null; + return data().select(PeerModel.class) + .get().observableResult() + .map(result -> { + List peerModels = result.toList(); + List peerEntities = new ArrayList<>(peerModels.size()); + for (PeerModel model : peerModels) { + peerEntities.add(peerMapping.modelToEntity(model, new IPeer())); + } + return peerEntities; + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override - public Single updatePeer(Peer contact) { - return null; + public Single updatePeer(Peer peer) { + // In order to update, we fetch the model, update it and write it back. + return data().select(PeerModel.class) + .where(PeerModel.ID.eq(peer.getId())) + .get().maybe().toSingle() + .flatMap(model -> { + // write changes into model + model = peerMapping.entityToModel(peer, model); + // write model back to db + return data().update(model); + }) + .map(model -> peerMapping.modelToEntity(model, peer)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override - public Single upsertPeer(Peer contact) { - return null; + public Single upsertPeer(Peer peer) { + return data().select(PeerModel.class) + .where(PeerModel.ID.eq(peer.getId())) + .get().maybe() + // if not exists, create + .switchIfEmpty(data().insert(peerMapping.entityToModel(peer, new PeerModel()))) + .flatMap(model -> { + // write changes into fetched model + model = peerMapping.entityToModel(peer, model); + // write changed model back to db + return data().update(model); + }) + .map(model -> peerMapping.modelToEntity(model, peer)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override - public Completable deletePeer(Peer contact) { - return null; + public Completable deletePeer(Peer peer) { + return data().delete(PeerModel.class) + .where(PeerModel.ID.eq(peer.getId())) + .get().single().ignoreElement() + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java index 7d422e3..57469b1 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java @@ -1,7 +1,8 @@ package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.Peer; import java.util.List; @@ -18,9 +19,19 @@ public interface PeerRepository { Maybe getPeer(long PeerId); - Observable> observePeerByAddress(String address); + default Observable> observePeerByAddress(Account account, String address) { + return observePeerByAddress(account.getId(), address); + } - Maybe getPeerByAddress(String address); + Observable> observePeerByAddress(long accountId, String address); + + default Maybe getPeerByAddress(Account account, String address) { + return getPeerByAddress(account.getId(), address); + } + + Maybe getPeerByAddress(long accountId, String address); + + Single getOrCreatePeer(Account account, String address); Observable> observeAllPeers(); From c5918efc8989b900fc786cf604839b3e66564d1d Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Dec 2019 02:29:50 +0100 Subject: [PATCH 28/83] Fix retreival method of GroupChatRepository to receive account as argument --- .../repository/XmppGroupChatRepository.java | 20 +++++++++++++++++-- .../data/repository/GroupChatRepository.java | 15 ++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index f5b58a3..d78ca5d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -3,6 +3,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.model.GroupChatModel; import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; import org.mercury_im.messenger.entity.chat.IGroupChat; import org.mercury_im.messenger.entity.message.Message; @@ -68,9 +69,23 @@ public class XmppGroupChatRepository } @Override - public Observable> observeGroupChatByRoomAddress(String roomAddress) { + public Single getOrCreateGroupChat(Account account, String roomAddress) { + return getGroupChatByRoomAddress(account, roomAddress) + .switchIfEmpty(insertGroupChat(new IGroupChat(){ + { + setAccount(account); + setRoomAddress(roomAddress); + } + })) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Observable> observeGroupChatByRoomAddress(long accountId, String roomAddress) { return data().select(GroupChatModel.class) .where(GroupChatModel.ADDRESS.eq(roomAddress)) + .and(GroupChatModel.ACCOUNT_ID.eq(accountId)) .get().observableResult() .map(result -> new Optional<>( groupChatMapping.modelToEntity(result.firstOrNull(), new IGroupChat()))) @@ -79,9 +94,10 @@ public class XmppGroupChatRepository } @Override - public Maybe getGroupChatByRoomAddress(String roomAddress) { + public Maybe getGroupChatByRoomAddress(long accountId, String roomAddress) { return data().select(GroupChatModel.class) .where(GroupChatModel.ADDRESS.eq(roomAddress)) + .and(GroupChatModel.ACCOUNT_ID.eq(accountId)) .get().maybe() .map(model -> groupChatMapping.modelToEntity(model, new IGroupChat())) .subscribeOn(subscriberScheduler()) diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java index 643c527..601edac 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java @@ -1,5 +1,6 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.data.util.Optional; @@ -19,9 +20,19 @@ public interface GroupChatRepository { Maybe getGroupChat(long chatId); - Observable> observeGroupChatByRoomAddress(String roomAddress); + Single getOrCreateGroupChat(Account account, String roomAddress); - Maybe getGroupChatByRoomAddress(String roomAddress); + default Observable> observeGroupChatByRoomAddress(Account account, String roomAddress) { + return observeGroupChatByRoomAddress(account.getId(), roomAddress); + } + + Observable> observeGroupChatByRoomAddress(long accountId, String roomAddress); + + default Maybe getGroupChatByRoomAddress(Account account, String roomAddress) { + return getGroupChatByRoomAddress(account.getId(), roomAddress); + } + + Maybe getGroupChatByRoomAddress(long accountId, String roomAddress); Observable> observeAllGroupChats(); From fd1e4ba22e12048d1e23573d531ef0c309337470 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Dec 2019 02:30:15 +0100 Subject: [PATCH 29/83] Add getOrCreate method to directChatRepo --- .../data/repository/XmppDirectChatRepository.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index 825a066..71e0ff0 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -78,6 +78,19 @@ public class XmppDirectChatRepository .observeOn(observerScheduler()); } + @Override + public Single getOrCreateChatWithPeer(Peer _peer) { + return getDirectChatByPeer(_peer) + .switchIfEmpty(insertDirectChat(new IDirectChat(){ + { + setAccount(_peer.getAccount()); + setPeer(_peer); + } + })) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + @Override public Observable> observeDirectChatByPeer(Peer peer) { return data().select(DirectChatModel.class) From f42fbda9d553b9ee5af6fc83239fd82b2503c1d5 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Dec 2019 02:31:03 +0100 Subject: [PATCH 30/83] Delete DataStore class --- .../org/mercury_im/messenger/DataStore.java | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 domain/src/main/java/org/mercury_im/messenger/DataStore.java diff --git a/domain/src/main/java/org/mercury_im/messenger/DataStore.java b/domain/src/main/java/org/mercury_im/messenger/DataStore.java deleted file mode 100644 index 9a1bd6f..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/DataStore.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.mercury_im.messenger; - -import org.mercury_im.messenger.data.repository.PeerRepository; -import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.entity.contact.Peer; - -import javax.inject.Inject; - -public class DataStore { - - @Inject - PeerRepository peerRepository; - - @Inject - public DataStore() { - - } - - public Peer getPeer(Account account, String address) { - return null; - } -} From c5bf492cda3e7704c3ca48b3c47fc37272737352 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 2 Dec 2019 02:31:32 +0100 Subject: [PATCH 31/83] Small changes and experiments --- .../org/mercury_im/messenger/Messenger.java | 16 ++++++++ .../data/repository/DirectChatRepository.java | 4 +- .../domain/xmpp/XmppDirectMessageCenter.java | 39 ++++++++++++++++++- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index 427a156..a3cb79d 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -1,15 +1,31 @@ package org.mercury_im.messenger; +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.transport.connection.ConnectionMethod; import org.mercury_im.messenger.entity.Account; import java.util.HashMap; import java.util.Map; +import javax.inject.Inject; + public class Messenger { private final Map connections = new HashMap<>(); + @Inject + AccountRepository accountRepository; + + @Inject + PeerRepository peerRepository; + + @Inject + public Messenger() { + + } + public void addConnection(ConnectionMethod connection) { connections.put(connection.getAccount().getId(), connection); } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index 5b04a74..8dbaaf2 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -1,9 +1,9 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.data.util.Optional; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.message.Message; -import org.mercury_im.messenger.data.util.Optional; import java.util.List; @@ -20,6 +20,8 @@ public interface DirectChatRepository { Maybe getDirectChat(long chatId); + Single getOrCreateChatWithPeer(Peer peer); + Observable> observeDirectChatByPeer(Peer peer); Maybe getDirectChatByPeer(Peer peer); diff --git a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java index abaa683..4ff920c 100644 --- a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java @@ -8,8 +8,12 @@ import org.jivesoftware.smackx.sid.element.OriginIdElement; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.DirectChatRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.message.IMessage; import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.MessageCenter; @@ -22,23 +26,41 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; +import javax.inject.Inject; + import io.reactivex.Completable; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; import sun.reflect.generics.tree.Tree; public class XmppDirectMessageCenter - implements MessageCenter { + implements MessageCenter, IncomingChatMessageListener { + + @Inject + PeerRepository peerRepository; + + @Inject + AccountRepository accountRepository; + + @Inject + DirectChatRepository directChatRepository; private final Messenger messenger; private final Account account; + private final CompositeDisposable disposable = new CompositeDisposable(); + private Set messageListeners = new LinkedHashSet<>(); + @Inject public XmppDirectMessageCenter(Account account, Messenger messenger) { this.messenger = messenger; this.account = account; + XMPPConnection connection = ((XmppTcpConnectionMethod) getMessenger() .getConnection(account)).getConnection(); + ChatManager.getInstanceFor(connection).addIncomingListener(this); } @Override @@ -77,4 +99,19 @@ public class XmppDirectMessageCenter XmppTcpConnectionMethod connectionMethod = (XmppTcpConnectionMethod) getMessenger().getConnection(chat.getAccount()); return ChatManager.getInstanceFor(connectionMethod.getConnection()); } + + @Override + public void newIncomingMessage(EntityBareJid from, org.jivesoftware.smack.packet.Message message, Chat chat) { + disposable.add(peerRepository + // get peer + .getOrCreatePeer(account, from.asEntityBareJidString()) + // get chat + .flatMap(peer -> directChatRepository.getOrCreateChatWithPeer(peer)) + // notify listeners + .subscribe(chatEntity -> { + for (IncomingDirectMessageListener listener : messageListeners) { + listener.onIncomingDirectMessage(account, chatEntity, new IMessage()); + } + })); + } } From c2b1d794b74e785025662b7dce2280a64dfd55ae Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 6 Dec 2019 15:52:50 +0100 Subject: [PATCH 32/83] Make the code compile again. --- app/build.gradle | 1 + .../messenger/MercuryImApplication.java | 5 +- .../mercury_im/messenger/Notifications.java | 6 +- .../messenger/di/component/AppComponent.java | 11 ++++ .../di/module/AndroidPersistenceModule.java | 2 +- .../mercury_im/messenger/ui/MainActivity.java | 8 +-- .../messenger/ui/chat/ChatActivity.java | 27 ++------ .../messenger/ui/chat/ChatViewModel.java | 64 +++++++++---------- .../ui/chat/MessagesRecyclerViewAdapter.java | 57 +++++++++-------- .../chatlist/ChatListRecyclerViewAdapter.java | 20 +++--- .../ui/chatlist/ChatListViewModel.java | 16 ++--- .../messenger/ui/login/AccountsFragment.java | 6 +- .../ui/login/AccountsRecyclerViewAdapter.java | 28 ++++---- .../messenger/ui/login/AccountsViewModel.java | 26 ++++---- .../messenger/ui/login/LoginActivity.java | 16 ++--- .../messenger/ui/login/LoginViewModel.java | 43 ++++++------- .../roster/contacts/ContactListFragment.java | 1 - .../contacts/ContactListItemViewModel.java | 8 +-- .../ContactListRecyclerViewAdapter.java | 33 +++++----- .../roster/contacts/ContactListViewModel.java | 15 ++--- .../ui/util/AbstractRecyclerViewAdapter.java | 2 +- .../messenger/data/di/RepositoryModule.java | 2 +- .../data/repository/XmppPeerRepository.java | 9 +++ .../data/repository/PeerRepository.java | 6 ++ .../di/component/MessengerComponent.java | 14 ---- 25 files changed, 205 insertions(+), 221 deletions(-) delete mode 100644 domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java diff --git a/app/build.gradle b/app/build.gradle index d2781f6..998f4a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,6 +73,7 @@ check.configure { dependencies { // Depend on the core project for XMPP related stuff + implementation project(":entity") implementation project(":domain") implementation project(":data") diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index a50bc02..8953c9b 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -9,7 +9,9 @@ import android.content.Context; import android.content.Intent; import android.os.Build; +import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.component.AppComponent; +import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; import org.mercury_im.messenger.service.XmppConnectionService; import org.mercury_im.messenger.util.AbstractActivityLifecycleCallbacks; @@ -24,7 +26,7 @@ public class MercuryImApplication extends Application { static { // Initialize Smack etc. - new MercuryConfiguration(); + // new MercuryConfiguration(); } private static MercuryImApplication INSTANCE; @@ -70,6 +72,7 @@ public class MercuryImApplication extends Application { public AppComponent createAppComponent() { AppComponent appComponent = DaggerAppComponent.builder() .appModule(new AppModule(this)) + .repositoryModule(new RepositoryModule()) .build(); appComponent.inject(this); diff --git a/app/src/main/java/org/mercury_im/messenger/Notifications.java b/app/src/main/java/org/mercury_im/messenger/Notifications.java index bdab127..51f99ff 100644 --- a/app/src/main/java/org/mercury_im/messenger/Notifications.java +++ b/app/src/main/java/org/mercury_im/messenger/Notifications.java @@ -7,7 +7,7 @@ import android.content.Intent; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; -import org.mercury_im.messenger.entity.chat.Chat; +import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.ui.chat.ChatActivity; public class Notifications { @@ -20,13 +20,13 @@ public class Notifications { // Notification IDs public static final int FOREGROUND_SERVICE_ID = 1; // must not be 0 - public static int chatMessageReceived(Context context, Chat chat, String contactName, String body) { + public static int directChatMessageReceived(Context context, DirectChat chat, String contactName, String body) { NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); int id = (int) chat.getId(); Intent tapAction = new Intent(context, ChatActivity.class); tapAction.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - tapAction.putExtra(ChatActivity.EXTRA_JID, chat.getPeer().getJid().toString()); + tapAction.putExtra(ChatActivity.EXTRA_JID, chat.getPeer().getAddress()); tapAction.putExtra(ChatActivity.EXTRA_ACCOUNT, chat.getPeer().getAccount().getId()); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, tapAction, 0); diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index c1a4b62..f7eda00 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -1,6 +1,7 @@ package org.mercury_im.messenger.di.component; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.di.module.AppModule; import org.mercury_im.messenger.service.XmppConnectionService; @@ -31,6 +32,16 @@ import dagger.Component; }) public interface AppComponent { + @Component.Builder + interface Builder { + + AppComponent build(); + + Builder appModule(AppModule appModule); + + Builder repositoryModule(RepositoryModule module); + } + // Application void inject(MercuryImApplication mercuryImApplication); diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java index a306090..0ea8b80 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java @@ -2,9 +2,9 @@ package org.mercury_im.messenger.di.module; import android.app.Application; +import org.mercury_im.messenger.data.model.Models; import org.mercury_im.messenger.util.ThreadUtils; import org.mercury_im.messenger.BuildConfig; -import org.mercury_im.messenger.xmpp.model.Models; import javax.inject.Named; import javax.inject.Singleton; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index a974333..6b0d4db 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -16,6 +16,7 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; import org.mercury_im.messenger.ui.login.AccountsFragment; import org.mercury_im.messenger.ui.roster.RosterFragment; @@ -30,9 +31,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, AccountsFragment.OnAccountListItemClickListener { - @Inject - ChatRepository chatRepository; - @BindView(R.id.toolbar) Toolbar toolbar; @@ -97,12 +95,12 @@ public class MainActivity extends AppCompatActivity } @Override - public void onAccountListItemClick(AccountModel item) { + public void onAccountListItemClick(Account item) { } @Override - public void onAccountListItemLongClick(AccountModel item) { + public void onAccountListItemLongClick(Account item) { } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java index b53b524..9d3d934 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java @@ -14,25 +14,15 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import butterknife.BindView; -import butterknife.ButterKnife; - -import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.schedulers.Schedulers; - -import org.jivesoftware.smack.SmackException; -import org.jivesoftware.smack.chat2.ChatManager; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; - import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.core.centers.ConnectionCenter; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.inject.Inject; +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; public class ChatActivity extends AppCompatActivity implements ChatInputFragment.OnChatInputActionListener, SearchView.OnQueryTextListener { @@ -40,18 +30,12 @@ public class ChatActivity extends AppCompatActivity public static final String EXTRA_JID = "JID"; public static final String EXTRA_ACCOUNT = "ACCOUNT"; - @Inject - ConnectionCenter connectionCenter; - @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.recyclerView) RecyclerView recyclerView; - @Inject - ChatRepository chatRepository; - private final MessagesRecyclerViewAdapter recyclerViewAdapter = new MessagesRecyclerViewAdapter(); private ChatViewModel chatViewModel; @@ -186,6 +170,7 @@ public class ChatActivity extends AppCompatActivity return; } + /* // TODO: Improve by using rx new Thread() { @Override @@ -200,6 +185,8 @@ public class ChatActivity extends AppCompatActivity } } }.start(); + + */ } @Override diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 17066fe..677aae7 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -6,12 +6,11 @@ import androidx.lifecycle.ViewModel; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.xmpp.model.ChatModel; -import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.xmpp.model.EntityModel; -import org.mercury_im.messenger.xmpp.model.MessageModel; -import org.mercury_im.messenger.data.repository.XmppPeerRepository; +import org.mercury_im.messenger.data.repository.DirectChatRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.message.Message; import java.util.List; @@ -26,22 +25,15 @@ public class ChatViewModel extends ViewModel { private final CompositeDisposable disposable = new CompositeDisposable(); @Inject - MessageRepository messageRepository; + PeerRepository contactRepository; @Inject - XmppPeerRepository xmppContactRepository; + DirectChatRepository chatRepository; - @Inject - ChatRepository chatRepository; - - @Inject - ConnectionCenter connectionCenter; - - private MutableLiveData entity = new MutableLiveData<>(); - private MutableLiveData contact = new MutableLiveData<>(); - private MutableLiveData> messages = new MutableLiveData<>(); + private MutableLiveData contact = new MutableLiveData<>(); + private MutableLiveData> messages = new MutableLiveData<>(); private MutableLiveData contactDisplayName = new MutableLiveData<>(); - private MutableLiveData chat = new MutableLiveData<>(); + private MutableLiveData chat = new MutableLiveData<>(); public ChatViewModel() { super(); @@ -49,24 +41,25 @@ public class ChatViewModel extends ViewModel { } public void init(long accountId, EntityBareJid jid) { - disposable.add(xmppContactRepository.getOrCreateEntity(accountId, jid) - .subscribe((Consumer) this::init)); + disposable.add(contactRepository.getOrCreatePeer(accountId, jid.toString()) + .subscribe((Consumer) this::init)); } - public void init(EntityModel entityModel) { + public void init(Peer peer) { + disposable.add(chatRepository.getOrCreateChatWithPeer(peer) + .subscribe((Consumer) this::init)); + } - disposable.add(xmppContactRepository.getContact(entityModel.getAccount().getId(), entityModel.getJid()) - .subscribe(reactiveResult -> { - ContactModel model = reactiveResult.first(); - ChatViewModel.this.contact.setValue(model); - contactDisplayName.setValue(model.getRostername()); - })); + public void init(DirectChat chat) { + this.chat.setValue(chat); - disposable.add(messageRepository.getAllMessagesOfEntity(entityModel) - .subscribe(reactiveResult -> { - List messages = reactiveResult.toList(); - ChatViewModel.this.messages.setValue(messages); - })); + // Subscribe peer + disposable.add(contactRepository.observePeer(chat.getPeer().getId()) + .subscribe(peer -> contactDisplayName.setValue(peer.getItem().getName()))); + + // Subscribe messages + disposable.add(chatRepository.observeMessages(chat) + .subscribe(ChatViewModel.this.messages::setValue)); } @Override @@ -75,11 +68,11 @@ public class ChatViewModel extends ViewModel { disposable.clear(); } - public LiveData> getMessages() { + public LiveData> getMessages() { return messages; } - public LiveData getContact() { + public LiveData getContact() { return contact; } @@ -107,6 +100,7 @@ public class ChatViewModel extends ViewModel { } public Completable requestMamMessages() { + /* return Completable.fromAction(() -> { ChatModel chatModel = ChatViewModel.this.chat.getValue(); if (chatModel == null) { @@ -115,5 +109,7 @@ public class ChatViewModel extends ViewModel { connectionCenter.requestMamMessagesFor(chatModel); }); + */ + return null; } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java index 67536f9..3f80d73 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java @@ -10,7 +10,8 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.MessageModel; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.entity.message.content.TextMessageContent; import org.mercury_im.messenger.ui.util.MessageBackgroundDrawable; import java.util.ArrayList; @@ -18,14 +19,14 @@ import java.util.List; public class MessagesRecyclerViewAdapter extends RecyclerView.Adapter { - private List messages = new ArrayList<>(); + private List messages = new ArrayList<>(); private SparseArray checkedItems = new SparseArray<>(); public MessagesRecyclerViewAdapter() { } - public void updateMessages(List messages) { + public void updateMessages(List messages) { this.messages.clear(); this.messages.addAll(messages); notifyDataSetChanged(); @@ -47,24 +48,24 @@ public class MessagesRecyclerViewAdapter extends RecyclerView.Adapter { + extends AbstractRecyclerViewAdapter { public ChatListRecyclerViewAdapter() { super(new ChatMessageDiffCallback(true)); @@ -41,15 +41,15 @@ public class ChatListRecyclerViewAdapter @Override public void onBindViewHolder(@NonNull ChatHolder holder, int position) { - ChatModel model = getModelAt(position); - holder.nameView.setText(model.getPeer().getJid() != null ? - model.getPeer().getJid() : model.toString()); - holder.avatarView.setColorFilter(ColorUtil.consistentColor(model.getPeer().getJid().toString())); + DirectChat model = getItemAt(position); + holder.nameView.setText(model.getPeer().getAddress() != null ? + model.getPeer().getAddress() : model.toString()); + holder.avatarView.setColorFilter(ColorUtil.consistentColor(model.getPeer().getAddress())); holder.itemView.setOnClickListener(view -> { Intent intent = new Intent(holder.context, ChatActivity.class); - intent.putExtra(ChatActivity.EXTRA_JID, model.getPeer().getJid().toString()); + intent.putExtra(ChatActivity.EXTRA_JID, model.getPeer().getAddress()); intent.putExtra(ChatActivity.EXTRA_ACCOUNT, model.getPeer().getAccount().getId()); holder.context.startActivity(intent); @@ -84,19 +84,19 @@ public class ChatListRecyclerViewAdapter } } - private static class ChatMessageDiffCallback extends AbstractDiffCallback { + private static class ChatMessageDiffCallback extends AbstractDiffCallback { ChatMessageDiffCallback(boolean detectMoves) { super(detectMoves); } @Override - public boolean areItemsTheSame(ChatModel oldItem, ChatModel newItem) { + public boolean areItemsTheSame(DirectChat oldItem, DirectChat newItem) { return oldItem.getId() == newItem.getId(); } @Override - public boolean areContentsTheSame(ChatModel oldItem, ChatModel newItem) { + public boolean areContentsTheSame(DirectChat oldItem, DirectChat newItem) { return areItemsTheSame(oldItem, newItem); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java index f9df7d8..ce13c2e 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java @@ -5,7 +5,8 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.data.repository.DirectChatRepository; +import org.mercury_im.messenger.entity.chat.DirectChat; import java.util.List; @@ -16,23 +17,20 @@ import io.reactivex.disposables.CompositeDisposable; public class ChatListViewModel extends ViewModel { @Inject - ChatRepository chatRepository; - - @Inject - MessageRepository messageRepository; + DirectChatRepository chatRepository; private CompositeDisposable disposable = new CompositeDisposable(); - private final MutableLiveData> chats = new MutableLiveData<>(); + private final MutableLiveData> chats = new MutableLiveData<>(); public ChatListViewModel() { MercuryImApplication.getApplication().getAppComponent().inject(this); - disposable.add(chatRepository.getVisibleChats() - .subscribe(result -> chats.setValue(result.toList()))); + disposable.add(chatRepository.observeAllDirectChats() + .subscribe(chats::setValue)); } - public LiveData> getChats() { + public LiveData> getChats() { return chats; } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java index 9440ae8..094bae9 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java @@ -17,7 +17,7 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.entity.Account; import butterknife.BindView; import butterknife.ButterKnife; @@ -109,8 +109,8 @@ public class AccountsFragment extends Fragment { * >Communicating with Other Fragments for more information. */ public interface OnAccountListItemClickListener { - void onAccountListItemClick(AccountModel item); + void onAccountListItemClick(Account item); - void onAccountListItemLongClick(AccountModel item); + void onAccountListItemLongClick(Account item); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java index deba1d2..564494e 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java @@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.login.AccountsFragment.OnAccountListItemClickListener; import org.mercury_im.messenger.util.AbstractDiffCallback; import org.mercury_im.messenger.util.ColorUtil; @@ -23,7 +23,7 @@ import java.util.List; public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - private final List mValues; + private final List mValues; private final OnAccountListItemClickListener mListener; private final AccountsViewModel viewModel; @@ -42,11 +42,11 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { viewModel.toggleAccountEnabled(account); }); @@ -54,18 +54,18 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { if (null != mListener) { - mListener.onAccountListItemLongClick(holder.accountModel); + mListener.onAccountListItemLongClick(holder.account); } return true; }); } - public void setValues(List values) { + public void setValues(List values) { DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AccountsDiffCallback(values, mValues), true); mValues.clear(); mValues.addAll(values); @@ -79,7 +79,7 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { + public class AccountsDiffCallback extends AbstractDiffCallback { - public AccountsDiffCallback(List newItems, List oldItems) { + public AccountsDiffCallback(List newItems, List oldItems) { super(newItems, oldItems); } @@ -109,8 +109,8 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter> accounts = new MutableLiveData<>(); + private final MutableLiveData> accounts = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); @Inject public AccountsViewModel(Application application) { super(application); MercuryImApplication.getApplication().getAppComponent().inject(this); - compositeDisposable.add(repository.getAll() - .subscribe(accountModels -> accounts.setValue(accountModels.toList()))); + compositeDisposable.add(repository.observeAllAccounts() + .subscribe(accounts::setValue)); } @Override @@ -44,19 +38,21 @@ public class AccountsViewModel extends AndroidViewModel { compositeDisposable.clear(); } - public LiveData> getAccounts() { + public LiveData> getAccounts() { return accounts; } - public void toggleAccountEnabled(AccountModel accountModel) { + public void toggleAccountEnabled(Account accountModel) { + /* MercuryConnection connection = connectionCenter.getConnection(accountModel); if (connection == null) { Toast.makeText(this.getApplication(), "MercuryConnection is null!", Toast.LENGTH_LONG).show(); return; } + */ accountModel.setEnabled(!accountModel.isEnabled()); - repository.upsert(accountModel) + repository.upsertAccount(accountModel) .subscribe(); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index 54a0bab..1a1f98d 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -15,7 +15,7 @@ import com.google.android.material.textfield.TextInputEditText; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.util.TextChangedListener; import butterknife.BindView; @@ -121,18 +121,18 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito }); } - private void displayCredentials(LiveData account) { - account.observe(this, accountModel -> { - if (accountModel == null) { + private void displayCredentials(LiveData account) { + account.observe(this, accountEvent -> { + if (accountEvent == null) { return; } - if (accountModel.getAddress() != null) { - mJidView.setText(accountModel.getAddress()); + if (accountEvent.getAddress() != null) { + mJidView.setText(accountEvent.getAddress()); } - if (accountModel.getPassword() != null) { - mPasswordView.setText(accountModel.getPassword()); + if (accountEvent.getAuthentication() != null) { + mPasswordView.setText(accountEvent.getAuthentication().getPassword()); } }); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index 115a101..27decc0 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -1,7 +1,5 @@ package org.mercury_im.messenger.ui.login; -import static org.mercury_im.messenger.core.connection.MercuryConnection.TAG; - import android.text.TextUtils; import android.util.Log; @@ -16,9 +14,10 @@ import io.reactivex.observers.DisposableSingleObserver; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.IAccount; +import org.mercury_im.messenger.entity.PasswordAuthentication; import javax.inject.Inject; @@ -27,8 +26,8 @@ public class LoginViewModel extends ViewModel { @Inject AccountRepository accountRepository; - @Inject - ConnectionCenter connectionCenter; + // @Inject + // ConnectionCenter connectionCenter; private String jid; private String password; @@ -36,14 +35,14 @@ public class LoginViewModel extends ViewModel { private MutableLiveData jidError = new MutableLiveData<>(); private MutableLiveData passwordError = new MutableLiveData<>(); - private MutableLiveData account = new MutableLiveData<>(); + private MutableLiveData account = new MutableLiveData<>(); private MutableLiveData signinSuccessful = new MutableLiveData<>(); public LoginViewModel() { super(); MercuryImApplication.getApplication().getAppComponent().inject(this); - init(new AccountModel()); + init(new IAccount()); } public LiveData getSigninSuccessful() { @@ -95,18 +94,18 @@ public class LoginViewModel extends ViewModel { return !password.isEmpty(); } - public void init(@NonNull AccountModel account) { + public void init(@NonNull Account account) { this.account.setValue(account); } - public MutableLiveData getAccount() { + public MutableLiveData getAccount() { return account; } public void login() { - AccountModel account = getAccount().getValue(); - if (account != null && account.getJid() != null && !TextUtils.isEmpty(account.getPassword())) { - accountRepository.upsert(account); + Account account = getAccount().getValue(); + if (account != null && account.getAddress() != null && !TextUtils.isEmpty(account.getAuthentication().getPassword())) { + accountRepository.upsertAccount(account); } } @@ -129,22 +128,22 @@ public class LoginViewModel extends ViewModel { } if (loginIntact) { - AccountModel accountModel = new AccountModel(); - accountModel.setEnabled(true); - accountModel.setJid(bareJid); - accountModel.setPassword(password); - Single insert = accountRepository.upsert(accountModel); - insert.subscribe(new DisposableSingleObserver() { + Account account = new IAccount(); + account.setEnabled(true); + account.setAddress(bareJid.toString()); + account.setAuthentication(new PasswordAuthentication(password)); + Single insert = accountRepository.upsertAccount(account); + insert.subscribe(new DisposableSingleObserver() { @Override - public void onSuccess(AccountModel inserted) { + public void onSuccess(Account inserted) { Log.d(MercuryImApplication.TAG, "LoginActivity.loginDetailsEntered: Account " + inserted.getId() + " inserted."); - connectionCenter.createConnection(accountModel); + // connectionCenter.createConnection(account); signinSuccessful.setValue(true); } @Override public void onError(Throwable e) { - Log.e(TAG, "Could not insert new Account data.", e); + Log.e("Mercury", "Could not insert new Account data.", e); } }); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java index 8115d00..d12eece 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java @@ -12,7 +12,6 @@ import android.widget.Toast; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; -import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java index baa12ad..ea26a71 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java @@ -6,17 +6,17 @@ import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; -import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.data.repository.XmppPeerRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.contact.Peer; import javax.inject.Inject; public class ContactListItemViewModel extends AndroidViewModel { @Inject - XmppPeerRepository contactRepository; + PeerRepository contactRepository; - private LiveData contact; + private LiveData contact; @Inject public ContactListItemViewModel(@NonNull Application application) { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java index 352e9ab..f6d075c 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java @@ -11,9 +11,8 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.ContactModel; +import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter; import org.mercury_im.messenger.util.ColorUtil; @@ -24,7 +23,7 @@ import butterknife.BindView; import butterknife.ButterKnife; public class ContactListRecyclerViewAdapter - extends AbstractRecyclerViewAdapter { + extends AbstractRecyclerViewAdapter { public ContactListRecyclerViewAdapter() { super(new ContactDiffCallback()); @@ -39,8 +38,8 @@ public class ContactListRecyclerViewAdapter @Override public void onBindViewHolder(@NonNull RosterItemViewHolder holder, int position) { - ContactModel model = getModelAt(position); - holder.bind(model); + Peer peer = getItemAt(position); + holder.bind(peer); } public class RosterItemViewHolder extends RecyclerView.ViewHolder { @@ -65,38 +64,38 @@ public class ContactListRecyclerViewAdapter ButterKnife.bind(this, view); } - void bind(ContactModel contactModel) { - String name = contactModel.getRostername(); - nameView.setText(name != null ? name : contactModel.getEntity().getJid().getLocalpart().asUnescapedString()); - EntityBareJid jid = contactModel.getEntity().getJid(); - jidView.setText(jid.toString()); - avatarView.setColorFilter(ColorUtil.consistentColor(jid.toString())); + void bind(Peer contact) { + String name = contact.getName(); + String address = contact.getAddress(); + nameView.setText(name != null ? name : address); + jidView.setText(address); + avatarView.setColorFilter(ColorUtil.consistentColor(address)); view.setOnClickListener(view -> { Intent intent = new Intent(context, ChatActivity.class); - intent.putExtra(ChatActivity.EXTRA_JID, jid.toString()); - intent.putExtra(ChatActivity.EXTRA_ACCOUNT, contactModel.getEntity().getAccount().getId()); + intent.putExtra(ChatActivity.EXTRA_JID, address); + intent.putExtra(ChatActivity.EXTRA_ACCOUNT, contact.getAccount().getId()); context.startActivity(intent); }); } } - private static class ContactDiffCallback extends AbstractDiffCallback { + private static class ContactDiffCallback extends AbstractDiffCallback { ContactDiffCallback() { super(true); } @Override - public boolean areItemsTheSame(ContactModel oldItem, ContactModel newItem) { + public boolean areItemsTheSame(Peer oldItem, Peer newItem) { return oldItem.getId() == newItem.getId(); } @Override - public boolean areContentsTheSame(ContactModel oldItem, ContactModel newItem) { + public boolean areContentsTheSame(Peer oldItem, Peer newItem) { return areItemsTheSame(oldItem, newItem) && - Objects.equals(oldItem.getRostername(), newItem.getRostername()); + Objects.equals(oldItem.getName(), newItem.getName()); } } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index 1c04349..5f4904d 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -7,16 +7,14 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.data.repository.XmppPeerRepository; +import org.mercury_im.messenger.entity.contact.Peer; import java.util.List; import javax.inject.Inject; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.schedulers.Schedulers; public class ContactListViewModel extends ViewModel { @@ -24,7 +22,7 @@ public class ContactListViewModel extends ViewModel { @Inject XmppPeerRepository xmppContactRepository; - private final MutableLiveData> rosterEntryList = new MutableLiveData<>(); + private final MutableLiveData> rosterEntryList = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); public ContactListViewModel() { @@ -32,11 +30,8 @@ public class ContactListViewModel extends ViewModel { MercuryImApplication.getApplication().getAppComponent().inject(this); Log.d("ContactListViewModel", "Start observing database"); // Subscribe to changes to the contacts table and update the LiveData object for the UI. - compositeDisposable.add(xmppContactRepository.getAllContacts() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(o -> { - List list = o.toList(); + compositeDisposable.add(xmppContactRepository.observeAllPeers() + .subscribe(list -> { Log.d("ContactListViewModel", "Room changed contacts: " + list.size()); rosterEntryList.setValue(list); })); @@ -48,7 +43,7 @@ public class ContactListViewModel extends ViewModel { compositeDisposable.clear(); } - public LiveData> getRosterEntryList() { + public LiveData> getRosterEntryList() { return rosterEntryList; } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java index 2b23247..8301ff9 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java @@ -27,7 +27,7 @@ public abstract class AbstractRecyclerViewAdapter getOrCreatePeer(long accountId, String address) { + return accountRepository.getAccount(accountId).toSingle() + .flatMap(account -> getOrCreatePeer(account, address)); + } + @Override public Maybe getPeerByAddress(long accountId, String address) { return data().select(PeerModel.class) diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java index 57469b1..8e081e0 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java @@ -15,6 +15,10 @@ public interface PeerRepository { Single insertPeer(Peer Peer); + default Observable> observePeer(Peer peer) { + return observePeer(peer.getId()); + } + Observable> observePeer(long PeerId); Maybe getPeer(long PeerId); @@ -33,6 +37,8 @@ public interface PeerRepository { Single getOrCreatePeer(Account account, String address); + Single getOrCreatePeer(long accountId, String address); + Observable> observeAllPeers(); Single updatePeer(Peer Peer); diff --git a/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java b/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java deleted file mode 100644 index e06803d..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.mercury_im.messenger.di.component; - -import org.mercury_im.messenger.Messenger; - -import javax.inject.Singleton; - -import dagger.Component; - -@Singleton -@Component -public interface MessengerComponent { - - void inject(Messenger messenger); -} From 40a14abe028602f87275d02d6b645200a7caa646 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 6 Dec 2019 20:25:33 +0100 Subject: [PATCH 33/83] Fix NPEs in repositories --- .../messenger/MercuryImApplication.java | 2 +- .../messenger/di/component/AppComponent.java | 14 ++---- .../data/di/RepositoryComponent.java | 23 +++++++++ .../messenger/data/di/RepositoryModule.java | 49 ++++++++++++++----- .../repository/XmppAccountRepository.java | 7 +-- .../repository/XmppDirectChatRepository.java | 17 ++++--- .../repository/XmppGroupChatRepository.java | 7 +-- .../data/repository/XmppPeerRepository.java | 7 +-- .../data/di/RepositoryTestComponent.java | 1 - .../repository/AccountRepositoryTest.java | 2 + .../data/repository/DirectChatRepository.java | 4 ++ 11 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index 8953c9b..d560b1b 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -9,6 +9,7 @@ import android.content.Context; import android.content.Intent; import android.os.Build; +import org.mercury_im.messenger.data.di.MappingModule; import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; @@ -72,7 +73,6 @@ public class MercuryImApplication extends Application { public AppComponent createAppComponent() { AppComponent appComponent = DaggerAppComponent.builder() .appModule(new AppModule(this)) - .repositoryModule(new RepositoryModule()) .build(); appComponent.inject(this); diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index f7eda00..84ff078 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -1,6 +1,7 @@ package org.mercury_im.messenger.di.component; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.data.di.MappingModule; import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.di.module.AppModule; @@ -28,20 +29,11 @@ import dagger.Component; @Component( modules = { AppModule.class, - AndroidPersistenceModule.class + AndroidPersistenceModule.class, + RepositoryModule.class }) public interface AppComponent { - @Component.Builder - interface Builder { - - AppComponent build(); - - Builder appModule(AppModule appModule); - - Builder repositoryModule(RepositoryModule module); - } - // Application void inject(MercuryImApplication mercuryImApplication); diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java new file mode 100644 index 0000000..0f7264c --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java @@ -0,0 +1,23 @@ +package org.mercury_im.messenger.data.di; + +import org.mercury_im.messenger.data.repository.XmppAccountRepository; +import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; +import org.mercury_im.messenger.data.repository.XmppGroupChatRepository; +import org.mercury_im.messenger.data.repository.XmppPeerRepository; + +import dagger.Component; + +@Component(modules = { + RepositoryModule.class +}) +public interface RepositoryComponent { + + void inject(XmppAccountRepository accountRepository); + + void inject(XmppPeerRepository peerRepository); + + void inject(XmppDirectChatRepository directChatRepository); + + void inject(XmppGroupChatRepository groupChatRepository); + +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index 84368ed..4a83441 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -1,11 +1,17 @@ package org.mercury_im.messenger.data.di; +import org.mercury_im.messenger.data.mapping.AccountMapping; +import org.mercury_im.messenger.data.mapping.DirectChatMapping; +import org.mercury_im.messenger.data.mapping.GroupChatMapping; +import org.mercury_im.messenger.data.mapping.PeerMapping; import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.GroupChatRepository; import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; import org.mercury_im.messenger.data.repository.EntityCapsRepository; import org.mercury_im.messenger.data.repository.XmppAccountRepository; import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; +import org.mercury_im.messenger.data.repository.XmppGroupChatRepository; import org.mercury_im.messenger.data.repository.XmppPeerRepository; import org.mercury_im.messenger.util.ThreadUtils; @@ -26,17 +32,41 @@ public class RepositoryModule { public static AccountRepository provideAccountRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppAccountRepository(data, ioScheduler, uiScheduler); + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + AccountMapping accountMapping) { + return new XmppAccountRepository(data, ioScheduler, uiScheduler, accountMapping); } @Provides @Singleton - public static DirectChatRepository provideChatRepository( + public static PeerRepository providePeerRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppDirectChatRepository(data, ioScheduler, uiScheduler); + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + PeerMapping peerMapping) { + return new XmppPeerRepository(data, ioScheduler, uiScheduler, peerMapping); + } + + @Provides + @Singleton + public static DirectChatRepository provideDirectChatRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + AccountMapping accountMapping, + PeerMapping peerMapping, + DirectChatMapping directChatMapping) { + return new XmppDirectChatRepository(data, ioScheduler, uiScheduler, accountMapping, peerMapping, directChatMapping); + } + + @Provides + @Singleton + public static GroupChatRepository provideGroupChatRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + GroupChatMapping groupChatMapping) { + return new XmppGroupChatRepository(data, ioScheduler, uiScheduler, groupChatMapping); } @Provides @@ -48,12 +78,5 @@ public class RepositoryModule { return new EntityCapsRepository(data, ioScheduler, uiScheduler); } - @Provides - @Singleton - public static PeerRepository provideRosterRepository( - ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppPeerRepository(data, ioScheduler, uiScheduler); - } + } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 274bcd8..dc988ba 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -26,14 +26,15 @@ public class XmppAccountRepository extends RequeryRepository implements AccountRepository { - @Inject - AccountMapping accountMapping; + private final AccountMapping accountMapping; @Inject public XmppAccountRepository(ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + AccountMapping accountMapping) { super(data, subscriberScheduler, observerScheduler); + this.accountMapping = accountMapping; } @Override diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index 71e0ff0..4e2b1c2 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -30,21 +30,24 @@ public class XmppDirectChatRepository extends RequeryRepository implements DirectChatRepository { - @Inject - AccountMapping accountMapping; + private final AccountMapping accountMapping; - @Inject - PeerMapping peerMapping; + private final PeerMapping peerMapping; - @Inject - DirectChatMapping directChatMapping; + private final DirectChatMapping directChatMapping; @Inject public XmppDirectChatRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + AccountMapping accountMapping, + PeerMapping peerMapping, + DirectChatMapping directChatMapping) { super(data, subscriberScheduler, observerScheduler); + this.accountMapping = accountMapping; + this.peerMapping = peerMapping; + this.directChatMapping = directChatMapping; } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index d78ca5d..516a0e1 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -28,15 +28,16 @@ public class XmppGroupChatRepository extends RequeryRepository implements GroupChatRepository { - @Inject - GroupChatMapping groupChatMapping; + private final GroupChatMapping groupChatMapping; @Inject public XmppGroupChatRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + GroupChatMapping groupChatMapping) { super(data, subscriberScheduler, observerScheduler); + this.groupChatMapping = groupChatMapping; } @Override diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index ce52c8a..ba539d9 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -29,14 +29,15 @@ public class XmppPeerRepository @Inject AccountRepository accountRepository; - @Inject - PeerMapping peerMapping; + private final PeerMapping peerMapping; @Inject public XmppPeerRepository(ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + PeerMapping peerMapping) { super(data, subscriberScheduler, observerScheduler); + this.peerMapping = peerMapping; } @Override diff --git a/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java b/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java index b40ee68..2fe90a9 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java +++ b/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java @@ -8,7 +8,6 @@ import dagger.Component; @Component(modules = { RepositoryModule.class, - MappingModule.class, TestDatabaseModule.class, TestingSchedulerModule.class }) diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 8611389..3180528 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -61,5 +61,7 @@ public class AccountRepositoryTest { DirectChat chatModel = directChatRepository.insertDirectChat(directChat) .blockingGet(); assertEquals(1, chatModel.getId()); + + dataStore.close(); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index 8dbaaf2..62effd7 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -16,6 +16,10 @@ public interface DirectChatRepository { Single insertDirectChat(DirectChat chat); + default Observable> observeDirectChat(DirectChat chat) { + return observeDirectChat(chat.getId()); + } + Observable> observeDirectChat(long chatId); Maybe getDirectChat(long chatId); From 1767a24fdef57da1ea6217e5021e3ad6c23fc88d Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 6 Dec 2019 20:48:27 +0100 Subject: [PATCH 34/83] Refactoring and commenting --- .../ui/chat/MessagesRecyclerViewAdapter.java | 4 +-- .../data/di/RepositoryComponent.java | 23 -------------- .../data/mapping/MessageContentMapping.java | 23 +++++++------- .../data/mapping/MessageMapping.java | 8 ++--- .../data/mapping/MessagePayloadMapping.java | 28 ++++++++--------- .../model/AbstractMessageContentModel.java | 27 ---------------- .../data/model/AbstractMessageModel.java | 2 +- .../AbstractMessagePayloadContainerModel.java | 24 ++++++++++++++ .../model/AbstractMessagePayloadModel.java | 15 +++++---- .../mercury_im/messenger/entity/Account.java | 2 ++ .../messenger/entity/chat/Chat.java | 5 +++ .../entity/chat/ChatPreferences.java | 5 +++ .../messenger/entity/chat/DirectChat.java | 5 +++ .../messenger/entity/chat/GroupChat.java | 5 +++ .../messenger/entity/contact/Peer.java | 2 ++ .../entity/contact/SubscriptionMode.java | 3 ++ .../messenger/entity/event/TypingEvent.java | 5 +++ .../messenger/entity/message/IMessage.java | 6 ++-- .../entity/message/IMessagePayload.java | 31 ------------------- .../entity/message/IPayloadContainer.java | 31 +++++++++++++++++++ .../messenger/entity/message/Message.java | 4 +-- .../entity/message/MessagePayload.java | 25 --------------- .../entity/message/PayloadContainer.java | 26 ++++++++++++++++ .../message/content/MessageContent.java | 16 ---------- .../entity/message/content/Payload.java | 25 +++++++++++++++ ...xtMessageContent.java => TextPayload.java} | 2 +- 26 files changed, 185 insertions(+), 167 deletions(-) delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/di/RepositoryComponent.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageContentModel.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadContainerModel.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/message/IPayloadContainer.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/message/PayloadContainer.java delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/message/content/Payload.java rename entity/src/main/java/org/mercury_im/messenger/entity/message/content/{TextMessageContent.java => TextPayload.java} (86%) diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java index 3f80d73..c0306c0 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java @@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.message.Message; -import org.mercury_im.messenger.entity.message.content.TextMessageContent; +import org.mercury_im.messenger.entity.message.content.TextPayload; import org.mercury_im.messenger.ui.util.MessageBackgroundDrawable; import java.util.ArrayList; @@ -55,7 +55,7 @@ public class MessagesRecyclerViewAdapter extends RecyclerView.Adapter { +public class MessageContentMapping implements Mapping { @Override - public MessageContentModel entityToModel(MessageContent entity, MessageContentModel model) { + public MessagePayloadModel entityToModel(Payload entity, MessagePayloadModel model) { if (entity == null) { return null; } if (model == null) { - model = new MessageContentModel(); + model = new MessagePayloadModel(); } - if (entity instanceof TextMessageContent) { + if (entity instanceof TextPayload) { model.setType(body); - model.setBody(((TextMessageContent) entity).getBody()); + model.setBody(((TextPayload) entity).getBody()); } // else if (...) return model; } @Override - public MessageContent modelToEntity(MessageContentModel model, MessageContent entity) { + public Payload modelToEntity(MessagePayloadModel model, Payload entity) { if (model == null) { - model = new MessageContentModel(); + model = new MessagePayloadModel(); } switch (model.getType()) { case body: if (entity == null) { - TextMessageContent body = new TextMessageContent(); + TextPayload body = new TextPayload(); body.setId(model.getId()); body.setBody(model.getBody()); entity = body; diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java index c69089a..37796c2 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java @@ -1,10 +1,10 @@ package org.mercury_im.messenger.data.mapping; import org.mercury_im.messenger.data.model.MessageModel; -import org.mercury_im.messenger.data.model.MessagePayloadModel; +import org.mercury_im.messenger.data.model.MessagePayloadContainerModel; import org.mercury_im.messenger.entity.message.IMessage; import org.mercury_im.messenger.entity.message.Message; -import org.mercury_im.messenger.entity.message.MessagePayload; +import org.mercury_im.messenger.entity.message.PayloadContainer; import javax.inject.Inject; @@ -30,8 +30,8 @@ public class MessageMapping implements Mapping { model.setTimestamp(entity.getTimestamp()); model.getPayloads().clear(); - for (MessagePayload payload : entity.getMessagePayloads()) { - MessagePayloadModel payloadModel = messagePayloadMapping.entityToModel(payload, new MessagePayloadModel()); + for (PayloadContainer payload : entity.getMessagePayloads()) { + MessagePayloadContainerModel payloadModel = messagePayloadMapping.entityToModel(payload, new MessagePayloadContainerModel()); payloadModel.setMessage(model); model.getPayloads().add(payloadModel); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java index 32cac4a..bbcad94 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java @@ -1,17 +1,17 @@ package org.mercury_im.messenger.data.mapping; -import org.mercury_im.messenger.data.model.MessageContentModel; import org.mercury_im.messenger.data.model.MessagePayloadModel; -import org.mercury_im.messenger.entity.message.IMessagePayload; -import org.mercury_im.messenger.entity.message.MessagePayload; -import org.mercury_im.messenger.entity.message.content.MessageContent; +import org.mercury_im.messenger.data.model.MessagePayloadContainerModel; +import org.mercury_im.messenger.entity.message.IPayloadContainer; +import org.mercury_im.messenger.entity.message.PayloadContainer; +import org.mercury_im.messenger.entity.message.content.Payload; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; -public class MessagePayloadMapping implements Mapping { +public class MessagePayloadMapping implements Mapping { private final MessageContentMapping messageContentMapping; @@ -21,17 +21,17 @@ public class MessagePayloadMapping implements Mapping contents = new ArrayList<>(model.getContents().size()); - for (MessageContentModel contentModel : model.getContents()) { - MessageContent contentEntity = messageContentMapping.modelToEntity(contentModel, null); + List contents = new ArrayList<>(model.getContents().size()); + for (MessagePayloadModel contentModel : model.getContents()) { + Payload contentEntity = messageContentMapping.modelToEntity(contentModel, null); contents.add(contentEntity); } entity.setMessageContents(contents); diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageContentModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageContentModel.java deleted file mode 100644 index 2f48e26..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageContentModel.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.mercury_im.messenger.data.model; - -import org.mercury_im.messenger.data.enums.MessageContentType; - -import io.requery.Column; -import io.requery.Entity; -import io.requery.Generated; -import io.requery.Key; -import io.requery.ManyToOne; -import io.requery.Table; - -@Entity -@Table(name = "message_contents") -public abstract class AbstractMessageContentModel { - - @Key @Generated - long id; - - @ManyToOne - MessagePayloadModel payload; - - @Column - String body; - - @Column(nullable = false) - MessageContentType type; -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index b8e495d..72c3971 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -28,7 +28,7 @@ public abstract class AbstractMessageModel implements Persistable { Date timestamp; @OneToMany - Set payloads; + Set payloads; @Column(nullable = false) String legacyId; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadContainerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadContainerModel.java new file mode 100644 index 0000000..8bd4a74 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadContainerModel.java @@ -0,0 +1,24 @@ +package org.mercury_im.messenger.data.model; + +import java.util.Set; + +import io.requery.Entity; +import io.requery.Generated; +import io.requery.Key; +import io.requery.ManyToOne; +import io.requery.OneToMany; +import io.requery.Table; + +@Entity +@Table(name = "msg_payload_containers") +public abstract class AbstractMessagePayloadContainerModel { + + @Key @Generated + long id; + + @ManyToOne + MessageModel message; + + @OneToMany + Set contents; +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadModel.java index e1ad512..f5e3da8 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessagePayloadModel.java @@ -1,24 +1,27 @@ package org.mercury_im.messenger.data.model; -import java.util.Set; +import org.mercury_im.messenger.data.enums.MessageContentType; +import io.requery.Column; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; import io.requery.ManyToOne; -import io.requery.OneToMany; import io.requery.Table; @Entity -@Table(name = "message_payloads") +@Table(name = "msg_payloads") public abstract class AbstractMessagePayloadModel { @Key @Generated long id; @ManyToOne - MessageModel message; + MessagePayloadContainerModel payload; - @OneToMany - Set contents; + @Column + String body; + + @Column(nullable = false) + MessageContentType type; } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java index 251ce19..3079838 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -2,6 +2,8 @@ package org.mercury_im.messenger.entity; /** * User Account entity. + * + * An implementation of this entity can be found as {@link IAccount}. */ public interface Account { diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java index 7882224..19fd2c6 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java @@ -2,6 +2,11 @@ package org.mercury_im.messenger.entity.chat; import org.mercury_im.messenger.entity.Account; +/** + * Generic interface defining shared properties of chats. + * + * Child interfaces of {@link Chat} are {@link DirectChat} and {@link GroupChat}. + */ public interface Chat { long getId(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/ChatPreferences.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/ChatPreferences.java index aebc4a3..f6aee3c 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/ChatPreferences.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/ChatPreferences.java @@ -1,5 +1,10 @@ package org.mercury_im.messenger.entity.chat; +/** + * Interface that describes typical preferences in the context of a chat. + * + * An implementation can be found as {@link IChatPreferences}. + */ public interface ChatPreferences { NotificationPreferences getNotificationPreference(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/DirectChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/DirectChat.java index c2ab095..b831e4a 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/DirectChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/DirectChat.java @@ -2,6 +2,11 @@ package org.mercury_im.messenger.entity.chat; import org.mercury_im.messenger.entity.contact.Peer; +/** + * Interface that describes a direct chat between the user and another one. + * + * An implementation can be found in {@link IDirectChat}. + */ public interface DirectChat extends Chat { Peer getPeer(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java index c825991..feae5dd 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java @@ -4,6 +4,11 @@ import org.mercury_im.messenger.entity.contact.Peer; import java.util.Set; +/** + * An interface that describes a group chat entity. + * + * An implementation can be found as {@link IGroupChat}. + */ public interface GroupChat extends Chat { Set getParticipants(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java index c0ea28a..d91a5e1 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java @@ -5,6 +5,8 @@ import org.mercury_im.messenger.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. + * + * An implementation can be found as {@link IPeer}. */ public interface Peer { diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java index 9eb1f2c..aeb728f 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java @@ -1,5 +1,8 @@ package org.mercury_im.messenger.entity.contact; +/** + * Enum describing the relationship between the user and another entity. + */ public enum SubscriptionMode { /** * No subscription between us an them. diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/event/TypingEvent.java b/entity/src/main/java/org/mercury_im/messenger/entity/event/TypingEvent.java index c0db012..c728929 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/event/TypingEvent.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/event/TypingEvent.java @@ -4,6 +4,11 @@ import org.mercury_im.messenger.entity.contact.Peer; import java.util.Map; +/** + * Event of someone typing in a chat. + * + * An implementation can be found as {@link ITypingEvent}. + */ public interface TypingEvent { Map getTypingStates(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java index 66c6bcf..b052aca 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java @@ -9,7 +9,7 @@ public class IMessage implements Message { protected String sender; protected String recipient; protected Date timestamp; - protected List payloads; + protected List payloads; protected MessageDeliveryState deliveryState; protected MessageMetadata metadata; @@ -54,12 +54,12 @@ public class IMessage implements Message { } @Override - public List getMessagePayloads() { + public List getMessagePayloads() { return payloads; } @Override - public void setMessagePayloads(List list) { + public void setMessagePayloads(List list) { this.payloads = list; } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java deleted file mode 100644 index 677616a..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessagePayload.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.mercury_im.messenger.entity.message; - -import org.mercury_im.messenger.entity.message.content.MessageContent; - -import java.util.List; - -public class IMessagePayload implements MessagePayload { - - protected long id; - protected List contents; - - @Override - public long getId() { - return id; - } - - @Override - public void setId(long id) { - this.id = id; - } - - @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/entity/message/IPayloadContainer.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IPayloadContainer.java new file mode 100644 index 0000000..d5337bd --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IPayloadContainer.java @@ -0,0 +1,31 @@ +package org.mercury_im.messenger.entity.message; + +import org.mercury_im.messenger.entity.message.content.Payload; + +import java.util.List; + +public class IPayloadContainer implements PayloadContainer { + + protected long id; + protected List contents; + + @Override + public long getId() { + return id; + } + + @Override + public void setId(long id) { + this.id = id; + } + + @Override + public List getMessageContents() { + return contents; + } + + @Override + public void setMessageContents(List payloads) { + this.contents = payloads; + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java index c5bcc44..81eab37 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java @@ -21,9 +21,9 @@ public interface Message { void setTimestamp(Date timestamp); - List getMessagePayloads(); + List getMessagePayloads(); - void setMessagePayloads(List messagePayloads); + void setMessagePayloads(List payloadContainers); MessageDeliveryState getDeliveryState(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java deleted file mode 100644 index d2263b8..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/MessagePayload.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.mercury_im.messenger.entity.message; - -import org.mercury_im.messenger.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 { - - long getId(); - - void setId(long id); - - List getMessageContents(); - - void setMessageContents(List messageContents); - - -} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/PayloadContainer.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/PayloadContainer.java new file mode 100644 index 0000000..1e31c04 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/PayloadContainer.java @@ -0,0 +1,26 @@ +package org.mercury_im.messenger.entity.message; + +import org.mercury_im.messenger.entity.message.content.Payload; + +import java.util.List; + +/** + * Defines a certain set of {@link Payload Payloads} of a message. + * A {@link PayloadContainer} can either be a plaintext container or an encrypted container and contains + * {@link Payload Payloads}. + * + * A message may contain encrypted and unencrypted payloads. Those could then be represented by + * two different {@link PayloadContainer PayloadContainers}. + */ +public interface PayloadContainer { + + long getId(); + + void setId(long id); + + List getMessageContents(); + + void setMessageContents(List payloads); + + +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java deleted file mode 100644 index 7502077..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/MessageContent.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.mercury_im.messenger.entity.message.content; - -public interface MessageContent { - - long getId(); - - void setId(long id); - - interface Body extends MessageContent { - - String getBody(); - - void setBody(String body); - - } -} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/Payload.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/Payload.java new file mode 100644 index 0000000..f84a8f7 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/Payload.java @@ -0,0 +1,25 @@ +package org.mercury_im.messenger.entity.message.content; + +/** + * Interface describing contents of a message. + * + * A message consists of general information like sender, recipient etc. + * Additionally a message contains at least one payload container, eg. the set of unencrypted + * message contents, or the set of encrypted contents. + * + * Inside those payloads, message contents exist. + */ +public interface Payload { + + long getId(); + + void setId(long id); + + interface Body extends Payload { + + String getBody(); + + void setBody(String body); + + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextPayload.java similarity index 86% rename from entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java rename to entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextPayload.java index ba09517..0500d18 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextMessageContent.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/content/TextPayload.java @@ -1,6 +1,6 @@ package org.mercury_im.messenger.entity.message.content; -public class TextMessageContent implements MessageContent.Body { +public class TextPayload implements Payload.Body { private long id; private String body; From ba15acf6594790d6ac95f64dbcfd218b2b37e5d3 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 7 Dec 2019 02:04:31 +0100 Subject: [PATCH 35/83] Improve usage or rx, start working on message storage --- .../messenger/MercuryImApplication.java | 2 - .../messenger/ui/chat/ChatViewModel.java | 6 +- .../messenger/data/di/MappingModule.java | 12 +- .../messenger/data/di/RepositoryModule.java | 18 +++ .../data/mapping/AbstractMapping.java | 76 +++++++++++ .../data/mapping/AccountMapping.java | 32 +++-- .../data/mapping/DirectChatMapping.java | 32 +++-- .../data/mapping/GroupChatMapping.java | 32 +++-- .../messenger/data/mapping/Mapping.java | 33 ++++- .../data/mapping/MessageContentMapping.java | 44 ------ .../data/mapping/MessageMapping.java | 36 +++-- .../MessagePayloadContainerMapping.java | 58 ++++++++ .../data/mapping/MessagePayloadMapping.java | 67 ++++----- .../messenger/data/mapping/PeerMapping.java | 32 +++-- .../repository/XmppAccountRepository.java | 51 ++++--- .../repository/XmppDirectChatRepository.java | 105 +++++++-------- .../repository/XmppGroupChatRepository.java | 107 +++++++-------- .../repository/XmppMessageRepository.java | 127 ++++++++++++++++++ .../data/repository/XmppPeerRepository.java | 66 ++++----- .../data/repository/dao/DirectChatDao.java | 25 ++++ .../data/repository/dao/RequeryDao.java | 17 +++ .../data/repository/DirectChatRepository.java | 11 -- .../data/repository/GroupChatRepository.java | 11 -- .../data/repository/MessageRepository.java | 36 +++++ 24 files changed, 655 insertions(+), 381 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/AbstractMapping.java delete mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/MessageContentMapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadContainerMapping.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/dao/RequeryDao.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index d560b1b..a2270f6 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -9,8 +9,6 @@ import android.content.Context; import android.content.Intent; import android.os.Build; -import org.mercury_im.messenger.data.di.MappingModule; -import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 677aae7..521d429 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModel; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.data.repository.DirectChatRepository; +import org.mercury_im.messenger.data.repository.MessageRepository; import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.contact.Peer; @@ -30,6 +31,9 @@ public class ChatViewModel extends ViewModel { @Inject DirectChatRepository chatRepository; + @Inject + MessageRepository messageRepository; + private MutableLiveData contact = new MutableLiveData<>(); private MutableLiveData> messages = new MutableLiveData<>(); private MutableLiveData contactDisplayName = new MutableLiveData<>(); @@ -58,7 +62,7 @@ public class ChatViewModel extends ViewModel { .subscribe(peer -> contactDisplayName.setValue(peer.getItem().getName()))); // Subscribe messages - disposable.add(chatRepository.observeMessages(chat) + disposable.add(messageRepository.observeMessages(chat) .subscribe(ChatViewModel.this.messages::setValue)); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java index c9086b1..63ff9e6 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java @@ -3,9 +3,9 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; import org.mercury_im.messenger.data.mapping.GroupChatMapping; -import org.mercury_im.messenger.data.mapping.MessageContentMapping; -import org.mercury_im.messenger.data.mapping.MessageMapping; import org.mercury_im.messenger.data.mapping.MessagePayloadMapping; +import org.mercury_im.messenger.data.mapping.MessageMapping; +import org.mercury_im.messenger.data.mapping.MessagePayloadContainerMapping; import org.mercury_im.messenger.data.mapping.PeerMapping; import javax.inject.Singleton; @@ -48,13 +48,13 @@ public class MappingModule { @Provides @Singleton - static MessagePayloadMapping provideMessagePayloadMapping() { - return new MessagePayloadMapping(provideMessageContentMapping()); + static MessagePayloadContainerMapping provideMessagePayloadMapping() { + return new MessagePayloadContainerMapping(provideMessageContentMapping()); } @Provides @Singleton - static MessageContentMapping provideMessageContentMapping() { - return new MessageContentMapping(); + static MessagePayloadMapping provideMessageContentMapping() { + return new MessagePayloadMapping(); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index 4a83441..c247e04 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -3,15 +3,18 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; import org.mercury_im.messenger.data.mapping.GroupChatMapping; +import org.mercury_im.messenger.data.mapping.MessageMapping; import org.mercury_im.messenger.data.mapping.PeerMapping; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.data.repository.GroupChatRepository; +import org.mercury_im.messenger.data.repository.MessageRepository; import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; import org.mercury_im.messenger.data.repository.EntityCapsRepository; import org.mercury_im.messenger.data.repository.XmppAccountRepository; import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; import org.mercury_im.messenger.data.repository.XmppGroupChatRepository; +import org.mercury_im.messenger.data.repository.XmppMessageRepository; import org.mercury_im.messenger.data.repository.XmppPeerRepository; import org.mercury_im.messenger.util.ThreadUtils; @@ -69,6 +72,21 @@ public class RepositoryModule { return new XmppGroupChatRepository(data, ioScheduler, uiScheduler, groupChatMapping); } + @Provides + @Singleton + public static MessageRepository provideMessageRepository( + ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + MessageMapping messageMapping, + DirectChatMapping directChatMapping, + GroupChatMapping groupChatMapping, + DirectChatRepository directChatRepository, + GroupChatRepository groupChatRepository) { + return new XmppMessageRepository(data, ioScheduler, uiScheduler, messageMapping, + directChatMapping, groupChatMapping, directChatRepository, groupChatRepository); + } + @Provides @Singleton public static EntityCapsRepository provideCapsRepository( diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AbstractMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AbstractMapping.java new file mode 100644 index 0000000..c615d1f --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AbstractMapping.java @@ -0,0 +1,76 @@ +package org.mercury_im.messenger.data.mapping; + +import lombok.NonNull; + +public abstract class AbstractMapping implements Mapping { + + @Override + public M toModel(E entity) { + if (entity == null) { + return null; + } + return toModel(entity, newModel(entity)); + } + + @Override + public E toEntity(M model) { + if (model == null) { + return null; + } + return toEntity(model, newEntity(model)); + } + + @Override + public M toModel(E entity, M model) { + if (entity == null) { + return null; + } + if (model == null) { + model = newModel(entity); + } + return mapToModel(entity, model); + } + + @Override + public E toEntity(M model, E entity) { + if (model == null) { + return null; + } + if (entity == null) { + entity = newEntity(model); + } + return mapToEntity(model, entity); + } + + /** + * Return a new entity object. + * + * @return entity + */ + protected abstract E newEntity(@NonNull M model); + + /** + * Return a new database model object. + * + * @return model + */ + protected abstract M newModel(@NonNull E entity); + + /** + * Copy data from the entity to the given model. + * + * @param entity application entity + * @param model database model + * @return the database model + */ + protected abstract M mapToModel(@NonNull E entity, @NonNull M model); + + /** + * Copy data from the database model to the entity. + * + * @param model database model + * @param entity entity + * @return the application entity + */ + protected abstract E mapToEntity(@NonNull M model, @NonNull E entity); +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index 9960f13..25034c2 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -7,7 +7,7 @@ import org.mercury_im.messenger.entity.PasswordAuthentication; import javax.inject.Inject; -public class AccountMapping implements Mapping { +public class AccountMapping extends AbstractMapping { @Inject public AccountMapping() { @@ -15,32 +15,30 @@ public class AccountMapping implements Mapping { } @Override - public AccountModel entityToModel(Account entity, AccountModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new AccountModel(); - } - model.setPassword(entity.getAuthentication().getPassword()); + public Account newEntity(AccountModel model) { + return new IAccount(); + } + + @Override + public AccountModel newModel(Account entity) { + return new AccountModel(); + } + + @Override + public AccountModel mapToModel(Account entity, AccountModel model) { model.setAddress(entity.getAddress()); + model.setPassword(entity.getAuthentication().getPassword()); model.setEnabled(entity.isEnabled()); return model; } @Override - public Account modelToEntity(AccountModel model, Account entity) { - if (model == null) { - return null; - } - if (entity == null) { - entity = new IAccount(); - } + public Account mapToEntity(AccountModel model, Account entity) { entity.setId(model.getId()); entity.setAddress(model.getAddress()); - entity.setEnabled(model.isEnabled()); entity.setAuthentication(new PasswordAuthentication(model.getPassword())); + entity.setEnabled(model.isEnabled()); return entity; } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java index 48098b6..11b5c4e 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java @@ -7,7 +7,7 @@ import org.mercury_im.messenger.entity.contact.Peer; import javax.inject.Inject; -public class DirectChatMapping implements Mapping { +public class DirectChatMapping extends AbstractMapping { private final PeerMapping peerMapping; @@ -17,27 +17,25 @@ public class DirectChatMapping implements Mapping { } @Override - public DirectChatModel entityToModel(DirectChat entity, DirectChatModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new DirectChatModel(); - } - model.setPeer(peerMapping.entityToModel(entity.getPeer(), model.getPeer())); + public DirectChat newEntity(DirectChatModel model) { + return new IDirectChat(); + } + + @Override + public DirectChatModel newModel(DirectChat entity) { + return new DirectChatModel(); + } + + @Override + public DirectChatModel mapToModel(DirectChat entity, DirectChatModel model) { + model.setPeer(peerMapping.toModel(entity.getPeer(), model.getPeer())); return model; } @Override - public DirectChat modelToEntity(DirectChatModel model, DirectChat entity) { - if (model == null) { - return null; - } - if (entity == null) { - entity = new IDirectChat(); - } + public DirectChat mapToEntity(DirectChatModel model, DirectChat entity) { entity.setId(model.getId()); - Peer peer = peerMapping.modelToEntity(model.getPeer(), entity.getPeer()); + Peer peer = peerMapping.toEntity(model.getPeer(), entity.getPeer()); entity.setPeer(peer); entity.setAccount(peer.getAccount()); return entity; diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/GroupChatMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/GroupChatMapping.java index 204ebed..0e92d5f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/GroupChatMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/GroupChatMapping.java @@ -6,7 +6,7 @@ import org.mercury_im.messenger.entity.chat.IGroupChat; import javax.inject.Inject; -public class GroupChatMapping implements Mapping { +public class GroupChatMapping extends AbstractMapping { private final AccountMapping accountMapping; @@ -16,29 +16,27 @@ public class GroupChatMapping implements Mapping { } @Override - public GroupChatModel entityToModel(GroupChat entity, GroupChatModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new GroupChatModel(); - } - model.setAccount(accountMapping.entityToModel(entity.getAccount(), model.getAccount())); + public GroupChat newEntity(GroupChatModel model) { + return new IGroupChat(); + } + + @Override + public GroupChatModel newModel(GroupChat entity) { + return new GroupChatModel(); + } + + @Override + public GroupChatModel mapToModel(GroupChat entity, GroupChatModel model) { + model.setAccount(accountMapping.toModel(entity.getAccount(), model.getAccount())); model.setAddress(entity.getRoomAddress()); model.setName(entity.getRoomName()); return model; } @Override - public GroupChat modelToEntity(GroupChatModel model, GroupChat entity) { - if (model == null) { - return null; - } - if (entity == null) { - entity = new IGroupChat(); - } + public GroupChat mapToEntity(GroupChatModel model, GroupChat entity) { entity.setId(model.getId()); - entity.setAccount(accountMapping.modelToEntity(model.getAccount(), entity.getAccount())); + entity.setAccount(accountMapping.toEntity(model.getAccount(), entity.getAccount())); entity.setRoomAddress(model.getAddress()); entity.setRoomName(model.getName()); return entity; diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java index b3665e6..8b7a10e 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java @@ -9,18 +9,37 @@ package org.mercury_im.messenger.data.mapping; public interface Mapping { /** - * Copy data from the entity to the model. + * Map data from the entity to a new model. * * @param entity application entity - * @param model database model + * @return new database model */ - M entityToModel(E entity, M model); + M toModel(E entity); /** - * Copy data from the database model to the entity. - * + * Copy data from the model to a new entity. * @param model database model - * @param entity entity + * @return new application entity */ - E modelToEntity(M model, E entity); + E toEntity(M model); + + /** + * Map an entity to a model. + * + * @param entity entity + * @param model model + * @return model + */ + M toModel(E entity, M model); + + /** + * Map a model to an entity. + * + * @param model model + * @param entity entity + * @return entity + */ + E toEntity(M model, E entity); + + } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageContentMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageContentMapping.java deleted file mode 100644 index e21c126..0000000 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageContentMapping.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.mercury_im.messenger.data.mapping; - -import org.mercury_im.messenger.data.model.MessagePayloadModel; -import org.mercury_im.messenger.entity.message.content.Payload; -import org.mercury_im.messenger.entity.message.content.TextPayload; - -import static org.mercury_im.messenger.data.enums.MessageContentType.body; - -public class MessageContentMapping implements Mapping { - - @Override - public MessagePayloadModel entityToModel(Payload entity, MessagePayloadModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new MessagePayloadModel(); - } - - if (entity instanceof TextPayload) { - model.setType(body); - model.setBody(((TextPayload) entity).getBody()); - } - // else if (...) - return model; - } - - @Override - public Payload modelToEntity(MessagePayloadModel model, Payload entity) { - if (model == null) { - model = new MessagePayloadModel(); - } - switch (model.getType()) { - case body: - if (entity == null) { - TextPayload body = new TextPayload(); - body.setId(model.getId()); - body.setBody(model.getBody()); - entity = body; - } - } - return entity; - } -} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java index 37796c2..0f1a295 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java @@ -8,30 +8,34 @@ import org.mercury_im.messenger.entity.message.PayloadContainer; import javax.inject.Inject; -public class MessageMapping implements Mapping { +public class MessageMapping extends AbstractMapping { - private final MessagePayloadMapping messagePayloadMapping; + private final MessagePayloadContainerMapping messagePayloadContainerMapping; @Inject - public MessageMapping(MessagePayloadMapping messagePayloadMapping) { - this.messagePayloadMapping = messagePayloadMapping; + public MessageMapping(MessagePayloadContainerMapping messagePayloadContainerMapping) { + this.messagePayloadContainerMapping = messagePayloadContainerMapping; } @Override - public MessageModel entityToModel(Message entity, MessageModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new MessageModel(); - } + public Message newEntity(MessageModel model) { + return new IMessage(); + } + + @Override + public MessageModel newModel(Message entity) { + return new MessageModel(); + } + + @Override + public MessageModel mapToModel(Message entity, MessageModel model) { model.setSender(entity.getSender()); model.setRecipient(entity.getRecipient()); model.setTimestamp(entity.getTimestamp()); model.getPayloads().clear(); for (PayloadContainer payload : entity.getMessagePayloads()) { - MessagePayloadContainerModel payloadModel = messagePayloadMapping.entityToModel(payload, new MessagePayloadContainerModel()); + MessagePayloadContainerModel payloadModel = messagePayloadContainerMapping.toModel(payload, new MessagePayloadContainerModel()); payloadModel.setMessage(model); model.getPayloads().add(payloadModel); } @@ -40,13 +44,7 @@ public class MessageMapping implements Mapping { } @Override - public Message modelToEntity(MessageModel model, Message entity) { - if (model == null) { - return null; - } - if (entity == null) { - entity = new IMessage(); - } + public Message mapToEntity(MessageModel model, Message entity) { return null; } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadContainerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadContainerMapping.java new file mode 100644 index 0000000..18624ed --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadContainerMapping.java @@ -0,0 +1,58 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.model.MessagePayloadModel; +import org.mercury_im.messenger.data.model.MessagePayloadContainerModel; +import org.mercury_im.messenger.entity.message.IPayloadContainer; +import org.mercury_im.messenger.entity.message.PayloadContainer; +import org.mercury_im.messenger.entity.message.content.Payload; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +public class MessagePayloadContainerMapping extends AbstractMapping { + + private final MessagePayloadMapping messagePayloadMapping; + + @Inject + public MessagePayloadContainerMapping(MessagePayloadMapping messagePayloadMapping) { + this.messagePayloadMapping = messagePayloadMapping; + } + + @Override + public PayloadContainer newEntity(MessagePayloadContainerModel model) { + return new IPayloadContainer(); + } + + @Override + public MessagePayloadContainerModel newModel(PayloadContainer entity) { + return new MessagePayloadContainerModel(); + } + + @Override + public MessagePayloadContainerModel mapToModel(PayloadContainer entity, MessagePayloadContainerModel model) { + model.getContents().clear(); + for (Payload contentEntity : entity.getMessageContents()) { + MessagePayloadModel contentModel = messagePayloadMapping.toModel(contentEntity, new MessagePayloadModel()); + contentModel.setPayload(model); + model.getContents().add(contentModel); + } + + return model; + } + + @Override + public PayloadContainer mapToEntity(MessagePayloadContainerModel model, PayloadContainer entity) { + entity.setId(model.getId()); + + List contents = new ArrayList<>(model.getContents().size()); + for (MessagePayloadModel contentModel : model.getContents()) { + Payload contentEntity = messagePayloadMapping.toEntity(contentModel, null); + contents.add(contentEntity); + } + entity.setMessageContents(contents); + + return entity; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java index bbcad94..3328dc9 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadMapping.java @@ -1,62 +1,47 @@ package org.mercury_im.messenger.data.mapping; import org.mercury_im.messenger.data.model.MessagePayloadModel; -import org.mercury_im.messenger.data.model.MessagePayloadContainerModel; -import org.mercury_im.messenger.entity.message.IPayloadContainer; -import org.mercury_im.messenger.entity.message.PayloadContainer; import org.mercury_im.messenger.entity.message.content.Payload; +import org.mercury_im.messenger.entity.message.content.TextPayload; -import java.util.ArrayList; -import java.util.List; +import static org.mercury_im.messenger.data.enums.MessageContentType.body; -import javax.inject.Inject; +public class MessagePayloadMapping extends AbstractMapping { -public class MessagePayloadMapping implements Mapping { - - private final MessageContentMapping messageContentMapping; - - @Inject - public MessagePayloadMapping(MessageContentMapping messageContentMapping) { - this.messageContentMapping = messageContentMapping; + @Override + public Payload newEntity(MessagePayloadModel model) { + switch (model.getType()) { + case body: + return new TextPayload(); + default: + return null; + } } @Override - public MessagePayloadContainerModel entityToModel(PayloadContainer entity, MessagePayloadContainerModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new MessagePayloadContainerModel(); - } + public MessagePayloadModel newModel(Payload entity) { + return new MessagePayloadModel(); + } - model.getContents().clear(); - for (Payload contentEntity : entity.getMessageContents()) { - MessagePayloadModel contentModel = messageContentMapping.entityToModel(contentEntity, new MessagePayloadModel()); - contentModel.setPayload(model); - model.getContents().add(contentModel); + @Override + public MessagePayloadModel mapToModel(Payload entity, MessagePayloadModel model) { + if (entity instanceof TextPayload) { + model.setType(body); + model.setBody(((TextPayload) entity).getBody()); } - + // else if (...) return model; } @Override - public PayloadContainer modelToEntity(MessagePayloadContainerModel model, PayloadContainer entity) { - if (model == null) { - return null; - } - if (entity == null) { - entity = new IPayloadContainer(); - } - + public Payload mapToEntity(MessagePayloadModel model, Payload entity) { entity.setId(model.getId()); - - List contents = new ArrayList<>(model.getContents().size()); - for (MessagePayloadModel contentModel : model.getContents()) { - Payload contentEntity = messageContentMapping.modelToEntity(contentModel, null); - contents.add(contentEntity); + switch (model.getType()) { + case body: + TextPayload body = (TextPayload) entity; + body.setBody(model.getBody()); + break; } - entity.setMessageContents(contents); - return entity; } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java index b25bcdd..91b6141 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -7,7 +7,7 @@ import org.mercury_im.messenger.entity.contact.Peer; import javax.inject.Inject; -public class PeerMapping implements Mapping { +public class PeerMapping extends AbstractMapping { private final AccountMapping accountMapping; @@ -17,14 +17,18 @@ public class PeerMapping implements Mapping { } @Override - public PeerModel entityToModel(Peer entity, PeerModel model) { - if (entity == null) { - return null; - } - if (model == null) { - model = new PeerModel(); - } - model.setAccount(accountMapping.entityToModel(entity.getAccount(), model.getAccount())); + public Peer newEntity(PeerModel model) { + return new IPeer(); + } + + @Override + public PeerModel newModel(Peer entity) { + return new PeerModel(); + } + + @Override + public PeerModel mapToModel(Peer entity, PeerModel model) { + model.setAccount(accountMapping.toModel(entity.getAccount(), model.getAccount())); model.setAddress(entity.getAddress()); model.setName(entity.getName()); @@ -34,14 +38,8 @@ public class PeerMapping implements Mapping { } @Override - public Peer modelToEntity(PeerModel model, Peer entity) { - if (model == null) { - return null; - } - if (entity == null) { - entity = new IPeer(); - } - entity.setAccount(accountMapping.modelToEntity(model.getAccount(), entity.getAccount())); + public Peer mapToEntity(PeerModel model, Peer entity) { + entity.setAccount(accountMapping.toEntity(model.getAccount(), entity.getAccount())); entity.setAddress(model.getAddress()); entity.setId(model.getId()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index dc988ba..1166aa5 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -39,8 +39,10 @@ public class XmppAccountRepository @Override public Single insertAccount(Account account) { - return data().insert(accountMapping.entityToModel(account, new AccountModel())) - .map(model -> accountMapping.modelToEntity(model, account)) + return Single.just(account) + .map(accountMapping::toModel) + .flatMap(data()::insert) + .map(model -> accountMapping.toEntity(model, account)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -50,7 +52,9 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().observableResult() - .map(result -> new Optional<>(accountMapping.modelToEntity(result.firstOrNull(), new IAccount()))) + .map(ResultDelegate::firstOrNull) + .map(accountMapping::toEntity) + .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -60,7 +64,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().maybe() - .map(model -> accountMapping.modelToEntity(model, new IAccount())) + .map(accountMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -70,7 +74,9 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ADDRESS.eq(address)) .get().observableResult() - .map(result -> new Optional<>(accountMapping.modelToEntity(result.firstOrNull(), new IAccount()))) + .map(ResultDelegate::firstOrNull) + .map(accountMapping::toEntity) + .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -80,7 +86,7 @@ public class XmppAccountRepository return data().select(AccountModel.class) .where(AccountModel.ADDRESS.eq(address)) .get().maybe() - .map(model -> accountMapping.modelToEntity(model, new IAccount())) + .map(accountMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -93,7 +99,7 @@ public class XmppAccountRepository .map(list -> { List entities = new ArrayList<>(list.size()); for (AccountModel model : list) { - entities.add(accountMapping.modelToEntity(model, new IAccount())); + entities.add(accountMapping.toEntity(model)); } return entities; }) @@ -109,13 +115,12 @@ public class XmppAccountRepository // fetch model return data().select(AccountModel.class) .where(AccountModel.ID.eq(account.getId())) - .get().maybe().toSingle() // to single - .flatMap(model -> { - // copy changes from the entity to the model - model = accountMapping.entityToModel(account, model); - // write the updated model back - return data().update(model); - }).map(model -> accountMapping.modelToEntity(model, account)) + .get().maybe().toSingle() + // copy changes from the entity to the model + .map(model -> accountMapping.toModel(account, model)) + // write the updated model back + .flatMap(updatedModel -> data().update(updatedModel)) + .map(model -> accountMapping.toEntity(model, account)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -127,14 +132,16 @@ public class XmppAccountRepository .where(AccountModel.ID.eq(account.getId())) .get().maybe() // If it does not exist, create a new model from the entity - .switchIfEmpty(data().insert(accountMapping.entityToModel(account, new AccountModel()))) - .flatMap(model -> { - // update the model - model = accountMapping.entityToModel(account, model); - // write the updated model back - return data().update(model); - }) - .map(model -> accountMapping.modelToEntity(model, account)) + .switchIfEmpty( + Single.just(account) + .map(accountMapping::toModel) + .flatMap(data()::insert) + ) + // update the model + .map(model -> accountMapping.toModel(account, model)) + // write the updated model back + .flatMap(data()::update) + .map(model -> accountMapping.toEntity(model, account)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index 4e2b1c2..164253e 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -4,11 +4,11 @@ import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; import org.mercury_im.messenger.data.mapping.PeerMapping; import org.mercury_im.messenger.data.model.DirectChatModel; +import org.mercury_im.messenger.data.repository.dao.DirectChatDao; import org.mercury_im.messenger.data.util.Optional; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.chat.IDirectChat; import org.mercury_im.messenger.entity.contact.Peer; -import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.util.ThreadUtils; import java.util.ArrayList; @@ -25,6 +25,7 @@ import io.reactivex.Single; import io.requery.Persistable; import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveResult; public class XmppDirectChatRepository extends RequeryRepository @@ -36,6 +37,8 @@ public class XmppDirectChatRepository private final DirectChatMapping directChatMapping; + private final DirectChatDao dao; + @Inject public XmppDirectChatRepository( ReactiveEntityStore data, @@ -48,14 +51,18 @@ public class XmppDirectChatRepository this.accountMapping = accountMapping; this.peerMapping = peerMapping; this.directChatMapping = directChatMapping; + + this.dao = new DirectChatDao(data); } - - @Override public Single insertDirectChat(DirectChat chat) { - return data().insert(directChatMapping.entityToModel(chat, new DirectChatModel())) - .map(model -> directChatMapping.modelToEntity(model, chat)) + return Single.just(chat) + // map entity to model + .map(directChatMapping::toModel) + .flatMap(dao::insert) + // map back to entity + .map(model -> directChatMapping.toEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -65,8 +72,9 @@ public class XmppDirectChatRepository return data().select(DirectChatModel.class) .where(DirectChatModel.ID.eq(chatId)) .get().observableResult() - .map(result -> new Optional<>( - directChatMapping.modelToEntity(result.firstOrNull(), new IDirectChat()))) + .map(ResultDelegate::firstOrNull) + .map(directChatMapping::toEntity) + .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -76,18 +84,18 @@ public class XmppDirectChatRepository return data().select(DirectChatModel.class) .where(DirectChatModel.ID.eq(chatId)) .get().maybe() - .map(result -> directChatMapping.modelToEntity(result, new IDirectChat())) + .map(result -> directChatMapping.toEntity(result, new IDirectChat())) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @Override - public Single getOrCreateChatWithPeer(Peer _peer) { - return getDirectChatByPeer(_peer) + public Single getOrCreateChatWithPeer(Peer peer) { + return getDirectChatByPeer(peer) .switchIfEmpty(insertDirectChat(new IDirectChat(){ { - setAccount(_peer.getAccount()); - setPeer(_peer); + setAccount(peer.getAccount()); + setPeer(peer); } })) .subscribeOn(subscriberScheduler()) @@ -99,8 +107,9 @@ public class XmppDirectChatRepository return data().select(DirectChatModel.class) .where(DirectChatModel.PEER_ID.eq(peer.getId())) .get().observableResult() - .map(result -> new Optional<>( - directChatMapping.modelToEntity(result.firstOrNull(), new IDirectChat()))) + .map(ReactiveResult::firstOrNull) + .map(model -> directChatMapping.toEntity(model, new IDirectChat())) + .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -110,7 +119,7 @@ public class XmppDirectChatRepository return data().select(DirectChatModel.class) .where(DirectChatModel.PEER_ID.eq(peer.getId())) .get().maybe() - .map(model -> directChatMapping.modelToEntity(model, new IDirectChat())) + .map(model -> directChatMapping.toEntity(model, new IDirectChat())) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -123,7 +132,7 @@ public class XmppDirectChatRepository .map(list -> { List entities = new ArrayList<>(list.size()); for (DirectChatModel model : list) { - entities.add(directChatMapping.modelToEntity(model, new IDirectChat())); + entities.add(directChatMapping.toEntity(model, new IDirectChat())); } return entities; }) @@ -133,29 +142,36 @@ public class XmppDirectChatRepository @Override public Single updateDirectChat(DirectChat chat) { - return data().select(DirectChatModel.class) + return dao.get(chat.getId()) + // fail if not exists + .toSingle() + .map(model -> directChatMapping.toModel(chat, model)) + .flatMap(data()::update) + .map(model -> directChatMapping.toEntity(model, chat)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + Single getOrCreateDirectChatModel(DirectChat chat) { + return data() + // fetch existing chat + .select(DirectChatModel.class) .where(DirectChatModel.ID.eq(chat.getId())) - .get().maybe().toSingle() - .flatMap(model -> { - model = directChatMapping.entityToModel(chat, model); - return data().update(model); - }) - .map(model -> directChatMapping.modelToEntity(model, chat)) + .get().maybe() + .switchIfEmpty( + // If not exists, insert chat as new model and return + data().insert(directChatMapping.toModel(chat, new DirectChatModel())) + ) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @Override public Single upsertDirectChat(DirectChat chat) { - return data().select(DirectChatModel.class) - .where(DirectChatModel.ID.eq(chat.getId())) - .get().maybe() - .switchIfEmpty(data().insert(directChatMapping.entityToModel(chat, new DirectChatModel()))) - .flatMap(model -> { - model = directChatMapping.entityToModel(chat, model); - return data().update(model); - }) - .map(model -> directChatMapping.modelToEntity(model, chat)) + return getOrCreateDirectChatModel(chat) + .map(directChatModel -> directChatMapping.toModel(chat, directChatModel)) + .flatMap(data()::update) + .map(model -> directChatMapping.toEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -168,29 +184,4 @@ public class XmppDirectChatRepository .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } - - @Override - public Single insertMessage(DirectChat chat, Message message) { - return null; - } - - @Override - public Observable> observeMessages(DirectChat chat) { - return null; - } - - @Override - public Single updateMessage(Message message) { - return null; - } - - @Override - public Single upsertMessage(DirectChat chat, Message message) { - return null; - } - - @Override - public Completable deleteMessage(Message message) { - return null; - } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index 516a0e1..f73f6dd 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -6,7 +6,6 @@ import org.mercury_im.messenger.data.util.Optional; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; import org.mercury_im.messenger.entity.chat.IGroupChat; -import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.util.ThreadUtils; import java.util.ArrayList; @@ -42,8 +41,10 @@ public class XmppGroupChatRepository @Override public Single insertGroupChat(GroupChat chat) { - return data().insert(groupChatMapping.entityToModel(chat, new GroupChatModel())) - .map(model -> groupChatMapping.modelToEntity(model, chat)) + return Single.just(chat) + .map(groupChatMapping::toModel) + .flatMap(data()::insert) + .map(model -> groupChatMapping.toEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -53,8 +54,9 @@ public class XmppGroupChatRepository return data().select(GroupChatModel.class) .where(GroupChatModel.ID.eq(chatId)) .get().observableResult() - .map(result -> new Optional<>( - groupChatMapping.modelToEntity(result.firstOrNull(), new IGroupChat()))) + .map(ResultDelegate::firstOrNull) + .map(groupChatMapping::toEntity) + .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -64,7 +66,7 @@ public class XmppGroupChatRepository return data().select(GroupChatModel.class) .where(GroupChatModel.ID.eq(chatId)) .get().maybe() - .map(model -> groupChatMapping.modelToEntity(model, new IGroupChat())) + .map(groupChatMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -72,12 +74,14 @@ public class XmppGroupChatRepository @Override public Single getOrCreateGroupChat(Account account, String roomAddress) { return getGroupChatByRoomAddress(account, roomAddress) - .switchIfEmpty(insertGroupChat(new IGroupChat(){ - { - setAccount(account); - setRoomAddress(roomAddress); - } - })) + .switchIfEmpty(Single + .just((GroupChat) new IGroupChat() { + { + setAccount(account); + setRoomAddress(roomAddress); + } + }) + .flatMap(this::insertGroupChat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -88,8 +92,9 @@ public class XmppGroupChatRepository .where(GroupChatModel.ADDRESS.eq(roomAddress)) .and(GroupChatModel.ACCOUNT_ID.eq(accountId)) .get().observableResult() - .map(result -> new Optional<>( - groupChatMapping.modelToEntity(result.firstOrNull(), new IGroupChat()))) + .map(ResultDelegate::firstOrNull) + .map(groupChatMapping::toEntity) + .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -100,7 +105,7 @@ public class XmppGroupChatRepository .where(GroupChatModel.ADDRESS.eq(roomAddress)) .and(GroupChatModel.ACCOUNT_ID.eq(accountId)) .get().maybe() - .map(model -> groupChatMapping.modelToEntity(model, new IGroupChat())) + .map(groupChatMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -113,7 +118,7 @@ public class XmppGroupChatRepository .map(list -> { List entities = new ArrayList<>(list.size()); for (GroupChatModel model : list) { - entities.add(groupChatMapping.modelToEntity(model, new IGroupChat())); + entities.add(groupChatMapping.toEntity(model)); } return entities; }) @@ -126,13 +131,26 @@ public class XmppGroupChatRepository return data().select(GroupChatModel.class) .where(GroupChatModel.ID.eq(chat.getId())) .get().maybe().toSingle() // to single - .flatMap(model -> { - // copy changes from entity to the model - model = groupChatMapping.entityToModel(chat, model); - // write the updated model back - return data().update(model); - }) - .map(model -> groupChatMapping.modelToEntity(model, chat)) + // copy changes from entity to the model + .map(model -> groupChatMapping.toModel(chat, model)) + // write the updated model back + .flatMap(data()::update) + // map back + .map(model -> groupChatMapping.toEntity(model, chat)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + Single getOrCreateGroupChatModel(GroupChat chat) { + // fetch existing model + return data().select(GroupChatModel.class) + .where(GroupChatModel.ID.eq(chat.getId())) + .get().maybe() + // if not found, create a new one and insert it + .switchIfEmpty( + Single.just(chat) + .map(groupChatMapping::toModel) + .flatMap(data()::insert)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -140,18 +158,12 @@ public class XmppGroupChatRepository @Override public Single upsertGroupChat(GroupChat chat) { // Try to fetch model - return data().select(GroupChatModel.class) - .where(GroupChatModel.ID.eq(chat.getId())) - .get().maybe() - // If it does not exist, create a new model from the entity - .switchIfEmpty(data().insert(groupChatMapping.entityToModel(chat, new GroupChatModel()))) - .flatMap(model -> { - // update the model - model = groupChatMapping.entityToModel(chat, model); - // write the updated model back - return data().update(model); - }) - .map(model -> groupChatMapping.modelToEntity(model, chat)) + return getOrCreateGroupChatModel(chat) + // update the model + .map(model -> groupChatMapping.toModel(chat, model)) + // write the updated model back + .flatMap(data()::update) + .map(model -> groupChatMapping.toEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -164,29 +176,4 @@ public class XmppGroupChatRepository .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } - - @Override - public Single insertMessage(GroupChat chat, Message message) { - return null; - } - - @Override - public Observable> observeMessages(GroupChat chat) { - return null; - } - - @Override - public Single updateMessage(Message message) { - return null; - } - - @Override - public Single upsertMessage(GroupChat chat, Message message) { - return null; - } - - @Override - public Completable deleteMessage(Message message) { - return null; - } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java new file mode 100644 index 0000000..1a2a67f --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java @@ -0,0 +1,127 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.data.mapping.DirectChatMapping; +import org.mercury_im.messenger.data.mapping.GroupChatMapping; +import org.mercury_im.messenger.data.mapping.MessageMapping; +import org.mercury_im.messenger.data.model.DirectChatModel; +import org.mercury_im.messenger.data.model.DirectMessagesRelation; +import org.mercury_im.messenger.data.model.MessageModel; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.chat.GroupChat; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.util.ThreadUtils; + +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.Completable; +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +public class XmppMessageRepository + extends RequeryRepository + implements MessageRepository { + + private final MessageMapping messageMapping; + private final DirectChatMapping directChatMapping; + private final GroupChatMapping groupChatMapping; + private final DirectChatRepository directChatRepository; + private final GroupChatRepository groupChatRepository; + + @Inject + public XmppMessageRepository(ReactiveEntityStore data, + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + MessageMapping messageMapping, + DirectChatMapping directChatMapping, + GroupChatMapping groupChatMapping, + DirectChatRepository directChatRepository, + GroupChatRepository groupChatRepository) { + super(data, subscriberScheduler, observerScheduler); + this.messageMapping = messageMapping; + this.directChatMapping = directChatMapping; + this.groupChatMapping = groupChatMapping; + this.directChatRepository = directChatRepository; + this.groupChatRepository = groupChatRepository; + } + + @Override + public Single insertMessage(DirectChat chat, Message message) { + return data() + // fetch chat model + .select(DirectChatModel.class) + .where(DirectChatModel.ID.eq(chat.getId())) + .get().maybe() + // if not exists, insert chat into db + .switchIfEmpty(data().insert(directChatMapping.toModel(chat, new DirectChatModel()))) + // place chat and message in relation + .map(chatModel -> { + DirectMessagesRelation relation = new DirectMessagesRelation(); + relation.setChat(chatModel); + relation.setMessage(messageMapping.toModel(message, new MessageModel())); + return relation; + }) + // insert relation + .flatMap(relationModel -> data().insert(relationModel)) + // prepare resulting message to be returned + .map(DirectMessagesRelation::getMessage) + .map(messageModel -> messageMapping.toEntity(messageModel, message)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Single insertMessage(GroupChat chat, Message message) { + return null; + } + + @Override + public Observable> observeMessages(DirectChat chat) { + return null; + } + + @Override + public Observable> observeMessages(GroupChat chat) { + return null; + } + + @Override + public Observable> findMessagesWithBody(String body) { + return null; + } + + @Override + public Observable> findMessagesWithBody(DirectChat chat, String body) { + return null; + } + + @Override + public Observable> findMessagesWithBody(GroupChat chat, String body) { + return null; + } + + @Override + public Single upsertMessage(DirectChat chat, Message message) { + return null; + } + + @Override + public Single upsertMessage(GroupChat chat, Message message) { + return null; + } + + @Override + public Single updateMessage(Message message) { + return null; + } + + @Override + public Completable deleteMessage(Message message) { + return null; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index ba539d9..2d18c3a 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -20,6 +20,7 @@ import io.reactivex.Observable; import io.reactivex.Scheduler; import io.reactivex.Single; import io.requery.Persistable; +import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; public class XmppPeerRepository @@ -42,8 +43,8 @@ public class XmppPeerRepository @Override public Single insertPeer(Peer peer) { - return data().insert(peerMapping.entityToModel(peer, new PeerModel())) - .map(model -> peerMapping.modelToEntity(model, peer)) + return data().insert(peerMapping.toModel(peer, new PeerModel())) + .map(model -> peerMapping.toEntity(model, peer)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -53,7 +54,7 @@ public class XmppPeerRepository return data().select(PeerModel.class) .where(PeerModel.ID.eq(peerId)) .get().observableResult() - .map(result -> new Optional<>(peerMapping.modelToEntity(result.firstOrNull(), new IPeer()))) + .map(result -> new Optional<>(peerMapping.toEntity(result.firstOrNull(), new IPeer()))) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -63,7 +64,7 @@ public class XmppPeerRepository return data().select(PeerModel.class) .where(PeerModel.ID.eq(peerId)) .get().maybe() - .map(model -> peerMapping.modelToEntity(model, new IPeer())) + .map(model -> peerMapping.toEntity(model, new IPeer())) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -74,7 +75,9 @@ public class XmppPeerRepository .where(PeerModel.ACCOUNT_ID.eq(accountId)) .and(PeerModel.ADDRESS.eq(address)) .get().observableResult() - .map(result -> new Optional<>(peerMapping.modelToEntity(result.firstOrNull(), new IPeer()))) + .map(ResultDelegate::firstOrNull) + .map(peerMapping::toEntity) + .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -91,20 +94,22 @@ public class XmppPeerRepository .where(PeerModel.ACCOUNT_ID.eq(accountId)) .and(PeerModel.ADDRESS.eq(address)) .get().maybe() - .map(model -> peerMapping.modelToEntity(model, new IPeer())) + .map(peerMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @Override - public Single getOrCreatePeer(Account _account, String _address) { - return getPeerByAddress(_account, _address) - .switchIfEmpty(insertPeer(new IPeer(){ - { - setAccount(_account); - setAddress(_address); - } - })) + public Single getOrCreatePeer(Account account, String address) { + return getPeerByAddress(account, address) + .switchIfEmpty(Single + .just(new IPeer(){ + { + setAccount(account); + setAddress(address); + } + }) + .flatMap(this::insertPeer)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -113,11 +118,11 @@ public class XmppPeerRepository public Observable> observeAllPeers() { return data().select(PeerModel.class) .get().observableResult() - .map(result -> { - List peerModels = result.toList(); + .map(ResultDelegate::toList) + .map(peerModels -> { List peerEntities = new ArrayList<>(peerModels.size()); for (PeerModel model : peerModels) { - peerEntities.add(peerMapping.modelToEntity(model, new IPeer())); + peerEntities.add(peerMapping.toEntity(model)); } return peerEntities; }) @@ -131,13 +136,10 @@ public class XmppPeerRepository return data().select(PeerModel.class) .where(PeerModel.ID.eq(peer.getId())) .get().maybe().toSingle() - .flatMap(model -> { - // write changes into model - model = peerMapping.entityToModel(peer, model); - // write model back to db - return data().update(model); - }) - .map(model -> peerMapping.modelToEntity(model, peer)) + // write changes into model + .map(model -> peerMapping.toModel(peer, model)) + .flatMap(data()::update) + .map(model -> peerMapping.toEntity(model, peer)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -148,14 +150,14 @@ public class XmppPeerRepository .where(PeerModel.ID.eq(peer.getId())) .get().maybe() // if not exists, create - .switchIfEmpty(data().insert(peerMapping.entityToModel(peer, new PeerModel()))) - .flatMap(model -> { - // write changes into fetched model - model = peerMapping.entityToModel(peer, model); - // write changed model back to db - return data().update(model); - }) - .map(model -> peerMapping.modelToEntity(model, peer)) + .switchIfEmpty(Single.just(peer) + .map(peerMapping::toModel) + .flatMap(data()::insert)) + // write changes into fetched model + .map(model -> peerMapping.toModel(peer, model)) + // write changed model back to db + .flatMap(data()::update) + .map(model -> peerMapping.toEntity(model, peer)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java new file mode 100644 index 0000000..c66ecea --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java @@ -0,0 +1,25 @@ +package org.mercury_im.messenger.data.repository.dao; + +import org.mercury_im.messenger.data.model.DirectChatModel; + +import io.reactivex.Maybe; +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +public class DirectChatDao extends RequeryDao { + + public DirectChatDao(ReactiveEntityStore data) { + super(data); + } + + public Single insert(DirectChatModel model) { + return data().insert(model); + } + + public Maybe get(long chatId) { + return data().select(DirectChatModel.class) + .where(DirectChatModel.ID.eq(chatId)) + .get().maybe(); + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/RequeryDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/RequeryDao.java new file mode 100644 index 0000000..813ef3b --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/RequeryDao.java @@ -0,0 +1,17 @@ +package org.mercury_im.messenger.data.repository.dao; + +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +public abstract class RequeryDao { + + private final ReactiveEntityStore data; + + public RequeryDao(ReactiveEntityStore data) { + this.data = data; + } + + public ReactiveEntityStore data() { + return data; + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index 62effd7..1970954 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -38,15 +38,4 @@ public interface DirectChatRepository { 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/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java index 601edac..a5d6ebb 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java @@ -42,15 +42,4 @@ public interface GroupChatRepository { 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/domain/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java new file mode 100644 index 0000000..bed2cea --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/MessageRepository.java @@ -0,0 +1,36 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.chat.GroupChat; +import org.mercury_im.messenger.entity.message.Message; + +import java.util.List; + +import io.reactivex.Completable; +import io.reactivex.Observable; +import io.reactivex.Single; + +public interface MessageRepository { + + Single insertMessage(DirectChat chat, Message message); + + Single insertMessage(GroupChat chat, Message message); + + Observable> observeMessages(DirectChat chat); + + Observable> observeMessages(GroupChat chat); + + Observable> findMessagesWithBody(String body); + + Observable> findMessagesWithBody(DirectChat chat, String body); + + Observable> findMessagesWithBody(GroupChat chat, String body); + + Single upsertMessage(DirectChat chat, Message message); + + Single upsertMessage(GroupChat chat, Message message); + + Single updateMessage(Message message); + + Completable deleteMessage(Message message); +} From a0b496be65fb0f50a1d46005b4f8f1600ba482ba Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 8 Dec 2019 18:27:34 +0100 Subject: [PATCH 36/83] Additions to MessageRepository --- .../messenger/data/di/DaoModule.java | 34 ++++ .../messenger/data/di/RepositoryModule.java | 23 ++- .../MessagePayloadContainerMapping.java | 2 +- .../model/AbstractDirectMessagesRelation.java | 11 +- .../model/AbstractGroupMessagesRelation.java | 10 +- .../model/AbstractMessagePayloadModel.java | 2 +- .../repository/XmppAccountRepository.java | 73 ++++----- .../repository/XmppDirectChatRepository.java | 62 ++------ .../repository/XmppGroupChatRepository.java | 59 ++----- .../repository/XmppMessageRepository.java | 147 +++++++++++++++--- .../data/repository/dao/AccountDao.java | 45 ++++++ .../data/repository/dao/DirectChatDao.java | 31 +++- .../data/repository/dao/GroupChatDao.java | 47 ++++++ .../data/repository/dao/MessageDao.java | 45 ++++++ 14 files changed, 400 insertions(+), 191 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/di/DaoModule.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/dao/AccountDao.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/dao/GroupChatDao.java create mode 100644 data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/DaoModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/DaoModule.java new file mode 100644 index 0000000..8d9c3ef --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/di/DaoModule.java @@ -0,0 +1,34 @@ +package org.mercury_im.messenger.data.di; + +import org.mercury_im.messenger.data.repository.dao.AccountDao; +import org.mercury_im.messenger.data.repository.dao.DirectChatDao; +import org.mercury_im.messenger.data.repository.dao.GroupChatDao; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; + +@Module +public class DaoModule { + + @Provides + @Singleton + static AccountDao provideAccountDao(ReactiveEntityStore data) { + return new AccountDao(data); + } + + @Provides + @Singleton + public static DirectChatDao provideDirectChatDao(ReactiveEntityStore data) { + return new DirectChatDao(data); + } + + @Provides + @Singleton + public static GroupChatDao provideGroupChatDao(ReactiveEntityStore data) { + return new GroupChatDao(data); + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index c247e04..5756117 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -27,12 +27,15 @@ import io.reactivex.Scheduler; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; -@Module(includes = MappingModule.class) +@Module(includes = { + MappingModule.class, + DaoModule.class +}) public class RepositoryModule { @Provides @Singleton - public static AccountRepository provideAccountRepository( + static AccountRepository provideAccountRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, @@ -42,7 +45,7 @@ public class RepositoryModule { @Provides @Singleton - public static PeerRepository providePeerRepository( + static PeerRepository providePeerRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, @@ -52,19 +55,17 @@ public class RepositoryModule { @Provides @Singleton - public static DirectChatRepository provideDirectChatRepository( + static DirectChatRepository provideDirectChatRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, - AccountMapping accountMapping, - PeerMapping peerMapping, DirectChatMapping directChatMapping) { - return new XmppDirectChatRepository(data, ioScheduler, uiScheduler, accountMapping, peerMapping, directChatMapping); + return new XmppDirectChatRepository(data, ioScheduler, uiScheduler, directChatMapping); } @Provides @Singleton - public static GroupChatRepository provideGroupChatRepository( + static GroupChatRepository provideGroupChatRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, @@ -74,7 +75,7 @@ public class RepositoryModule { @Provides @Singleton - public static MessageRepository provideMessageRepository( + static MessageRepository provideMessageRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, @@ -89,12 +90,10 @@ public class RepositoryModule { @Provides @Singleton - public static EntityCapsRepository provideCapsRepository( + static EntityCapsRepository provideCapsRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { return new EntityCapsRepository(data, ioScheduler, uiScheduler); } - - } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadContainerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadContainerMapping.java index 18624ed..4c06ab3 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadContainerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessagePayloadContainerMapping.java @@ -35,7 +35,7 @@ public class MessagePayloadContainerMapping extends AbstractMapping data, @@ -35,13 +36,14 @@ public class XmppAccountRepository AccountMapping accountMapping) { super(data, subscriberScheduler, observerScheduler); this.accountMapping = accountMapping; + this.dao = new AccountDao(data); } @Override public Single insertAccount(Account account) { return Single.just(account) .map(accountMapping::toModel) - .flatMap(data()::insert) + .flatMap(dao::insert) .map(model -> accountMapping.toEntity(model, account)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -49,9 +51,7 @@ public class XmppAccountRepository @Override public Observable> observeAccount(long accountId) { - return data().select(AccountModel.class) - .where(AccountModel.ID.eq(accountId)) - .get().observableResult() + return dao.get(accountId).observableResult() .map(ResultDelegate::firstOrNull) .map(accountMapping::toEntity) .map(Optional::new) @@ -61,9 +61,7 @@ public class XmppAccountRepository @Override public Maybe getAccount(long accountId) { - return data().select(AccountModel.class) - .where(AccountModel.ID.eq(accountId)) - .get().maybe() + return dao.get(accountId).maybe() .map(accountMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -71,9 +69,7 @@ public class XmppAccountRepository @Override public Observable> observeAccountByAddress(String address) { - return data().select(AccountModel.class) - .where(AccountModel.ADDRESS.eq(address)) - .get().observableResult() + return dao.get(address).observableResult() .map(ResultDelegate::firstOrNull) .map(accountMapping::toEntity) .map(Optional::new) @@ -83,9 +79,7 @@ public class XmppAccountRepository @Override public Maybe getAccountByAddress(String address) { - return data().select(AccountModel.class) - .where(AccountModel.ADDRESS.eq(address)) - .get().maybe() + return dao.get(address).maybe() .map(accountMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -93,16 +87,9 @@ public class XmppAccountRepository @Override public Observable> observeAllAccounts() { - return data().select(AccountModel.class) - .get().observableResult() + return dao.getAll().observableResult() .map(ResultDelegate::toList) - .map(list -> { - List entities = new ArrayList<>(list.size()); - for (AccountModel model : list) { - entities.add(accountMapping.toEntity(model)); - } - return entities; - }) + .map(this::modelsToEntities) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -112,13 +99,8 @@ public class XmppAccountRepository // 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 - // fetch model - return data().select(AccountModel.class) - .where(AccountModel.ID.eq(account.getId())) - .get().maybe().toSingle() - // copy changes from the entity to the model + return dao.get(account.getId()).maybe().toSingle() .map(model -> accountMapping.toModel(account, model)) - // write the updated model back .flatMap(updatedModel -> data().update(updatedModel)) .map(model -> accountMapping.toEntity(model, account)) .subscribeOn(subscriberScheduler()) @@ -127,19 +109,10 @@ public class XmppAccountRepository @Override public Single upsertAccount(Account account) { - // Try to fetch model - return data().select(AccountModel.class) - .where(AccountModel.ID.eq(account.getId())) - .get().maybe() - // If it does not exist, create a new model from the entity + return dao.get(account.getId()).maybe() .switchIfEmpty( - Single.just(account) - .map(accountMapping::toModel) - .flatMap(data()::insert) - ) - // update the model + Single.just(account).map(accountMapping::toModel).flatMap(dao::insert)) .map(model -> accountMapping.toModel(account, model)) - // write the updated model back .flatMap(data()::update) .map(model -> accountMapping.toEntity(model, account)) .subscribeOn(subscriberScheduler()) @@ -148,10 +121,16 @@ public class XmppAccountRepository @Override public Completable deleteAccount(Account account) { - return data().delete(AccountModel.class) - .where(AccountModel.ID.eq(account.getId())) - .get().single().ignoreElement() // to completable + return dao.delete(account.getId()).ignoreElement() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } + + private List modelsToEntities(List models) { + List entities = new ArrayList<>(models.size()); + for (AccountModel model : models) { + entities.add(accountMapping.toEntity(model)); + } + return entities; + } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index 164253e..ea3604c 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -31,10 +31,6 @@ public class XmppDirectChatRepository extends RequeryRepository implements DirectChatRepository { - private final AccountMapping accountMapping; - - private final PeerMapping peerMapping; - private final DirectChatMapping directChatMapping; private final DirectChatDao dao; @@ -44,14 +40,9 @@ public class XmppDirectChatRepository ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, - AccountMapping accountMapping, - PeerMapping peerMapping, DirectChatMapping directChatMapping) { super(data, subscriberScheduler, observerScheduler); - this.accountMapping = accountMapping; - this.peerMapping = peerMapping; this.directChatMapping = directChatMapping; - this.dao = new DirectChatDao(data); } @@ -69,9 +60,7 @@ public class XmppDirectChatRepository @Override public Observable> observeDirectChat(long chatId) { - return data().select(DirectChatModel.class) - .where(DirectChatModel.ID.eq(chatId)) - .get().observableResult() + return dao.get(chatId).observableResult() .map(ResultDelegate::firstOrNull) .map(directChatMapping::toEntity) .map(Optional::new) @@ -81,10 +70,8 @@ public class XmppDirectChatRepository @Override public Maybe getDirectChat(long chatId) { - return data().select(DirectChatModel.class) - .where(DirectChatModel.ID.eq(chatId)) - .get().maybe() - .map(result -> directChatMapping.toEntity(result, new IDirectChat())) + return dao.get(chatId).maybe() + .map(directChatMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -104,11 +91,9 @@ public class XmppDirectChatRepository @Override public Observable> observeDirectChatByPeer(Peer peer) { - return data().select(DirectChatModel.class) - .where(DirectChatModel.PEER_ID.eq(peer.getId())) - .get().observableResult() + return dao.getByPeer(peer.getId()).observableResult() .map(ReactiveResult::firstOrNull) - .map(model -> directChatMapping.toEntity(model, new IDirectChat())) + .map(directChatMapping::toEntity) .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -116,23 +101,20 @@ public class XmppDirectChatRepository @Override public Maybe getDirectChatByPeer(Peer peer) { - return data().select(DirectChatModel.class) - .where(DirectChatModel.PEER_ID.eq(peer.getId())) - .get().maybe() - .map(model -> directChatMapping.toEntity(model, new IDirectChat())) + return dao.getByPeer(peer.getId()).maybe() + .map(directChatMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @Override public Observable> observeAllDirectChats() { - return data().select(DirectChatModel.class) - .get().observableResult() + return dao.getAll().observableResult() .map(ResultDelegate::toList) .map(list -> { List entities = new ArrayList<>(list.size()); for (DirectChatModel model : list) { - entities.add(directChatMapping.toEntity(model, new IDirectChat())); + entities.add(directChatMapping.toEntity(model)); } return entities; }) @@ -142,9 +124,7 @@ public class XmppDirectChatRepository @Override public Single updateDirectChat(DirectChat chat) { - return dao.get(chat.getId()) - // fail if not exists - .toSingle() + return dao.get(chat.getId()).maybe().toSingle() .map(model -> directChatMapping.toModel(chat, model)) .flatMap(data()::update) .map(model -> directChatMapping.toEntity(model, chat)) @@ -152,23 +132,10 @@ public class XmppDirectChatRepository .observeOn(observerScheduler()); } - Single getOrCreateDirectChatModel(DirectChat chat) { - return data() - // fetch existing chat - .select(DirectChatModel.class) - .where(DirectChatModel.ID.eq(chat.getId())) - .get().maybe() - .switchIfEmpty( - // If not exists, insert chat as new model and return - data().insert(directChatMapping.toModel(chat, new DirectChatModel())) - ) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - @Override public Single upsertDirectChat(DirectChat chat) { - return getOrCreateDirectChatModel(chat) + return dao.get(chat.getId()).maybe() + .switchIfEmpty(dao.insert(directChatMapping.toModel(chat))) .map(directChatModel -> directChatMapping.toModel(chat, directChatModel)) .flatMap(data()::update) .map(model -> directChatMapping.toEntity(model, chat)) @@ -178,9 +145,8 @@ public class XmppDirectChatRepository @Override public Completable deleteDirectChat(DirectChat chat) { - return data().delete(DirectChatModel.class) - .where(DirectChatModel.ID.eq(chat.getId())) - .get().single().ignoreElement() + return dao.delete(chat.getId()) + .ignoreElement() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index f73f6dd..99a5b69 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -2,6 +2,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.model.GroupChatModel; +import org.mercury_im.messenger.data.repository.dao.GroupChatDao; import org.mercury_im.messenger.data.util.Optional; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; @@ -29,6 +30,8 @@ public class XmppGroupChatRepository private final GroupChatMapping groupChatMapping; + private final GroupChatDao dao; + @Inject public XmppGroupChatRepository( ReactiveEntityStore data, @@ -37,13 +40,14 @@ public class XmppGroupChatRepository GroupChatMapping groupChatMapping) { super(data, subscriberScheduler, observerScheduler); this.groupChatMapping = groupChatMapping; + this.dao = new GroupChatDao(data); } @Override public Single insertGroupChat(GroupChat chat) { return Single.just(chat) .map(groupChatMapping::toModel) - .flatMap(data()::insert) + .flatMap(dao::insert) .map(model -> groupChatMapping.toEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -51,9 +55,7 @@ public class XmppGroupChatRepository @Override public Observable> observeGroupChat(long chatId) { - return data().select(GroupChatModel.class) - .where(GroupChatModel.ID.eq(chatId)) - .get().observableResult() + return dao.get(chatId).observableResult() .map(ResultDelegate::firstOrNull) .map(groupChatMapping::toEntity) .map(Optional::new) @@ -63,9 +65,7 @@ public class XmppGroupChatRepository @Override public Maybe getGroupChat(long chatId) { - return data().select(GroupChatModel.class) - .where(GroupChatModel.ID.eq(chatId)) - .get().maybe() + return dao.get(chatId).maybe() .map(groupChatMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -88,10 +88,7 @@ public class XmppGroupChatRepository @Override public Observable> observeGroupChatByRoomAddress(long accountId, String roomAddress) { - return data().select(GroupChatModel.class) - .where(GroupChatModel.ADDRESS.eq(roomAddress)) - .and(GroupChatModel.ACCOUNT_ID.eq(accountId)) - .get().observableResult() + return dao.get(accountId, roomAddress).observableResult() .map(ResultDelegate::firstOrNull) .map(groupChatMapping::toEntity) .map(Optional::new) @@ -101,10 +98,7 @@ public class XmppGroupChatRepository @Override public Maybe getGroupChatByRoomAddress(long accountId, String roomAddress) { - return data().select(GroupChatModel.class) - .where(GroupChatModel.ADDRESS.eq(roomAddress)) - .and(GroupChatModel.ACCOUNT_ID.eq(accountId)) - .get().maybe() + return dao.get(accountId, roomAddress).maybe() .map(groupChatMapping::toEntity) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); @@ -112,8 +106,7 @@ public class XmppGroupChatRepository @Override public Observable> observeAllGroupChats() { - return data().select(GroupChatModel.class) - .get().observableResult() + return dao.getAll().observableResult() .map(ResultDelegate::toList) .map(list -> { List entities = new ArrayList<>(list.size()); @@ -128,40 +121,20 @@ public class XmppGroupChatRepository @Override public Single updateGroupChat(GroupChat chat) { - return data().select(GroupChatModel.class) - .where(GroupChatModel.ID.eq(chat.getId())) - .get().maybe().toSingle() // to single - // copy changes from entity to the model + return dao.get(chat.getId()).maybe().toSingle() .map(model -> groupChatMapping.toModel(chat, model)) - // write the updated model back .flatMap(data()::update) - // map back .map(model -> groupChatMapping.toEntity(model, chat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } - Single getOrCreateGroupChatModel(GroupChat chat) { - // fetch existing model - return data().select(GroupChatModel.class) - .where(GroupChatModel.ID.eq(chat.getId())) - .get().maybe() - // if not found, create a new one and insert it - .switchIfEmpty( - Single.just(chat) - .map(groupChatMapping::toModel) - .flatMap(data()::insert)) - .subscribeOn(subscriberScheduler()) - .observeOn(observerScheduler()); - } - @Override public Single upsertGroupChat(GroupChat chat) { - // Try to fetch model - return getOrCreateGroupChatModel(chat) - // update the model + return dao.get(chat.getId()).maybe() + .switchIfEmpty(Single.just(chat).map(groupChatMapping::toModel) + .flatMap(dao::insert)) .map(model -> groupChatMapping.toModel(chat, model)) - // write the updated model back .flatMap(data()::update) .map(model -> groupChatMapping.toEntity(model, chat)) .subscribeOn(subscriberScheduler()) @@ -170,9 +143,7 @@ public class XmppGroupChatRepository @Override public Completable deleteGroupChat(GroupChat chat) { - return data().delete(GroupChatModel.class) - .where(GroupChatModel.ID.eq(chat.getId())) - .get().single().ignoreElement() + return dao.delete(chat.getId()).ignoreElement() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java index 1a2a67f..60874e4 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java @@ -5,12 +5,20 @@ import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.mapping.MessageMapping; import org.mercury_im.messenger.data.model.DirectChatModel; import org.mercury_im.messenger.data.model.DirectMessagesRelation; +import org.mercury_im.messenger.data.model.GroupChatModel; +import org.mercury_im.messenger.data.model.GroupMessagesRelation; import org.mercury_im.messenger.data.model.MessageModel; +import org.mercury_im.messenger.data.model.MessagePayloadContainerModel; +import org.mercury_im.messenger.data.model.MessagePayloadModel; +import org.mercury_im.messenger.data.repository.dao.DirectChatDao; +import org.mercury_im.messenger.data.repository.dao.GroupChatDao; +import org.mercury_im.messenger.data.repository.dao.MessageDao; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.chat.GroupChat; import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.util.ThreadUtils; +import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -21,6 +29,7 @@ import io.reactivex.Observable; import io.reactivex.Scheduler; import io.reactivex.Single; import io.requery.Persistable; +import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; public class XmppMessageRepository @@ -33,6 +42,12 @@ public class XmppMessageRepository private final DirectChatRepository directChatRepository; private final GroupChatRepository groupChatRepository; + private final DirectChatDao directChatDao; + private final GroupChatDao groupChatDao; + + private final MessageDao dao; + + @Inject public XmppMessageRepository(ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, @@ -48,27 +63,17 @@ public class XmppMessageRepository this.groupChatMapping = groupChatMapping; this.directChatRepository = directChatRepository; this.groupChatRepository = groupChatRepository; + this.directChatDao = new DirectChatDao(data); + this.groupChatDao = new GroupChatDao(data); + this.dao = new MessageDao(data); } @Override public Single insertMessage(DirectChat chat, Message message) { - return data() - // fetch chat model - .select(DirectChatModel.class) - .where(DirectChatModel.ID.eq(chat.getId())) - .get().maybe() - // if not exists, insert chat into db - .switchIfEmpty(data().insert(directChatMapping.toModel(chat, new DirectChatModel()))) - // place chat and message in relation - .map(chatModel -> { - DirectMessagesRelation relation = new DirectMessagesRelation(); - relation.setChat(chatModel); - relation.setMessage(messageMapping.toModel(message, new MessageModel())); - return relation; - }) - // insert relation - .flatMap(relationModel -> data().insert(relationModel)) - // prepare resulting message to be returned + return directChatDao.get(chat.getId()).maybe() + .switchIfEmpty(directChatDao.insert(directChatMapping.toModel(chat))) + .map(chatModel -> toRelation(chatModel, messageMapping.toModel(message))) + .flatMap(data()::insert) .map(DirectMessagesRelation::getMessage) .map(messageModel -> messageMapping.toEntity(messageModel, message)) .subscribeOn(subscriberScheduler()) @@ -77,32 +82,99 @@ public class XmppMessageRepository @Override public Single insertMessage(GroupChat chat, Message message) { - return null; + return groupChatDao.get(chat.getId()).maybe() + .switchIfEmpty(groupChatDao.insert(groupChatMapping.toModel(chat))) + .map(chatModel -> toRelation(chatModel, messageMapping.toModel(message))) + .flatMap(data()::insert) + .map(GroupMessagesRelation::getMessage) + .map(messageModel -> messageMapping.toEntity(messageModel, message)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> observeMessages(DirectChat chat) { - return null; + return data().select(MessageModel.class) + .from(MessageModel.class) + .join(DirectMessagesRelation.class) + .on(DirectMessagesRelation.MESSAGE_ID.eq(MessageModel.ID)) + .get().observableResult() + .map(ResultDelegate::toList) + .map(this::messageModelsToEntities) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> observeMessages(GroupChat chat) { - return null; + return data().select(MessageModel.class) + .from(MessageModel.class) + .join(GroupMessagesRelation.class) + .on(GroupMessagesRelation.MESSAGE_ID.eq(MessageModel.ID)) + .where(GroupMessagesRelation.CHAT_ID.eq(chat.getId())) + .get().observableResult() + .map(ResultDelegate::toList) + .map(this::messageModelsToEntities) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> findMessagesWithBody(String body) { - return null; + return data().select(MessageModel.class) + .from(MessageModel.class) + .join(MessagePayloadContainerModel.class) + .on(MessagePayloadContainerModel.MESSAGE_ID.eq(MessageModel.ID)) + .join(MessagePayloadModel.class) + .on(MessagePayloadModel.PAYLOAD_CONTAINER_ID.eq(MessagePayloadContainerModel.ID)) + .where(MessagePayloadModel.BODY.eq(body)) + .get().observableResult() + .map(ResultDelegate::toList) + .map(this::messageModelsToEntities) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> findMessagesWithBody(DirectChat chat, String body) { - return null; + return data().select(MessageModel.class) + + .from(MessageModel.class) + .join(DirectMessagesRelation.class) + .on(DirectMessagesRelation.MESSAGE_ID.eq(MessageModel.ID)) + .join(MessagePayloadContainerModel.class) + .on(MessagePayloadContainerModel.MESSAGE_ID.eq(MessageModel.ID)) + .join(MessagePayloadModel.class) + .on(MessagePayloadModel.PAYLOAD_CONTAINER_ID.eq(MessagePayloadContainerModel.ID)) + + .where(MessagePayloadModel.BODY.eq(body)) + .and(DirectMessagesRelation.CHAT_ID.eq(chat.getId())) + .get().observableResult() + .map(ResultDelegate::toList) + .map(this::messageModelsToEntities) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Observable> findMessagesWithBody(GroupChat chat, String body) { - return null; + return data().select(MessageModel.class) + + .from(MessageModel.class) + .join(GroupMessagesRelation.class) + .on(GroupMessagesRelation.MESSAGE_ID.eq(MessageModel.ID)) + .join(MessagePayloadContainerModel.class) + .on(MessagePayloadContainerModel.MESSAGE_ID.eq(MessageModel.ID)) + .join(MessagePayloadModel.class) + .on(MessagePayloadModel.PAYLOAD_CONTAINER_ID.eq(MessagePayloadContainerModel.ID)) + + .where(MessagePayloadModel.BODY.eq(body)) + .and(GroupMessagesRelation.CHAT_ID.eq(chat.getId())) + .get().observableResult() + .map(ResultDelegate::toList) + .map(this::messageModelsToEntities) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override @@ -117,11 +189,38 @@ public class XmppMessageRepository @Override public Single updateMessage(Message message) { - return null; + return dao.get(message.getId()).maybe().toSingle() + .map(model -> messageMapping.toModel(message, model)) + .flatMap(data()::update) + .map(model -> messageMapping.toEntity(model, message)) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } @Override public Completable deleteMessage(Message message) { return null; } + + private DirectMessagesRelation toRelation(DirectChatModel chat, MessageModel message) { + DirectMessagesRelation relation = new DirectMessagesRelation(); + relation.setChat(chat); + relation.setMessage(message); + return relation; + } + + private GroupMessagesRelation toRelation(GroupChatModel chat, MessageModel message) { + GroupMessagesRelation relation = new GroupMessagesRelation(); + relation.setChat(chat); + relation.setMessage(message); + return relation; + } + + private List messageModelsToEntities(List models) { + List entities = new ArrayList<>(models.size()); + for (MessageModel model : models) { + entities.add(messageMapping.toEntity(model)); + } + return entities; + } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/AccountDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/AccountDao.java new file mode 100644 index 0000000..2aa5cca --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/AccountDao.java @@ -0,0 +1,45 @@ +package org.mercury_im.messenger.data.repository.dao; + +import org.mercury_im.messenger.data.model.AccountModel; + +import javax.inject.Inject; + +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveResult; + +public class AccountDao extends RequeryDao { + + @Inject + public AccountDao(ReactiveEntityStore data) { + super(data); + } + + public Single insert(AccountModel account) { + return data().insert(account); + } + + public ReactiveResult get(long accountId) { + return data().select(AccountModel.class) + .where(AccountModel.ID.eq(accountId)) + .get(); + } + + public ReactiveResult get(String address) { + return data().select(AccountModel.class) + .where(AccountModel.ADDRESS.eq(address)) + .get(); + } + + public ReactiveResult getAll() { + return data().select(AccountModel.class) + .get(); + } + + public Single delete(long accountId) { + return data().delete(AccountModel.class) + .where(AccountModel.ID.eq(accountId)) + .get().single(); + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java index c66ecea..ffe372b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java @@ -2,24 +2,45 @@ package org.mercury_im.messenger.data.repository.dao; import org.mercury_im.messenger.data.model.DirectChatModel; -import io.reactivex.Maybe; +import javax.inject.Inject; + import io.reactivex.Single; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveResult; public class DirectChatDao extends RequeryDao { + @Inject public DirectChatDao(ReactiveEntityStore data) { super(data); } - public Single insert(DirectChatModel model) { - return data().insert(model); + public Single insert(DirectChatModel chat) { + return data().insert(chat); } - public Maybe get(long chatId) { + public ReactiveResult get(long chatId) { return data().select(DirectChatModel.class) .where(DirectChatModel.ID.eq(chatId)) - .get().maybe(); + .get(); + } + + public ReactiveResult getByPeer(long peerId) { + return data().select(DirectChatModel.class) + .where(DirectChatModel.PEER_ID.eq(peerId)) + .get(); + } + + public ReactiveResult getAll() { + return data().select(DirectChatModel.class) + .get(); + } + + public Single delete(long chatId) { + return data().delete(DirectChatModel.class) + .where(DirectChatModel.ID.eq(chatId)) + .get() + .single(); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/GroupChatDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/GroupChatDao.java new file mode 100644 index 0000000..571f5c9 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/GroupChatDao.java @@ -0,0 +1,47 @@ +package org.mercury_im.messenger.data.repository.dao; + +import org.mercury_im.messenger.data.model.GroupChatModel; + +import javax.inject.Inject; + +import io.reactivex.Single; +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveResult; + +public class GroupChatDao extends RequeryDao { + + @Inject + public GroupChatDao(ReactiveEntityStore data) { + super(data); + } + + public Single insert(GroupChatModel chat) { + return data().insert(chat); + } + + public ReactiveResult get(long chatId) { + return data().select(GroupChatModel.class) + .where(GroupChatModel.ID.eq(chatId)) + .get(); + } + + public ReactiveResult get(long accountId, String address) { + return data().select(GroupChatModel.class) + .where(GroupChatModel.ACCOUNT_ID.eq(accountId)) + .and(GroupChatModel.ADDRESS.eq(address)) + .get(); + } + + public ReactiveResult getAll() { + return data().select(GroupChatModel.class) + .get(); + } + + public Single delete(long chatId) { + return data().delete(GroupChatModel.class) + .where(GroupChatModel.ID.eq(chatId)) + .get() + .single(); + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java new file mode 100644 index 0000000..b0abaee --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java @@ -0,0 +1,45 @@ +package org.mercury_im.messenger.data.repository.dao; + +import org.mercury_im.messenger.data.model.DirectChatModel; +import org.mercury_im.messenger.data.model.DirectMessagesRelation; +import org.mercury_im.messenger.data.model.GroupChatModel; +import org.mercury_im.messenger.data.model.GroupMessagesRelation; +import org.mercury_im.messenger.data.model.MessageModel; + +import io.requery.Persistable; +import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveResult; + +public class MessageDao extends RequeryDao { + + private final DirectChatDao directChatDao; + private final GroupChatDao groupChatDao; + + public MessageDao(ReactiveEntityStore data) { + super(data); + this.directChatDao = new DirectChatDao(data); + this.groupChatDao = new GroupChatDao(data); + } + + public ReactiveResult get(long messageId) { + return data().select(MessageModel.class) + .where(MessageModel.ID.eq(messageId)) + .get(); + } + + + + private DirectMessagesRelation toRelation(DirectChatModel chat, MessageModel message) { + DirectMessagesRelation relation = new DirectMessagesRelation(); + relation.setChat(chat); + relation.setMessage(message); + return relation; + } + + private GroupMessagesRelation toRelation(GroupChatModel chat, MessageModel message) { + GroupMessagesRelation relation = new GroupMessagesRelation(); + relation.setChat(chat); + relation.setMessage(message); + return relation; + } +} From 366d9b9df8b08a3b92582dbc464a6d5080adf79a Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 8 Dec 2019 22:49:42 +0100 Subject: [PATCH 37/83] Fix message mapping --- .../messenger/data/di/DaoModule.java | 11 +++++-- .../messenger/data/di/RepositoryModule.java | 8 ++--- .../data/mapping/MessageMapping.java | 15 +++++++++- .../data/model/AbstractMessageModel.java | 5 +++- .../repository/XmppMessageRepository.java | 29 +++++++++++-------- .../data/repository/dao/MessageDao.java | 5 ++++ .../repository/AccountRepositoryTest.java | 29 +++++++++++++++++++ 7 files changed, 81 insertions(+), 21 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/DaoModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/DaoModule.java index 8d9c3ef..3b472d1 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/DaoModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/DaoModule.java @@ -3,6 +3,7 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.repository.dao.AccountDao; import org.mercury_im.messenger.data.repository.dao.DirectChatDao; import org.mercury_im.messenger.data.repository.dao.GroupChatDao; +import org.mercury_im.messenger.data.repository.dao.MessageDao; import javax.inject.Singleton; @@ -22,13 +23,19 @@ public class DaoModule { @Provides @Singleton - public static DirectChatDao provideDirectChatDao(ReactiveEntityStore data) { + static DirectChatDao provideDirectChatDao(ReactiveEntityStore data) { return new DirectChatDao(data); } @Provides @Singleton - public static GroupChatDao provideGroupChatDao(ReactiveEntityStore data) { + static GroupChatDao provideGroupChatDao(ReactiveEntityStore data) { return new GroupChatDao(data); } + + @Provides + @Singleton + static MessageDao provideMessageDao(ReactiveEntityStore data) { + return new MessageDao(data); + } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index 5756117..68fcca9 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -81,11 +81,9 @@ public class RepositoryModule { @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, MessageMapping messageMapping, DirectChatMapping directChatMapping, - GroupChatMapping groupChatMapping, - DirectChatRepository directChatRepository, - GroupChatRepository groupChatRepository) { - return new XmppMessageRepository(data, ioScheduler, uiScheduler, messageMapping, - directChatMapping, groupChatMapping, directChatRepository, groupChatRepository); + GroupChatMapping groupChatMapping) { + return new XmppMessageRepository(data, ioScheduler, uiScheduler, + messageMapping, directChatMapping, groupChatMapping); } @Provides diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java index 0f1a295..34e4c71 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java @@ -6,6 +6,9 @@ import org.mercury_im.messenger.entity.message.IMessage; import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.entity.message.PayloadContainer; +import java.util.ArrayList; +import java.util.List; + import javax.inject.Inject; public class MessageMapping extends AbstractMapping { @@ -45,6 +48,16 @@ public class MessageMapping extends AbstractMapping { @Override public Message mapToEntity(MessageModel model, Message entity) { - return null; + entity.setId(model.getId()); + entity.setSender(model.getSender()); + entity.setRecipient(model.getRecipient()); + entity.setTimestamp(model.getTimestamp()); + + List payloadContainers = new ArrayList<>(entity.getMessagePayloads().size()); + for (MessagePayloadContainerModel containerModel : model.getPayloads()) { + payloadContainers.add(messagePayloadContainerMapping.toEntity(containerModel)); + } + entity.setMessagePayloads(payloadContainers); + return entity; } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index 72c3971..a773d83 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -30,12 +30,15 @@ public abstract class AbstractMessageModel implements Persistable { @OneToMany Set payloads; - @Column(nullable = false) + @Column String legacyId; + @Column String originId; + @Column String stanzaId; + @Column String stanzaIdBy; } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java index 60874e4..9a5f8b7 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java @@ -39,8 +39,6 @@ public class XmppMessageRepository private final MessageMapping messageMapping; private final DirectChatMapping directChatMapping; private final GroupChatMapping groupChatMapping; - private final DirectChatRepository directChatRepository; - private final GroupChatRepository groupChatRepository; private final DirectChatDao directChatDao; private final GroupChatDao groupChatDao; @@ -50,19 +48,15 @@ public class XmppMessageRepository @Inject public XmppMessageRepository(ReactiveEntityStore data, - @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, - MessageMapping messageMapping, - DirectChatMapping directChatMapping, - GroupChatMapping groupChatMapping, - DirectChatRepository directChatRepository, - GroupChatRepository groupChatRepository) { + @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + MessageMapping messageMapping, + DirectChatMapping directChatMapping, + GroupChatMapping groupChatMapping) { super(data, subscriberScheduler, observerScheduler); this.messageMapping = messageMapping; this.directChatMapping = directChatMapping; this.groupChatMapping = groupChatMapping; - this.directChatRepository = directChatRepository; - this.groupChatRepository = groupChatRepository; this.directChatDao = new DirectChatDao(data); this.groupChatDao = new GroupChatDao(data); this.dao = new MessageDao(data); @@ -180,6 +174,15 @@ public class XmppMessageRepository @Override public Single upsertMessage(DirectChat chat, Message message) { return null; + /* + return data().select(DirectMessagesRelation.class) + .where(DirectMessagesRelation.CHAT_ID.eq(chat.getId())) + .and(DirectMessagesRelation.MESSAGE_ID.eq(message.getId())) + .get().maybe() + .switchIfEmpty(Single.just(message) + .map(messageMapping::toModel) + .flatMap(messageModel -> ) + */ } @Override @@ -199,7 +202,9 @@ public class XmppMessageRepository @Override public Completable deleteMessage(Message message) { - return null; + return data().delete(MessageModel.class) + .where(MessageModel.ID.eq(message.getId())) + .get().single().ignoreElement(); } private DirectMessagesRelation toRelation(DirectChatModel chat, MessageModel message) { diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java index b0abaee..5e8bc8f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java @@ -6,6 +6,7 @@ import org.mercury_im.messenger.data.model.GroupChatModel; import org.mercury_im.messenger.data.model.GroupMessagesRelation; import org.mercury_im.messenger.data.model.MessageModel; +import io.reactivex.Single; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; import io.requery.reactivex.ReactiveResult; @@ -21,6 +22,10 @@ public class MessageDao extends RequeryDao { this.groupChatDao = new GroupChatDao(data); } + public Single insert(MessageModel message) { + return data().insert(message); + } + public ReactiveResult get(long messageId) { return data().select(MessageModel.class) .where(MessageModel.ID.eq(messageId)) diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 3180528..730f4bc 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -10,6 +10,17 @@ import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.chat.IDirectChat; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.message.IMessage; +import org.mercury_im.messenger.entity.message.IPayloadContainer; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.entity.message.PayloadContainer; +import org.mercury_im.messenger.entity.message.content.TextPayload; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; import javax.inject.Inject; @@ -32,6 +43,9 @@ public class AccountRepositoryTest { @Inject XmppPeerRepository contactRepository; + @Inject + XmppMessageRepository messageRepository; + @Inject public AccountRepositoryTest() { RepositoryTestComponent testComponent = DaggerRepositoryTestComponent.builder() @@ -62,6 +76,21 @@ public class AccountRepositoryTest { .blockingGet(); assertEquals(1, chatModel.getId()); + Message message = new IMessage(); + message.setSender("test@test.test"); + message.setRecipient("peer@peer.peer"); + message.setTimestamp(new Date()); + PayloadContainer container = new IPayloadContainer(); + TextPayload body = new TextPayload(); + body.setBody("Hallo"); + container.setMessageContents(Collections.singletonList(body)); + List payloadContainers = new ArrayList<>(); + payloadContainers.add(container); + message.setMessagePayloads(payloadContainers); + + Message _message = messageRepository.insertMessage(directChat, message) + .blockingGet(); + dataStore.close(); } } From 9882d159beff99f78885732632b0d0562c90e145 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 9 Dec 2019 00:28:21 +0100 Subject: [PATCH 38/83] Add some mapping tests --- ...nt.java => InMemoryDatabaseComponent.java} | 2 +- .../data/di/MappingTestComponent.java | 18 ++++ .../data/mapping/AccountMappingTest.java | 84 +++++++++++++++++++ .../data/mapping/PeerMappingTest.java | 50 +++++++++++ .../repository/AccountRepositoryTest.java | 7 +- 5 files changed, 156 insertions(+), 5 deletions(-) rename data/src/test/java/org/mercury_im/messenger/data/di/{RepositoryTestComponent.java => InMemoryDatabaseComponent.java} (88%) create mode 100644 data/src/test/java/org/mercury_im/messenger/data/di/MappingTestComponent.java create mode 100644 data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java create mode 100644 data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java diff --git a/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java b/data/src/test/java/org/mercury_im/messenger/data/di/InMemoryDatabaseComponent.java similarity index 88% rename from data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java rename to data/src/test/java/org/mercury_im/messenger/data/di/InMemoryDatabaseComponent.java index 2fe90a9..37e71d6 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/di/RepositoryTestComponent.java +++ b/data/src/test/java/org/mercury_im/messenger/data/di/InMemoryDatabaseComponent.java @@ -12,7 +12,7 @@ import dagger.Component; TestingSchedulerModule.class }) @Singleton -public interface RepositoryTestComponent { +public interface InMemoryDatabaseComponent { void inject(AccountRepositoryTest test); } diff --git a/data/src/test/java/org/mercury_im/messenger/data/di/MappingTestComponent.java b/data/src/test/java/org/mercury_im/messenger/data/di/MappingTestComponent.java new file mode 100644 index 0000000..c804283 --- /dev/null +++ b/data/src/test/java/org/mercury_im/messenger/data/di/MappingTestComponent.java @@ -0,0 +1,18 @@ +package org.mercury_im.messenger.data.di; + + +import org.mercury_im.messenger.data.mapping.AccountMappingTest; +import org.mercury_im.messenger.data.mapping.PeerMappingTest; + +import javax.inject.Singleton; + +import dagger.Component; + +@Component(modules = MappingModule.class) +@Singleton +public interface MappingTestComponent { + + void inject(AccountMappingTest test); + + void inject(PeerMappingTest test); +} diff --git a/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java b/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java new file mode 100644 index 0000000..1f921b4 --- /dev/null +++ b/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java @@ -0,0 +1,84 @@ +package org.mercury_im.messenger.data.mapping; + +import org.junit.Test; +import org.mercury_im.messenger.data.di.DaggerMappingTestComponent; +import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.IAccount; +import org.mercury_im.messenger.entity.PasswordAuthentication; + +import java.lang.reflect.Field; + +import javax.inject.Inject; + +import io.requery.proxy.EntityProxy; + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNotSame; + +public class AccountMappingTest { + + @Inject + AccountMapping accountMapping; + + public static final Account ACCOUNT_MISSION_CONTROL; + public static final Account ACCOUNT_LITTLE_JOE; + + static { + ACCOUNT_MISSION_CONTROL = new IAccount(); + ACCOUNT_MISSION_CONTROL.setId(1); + ACCOUNT_MISSION_CONTROL.setAddress("mission-controll@planet.earth"); + ACCOUNT_MISSION_CONTROL.setEnabled(true); + ACCOUNT_MISSION_CONTROL.setAuthentication(new PasswordAuthentication("notBecauseItIsEasy")); + + ACCOUNT_LITTLE_JOE = new IAccount(); + ACCOUNT_LITTLE_JOE.setId(2); + ACCOUNT_LITTLE_JOE.setAddress("little-joe@planet.earth"); + ACCOUNT_LITTLE_JOE.setEnabled(false); + ACCOUNT_LITTLE_JOE.setAuthentication(new PasswordAuthentication("butBecauseItIsHard")); + } + + public AccountMappingTest() { + DaggerMappingTestComponent.create().inject(this); + } + + @Test + public void entityToModel() { + + AccountModel model = accountMapping.toModel(ACCOUNT_MISSION_CONTROL); + + assertEquals("Since we cannot set the id of the model in the mapper, it is still 0.", + 0, model.getId()); + assertNotSame(ACCOUNT_MISSION_CONTROL.getId(), model.getId()); + assertEquals(ACCOUNT_MISSION_CONTROL.getAddress(), model.getAddress()); + assertEquals(ACCOUNT_MISSION_CONTROL.getAuthentication().getPassword(), model.getPassword()); + assertEquals(ACCOUNT_MISSION_CONTROL.isEnabled(), model.isEnabled()); + } + + @Test + public void modelToEntity() throws NoSuchFieldException, IllegalAccessException { + AccountModel model = new AccountModel(); + model.getId(); + model.setAddress("model@entity.store"); + model.setEnabled(true); + model.setPassword("12345"); + + // I hate reflections... Set ID to 12 + setIdUsingReflections(model, 12L); + + assertEquals(12L, model.getId()); + + Account entity = accountMapping.toEntity(model); + + assertEquals(model.getId(), entity.getId()); + assertEquals(model.getAddress(), entity.getAddress()); + assertEquals(model.getPassword(), entity.getAuthentication().getPassword()); + } + + private void setIdUsingReflections(AccountModel model, long id) throws NoSuchFieldException, IllegalAccessException { + Field field = model.getClass().getDeclaredField("$proxy"); + field.setAccessible(true); + EntityProxy proxy = (EntityProxy) field.get(model); + proxy.set(AccountModel.ID, id); + } +} diff --git a/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java b/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java new file mode 100644 index 0000000..c3d7c36 --- /dev/null +++ b/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java @@ -0,0 +1,50 @@ +package org.mercury_im.messenger.data.mapping; + +import org.junit.Test; +import org.mercury_im.messenger.data.di.DaggerMappingTestComponent; +import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.data.model.PeerModel; +import org.mercury_im.messenger.entity.contact.IPeer; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.contact.SubscriptionMode; + +import javax.inject.Inject; + +import static junit.framework.TestCase.assertEquals; + +public class PeerMappingTest { + + @Inject + PeerMapping peerMapping; + + public static final Peer PEER_GORDO; + + static { + PEER_GORDO = new IPeer(); + PEER_GORDO.setAccount(AccountMappingTest.ACCOUNT_MISSION_CONTROL); + PEER_GORDO.setId(1); + PEER_GORDO.setAddress("gordo@big.joe"); + PEER_GORDO.setName("Gordo"); + PEER_GORDO.setSubscriptionMode(SubscriptionMode.TO_THEM_ACCEPTED_PREAPPROVED); + } + + public PeerMappingTest() { + DaggerMappingTestComponent.create().inject(this); + } + + @Test + public void entityToModel() { + PeerModel model = peerMapping.toModel(PEER_GORDO); + assertEquals(PEER_GORDO.getAddress(), model.getAddress()); + assertEquals(PEER_GORDO.getAccount().getAddress(), model.getAccount().getAddress()); + assertEquals(PEER_GORDO.getName(), model.getName()); + } + + @Test + public void modelToEntity() { + PeerModel model = new PeerModel(); + model.setName("Gordo"); + model.setAddress("gordo@big.joe"); + model.setAccount(new AccountModel()); + } +} diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 730f4bc..17f0620 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -1,8 +1,8 @@ package org.mercury_im.messenger.data.repository; import org.junit.Test; -import org.mercury_im.messenger.data.di.DaggerRepositoryTestComponent; -import org.mercury_im.messenger.data.di.RepositoryTestComponent; +import org.mercury_im.messenger.data.di.DaggerInMemoryDatabaseComponent; +import org.mercury_im.messenger.data.di.InMemoryDatabaseComponent; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.entity.PasswordAuthentication; @@ -17,7 +17,6 @@ import org.mercury_im.messenger.entity.message.PayloadContainer; import org.mercury_im.messenger.entity.message.content.TextPayload; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; @@ -48,7 +47,7 @@ public class AccountRepositoryTest { @Inject public AccountRepositoryTest() { - RepositoryTestComponent testComponent = DaggerRepositoryTestComponent.builder() + InMemoryDatabaseComponent testComponent = DaggerInMemoryDatabaseComponent.builder() .build(); testComponent.inject(this); } From b3b05a42b6ea91e1bee2f30e4f02b7d062260cc1 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 9 Dec 2019 13:50:26 +0100 Subject: [PATCH 39/83] Refactoring in app module --- app/src/main/AndroidManifest.xml | 2 +- .../messenger/MercuryImApplication.java | 8 ++- .../messenger/di/component/AppComponent.java | 5 +- ...ice.java => MercuryConnectionService.java} | 50 ++++++------------- .../messenger/ui/chat/ChatInputFragment.java | 7 +-- .../ui/chatlist/ChatListFragment.java | 10 ++-- .../messenger/ui/login/AccountsFragment.java | 1 - .../ui/login/AccountsRecyclerViewAdapter.java | 3 +- .../messenger/ui/login/LoginViewModel.java | 1 - .../repository/XmppAccountRepository.java | 2 +- .../repository/XmppDirectChatRepository.java | 4 +- .../repository/XmppGroupChatRepository.java | 2 +- .../data/repository/XmppPeerRepository.java | 2 +- .../org/mercury_im/messenger/Messenger.java | 10 ++++ .../data/repository/AccountRepository.java | 2 +- .../data/repository/DirectChatRepository.java | 3 +- .../data/repository/GroupChatRepository.java | 3 +- .../data/repository/PeerRepository.java | 2 +- .../messenger/{data => }/util/Optional.java | 2 +- 19 files changed, 50 insertions(+), 69 deletions(-) rename app/src/main/java/org/mercury_im/messenger/service/{XmppConnectionService.java => MercuryConnectionService.java} (65%) rename domain/src/main/java/org/mercury_im/messenger/{data => }/util/Optional.java (89%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 37827cb..f39d433 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,7 +35,7 @@ - + \ No newline at end of file diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index a2270f6..82c5af4 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -12,7 +12,7 @@ import android.os.Build; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; -import org.mercury_im.messenger.service.XmppConnectionService; +import org.mercury_im.messenger.service.MercuryConnectionService; import org.mercury_im.messenger.util.AbstractActivityLifecycleCallbacks; import java.util.concurrent.atomic.AtomicBoolean; @@ -21,8 +21,6 @@ import java.util.concurrent.atomic.AtomicInteger; public class MercuryImApplication extends Application { - public static final String TAG = "Mercury-IM"; - static { // Initialize Smack etc. // new MercuryConfiguration(); @@ -54,9 +52,9 @@ public class MercuryImApplication extends Application { initializeNotificationChannels(this); - Intent serviceIntent = new Intent(getApplicationContext(), XmppConnectionService.class); + Intent serviceIntent = new Intent(getApplicationContext(), MercuryConnectionService.class); - serviceIntent.setAction(XmppConnectionService.ACTION_START); + serviceIntent.setAction(MercuryConnectionService.ACTION_START); if (Build.VERSION.SDK_INT < 26) { startService(serviceIntent); } else { diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index 84ff078..8c8f752 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -1,11 +1,10 @@ package org.mercury_im.messenger.di.component; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.data.di.MappingModule; import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.di.module.AppModule; -import org.mercury_im.messenger.service.XmppConnectionService; +import org.mercury_im.messenger.service.MercuryConnectionService; import org.mercury_im.messenger.ui.MainActivity; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.chat.ChatInputFragment; @@ -67,6 +66,6 @@ public interface AppComponent { // Services - void inject(XmppConnectionService service); + void inject(MercuryConnectionService service); } diff --git a/app/src/main/java/org/mercury_im/messenger/service/XmppConnectionService.java b/app/src/main/java/org/mercury_im/messenger/service/MercuryConnectionService.java similarity index 65% rename from app/src/main/java/org/mercury_im/messenger/service/XmppConnectionService.java rename to app/src/main/java/org/mercury_im/messenger/service/MercuryConnectionService.java index 8f5ce85..981bd31 100644 --- a/app/src/main/java/org/mercury_im/messenger/service/XmppConnectionService.java +++ b/app/src/main/java/org/mercury_im/messenger/service/MercuryConnectionService.java @@ -6,7 +6,6 @@ import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; -import android.util.Log; import androidx.annotation.NonNull; import androidx.core.app.NotificationCompat; @@ -22,36 +21,16 @@ import org.mercury_im.messenger.ui.MainActivity; * Started, Bound Service, which is responsible for managing {@link XMPPConnection XMPPConnections} * affiliated with registered accounts. */ -public class XmppConnectionService extends Service { - - private static final String TAG = MercuryImApplication.TAG; +public class MercuryConnectionService extends Service { private static final String APP = "org.mercury-im.messenger"; - private static final String SERVICE = APP + ".XmppConnectionService"; + private static final String SERVICE = APP + ".MercuryConnectionService"; private static final String ACTION = SERVICE + ".ACTION"; - private static final String EVENT = SERVICE + ".EVENT"; - private static final String EXTRA = SERVICE + ".EXTRA"; - private static final String STATUS = SERVICE + ".STATUS"; // ACTIONS public static final String ACTION_START = ACTION + ".START"; public static final String ACTION_STOP = ACTION + ".STOP"; - public static final String ACTION_CONNECT = ACTION + ".CONNECT"; - public static final String ACTION_DISCONNECT = ACTION + ".DISCONNECT"; - public static final String ACTION_PING = ACTION + ".PING"; - - // EVENTS - public static final String EVENT_INCOMING_MESSAGE = EVENT + ".INCOMING_MESSAGE"; - public static final String EVENT_OUTGOING_MESSAGE = EVENT + ".OUTGOING_MESSAGE"; - - // EXTRAS - public static final String EXTRA_CONFIGURATION = EXTRA + ".CONFIGURATION"; - public static final String EXTRA_ACCOUNT_ID = EXTRA + ".ACCOUNT_ID"; - - // STATUSES - public static final String STATUS_SUCCESS = STATUS + ".SUCCESS"; - public static final String STATUS_FAILURE = STATUS + ".FAILURE"; @NonNull @@ -63,27 +42,31 @@ public class XmppConnectionService extends Service { @Override public void onCreate() { super.onCreate(); - Log.d(TAG, "onCreate()"); MercuryImApplication.getApplication().getAppComponent().inject(this); + beginLifecycleOfPingManager(); + } - // Begin life cycle of Ping Manager. - // The Manager will automatically detect newly created connections and ping the server - // every half hour if necessary. + /** + * PingManager will ensure the XMPP connection is kept alive. + * TODO: Move out of this service/module + */ + private void beginLifecycleOfPingManager() { ServerPingWithAlarmManager.onCreate(this); } @Override public void onDestroy() { super.onDestroy(); - Log.d(TAG, "onDestroy()"); - // End life cycle of Ping Manager. + endLifecycleOfPingManager(); + } + + private void endLifecycleOfPingManager() { ServerPingWithAlarmManager.onDestroy(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { - Log.d(TAG, "onStartCommand(" + intent + ")"); if (intent == null) { startAndDisplayForegroundNotification(); } else { @@ -107,7 +90,6 @@ public class XmppConnectionService extends Service { } public void startAndDisplayForegroundNotification() { - Log.d(TAG, "startAndDisplayForegroundNotification()"); Notification notification = getForegroundNotification(getApplicationContext()); startForeground(Notifications.FOREGROUND_SERVICE_ID, notification); @@ -126,13 +108,13 @@ public class XmppConnectionService extends Service { public class Binder extends android.os.Binder { - private final XmppConnectionService service; + private final MercuryConnectionService service; - public Binder(XmppConnectionService service) { + public Binder(MercuryConnectionService service) { this.service = service; } - public XmppConnectionService getService() { + public MercuryConnectionService getService() { return service; } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatInputFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatInputFragment.java index 9a02bff..1de0c9f 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatInputFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatInputFragment.java @@ -1,6 +1,5 @@ package org.mercury_im.messenger.ui.chat; -import static org.mercury_im.messenger.MercuryImApplication.TAG; import android.content.Context; import android.os.Bundle; @@ -14,7 +13,7 @@ import android.widget.ImageButton; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import androidx.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModelProvider; import butterknife.BindView; import butterknife.ButterKnife; @@ -48,7 +47,6 @@ public class ChatInputFragment extends Fragment implements View.OnClickListener @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - Log.d(TAG, "onCreateView"); View view = inflater.inflate(R.layout.view_compose, container, false); ButterKnife.bind(this, view); return view; @@ -57,7 +55,7 @@ public class ChatInputFragment extends Fragment implements View.OnClickListener @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - mViewModel = ViewModelProviders.of(this).get(ChatInputViewModel.class); + mViewModel = new ViewModelProvider(this).get(ChatInputViewModel.class); observeViewModel(mViewModel); } @@ -97,7 +95,6 @@ public class ChatInputFragment extends Fragment implements View.OnClickListener @Override @OnClick({R.id.btn_send, R.id.btn_media, R.id.btn_emoji}) public void onClick(View view) { - Log.d(TAG, "onClick!"); switch (view.getId()) { // Add media case R.id.btn_media: diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java index 468c041..fa4aca3 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java @@ -1,6 +1,5 @@ package org.mercury_im.messenger.ui.chatlist; -import static org.mercury_im.messenger.MercuryImApplication.TAG; import android.content.Context; import android.os.Bundle; @@ -13,7 +12,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import androidx.lifecycle.ViewModelProviders; +import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; @@ -21,6 +20,7 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu import butterknife.BindView; import butterknife.ButterKnife; +import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; public class ChatListFragment extends Fragment { @@ -61,13 +61,13 @@ public class ChatListFragment extends Fragment { @Override public void onAttach(Context context) { super.onAttach(context); - viewModel = ViewModelProviders.of(getActivity()).get(ChatListViewModel.class); + viewModel = new ViewModelProvider(getActivity()).get(ChatListViewModel.class); viewModel.getChats().observe(this, chatModels -> { if (chatModels == null) { - Log.d(TAG, "Displaying null chats"); + Log.d(Messenger.TAG, "Displaying null chats"); return; } - Log.d(TAG, "Displaying " + chatModels.size() + " chats"); + Log.d(Messenger.TAG, "Displaying " + chatModels.size() + " chats"); recyclerViewAdapter.setModels(chatModels); }); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java index 094bae9..07ac534 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java @@ -63,7 +63,6 @@ public class AccountsFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - Log.d(MercuryImApplication.TAG, "AccountsFragment.onCreateView"); View view = inflater.inflate(R.layout.fragment_account_list, container, false); ButterKnife.bind(this, view); viewModel = new ViewModelProvider(this).get(AccountsViewModel.class); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java index 564494e..aba0233 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java @@ -12,6 +12,7 @@ import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.login.AccountsFragment.OnAccountListItemClickListener; @@ -74,7 +75,7 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter() { @Override public void onSuccess(Account inserted) { - Log.d(MercuryImApplication.TAG, "LoginActivity.loginDetailsEntered: Account " + inserted.getId() + " inserted."); // connectionCenter.createConnection(account); signinSuccessful.setValue(true); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 57f159b..aae3f4b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -3,7 +3,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.repository.dao.AccountDao; -import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.util.ThreadUtils; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index ea3604c..ce37e84 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -1,11 +1,9 @@ package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; -import org.mercury_im.messenger.data.mapping.PeerMapping; import org.mercury_im.messenger.data.model.DirectChatModel; import org.mercury_im.messenger.data.repository.dao.DirectChatDao; -import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.chat.IDirectChat; import org.mercury_im.messenger.entity.contact.Peer; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index 99a5b69..fec5567 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -3,7 +3,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.model.GroupChatModel; import org.mercury_im.messenger.data.repository.dao.GroupChatDao; -import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; import org.mercury_im.messenger.entity.chat.IGroupChat; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index 2d18c3a..bb7d894 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -2,7 +2,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.data.mapping.PeerMapping; import org.mercury_im.messenger.data.model.PeerModel; -import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index a3cb79d..75fab40 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -13,6 +13,8 @@ import javax.inject.Inject; public class Messenger { + public static final String TAG = "MercuryIM"; + private final Map connections = new HashMap<>(); @Inject @@ -33,4 +35,12 @@ public class Messenger { public ConnectionMethod getConnection(Account account) { return connections.get(account.getId()); } + + public void appInUse() { + + } + + public void appInBackground() { + + } } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java index f24af5c..7138482 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java @@ -1,7 +1,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.Optional; import java.util.List; diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index 1970954..ed592d0 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -1,9 +1,8 @@ package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.contact.Peer; -import org.mercury_im.messenger.entity.message.Message; import java.util.List; diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java index a5d6ebb..a86abad 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java @@ -2,8 +2,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; -import org.mercury_im.messenger.entity.message.Message; -import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.Optional; import java.util.List; diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java index 8e081e0..cb4a64d 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java @@ -1,6 +1,6 @@ package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.Peer; diff --git a/domain/src/main/java/org/mercury_im/messenger/data/util/Optional.java b/domain/src/main/java/org/mercury_im/messenger/util/Optional.java similarity index 89% rename from domain/src/main/java/org/mercury_im/messenger/data/util/Optional.java rename to domain/src/main/java/org/mercury_im/messenger/util/Optional.java index c334483..ced8945 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/util/Optional.java +++ b/domain/src/main/java/org/mercury_im/messenger/util/Optional.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.data.util; +package org.mercury_im.messenger.util; /** * Since j.u.Optional is only available on Android since API lvl 24, we need this utility class. From 6d4033e92332027aa078584ab74a8b3c27094735 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 9 Dec 2019 15:49:59 +0100 Subject: [PATCH 40/83] Refactoring app --- app/build.gradle | 2 +- .../messenger/di/component/AppComponent.java | 4 +- .../messenger/di/module/AppModule.java | 5 +- .../messenger/ui/login/AccountsFragment.java | 9 -- .../messenger/ui/login/LoginActivity.java | 148 ++++++++++-------- .../messenger/ui/login/LoginViewModel.java | 49 +++--- .../ui/settings/SettingsActivity.java | 2 +- app/src/main/res/layout/activity_login.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- .../domain/data/util/ContactNameUtil.java | 22 +-- .../messenger/data/di/RepositoryModule.java | 13 ++ .../messenger/data/enums/SaslCondition.java | 6 +- .../org/mercury_im/messenger/Messenger.java | 16 +- .../account/error/PasswordError.java | 8 + .../account/error/UsernameError.java | 8 + .../data/repository/Repositories.java | 45 ++++++ .../messenger/di/module/MercuryModule.java | 23 +++ .../messenger/di/module/MessengerModule.java | 5 - .../view/entity/ViewInterlocutor.java | 12 +- .../definition/InterlocutorViewEntity.java | 4 +- xmpp/build.gradle | 5 + .../domain/xmpp/XmppDirectMessageCenter.java | 14 +- 22 files changed, 239 insertions(+), 165 deletions(-) create mode 100644 domain/src/main/java/org/mercury_im/messenger/account/error/PasswordError.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/account/error/UsernameError.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/data/repository/Repositories.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/di/module/MercuryModule.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/di/module/MessengerModule.java diff --git a/app/build.gradle b/app/build.gradle index 998f4a3..c274fa2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,7 +23,7 @@ android { lintOptions { disable 'GoogleAppIndexingWarning', 'AllowBackup' - // Warn about invalid packages instead of failing + // Warn about invalidUsername packages instead of failing warning 'InvalidPackage' } diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index 8c8f752..d37dd20 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -4,6 +4,7 @@ import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.di.module.AppModule; +import org.mercury_im.messenger.di.module.MercuryModule; import org.mercury_im.messenger.service.MercuryConnectionService; import org.mercury_im.messenger.ui.MainActivity; import org.mercury_im.messenger.ui.chat.ChatActivity; @@ -29,7 +30,8 @@ import dagger.Component; modules = { AppModule.class, AndroidPersistenceModule.class, - RepositoryModule.class + RepositoryModule.class, + MercuryModule.class }) public interface AppComponent { diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java index 21d04dc..9e911b0 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java @@ -3,16 +3,13 @@ package org.mercury_im.messenger.di.module; import android.app.Application; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.data.di.RepositoryModule; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; -@Module(includes = { - RepositoryModule.class -}) +@Module public class AppModule { private MercuryImApplication mApplication; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java index 07ac534..f1e9b26 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java @@ -42,17 +42,8 @@ public class AccountsFragment extends Fragment { @BindView(R.id.fab) ExtendedFloatingActionButton fab; - /** - * Mandatory empty constructor for the fragment manager to instantiate the - * fragment (e.g. upon screen orientation changes). - */ public AccountsFragment() { - } - // TODO: Customize parameter initialization - public static AccountsFragment newInstance() { - AccountsFragment fragment = new AccountsFragment(); - return fragment; } @Override diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index 1a1f98d..82d9c7d 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -14,8 +14,12 @@ import androidx.lifecycle.ViewModelProvider; import com.google.android.material.textfield.TextInputEditText; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; +import org.mercury_im.messenger.account.error.PasswordError; +import org.mercury_im.messenger.account.error.UsernameError; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.util.TextChangedListener; import butterknife.BindView; @@ -27,9 +31,8 @@ import butterknife.ButterKnife; */ public class LoginActivity extends AppCompatActivity implements TextView.OnEditorActionListener { - // UI references. - @BindView(R.id.jid) - TextInputEditText mJidView; + @BindView(R.id.username) + TextInputEditText mUsernameView; @BindView(R.id.password) TextInputEditText mPasswordView; @@ -46,81 +49,77 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito MercuryImApplication.getApplication().getAppComponent().inject(this); - // Set up the login form. ButterKnife.bind(this); viewModel = new ViewModelProvider(this).get(LoginViewModel.class); - - observeViewModel(viewModel); - displayCredentials(viewModel.getAccount()); - - mJidView.setOnEditorActionListener(this); - mPasswordView.setOnEditorActionListener(this); - - mJidView.addTextChangedListener(new TextChangedListener() { - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - viewModel.onJidInputChanged(charSequence.toString()); - Log.d("Mercury", "onTextChanged"); - } - }); - - mPasswordView.addTextChangedListener(new TextChangedListener() { - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - viewModel.onPasswordInputChanged(charSequence.toString()); - Log.d("Mercury", "onTextChanged"); - } - }); - + observeViewModel(); + setupTextInputFields(); mSignInView.setOnClickListener(view -> viewModel.loginDetailsEntered()); } - private void observeViewModel(LoginViewModel viewModel) { - viewModel.getJidError().observe(this, jidError -> { - if (jidError == null) return; - String errorMessage = null; - switch (jidError) { - case none: - break; - case emptyJid: - errorMessage = getResources().getString(R.string.error_field_required); - break; - case invalidJid: - errorMessage = getResources().getString(R.string.error_invalid_jid); - break; - case unknownJid: - errorMessage = "Unknown Jid!"; - } - mJidView.setError(errorMessage); - }); + private void observeViewModel() { + observeUsernameError(); + observePasswordError(); + finishOnceLoginWasSuccessful(); + displayCredentials(viewModel.getAccount()); + } + private void observeUsernameError() { + viewModel.getUsernameError().observe(this, usernameError -> { + Optional errorMessage = getUsernameError(usernameError); + if (errorMessage.isPresent()) { + mUsernameView.setError(errorMessage.getItem()); + } + }); + } + + private void observePasswordError() { viewModel.getPasswordError().observe(this, passwordError -> { - if (passwordError == null) return; - String errorMessage = null; - switch (passwordError) { - case none: - break; - case emptyPassword: - errorMessage = getResources().getString(R.string.error_field_required); - break; - case invalidPassword: - errorMessage = getResources().getString(R.string.error_invalid_password); - break; - case incorrectPassword: - errorMessage = getResources().getString(R.string.error_incorrect_password); - break; + Optional errorMessage = getPasswordError(passwordError); + if (errorMessage.isPresent()) { + mPasswordView.setError(errorMessage.getItem()); } - mPasswordView.setError(errorMessage); }); + } - viewModel.getSigninSuccessful().observe(this, aBoolean -> { - if (Boolean.TRUE.equals(aBoolean)) { + private void finishOnceLoginWasSuccessful() { + viewModel.getSigninSuccessful().observe(this, successful -> { + if (Boolean.TRUE.equals(successful)) { finish(); } }); } + private Optional getUsernameError(UsernameError usernameError) { + switch (usernameError) { + case none: + return new Optional<>(null); + case emptyUsername: + return new Optional<>(getResources().getString(R.string.error_field_required)); + case invalidUsername: + return new Optional<>(getResources().getString(R.string.error_invalid_username)); + case unknownUsername: + return new Optional<>("Unknown Username!"); + default: + throw new AssertionError("Unknown UsernameError enum value."); + } + } + + private Optional getPasswordError(PasswordError passwordError) { + switch (passwordError) { + case none: + return new Optional<>(null); + case emptyPassword: + return new Optional<>(getResources().getString(R.string.error_field_required)); + case invalidPassword: + return new Optional<>(getResources().getString(R.string.error_invalid_password)); + case incorrectPassword: + return new Optional<>(getResources().getString(R.string.error_incorrect_password)); + default: + throw new AssertionError("Unknown PasswordError enum value."); + } + } + private void displayCredentials(LiveData account) { account.observe(this, accountEvent -> { if (accountEvent == null) { @@ -128,7 +127,7 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito } if (accountEvent.getAddress() != null) { - mJidView.setText(accountEvent.getAddress()); + mUsernameView.setText(accountEvent.getAddress()); } if (accountEvent.getAuthentication() != null) { @@ -137,10 +136,31 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito }); } + private void setupTextInputFields() { + mUsernameView.setOnEditorActionListener(this); + mPasswordView.setOnEditorActionListener(this); + + mUsernameView.addTextChangedListener(new TextChangedListener() { + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + viewModel.onUsernameInputChanged(charSequence.toString()); + Log.d(Messenger.TAG, "onTextChanged"); + } + }); + + mPasswordView.addTextChangedListener(new TextChangedListener() { + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + viewModel.onPasswordInputChanged(charSequence.toString()); + Log.d(Messenger.TAG, "onTextChanged"); + } + }); + } + @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { switch (v.getId()) { - case R.id.jid: + case R.id.username: if (actionId == EditorInfo.IME_ACTION_NEXT) { mPasswordView.requestFocus(); return true; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index 2809f49..c4afcb1 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -14,6 +14,8 @@ import io.reactivex.observers.DisposableSingleObserver; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.account.error.PasswordError; +import org.mercury_im.messenger.account.error.UsernameError; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; @@ -29,11 +31,11 @@ public class LoginViewModel extends ViewModel { // @Inject // ConnectionCenter connectionCenter; - private String jid; + private String username; private String password; - private MutableLiveData jidError = new MutableLiveData<>(); - private MutableLiveData passwordError = new MutableLiveData<>(); + private MutableLiveData usernameError = new MutableLiveData<>(UsernameError.none); + private MutableLiveData passwordError = new MutableLiveData<>(PasswordError.none); private MutableLiveData account = new MutableLiveData<>(); @@ -49,31 +51,16 @@ public class LoginViewModel extends ViewModel { return signinSuccessful; } - public enum JidError { - none, - emptyJid, - invalidJid, - unknownJid - } - - public enum PasswordError { - none, - emptyPassword, - invalidPassword, - incorrectPassword - } - - public void onJidInputChanged(String input) { - this.jid = input; - + public void onUsernameInputChanged(String input) { + this.username = input; } public void onPasswordInputChanged(String input) { this.password = input; } - public LiveData getJidError() { - return jidError; + public LiveData getUsernameError() { + return usernameError; } public LiveData getPasswordError() { @@ -84,9 +71,9 @@ public class LoginViewModel extends ViewModel { * Try to parse the input string into a {@link EntityBareJid} and return it. * Return null on failure. * @param input input string - * @return valid jid or null + * @return valid username or null */ - private EntityBareJid asValidJidOrNull(String input) { + private EntityBareJid asValidUsernameOrNull(String input) { return JidCreate.entityBareFromOrNull(input); } @@ -104,21 +91,22 @@ public class LoginViewModel extends ViewModel { public void login() { Account account = getAccount().getValue(); - if (account != null && account.getAddress() != null && !TextUtils.isEmpty(account.getAuthentication().getPassword())) { + if (account != null && account.getAddress() != null + && !TextUtils.isEmpty(account.getAuthentication().getPassword())) { accountRepository.upsertAccount(account); } } public void loginDetailsEntered() { boolean loginIntact = true; - if (jid.isEmpty()) { - jidError.postValue(JidError.emptyJid); + if (username.isEmpty()) { + usernameError.postValue(UsernameError.emptyUsername); loginIntact = false; } - EntityBareJid bareJid = asValidJidOrNull(jid); + EntityBareJid bareJid = asValidUsernameOrNull(username); if (bareJid == null) { - jidError.postValue(JidError.invalidJid); + usernameError.postValue(UsernameError.invalidUsername); loginIntact = false; } @@ -133,7 +121,8 @@ public class LoginViewModel extends ViewModel { account.setAddress(bareJid.toString()); account.setAuthentication(new PasswordAuthentication(password)); Single insert = accountRepository.upsertAccount(account); - insert.subscribe(new DisposableSingleObserver() { + insert.subscribe( + new DisposableSingleObserver() { @Override public void onSuccess(Account inserted) { // connectionCenter.createConnection(account); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/settings/SettingsActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/settings/SettingsActivity.java index 0ea25a9..59a99a0 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/settings/SettingsActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/settings/SettingsActivity.java @@ -155,7 +155,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { /** * This method stops fragment injection in malicious applications. - * Make sure to deny any unknown fragments here. + * Make sure to deny any unknownUsername fragments here. */ protected boolean isValidFragment(String fragmentName) { return PreferenceFragment.class.getName().equals(fragmentName) diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index f0715e3..1f7b1cd 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -24,7 +24,7 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"> Password Sign in Sign in - This XMPP address is invalid + This XMPP address is invalid This password is too short This password is incorrect This field is required diff --git a/core-old/src/main/java/org/mercury_im/domain/data/util/ContactNameUtil.java b/core-old/src/main/java/org/mercury_im/domain/data/util/ContactNameUtil.java index 43c538a..b4159f3 100644 --- a/core-old/src/main/java/org/mercury_im/domain/data/util/ContactNameUtil.java +++ b/core-old/src/main/java/org/mercury_im/domain/data/util/ContactNameUtil.java @@ -1,28 +1,18 @@ package org.mercury_im.domain.data.util; -import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.xmpp.model.EntityModel; +import org.mercury_im.messenger.entity.contact.Peer; public class ContactNameUtil { - public static String displayableNameFrom(ContactModel contactModel) { - if (contactModel == null) { + public static String displayableNameFrom(Peer contact) { + if (contact == null) { return null; } - if (contactModel.getRostername() != null) { - return contactModel.getRostername(); - } - if (contactModel.getEntity() != null) { - return contactModel.getEntity().getJid().getLocalpart().asUnescapedString(); + if (contact.getName() != null) { + return contact.getName(); } - return null; - } - - public static String displayableNameFrom(ContactModel contact, EntityModel entity) { - if (contact == null) { - return entity.getJid().getLocalpart().asUnescapedString(); - } return displayableNameFrom(contact); + return contact.getAddress(); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index 68fcca9..bc16ffe 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -11,6 +11,7 @@ import org.mercury_im.messenger.data.repository.MessageRepository; import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; import org.mercury_im.messenger.data.repository.EntityCapsRepository; +import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.data.repository.XmppAccountRepository; import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; import org.mercury_im.messenger.data.repository.XmppGroupChatRepository; @@ -94,4 +95,16 @@ public class RepositoryModule { @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { return new EntityCapsRepository(data, ioScheduler, uiScheduler); } + + @Provides + @Singleton + static Repositories provideRepositories( + AccountRepository accountRepository, + DirectChatRepository directChatRepository, + GroupChatRepository groupChatRepository, + MessageRepository messageRepository, + PeerRepository peerRepository) { + return new Repositories(accountRepository, directChatRepository, groupChatRepository, + messageRepository, peerRepository); + } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/enums/SaslCondition.java b/data/src/main/java/org/mercury_im/messenger/data/enums/SaslCondition.java index df23da2..da381d0 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/enums/SaslCondition.java +++ b/data/src/main/java/org/mercury_im/messenger/data/enums/SaslCondition.java @@ -59,12 +59,12 @@ public enum SaslCondition { incorrect_encoding, /** - * The authzid provided by the initiating entity is invalid, either because it is incorrectly + * The authzid provided by the initiating entity is invalidUsername, either because it is incorrectly * formatted or because the initiating entity does not have permissions to authorize that ID; * sent in reply to a
element or an
element with * initial response data. * - * @see rfc6120 §6.5.6: invalid-authzid + * @see rfc6120 §6.5.6: invalidUsername-authzid */ invalid_authzid, @@ -72,7 +72,7 @@ public enum SaslCondition { * The initiating entity did not specify a mechanism, or requested a mechanism that is not * supported by the receiving entity; sent in reply to an
element. * - * @see rfc6120 §6.5.7: invalid-mechanism + * @see rfc6120 §6.5.7: invalidUsername-mechanism */ invalid_mechanism, diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index 75fab40..a23d1e7 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -1,10 +1,8 @@ package org.mercury_im.messenger; -import org.mercury_im.messenger.data.repository.AccountRepository; -import org.mercury_im.messenger.data.repository.PeerRepository; -import org.mercury_im.messenger.entity.contact.Peer; -import org.mercury_im.messenger.transport.connection.ConnectionMethod; +import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.transport.connection.ConnectionMethod; import java.util.HashMap; import java.util.Map; @@ -17,15 +15,11 @@ public class Messenger { private final Map connections = new HashMap<>(); - @Inject - AccountRepository accountRepository; + private final Repositories repositories; @Inject - PeerRepository peerRepository; - - @Inject - public Messenger() { - + public Messenger(Repositories repositories) { + this.repositories = repositories; } public void addConnection(ConnectionMethod connection) { diff --git a/domain/src/main/java/org/mercury_im/messenger/account/error/PasswordError.java b/domain/src/main/java/org/mercury_im/messenger/account/error/PasswordError.java new file mode 100644 index 0000000..6efc818 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/account/error/PasswordError.java @@ -0,0 +1,8 @@ +package org.mercury_im.messenger.account.error; + +public enum PasswordError { + none, + emptyPassword, + invalidPassword, + incorrectPassword +} \ No newline at end of file diff --git a/domain/src/main/java/org/mercury_im/messenger/account/error/UsernameError.java b/domain/src/main/java/org/mercury_im/messenger/account/error/UsernameError.java new file mode 100644 index 0000000..33b9030 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/account/error/UsernameError.java @@ -0,0 +1,8 @@ +package org.mercury_im.messenger.account.error; + +public enum UsernameError { + none, + emptyUsername, + invalidUsername, + unknownUsername +} diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/Repositories.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/Repositories.java new file mode 100644 index 0000000..4500aaf --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/Repositories.java @@ -0,0 +1,45 @@ +package org.mercury_im.messenger.data.repository; + +import javax.inject.Inject; + +public class Repositories { + + private final AccountRepository accountRepository; + private final DirectChatRepository directChatRepository; + private final GroupChatRepository groupChatRepository; + private final MessageRepository messageRepository; + private final PeerRepository peerRepository; + + @Inject + public Repositories(AccountRepository accountRepository, + DirectChatRepository directChatRepository, + GroupChatRepository groupChatRepository, + MessageRepository messageRepository, + PeerRepository peerRepository) { + this.accountRepository = accountRepository; + this.directChatRepository = directChatRepository; + this.groupChatRepository = groupChatRepository; + this.messageRepository = messageRepository; + this.peerRepository = peerRepository; + } + + public AccountRepository getAccountRepository() { + return accountRepository; + } + + public DirectChatRepository getDirectChatRepository() { + return directChatRepository; + } + + public GroupChatRepository getGroupChatRepository() { + return groupChatRepository; + } + + public MessageRepository getMessageRepository() { + return messageRepository; + } + + public PeerRepository getPeerRepository() { + return peerRepository; + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/di/module/MercuryModule.java b/domain/src/main/java/org/mercury_im/messenger/di/module/MercuryModule.java new file mode 100644 index 0000000..d54d541 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/di/module/MercuryModule.java @@ -0,0 +1,23 @@ +package org.mercury_im.messenger.di.module; + +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.data.repository.Repositories; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class MercuryModule { + + /* + @Provides + @Singleton + static Messenger provideMessenger(Repositories repositories) { + return new Messenger(repositories); + } + + */ + +} diff --git a/domain/src/main/java/org/mercury_im/messenger/di/module/MessengerModule.java b/domain/src/main/java/org/mercury_im/messenger/di/module/MessengerModule.java deleted file mode 100644 index 76fe55d..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/di/module/MessengerModule.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.mercury_im.messenger.di.module; - -public class MessengerModule { - -} 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 index cc7585b..56bc35e 100644 --- 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 @@ -1,6 +1,6 @@ package org.mercury_im.messenger.view.entity; -import org.mercury_im.messenger.entity.contact.Contact; +import org.mercury_im.messenger.entity.contact.SubscriptionMode; import org.mercury_im.messenger.view.entity.definition.InterlocutorViewEntity; public class ViewInterlocutor implements InterlocutorViewEntity { @@ -8,7 +8,7 @@ public class ViewInterlocutor implements InterlocutorViewEntity { private final String name; private final String address; private final String accountAddress; - private final Contact.SubscriptionMode subscriptionMode; + private final SubscriptionMode subscriptionMode; private final String lastActivity; private final boolean isTyping; private final String status; @@ -17,7 +17,7 @@ public class ViewInterlocutor implements InterlocutorViewEntity { private ViewInterlocutor(String name, String address, String accountAddress, - Contact.SubscriptionMode subscriptionMode, + SubscriptionMode subscriptionMode, String lastActivity, boolean isTyping, String status, @@ -48,7 +48,7 @@ public class ViewInterlocutor implements InterlocutorViewEntity { } @Override - public Contact.SubscriptionMode getSubscriptionMode() { + public SubscriptionMode getSubscriptionMode() { return subscriptionMode; } @@ -80,7 +80,7 @@ public class ViewInterlocutor implements InterlocutorViewEntity { private String name; private String address; private String accountAddress; - private Contact.SubscriptionMode subscriptionMode; + private SubscriptionMode subscriptionMode; private String lastActivity; private boolean isTyping; private String status; @@ -101,7 +101,7 @@ public class ViewInterlocutor implements InterlocutorViewEntity { return this; } - public Builder setSubscriptionMode(Contact.SubscriptionMode subscriptionMode) { + public Builder setSubscriptionMode(SubscriptionMode subscriptionMode) { this.subscriptionMode = subscriptionMode; return this; } 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 index d619132..4187adb 100644 --- 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 @@ -1,6 +1,6 @@ package org.mercury_im.messenger.view.entity.definition; -import org.mercury_im.messenger.entity.contact.Contact; +import org.mercury_im.messenger.entity.contact.SubscriptionMode; public interface InterlocutorViewEntity { @@ -10,7 +10,7 @@ public interface InterlocutorViewEntity { String getAccountAddress(); - Contact.SubscriptionMode getSubscriptionMode(); + SubscriptionMode getSubscriptionMode(); String getLastActivity(); diff --git a/xmpp/build.gradle b/xmpp/build.gradle index b59ea59..a0594e6 100644 --- a/xmpp/build.gradle +++ b/xmpp/build.gradle @@ -7,6 +7,11 @@ dependencies { // 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" + testAnnotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" + // 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" diff --git a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java index 4ff920c..0c8ca0a 100644 --- a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java @@ -7,31 +7,25 @@ import org.jivesoftware.smack.chat2.IncomingChatMessageListener; import org.jivesoftware.smackx.sid.element.OriginIdElement; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; +import org.mercury_im.messenger.MessageCenter; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.entity.contact.Peer; -import org.mercury_im.messenger.entity.message.IMessage; -import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; -import org.mercury_im.messenger.entity.message.Message; -import org.mercury_im.messenger.MessageCenter; import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.message.IMessage; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; import org.mercury_im.messenger.transport.xmpp.XmppTcpConnectionMethod; -import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.List; import java.util.Set; -import java.util.TreeSet; import javax.inject.Inject; import io.reactivex.Completable; import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.disposables.Disposable; -import sun.reflect.generics.tree.Tree; public class XmppDirectMessageCenter implements MessageCenter, IncomingChatMessageListener { From 7f2fe135b3f19c8ce124881169e89aef48d89560 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 13 Dec 2019 11:05:33 +0100 Subject: [PATCH 41/83] Refactor notification channel setup code --- .../messenger/ClientStateHandler.java | 52 +++++++++++ .../messenger/MercuryImApplication.java | 92 +++---------------- .../mercury_im/messenger/Notifications.java | 42 ++++++++- .../messenger/ClientStateListener.java | 8 ++ 4 files changed, 114 insertions(+), 80 deletions(-) create mode 100644 app/src/main/java/org/mercury_im/messenger/ClientStateHandler.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/ClientStateListener.java diff --git a/app/src/main/java/org/mercury_im/messenger/ClientStateHandler.java b/app/src/main/java/org/mercury_im/messenger/ClientStateHandler.java new file mode 100644 index 0000000..7d4426c --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ClientStateHandler.java @@ -0,0 +1,52 @@ +package org.mercury_im.messenger; + +import android.app.Activity; + +import org.mercury_im.messenger.util.AbstractActivityLifecycleCallbacks; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Keep track of activities in "started" state. + * This will come in handy for things like XMPPs CSI. + * + * @see Date: Fri, 13 Dec 2019 11:39:35 +0100 Subject: [PATCH 42/83] Readability fixes --- .../messenger/di/module/AndroidPersistenceModule.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java index 0ea8b80..05ad91a 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java @@ -29,16 +29,12 @@ public class AndroidPersistenceModule { @Singleton static ReactiveEntityStore provideDatabase(Application application) { // override onUpgrade to handle migrating to a new version - DatabaseSource source = new DatabaseSource(application, Models.DEFAULT, - "mercury_req_db", 1); + DatabaseSource source = new DatabaseSource(application, Models.DEFAULT, "mercury_req_db", 1); if (BuildConfig.DEBUG) { - // use this in development mode to drop and recreate the tables on every upgrade source.setTableCreationMode(TableCreationMode.DROP_CREATE); } Configuration configuration = source.getConfiguration(); - ReactiveEntityStore dataStore = ReactiveSupport.toReactiveStore( - new EntityDataStore<>(configuration)); - return dataStore; + return ReactiveSupport.toReactiveStore(new EntityDataStore<>(configuration)); } @Provides From ec024d6a1ae7d35d20272d479a5f0477c838b972 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 13 Dec 2019 11:54:10 +0100 Subject: [PATCH 43/83] Use AvatarDrawable from ltt.rs in Account list --- .../messenger/ui/avatar/AvatarDrawable.java | 71 +++++++++++++++++++ .../ui/login/AccountsRecyclerViewAdapter.java | 3 +- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/mercury_im/messenger/ui/avatar/AvatarDrawable.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/avatar/AvatarDrawable.java b/app/src/main/java/org/mercury_im/messenger/ui/avatar/AvatarDrawable.java new file mode 100644 index 0000000..e014ad4 --- /dev/null +++ b/app/src/main/java/org/mercury_im/messenger/ui/avatar/AvatarDrawable.java @@ -0,0 +1,71 @@ +/* + * Copyright 2019 Daniel Gultsch + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.mercury_im.messenger.ui.avatar; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.graphics.drawable.ColorDrawable; + +import org.mercury_im.messenger.util.ColorUtil; + +/** + * Generates a round colored drawable with white initials. + * Code courtesy of Daniel Gultsch's lttrs-android application. + * + * @see Ltt.rs for Android + */ +public class AvatarDrawable extends ColorDrawable { + + private final Paint paint; + private final Paint textPaint; + private String letter; + + public AvatarDrawable(String name, String key) { + paint = new Paint(); + paint.setColor(key == null ? 0xff757575 : ColorUtil.consistentColor(key)); + paint.setAntiAlias(true); + textPaint = new Paint(); + textPaint.setColor(Color.WHITE); + textPaint.setTextAlign(Paint.Align.CENTER); + textPaint.setAntiAlias(true); + textPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); + this.letter = name == null ? null : String.valueOf(Character.toUpperCase(name.charAt(0))); + } + + @Override + public void draw(Canvas canvas) { + float midx = getBounds().width() / 2.0f; + float midy = getBounds().height() / 2.0f; + float radius = Math.min(getBounds().width(), getBounds().height()) / 2.0f; + textPaint.setTextSize(radius); + Rect r = new Rect(); + canvas.getClipBounds(r); + int cHeight = r.height(); + int cWidth = r.width(); + canvas.drawCircle(midx, midy, radius, paint); + if (letter == null) { + return; + } + textPaint.setTextAlign(Paint.Align.LEFT); + textPaint.getTextBounds(letter, 0, letter.length(), r); + float x = cWidth / 2f - r.width() / 2f - r.left; + float y = cHeight / 2f + r.height() / 2f - r.bottom; + canvas.drawText(letter, x, y, textPaint); + } +} diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java index aba0233..969b403 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java @@ -15,6 +15,7 @@ import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.ui.avatar.AvatarDrawable; import org.mercury_im.messenger.ui.login.AccountsFragment.OnAccountListItemClickListener; import org.mercury_im.messenger.util.AbstractDiffCallback; import org.mercury_im.messenger.util.ColorUtil; @@ -45,7 +46,7 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { From cd56798f0664cfc24010c49dbb58e658e5ae1131 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 13 Dec 2019 12:34:24 +0100 Subject: [PATCH 44/83] Update app dependencies --- app/build.gradle | 8 ++++---- version.gradle | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c274fa2..d6198a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -78,7 +78,7 @@ dependencies { implementation project(":data") implementation "io.requery:requery-android:$requeryVersion" - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61' // Dagger 2 for dependency injection implementation "com.google.dagger:dagger:$daggerVersion" @@ -97,12 +97,12 @@ dependencies { // support libraries implementation "androidx.appcompat:appcompat:$appCompatVersion" - implementation 'com.google.android.material:material:1.1.0-beta01' + implementation 'com.google.android.material:material:1.2.0-alpha02' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' - implementation 'androidx.recyclerview:recyclerview:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3' + implementation 'androidx.recyclerview:recyclerview:1.1.0' // circular image viewer for avatars implementation 'de.hdodenhof:circleimageview:3.0.1' diff --git a/version.gradle b/version.gradle index 25d6a4d..7adc839 100644 --- a/version.gradle +++ b/version.gradle @@ -73,7 +73,7 @@ ext { // Other libraries // Architecture Components - lifecycleVersion = '2.2.0-alpha05' + lifecycleVersion = '2.2.0-rc03' pagingVersion = "2.1.0" appCompatVersion = '1.1.0' @@ -86,7 +86,7 @@ ext { rxAndroidVersion = "2.1.1" // Dagger 2 - daggerVersion = '2.24' + daggerVersion = '2.25.2' // Android Support Library supportLibVersion = "28.0.0" From cfa4b8d9bf0e3a0d1993e71a6a6400bc293e7cc0 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 13 Dec 2019 12:34:52 +0100 Subject: [PATCH 45/83] Make use of lifecycle-common-java8 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d6198a0..872bc4f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,7 +86,7 @@ dependencies { // ViewModel and LiveData implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion" - annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion" + annotationProcessor "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion" // Android extension for rxJava api "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion" From ccddad2e311c01067ddef19578a8dedfee76eadc Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 20 Dec 2019 10:41:55 +0100 Subject: [PATCH 46/83] Temporary changes - gotta go! --- .../messenger/di/module/AppModule.java | 2 + .../repository/XmppAccountRepository.java | 16 ++++ .../repository/AccountRepositoryTest.java | 67 ++++++++-------- .../data/repository/AccountRepository.java | 2 + .../transport/AccountChangedEvent.java | 27 +++++++ .../transport/AccountChangedHandler.java | 77 +++++++++++++++++++ .../mercury_im/messenger/util/DiffUtil.java | 42 ++++++++++ .../entity/message/IMessageMetadata.java | 41 ++++++++++ .../domain/xmpp/XmppDirectMessageCenter.java | 36 ++++++--- 9 files changed, 267 insertions(+), 43 deletions(-) create mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedEvent.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedHandler.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/util/DiffUtil.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/message/IMessageMetadata.java diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java index 9e911b0..d2fceee 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AppModule.java @@ -2,6 +2,7 @@ package org.mercury_im.messenger.di.module; import android.app.Application; +import org.jivesoftware.smackx.ping.android.ServerPingWithAlarmManager; import org.mercury_im.messenger.MercuryImApplication; import javax.inject.Singleton; @@ -16,6 +17,7 @@ public class AppModule { public AppModule(MercuryImApplication application) { this.mApplication = application; + ServerPingWithAlarmManager.onCreate(application); } @Provides diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index aae3f4b..89e0404 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -8,6 +8,7 @@ import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.util.ThreadUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.inject.Inject; @@ -21,6 +22,7 @@ import io.reactivex.Single; import io.requery.Persistable; import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveResult; public class XmppAccountRepository extends RequeryRepository @@ -89,11 +91,25 @@ public class XmppAccountRepository public Observable> observeAllAccounts() { return dao.getAll().observableResult() .map(ResultDelegate::toList) + .scan(Collections.emptyList(), (a, b) -> { + List c = new ArrayList<>(b); + c.removeAll(a); + return c; + }) .map(this::modelsToEntities) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } + @Override + public Observable observeAccounts() { + return dao.getAll().observableResult() + .flatMap(ReactiveResult::observable) + .map(accountMapping::toEntity) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + @Override public Single updateAccount(Account account) { // Since we cannot access setId() of AccountModel, we have to query the model by ID and update it manually. diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 17f0620..7d5f288 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -17,12 +17,14 @@ import org.mercury_im.messenger.entity.message.PayloadContainer; import org.mercury_im.messenger.entity.message.content.TextPayload; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; import javax.inject.Inject; +import io.reactivex.disposables.CompositeDisposable; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; @@ -53,43 +55,46 @@ public class AccountRepositoryTest { } @Test - public void test() { - Account account = new IAccount(); - account.setAddress("test@test.test"); - account.setEnabled(true); - account.setAuthentication(new PasswordAuthentication("swordfish")); + public void test() throws InterruptedException { + CompositeDisposable d = new CompositeDisposable(); + d.add(accountRepository.observeAccounts() + .distinct(Account::getId) + .subscribe(a -> System.out.println("Observe: " + a.getAddress()))); - Peer peer = new IPeer(); - peer.setName("Test Peer"); - peer.setAddress("peer@peer.peer"); - peer.setAccount(account); + Thread.sleep(100); - DirectChat directChat = new IDirectChat(); - directChat.setPeer(peer); - directChat.setAccount(account); + Account a1 = new IAccount(); + a1.setAddress("a1@example.com"); + a1.setAuthentication(new PasswordAuthentication("a1a1a1")); + a1.setEnabled(true); - //Account accountModel = accountRepository.insertAccount(account).blockingGet(); - //assertEquals(1, accountModel.getId()); + d.add(accountRepository.insertAccount(a1).subscribe()); - DirectChat chatModel = directChatRepository.insertDirectChat(directChat) - .blockingGet(); - assertEquals(1, chatModel.getId()); + Thread.sleep(100); + a1.setId(1); - Message message = new IMessage(); - message.setSender("test@test.test"); - message.setRecipient("peer@peer.peer"); - message.setTimestamp(new Date()); - PayloadContainer container = new IPayloadContainer(); - TextPayload body = new TextPayload(); - body.setBody("Hallo"); - container.setMessageContents(Collections.singletonList(body)); - List payloadContainers = new ArrayList<>(); - payloadContainers.add(container); - message.setMessagePayloads(payloadContainers); + Account a2 = new IAccount(); + a2.setAddress("a2@example.com"); + a2.setAuthentication(new PasswordAuthentication("a2a2a2")); + a2.setEnabled(false); - Message _message = messageRepository.insertMessage(directChat, message) - .blockingGet(); + d.add(accountRepository.insertAccount(a2).subscribe()); - dataStore.close(); + Thread.sleep(100); + + Account a3 = new IAccount(); + a3.setAddress("a3@example.com"); + a3.setAuthentication(new PasswordAuthentication("a3a3a3")); + a3.setEnabled(false); + + d.add(accountRepository.insertAccount(a3).subscribe()); + + Thread.sleep(100); + + a1.setAddress("a11@example.org"); + + d.add(accountRepository.updateAccount(a1).subscribe()); + + Thread.sleep(100); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java index 7138482..9b8baea 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java @@ -24,6 +24,8 @@ public interface AccountRepository { Observable> observeAllAccounts(); + Observable observeAccounts(); + Single updateAccount(Account account); Single upsertAccount(Account account); diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedEvent.java b/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedEvent.java new file mode 100644 index 0000000..2628fcf --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedEvent.java @@ -0,0 +1,27 @@ +package org.mercury_im.messenger.transport; + +import org.mercury_im.messenger.entity.Account; + +public class AccountChangedEvent { + + private final Account account; + private final EventType eventType; + + public AccountChangedEvent(Account account, EventType eventType) { + this.account = account; + this.eventType = eventType; + } + + public Account getAccount() { + return account; + } + + public EventType getEventType() { + return eventType; + } + + public enum EventType { + enabled, + disabled + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedHandler.java b/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedHandler.java new file mode 100644 index 0000000..ad38e00 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedHandler.java @@ -0,0 +1,77 @@ +package org.mercury_im.messenger.transport; + +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.util.DiffUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +import io.reactivex.disposables.CompositeDisposable; + +public class AccountChangedHandler { + + private final Messenger messenger; + private final AccountRepository accountRepository; + private final Map accounts = new HashMap<>(); + private final CompositeDisposable disposable = new CompositeDisposable(); + + @Inject + public AccountChangedHandler(Messenger messenger, AccountRepository accountRepository) { + this.messenger = messenger; + this.accountRepository = accountRepository; + //disposable.add(accountRepository.observeAllAccounts() + // .scan(new ArrayList<>(), this::calculateChangeEvents) + // .subscribe(this::onAccountsChanged)); + } + + private HashMap calculateChangeEvents(List accounts, List newAccounts) { + DiffUtil.Diff diff = DiffUtil.diff(accounts, newAccounts); + return null; + } + + private AccountChangedEvent calculateEvent(Account previous, Account next) { + if (previous == null && next == null) { + throw new IllegalArgumentException("Not both accounts can be null at the same time!"); + } + if (previous == null) { + if (next.isEnabled()) { + return new AccountChangedEvent(next, AccountChangedEvent.EventType.enabled); + } else { + return null; + } + } + if (next == null) { + if (previous.isEnabled()) { + return new AccountChangedEvent(previous, AccountChangedEvent.EventType.disabled); + } else { + return null; + } + } + if (previous.isEnabled()) { + if (next.isEnabled()) { + return null; + } else { + return new AccountChangedEvent(next, AccountChangedEvent.EventType.disabled); + } + } else { + if (next.isEnabled()) { + return new AccountChangedEvent(next, AccountChangedEvent.EventType.enabled); + } else { + return null; + } + } + } + + private void onAccountsChanged(List accounts, List newAccounts) { + DiffUtil.Diff diff = DiffUtil.diff(accounts, newAccounts); + + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/util/DiffUtil.java b/domain/src/main/java/org/mercury_im/messenger/util/DiffUtil.java new file mode 100644 index 0000000..2a22abc --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/util/DiffUtil.java @@ -0,0 +1,42 @@ +package org.mercury_im.messenger.util; + +import java.util.ArrayList; +import java.util.List; + +public class DiffUtil { + + public static Diff diff(List a, List b) { + List removed = new ArrayList<>(a); + removed.removeAll(b); + List added = new ArrayList<>(b); + added.removeAll(a); + List preserved = new ArrayList<>(a); + preserved.retainAll(b); + return new Diff<>(added, preserved, removed); + } + + public static class Diff { + + private final List added; + private final List preserved; + private final List removed; + + public Diff(List added, List preserved, List removed) { + this.added = added; + this.preserved = preserved; + this.removed = removed; + } + + public List getAdded() { + return added; + } + + public List getPreserved() { + return preserved; + } + + public List getRemoved() { + return removed; + } + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessageMetadata.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessageMetadata.java new file mode 100644 index 0000000..931cd06 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessageMetadata.java @@ -0,0 +1,41 @@ +package org.mercury_im.messenger.entity.message; + +public class IMessageMetadata implements MessageMetadata { + + private long id; + private String legacyStanzaId; + private String originId; + private String stanzaId; + + public void setId(long id) { + this.id = id; + } + + public void setLegacyStanzaId(String legacyStanzaId) { + this.legacyStanzaId = legacyStanzaId; + } + + public void setOriginId(String originId) { + this.originId = originId; + } + + public void setStanzaId(String stanzaId) { + this.stanzaId = stanzaId; + } + + public long getId() { + return id; + } + + public String getLegacyStanzaId() { + return legacyStanzaId; + } + + public String getOriginId() { + return originId; + } + + public String getStanzaId() { + return stanzaId; + } +} diff --git a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java index 0c8ca0a..6de84cc 100644 --- a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java +++ b/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java @@ -4,6 +4,7 @@ import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.chat2.Chat; import org.jivesoftware.smack.chat2.ChatManager; import org.jivesoftware.smack.chat2.IncomingChatMessageListener; +import org.jivesoftware.smackx.avatar.element.MetadataExtension; import org.jivesoftware.smackx.sid.element.OriginIdElement; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; @@ -11,11 +12,15 @@ import org.mercury_im.messenger.MessageCenter; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; +import org.mercury_im.messenger.data.repository.MessageRepository; import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.message.IMessage; +import org.mercury_im.messenger.entity.message.IMessageMetadata; import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.entity.message.MessageMetadata; import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; import org.mercury_im.messenger.transport.xmpp.XmppTcpConnectionMethod; @@ -30,14 +35,10 @@ import io.reactivex.disposables.CompositeDisposable; public class XmppDirectMessageCenter implements MessageCenter, IncomingChatMessageListener { - @Inject - PeerRepository peerRepository; - - @Inject - AccountRepository accountRepository; - - @Inject - DirectChatRepository directChatRepository; + private final PeerRepository peerRepository; + private final AccountRepository accountRepository; + private final DirectChatRepository directChatRepository; + private final MessageRepository messageRepository; private final Messenger messenger; private final Account account; @@ -47,9 +48,13 @@ public class XmppDirectMessageCenter private Set messageListeners = new LinkedHashSet<>(); @Inject - public XmppDirectMessageCenter(Account account, Messenger messenger) { + public XmppDirectMessageCenter(Account account, Messenger messenger, Repositories repositories) { this.messenger = messenger; this.account = account; + this.peerRepository = repositories.getPeerRepository(); + this.accountRepository = repositories.getAccountRepository(); + this.directChatRepository = repositories.getDirectChatRepository(); + this.messageRepository = repositories.getMessageRepository(); XMPPConnection connection = ((XmppTcpConnectionMethod) getMessenger() .getConnection(account)).getConnection(); @@ -76,12 +81,19 @@ public class XmppDirectMessageCenter smackMessage.setTo(peerAddress); smackMessage.setType(org.jivesoftware.smack.packet.Message.Type.chat); - OriginIdElement.addOriginId(smackMessage); + String originId = OriginIdElement.addOriginId(smackMessage).getId(); + String legacyStanzaId = smackMessage.getStanzaId(); + IMessageMetadata metadata = new IMessageMetadata(); + metadata.setLegacyStanzaId(legacyStanzaId); + metadata.setOriginId(originId); + + message.setMetadata(metadata); Chat smackChat = chatManager.chatWith(peerAddress); - return Completable.fromAction( - () -> smackChat.send(smackMessage)); + return messageRepository.insertMessage(chat, message) + .ignoreElement() + .andThen(Completable.fromAction(() -> smackChat.send(smackMessage))); } @Override From 3569462a7890b863b7720eae7ddd31cd07de9d6e Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 00:27:48 +0100 Subject: [PATCH 47/83] Too lazy to comment. Simplifications and rewrites of login --- .../messenger/di/component/AppComponent.java | 4 +- .../messenger/ui/login/LoginActivity.java | 36 ++-- .../messenger/ui/login/LoginViewModel.java | 196 +++++++++--------- core-old/build.gradle | 3 +- .../core/stores/EntityCapsStore.java | 8 +- .../messenger/data/di/RepositoryModule.java | 6 +- .../data/mapping/AccountMapping.java | 5 +- ...ory.java => XmppEntityCapsRepository.java} | 4 +- .../repository/XmppGroupChatRepository.java | 4 +- .../repository/AccountRepositoryTest.java | 17 -- domain/.gitignore | 1 + domain/build.gradle | 10 + .../mercury_im/messenger/MessageCenter.java | 2 +- .../org/mercury_im/messenger/Messenger.java | 20 +- .../messenger/di/module/MercuryModule.java | 23 -- .../exception/IllegalUsernameException.java | 8 + .../IncomingDirectMessageListener.java | 2 +- .../IncomingGroupChatMessageListener.java | 2 +- .../listener/TypingEventListener.java | 2 +- .../transport/AccountChangedEvent.java | 27 --- .../transport/AccountChangedHandler.java | 77 ------- .../messenger/transport/ConnectionType.java | 22 -- .../connection/AbstractConnectionMethod.java | 26 --- .../connection/ConnectionFactory.java | 13 -- .../connection/ConnectionMethod.java | 18 -- .../exception/ConnectionFailedException.java | 6 - .../messenger/usecase/AddAccount.java | 132 ++++++++++++ .../messenger/xmpp/MercuryConnection.java | 34 +++ .../xmpp/XmppDirectMessageCenter.java | 14 +- .../XmppConnectionLoginBehaviorTest.java | 91 ++++++++ domain/testcredentials.properties.example | 11 + .../mercury_im/messenger/entity/Account.java | 6 + .../mercury_im/messenger/entity/IAccount.java | 11 + settings.gradle | 4 +- view_entity/.gitignore | 1 - view_entity/build.gradle | 8 - .../view/entity/ViewInterlocutor.java | 134 ------------ .../definition/InterlocutorViewEntity.java | 20 -- xmpp/.gitignore | 1 - xmpp/build.gradle | 25 --- .../transport/xmpp/XmppConnectionFactory.java | 30 --- .../xmpp/XmppTcpConnectionFactory.java | 36 ---- .../xmpp/XmppTcpConnectionMethod.java | 59 ------ 43 files changed, 451 insertions(+), 708 deletions(-) rename data/src/main/java/org/mercury_im/messenger/data/repository/{EntityCapsRepository.java => XmppEntityCapsRepository.java} (84%) delete mode 100644 domain/src/main/java/org/mercury_im/messenger/di/module/MercuryModule.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/exception/IllegalUsernameException.java rename domain/src/main/java/org/mercury_im/messenger/{transport => }/listener/IncomingDirectMessageListener.java (84%) rename domain/src/main/java/org/mercury_im/messenger/{transport => }/listener/IncomingGroupChatMessageListener.java (85%) rename domain/src/main/java/org/mercury_im/messenger/{transport => }/listener/TypingEventListener.java (80%) delete mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedEvent.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedHandler.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/ConnectionType.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/connection/AbstractConnectionMethod.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionFactory.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionMethod.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/transport/connection/exception/ConnectionFailedException.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java rename {xmpp/src/main/java/org/mercury_im/messenger/domain => domain/src/main/java/org/mercury_im/messenger}/xmpp/XmppDirectMessageCenter.java (87%) create mode 100644 domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/XmppConnectionLoginBehaviorTest.java create mode 100644 domain/testcredentials.properties.example delete mode 100644 view_entity/.gitignore delete mode 100644 view_entity/build.gradle delete mode 100644 view_entity/src/main/java/org/mercury_im/messenger/view/entity/ViewInterlocutor.java delete mode 100644 view_entity/src/main/java/org/mercury_im/messenger/view/entity/definition/InterlocutorViewEntity.java delete mode 100644 xmpp/.gitignore delete mode 100644 xmpp/build.gradle delete mode 100644 xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppConnectionFactory.java delete mode 100644 xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionFactory.java delete mode 100644 xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionMethod.java diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index d37dd20..8c8f752 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -4,7 +4,6 @@ import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.di.module.AppModule; -import org.mercury_im.messenger.di.module.MercuryModule; import org.mercury_im.messenger.service.MercuryConnectionService; import org.mercury_im.messenger.ui.MainActivity; import org.mercury_im.messenger.ui.chat.ChatActivity; @@ -30,8 +29,7 @@ import dagger.Component; modules = { AppModule.class, AndroidPersistenceModule.class, - RepositoryModule.class, - MercuryModule.class + RepositoryModule.class }) public interface AppComponent { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index 82d9c7d..fc28124 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -1,7 +1,6 @@ package org.mercury_im.messenger.ui.login; import android.os.Bundle; -import android.util.Log; import android.view.KeyEvent; import android.view.inputmethod.EditorInfo; import android.widget.Button; @@ -14,7 +13,6 @@ import androidx.lifecycle.ViewModelProvider; import com.google.android.material.textfield.TextInputEditText; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; import org.mercury_im.messenger.account.error.PasswordError; import org.mercury_im.messenger.account.error.UsernameError; @@ -54,42 +52,42 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito viewModel = new ViewModelProvider(this).get(LoginViewModel.class); observeViewModel(); setupTextInputFields(); - mSignInView.setOnClickListener(view -> viewModel.loginDetailsEntered()); + mSignInView.setOnClickListener(view -> viewModel.login()); } private void observeViewModel() { observeUsernameError(); observePasswordError(); finishOnceLoginWasSuccessful(); - displayCredentials(viewModel.getAccount()); + enableLoginButtonOncePossible(); } private void observeUsernameError() { viewModel.getUsernameError().observe(this, usernameError -> { - Optional errorMessage = getUsernameError(usernameError); - if (errorMessage.isPresent()) { - mUsernameView.setError(errorMessage.getItem()); - } + mUsernameView.setError(usernameError.isError() ? usernameError.getErrorMessage() : null); }); } private void observePasswordError() { viewModel.getPasswordError().observe(this, passwordError -> { - Optional errorMessage = getPasswordError(passwordError); - if (errorMessage.isPresent()) { - mPasswordView.setError(errorMessage.getItem()); - } + mPasswordView.setError(passwordError.isError() ? passwordError.getErrorMessage() : null); }); } private void finishOnceLoginWasSuccessful() { - viewModel.getSigninSuccessful().observe(this, successful -> { + viewModel.isLoginSuccessful().observe(this, successful -> { if (Boolean.TRUE.equals(successful)) { finish(); } }); } + private void enableLoginButtonOncePossible() { + viewModel.isLoginEnabled().observe(this, isEnabled -> { + mSignInView.setEnabled(isEnabled); + }); + } + private Optional getUsernameError(UsernameError usernameError) { switch (usernameError) { case none: @@ -130,8 +128,8 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito mUsernameView.setText(accountEvent.getAddress()); } - if (accountEvent.getAuthentication() != null) { - mPasswordView.setText(accountEvent.getAuthentication().getPassword()); + if (accountEvent.getPassword() != null) { + mPasswordView.setText(accountEvent.getPassword()); } }); } @@ -143,16 +141,14 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito mUsernameView.addTextChangedListener(new TextChangedListener() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - viewModel.onUsernameInputChanged(charSequence.toString()); - Log.d(Messenger.TAG, "onTextChanged"); + viewModel.setUsername(charSequence.toString()); } }); mPasswordView.addTextChangedListener(new TextChangedListener() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - viewModel.onPasswordInputChanged(charSequence.toString()); - Log.d(Messenger.TAG, "onTextChanged"); + viewModel.setPassword(charSequence.toString()); } }); } @@ -169,7 +165,7 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito case R.id.password: if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL) { - viewModel.loginDetailsEntered(); + viewModel.login(); return true; } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index c4afcb1..138ae70 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -1,140 +1,138 @@ package org.mercury_im.messenger.ui.login; -import android.text.TextUtils; -import android.util.Log; +import android.app.Application; +import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -import io.reactivex.Single; -import io.reactivex.observers.DisposableSingleObserver; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; +import org.jxmpp.stringprep.XmppStringprepException; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.account.error.PasswordError; -import org.mercury_im.messenger.account.error.UsernameError; -import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; -import org.mercury_im.messenger.entity.PasswordAuthentication; import javax.inject.Inject; -public class LoginViewModel extends ViewModel { +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; - @Inject - AccountRepository accountRepository; +public class LoginViewModel extends AndroidViewModel { - // @Inject - // ConnectionCenter connectionCenter; + private MutableLiveData usernameError = new MutableLiveData<>(new Error()); + private MutableLiveData passwordError = new MutableLiveData<>(new Error()); + private MutableLiveData loginEnabled = new MutableLiveData<>(false); + private MutableLiveData loginSuccessful = new MutableLiveData<>(false); - private String username; + private EntityBareJid username; private String password; - private MutableLiveData usernameError = new MutableLiveData<>(UsernameError.none); - private MutableLiveData passwordError = new MutableLiveData<>(PasswordError.none); + @Inject + Messenger messenger; - private MutableLiveData account = new MutableLiveData<>(); - - private MutableLiveData signinSuccessful = new MutableLiveData<>(); - - public LoginViewModel() { - super(); - MercuryImApplication.getApplication().getAppComponent().inject(this); - init(new IAccount()); + public LoginViewModel(@NonNull Application application) { + super(application); + ((MercuryImApplication) application).getAppComponent().inject(this); } - public LiveData getSigninSuccessful() { - return signinSuccessful; + public void setUsername(String username) { + if (username == null || username.isEmpty()) { + usernameError.setValue(new Error(getApplication().getResources().getString(R.string.error_field_required))); + this.username = null; + updateLoginEnabled(); + return; + } + + try { + this.username = JidCreate.entityBareFrom(username); + updateLoginEnabled(); + } catch (XmppStringprepException e) { + usernameError.setValue(new Error(getApplication().getResources().getString(R.string.error_invalid_username))); + this.username = null; + updateLoginEnabled(); + } } - public void onUsernameInputChanged(String input) { - this.username = input; + public void setPassword(String password) { + this.password = password; + updateLoginEnabled(); + if (password == null || password.isEmpty()) { + passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_field_required))); + } } - public void onPasswordInputChanged(String input) { - this.password = input; - } - - public LiveData getUsernameError() { - return usernameError; - } - - public LiveData getPasswordError() { - return passwordError; - } - - /** - * Try to parse the input string into a {@link EntityBareJid} and return it. - * Return null on failure. - * @param input input string - * @return valid username or null - */ - private EntityBareJid asValidUsernameOrNull(String input) { - return JidCreate.entityBareFromOrNull(input); - } - - private boolean isPasswordValid(String password) { - return !password.isEmpty(); - } - - public void init(@NonNull Account account) { - this.account.setValue(account); - } - - public MutableLiveData getAccount() { - return account; + private void updateLoginEnabled() { + loginEnabled.setValue(username != null && !(password == null || password.isEmpty())); } public void login() { - Account account = getAccount().getValue(); - if (account != null && account.getAddress() != null - && !TextUtils.isEmpty(account.getAuthentication().getPassword())) { - accountRepository.upsertAccount(account); - } + Account account = new IAccount(); + account.setAddress(username.asUnescapedString()); + account.setPassword(password); + account.setEnabled(true); + loginEnabled.setValue(false); + messenger.addAccount().enableAccountAndLogin(account) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .map(result -> { + switch (result) { + case success: + loginSuccessful.setValue(true); + break; + case credential_error: + passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_incorrect_password))); + loginEnabled.setValue(true); + break; + case server_error: + case other_error: + Toast.makeText(getApplication(), "A connection error occurred", Toast.LENGTH_LONG); + loginEnabled.setValue(true); + } + return true; + }) + .ignoreElement() + .subscribe(); } - public void loginDetailsEntered() { - boolean loginIntact = true; - if (username.isEmpty()) { - usernameError.postValue(UsernameError.emptyUsername); - loginIntact = false; + public LiveData getPasswordError() { + return passwordError; + } + + public LiveData getUsernameError() { + return usernameError; + } + + public LiveData isLoginSuccessful() { + return loginSuccessful; + } + + public LiveData isLoginEnabled() { + return loginEnabled; + } + + public static class Error { + + private String message; + + public Error() { + } - EntityBareJid bareJid = asValidUsernameOrNull(username); - if (bareJid == null) { - usernameError.postValue(UsernameError.invalidUsername); - loginIntact = false; + public Error(String errorMessage) { + this.message = errorMessage; } - if (!isPasswordValid(password)) { - passwordError.postValue(PasswordError.invalidPassword); - loginIntact = false; + public boolean isError() { + return message != null; } - if (loginIntact) { - Account account = new IAccount(); - account.setEnabled(true); - account.setAddress(bareJid.toString()); - account.setAuthentication(new PasswordAuthentication(password)); - Single insert = accountRepository.upsertAccount(account); - insert.subscribe( - new DisposableSingleObserver() { - @Override - public void onSuccess(Account inserted) { - // connectionCenter.createConnection(account); - signinSuccessful.setValue(true); - } - - @Override - public void onError(Throwable e) { - Log.e("Mercury", "Could not insert new Account data.", e); - } - }); - + public String getErrorMessage() { + return message; } } } diff --git a/core-old/build.gradle b/core-old/build.gradle index 03b0732..348a34c 100644 --- a/core-old/build.gradle +++ b/core-old/build.gradle @@ -8,7 +8,7 @@ sourceSets { dependencies { - api project(':entity') // Entities + api project(':entity') // Smack // Not all of those are needed, but it may be a good idea to define those versions explicitly @@ -37,6 +37,7 @@ dependencies { // JUnit for testing testImplementation "junit:junit:$junitVersion" + compile project(path: ':data') } sourceCompatibility = "8" diff --git a/core-old/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java b/core-old/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java index 9d41c30..ff67a9d 100644 --- a/core-old/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java +++ b/core-old/src/main/java/org/mercury_im/messenger/core/stores/EntityCapsStore.java @@ -4,8 +4,8 @@ import org.jivesoftware.smack.util.PacketParserUtils; import org.jivesoftware.smack.xml.XmlPullParser; import org.jivesoftware.smackx.caps.cache.EntityCapsPersistentCache; import org.jivesoftware.smackx.disco.packet.DiscoverInfo; -import org.mercury_im.messenger.xmpp.model.EntityCapsModel; -import org.mercury_im.messenger.xmpp.repository.EntityCapsRepository; +import org.mercury_im.messenger.data.model.EntityCapsModel; +import org.mercury_im.messenger.data.repository.XmppEntityCapsRepository; import java.io.StringReader; @@ -23,13 +23,13 @@ public class EntityCapsStore implements EntityCapsPersistentCache { private static final Logger LOGGER = Logger.getLogger(EntityCapsStore.class.getName()); - private final EntityCapsRepository entityCapsRepository; + private final XmppEntityCapsRepository entityCapsRepository; private final Map discoverInfoMap = new HashMap<>(); private final CompositeDisposable disposable = new CompositeDisposable(); @Inject - public EntityCapsStore(EntityCapsRepository entityCapsRepository) { + public EntityCapsStore(XmppEntityCapsRepository entityCapsRepository) { this.entityCapsRepository = entityCapsRepository; populateFromDatabase(); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index bc16ffe..9d2a91e 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -10,7 +10,7 @@ import org.mercury_im.messenger.data.repository.GroupChatRepository; import org.mercury_im.messenger.data.repository.MessageRepository; import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.data.repository.DirectChatRepository; -import org.mercury_im.messenger.data.repository.EntityCapsRepository; +import org.mercury_im.messenger.data.repository.XmppEntityCapsRepository; import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.data.repository.XmppAccountRepository; import org.mercury_im.messenger.data.repository.XmppDirectChatRepository; @@ -89,11 +89,11 @@ public class RepositoryModule { @Provides @Singleton - static EntityCapsRepository provideCapsRepository( + static XmppEntityCapsRepository provideCapsRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new EntityCapsRepository(data, ioScheduler, uiScheduler); + return new XmppEntityCapsRepository(data, ioScheduler, uiScheduler); } @Provides diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index 25034c2..e3976fe 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -3,7 +3,6 @@ package org.mercury_im.messenger.data.mapping; import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; -import org.mercury_im.messenger.entity.PasswordAuthentication; import javax.inject.Inject; @@ -27,7 +26,7 @@ public class AccountMapping extends AbstractMapping { @Override public AccountModel mapToModel(Account entity, AccountModel model) { model.setAddress(entity.getAddress()); - model.setPassword(entity.getAuthentication().getPassword()); + model.setPassword(entity.getPassword()); model.setEnabled(entity.isEnabled()); return model; @@ -37,7 +36,7 @@ public class AccountMapping extends AbstractMapping { public Account mapToEntity(AccountModel model, Account entity) { entity.setId(model.getId()); entity.setAddress(model.getAddress()); - entity.setAuthentication(new PasswordAuthentication(model.getPassword())); + entity.setPassword(model.getPassword()); entity.setEnabled(model.isEnabled()); return entity; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppEntityCapsRepository.java similarity index 84% rename from data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java rename to data/src/main/java/org/mercury_im/messenger/data/repository/XmppEntityCapsRepository.java index feccee5..e7073ed 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppEntityCapsRepository.java @@ -9,10 +9,10 @@ import io.reactivex.Scheduler; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; -public class EntityCapsRepository extends RequeryRepository { +public class XmppEntityCapsRepository extends RequeryRepository { @Inject - public EntityCapsRepository( + public XmppEntityCapsRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index fec5567..98ece17 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -74,8 +74,8 @@ public class XmppGroupChatRepository @Override public Single getOrCreateGroupChat(Account account, String roomAddress) { return getGroupChatByRoomAddress(account, roomAddress) - .switchIfEmpty(Single - .just((GroupChat) new IGroupChat() { + .switchIfEmpty( + Single.just((GroupChat) new IGroupChat() { { setAccount(account); setRoomAddress(roomAddress); diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 7d5f288..c63d6cf 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -6,21 +6,6 @@ import org.mercury_im.messenger.data.di.InMemoryDatabaseComponent; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.entity.PasswordAuthentication; -import org.mercury_im.messenger.entity.chat.DirectChat; -import org.mercury_im.messenger.entity.chat.IDirectChat; -import org.mercury_im.messenger.entity.contact.IPeer; -import org.mercury_im.messenger.entity.contact.Peer; -import org.mercury_im.messenger.entity.message.IMessage; -import org.mercury_im.messenger.entity.message.IPayloadContainer; -import org.mercury_im.messenger.entity.message.Message; -import org.mercury_im.messenger.entity.message.PayloadContainer; -import org.mercury_im.messenger.entity.message.content.TextPayload; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.List; import javax.inject.Inject; @@ -28,8 +13,6 @@ import io.reactivex.disposables.CompositeDisposable; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; -import static junit.framework.TestCase.assertEquals; - public class AccountRepositoryTest { @Inject diff --git a/domain/.gitignore b/domain/.gitignore index 796b96d..60bf954 100644 --- a/domain/.gitignore +++ b/domain/.gitignore @@ -1 +1,2 @@ /build +testcredentials.properties diff --git a/domain/build.gradle b/domain/build.gradle index 608afd2..7b7739b 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -4,6 +4,16 @@ dependencies { implementation project(':entity') + // 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" + + testImplementation "org.igniterealtime.smack:smack-java7:$smackJava7Version" + // RxJava2 implementation "io.reactivex.rxjava2:rxjava:$rxJava2Version" diff --git a/domain/src/main/java/org/mercury_im/messenger/MessageCenter.java b/domain/src/main/java/org/mercury_im/messenger/MessageCenter.java index fe5ab2c..995f780 100644 --- a/domain/src/main/java/org/mercury_im/messenger/MessageCenter.java +++ b/domain/src/main/java/org/mercury_im/messenger/MessageCenter.java @@ -1,6 +1,6 @@ package org.mercury_im.messenger; -import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; +import org.mercury_im.messenger.listener.IncomingDirectMessageListener; import org.mercury_im.messenger.entity.chat.Chat; import org.mercury_im.messenger.entity.message.Message; diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index a23d1e7..22cde18 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -2,7 +2,8 @@ package org.mercury_im.messenger; import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.transport.connection.ConnectionMethod; +import org.mercury_im.messenger.usecase.AddAccount; +import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.HashMap; import java.util.Map; @@ -13,28 +14,23 @@ public class Messenger { public static final String TAG = "MercuryIM"; - private final Map connections = new HashMap<>(); - - private final Repositories repositories; + private final Map connections = new HashMap<>(); + private Repositories repositories; @Inject public Messenger(Repositories repositories) { this.repositories = repositories; } - public void addConnection(ConnectionMethod connection) { + public void addConnection(MercuryConnection connection) { connections.put(connection.getAccount().getId(), connection); } - public ConnectionMethod getConnection(Account account) { + public MercuryConnection getConnection(Account account) { return connections.get(account.getId()); } - public void appInUse() { - - } - - public void appInBackground() { - + public AddAccount addAccount() { + return new AddAccount(repositories.getAccountRepository(), this); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/di/module/MercuryModule.java b/domain/src/main/java/org/mercury_im/messenger/di/module/MercuryModule.java deleted file mode 100644 index d54d541..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/di/module/MercuryModule.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.mercury_im.messenger.di.module; - -import org.mercury_im.messenger.Messenger; -import org.mercury_im.messenger.data.repository.Repositories; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; - -@Module -public class MercuryModule { - - /* - @Provides - @Singleton - static Messenger provideMessenger(Repositories repositories) { - return new Messenger(repositories); - } - - */ - -} diff --git a/domain/src/main/java/org/mercury_im/messenger/exception/IllegalUsernameException.java b/domain/src/main/java/org/mercury_im/messenger/exception/IllegalUsernameException.java new file mode 100644 index 0000000..6e084dc --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/exception/IllegalUsernameException.java @@ -0,0 +1,8 @@ +package org.mercury_im.messenger.exception; + +public class IllegalUsernameException extends RuntimeException { + + public IllegalUsernameException(Throwable cause) { + super(cause); + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingDirectMessageListener.java b/domain/src/main/java/org/mercury_im/messenger/listener/IncomingDirectMessageListener.java similarity index 84% rename from domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingDirectMessageListener.java rename to domain/src/main/java/org/mercury_im/messenger/listener/IncomingDirectMessageListener.java index 9e7a8d2..3facc87 100644 --- a/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingDirectMessageListener.java +++ b/domain/src/main/java/org/mercury_im/messenger/listener/IncomingDirectMessageListener.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.transport.listener; +package org.mercury_im.messenger.listener; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.DirectChat; diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingGroupChatMessageListener.java b/domain/src/main/java/org/mercury_im/messenger/listener/IncomingGroupChatMessageListener.java similarity index 85% rename from domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingGroupChatMessageListener.java rename to domain/src/main/java/org/mercury_im/messenger/listener/IncomingGroupChatMessageListener.java index b6932f3..3fc9af3 100644 --- a/domain/src/main/java/org/mercury_im/messenger/transport/listener/IncomingGroupChatMessageListener.java +++ b/domain/src/main/java/org/mercury_im/messenger/listener/IncomingGroupChatMessageListener.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.transport.listener; +package org.mercury_im.messenger.listener; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/listener/TypingEventListener.java b/domain/src/main/java/org/mercury_im/messenger/listener/TypingEventListener.java similarity index 80% rename from domain/src/main/java/org/mercury_im/messenger/transport/listener/TypingEventListener.java rename to domain/src/main/java/org/mercury_im/messenger/listener/TypingEventListener.java index 7662eac..3d8e037 100644 --- a/domain/src/main/java/org/mercury_im/messenger/transport/listener/TypingEventListener.java +++ b/domain/src/main/java/org/mercury_im/messenger/listener/TypingEventListener.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.transport.listener; +package org.mercury_im.messenger.listener; import org.mercury_im.messenger.entity.chat.Chat; import org.mercury_im.messenger.entity.event.TypingEvent; diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedEvent.java b/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedEvent.java deleted file mode 100644 index 2628fcf..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.mercury_im.messenger.transport; - -import org.mercury_im.messenger.entity.Account; - -public class AccountChangedEvent { - - private final Account account; - private final EventType eventType; - - public AccountChangedEvent(Account account, EventType eventType) { - this.account = account; - this.eventType = eventType; - } - - public Account getAccount() { - return account; - } - - public EventType getEventType() { - return eventType; - } - - public enum EventType { - enabled, - disabled - } -} diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedHandler.java b/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedHandler.java deleted file mode 100644 index ad38e00..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/transport/AccountChangedHandler.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.mercury_im.messenger.transport; - -import org.mercury_im.messenger.Messenger; -import org.mercury_im.messenger.data.repository.AccountRepository; -import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.util.DiffUtil; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import javax.inject.Inject; - -import io.reactivex.disposables.CompositeDisposable; - -public class AccountChangedHandler { - - private final Messenger messenger; - private final AccountRepository accountRepository; - private final Map accounts = new HashMap<>(); - private final CompositeDisposable disposable = new CompositeDisposable(); - - @Inject - public AccountChangedHandler(Messenger messenger, AccountRepository accountRepository) { - this.messenger = messenger; - this.accountRepository = accountRepository; - //disposable.add(accountRepository.observeAllAccounts() - // .scan(new ArrayList<>(), this::calculateChangeEvents) - // .subscribe(this::onAccountsChanged)); - } - - private HashMap calculateChangeEvents(List accounts, List newAccounts) { - DiffUtil.Diff diff = DiffUtil.diff(accounts, newAccounts); - return null; - } - - private AccountChangedEvent calculateEvent(Account previous, Account next) { - if (previous == null && next == null) { - throw new IllegalArgumentException("Not both accounts can be null at the same time!"); - } - if (previous == null) { - if (next.isEnabled()) { - return new AccountChangedEvent(next, AccountChangedEvent.EventType.enabled); - } else { - return null; - } - } - if (next == null) { - if (previous.isEnabled()) { - return new AccountChangedEvent(previous, AccountChangedEvent.EventType.disabled); - } else { - return null; - } - } - if (previous.isEnabled()) { - if (next.isEnabled()) { - return null; - } else { - return new AccountChangedEvent(next, AccountChangedEvent.EventType.disabled); - } - } else { - if (next.isEnabled()) { - return new AccountChangedEvent(next, AccountChangedEvent.EventType.enabled); - } else { - return null; - } - } - } - - private void onAccountsChanged(List accounts, List newAccounts) { - DiffUtil.Diff diff = DiffUtil.diff(accounts, newAccounts); - - } -} diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/ConnectionType.java b/domain/src/main/java/org/mercury_im/messenger/transport/ConnectionType.java deleted file mode 100644 index aa04e7f..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/transport/ConnectionType.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.mercury_im.messenger.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/messenger/transport/connection/AbstractConnectionMethod.java b/domain/src/main/java/org/mercury_im/messenger/transport/connection/AbstractConnectionMethod.java deleted file mode 100644 index 7d7383f..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/transport/connection/AbstractConnectionMethod.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.mercury_im.messenger.transport.connection; - -import org.mercury_im.messenger.Messenger; -import org.mercury_im.messenger.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/messenger/transport/connection/ConnectionFactory.java b/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionFactory.java deleted file mode 100644 index 7c9369a..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.mercury_im.messenger.transport.connection; - -import org.mercury_im.messenger.Messenger; -import org.mercury_im.messenger.entity.Account; - -public interface ConnectionFactory< - CM extends ConnectionMethod> { - - Messenger getMessenger(); - - CM provideConnection(Account account); - -} diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionMethod.java b/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionMethod.java deleted file mode 100644 index f8c0fbb..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/transport/connection/ConnectionMethod.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.mercury_im.messenger.transport.connection; - -import org.mercury_im.messenger.Messenger; -import org.mercury_im.messenger.transport.ConnectionType; -import org.mercury_im.messenger.entity.Account; - -import io.reactivex.Completable; - -public interface ConnectionMethod { - - Account getAccount(); - - Messenger getMessenger(); - - Completable connect(); - - ConnectionType getConnectionType(); -} diff --git a/domain/src/main/java/org/mercury_im/messenger/transport/connection/exception/ConnectionFailedException.java b/domain/src/main/java/org/mercury_im/messenger/transport/connection/exception/ConnectionFailedException.java deleted file mode 100644 index add6a2c..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/transport/connection/exception/ConnectionFailedException.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.mercury_im.messenger.transport.connection.exception; - -public class ConnectionFailedException extends Exception { - - private static final long serialVersionUID = 1L; -} diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java new file mode 100644 index 0000000..61a6953 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java @@ -0,0 +1,132 @@ +package org.mercury_im.messenger.usecase; + +import org.jivesoftware.smack.AbstractXMPPConnection; +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.sasl.SASLErrorException; +import org.jxmpp.jid.BareJid; +import org.jxmpp.jid.impl.JidCreate; +import org.jxmpp.stringprep.XmppStringprepException; +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.IAccount; +import org.mercury_im.messenger.exception.IllegalUsernameException; +import org.mercury_im.messenger.xmpp.MercuryConnection; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import io.reactivex.Completable; +import io.reactivex.Single; +import io.reactivex.schedulers.Schedulers; + +public class AddAccount { + + private static final Logger LOGGER = Logger.getLogger(AddAccount.class.getName()); + + private String username; + private String server; + private BareJid address; + private String password; + private Account account; + + private final AccountRepository accountRepository; + private final Messenger messenger; + + public AddAccount(AccountRepository accountRepository, Messenger messenger) { + this.accountRepository = accountRepository; + this.messenger = messenger; + } + + public void setAddress(String address) { + try { + this.address = JidCreate.entityBareFrom(address); + } catch (XmppStringprepException e) { + this.address = null; + throw new IllegalUsernameException(e); + } + } + + public boolean isAddressSet() { + return address != null; + } + + public void setPassword(String password) { + this.password = password; + } + + public boolean isPasswordSet() { + return password != null; + } + + public Single insertAccountIntoDatabase() { + Account account = new IAccount(); + account.setAddress(address.asUnescapedString()); + account.setPassword(password); + return accountRepository.insertAccount(account).doAfterSuccess(this::setAccount); + } + + private void setAccount(Account account) { + this.account = account; + } + + public Single enableAccountAndLogin(Account account) { + return enableAccount(account).andThen(login(account)); + } + + private Completable enableAccount(Account account) { + account.setEnabled(true); + return accountRepository.upsertAccount(account) + .doAfterSuccess(this::setAccount) + .ignoreElement(); + } + + private Single login(Account account) { + return Single.fromCallable(() -> { + MercuryConnection connection = getOrCreateConnection(account); + return authenticateIfNecessary(connection); + }).subscribeOn(Schedulers.io()); + } + + private MercuryConnection getOrCreateConnection(Account account) { + MercuryConnection connection = messenger.getConnection(account); + if (connection == null) { + connection = new MercuryConnection(account); + messenger.addConnection(connection); + } + return connection; + } + + private ConnectionResult authenticateIfNecessary(MercuryConnection connection) { + try { + doAuthenticateIfNecessary(connection); + return ConnectionResult.success; + } catch (SASLErrorException e) { + LOGGER.log(Level.WARNING, "SASL Error while connecting to account " + account.getAddress(), e); + return ConnectionResult.credential_error; + } catch (SmackException.ConnectionException e) { + LOGGER.log(Level.WARNING, "Connectivity error while connecting to account " + account.getAddress(), e); + return ConnectionResult.server_error; + } + catch (IOException | XMPPException | SmackException | InterruptedException e) { + LOGGER.log(Level.WARNING, "Error connecting to account " + account.getAddress(), e); + return ConnectionResult.other_error; + } + } + + private void doAuthenticateIfNecessary(MercuryConnection connection) + throws InterruptedException, XMPPException, SmackException, IOException { + if (!connection.getConnection().isAuthenticated()) { + ((AbstractXMPPConnection) connection.getConnection()).connect().login(); + } + } + + public enum ConnectionResult { + success, + credential_error, + server_error, + other_error + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java new file mode 100644 index 0000000..98bfa96 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -0,0 +1,34 @@ +package org.mercury_im.messenger.xmpp; + +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.tcp.XMPPTCPConnection; +import org.jxmpp.stringprep.XmppStringprepException; +import org.mercury_im.messenger.entity.Account; + +public class MercuryConnection { + + private final Account account; + + private XMPPConnection connection; + + public MercuryConnection(Account account) { + this.account = account; + try { + this.connection = new XMPPTCPConnection(account.getAddress(), account.getPassword()); + } catch (XmppStringprepException e) { + throw new AssertionError("Account has invalid address: " + account.getAddress(), e); + } + } + + public Account getAccount() { + return account; + } + + public XMPPConnection getConnection() { + return connection; + } + + public void ensureAuthenticated() { + + } +} diff --git a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppDirectMessageCenter.java similarity index 87% rename from xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java rename to domain/src/main/java/org/mercury_im/messenger/xmpp/XmppDirectMessageCenter.java index 6de84cc..ba8f8f4 100644 --- a/xmpp/src/main/java/org/mercury_im/messenger/domain/xmpp/XmppDirectMessageCenter.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppDirectMessageCenter.java @@ -1,10 +1,9 @@ -package org.mercury_im.messenger.domain.xmpp; +package org.mercury_im.messenger.xmpp; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.chat2.Chat; import org.jivesoftware.smack.chat2.ChatManager; import org.jivesoftware.smack.chat2.IncomingChatMessageListener; -import org.jivesoftware.smackx.avatar.element.MetadataExtension; import org.jivesoftware.smackx.sid.element.OriginIdElement; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; @@ -20,9 +19,7 @@ import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.message.IMessage; import org.mercury_im.messenger.entity.message.IMessageMetadata; import org.mercury_im.messenger.entity.message.Message; -import org.mercury_im.messenger.entity.message.MessageMetadata; -import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener; -import org.mercury_im.messenger.transport.xmpp.XmppTcpConnectionMethod; +import org.mercury_im.messenger.listener.IncomingDirectMessageListener; import java.util.LinkedHashSet; import java.util.Set; @@ -56,8 +53,7 @@ public class XmppDirectMessageCenter this.directChatRepository = repositories.getDirectChatRepository(); this.messageRepository = repositories.getMessageRepository(); - XMPPConnection connection = ((XmppTcpConnectionMethod) getMessenger() - .getConnection(account)).getConnection(); + XMPPConnection connection = getMessenger().getConnection(account).getConnection(); ChatManager.getInstanceFor(connection).addIncomingListener(this); } @@ -102,8 +98,8 @@ public class XmppDirectMessageCenter } protected ChatManager getChatManager(DirectChat chat) { - XmppTcpConnectionMethod connectionMethod = (XmppTcpConnectionMethod) getMessenger().getConnection(chat.getAccount()); - return ChatManager.getInstanceFor(connectionMethod.getConnection()); + MercuryConnection mercuryConnection = getMessenger().getConnection(chat.getAccount()); + return ChatManager.getInstanceFor(mercuryConnection.getConnection()); } @Override diff --git a/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/XmppConnectionLoginBehaviorTest.java b/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/XmppConnectionLoginBehaviorTest.java new file mode 100644 index 0000000..2b62017 --- /dev/null +++ b/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/XmppConnectionLoginBehaviorTest.java @@ -0,0 +1,91 @@ +package org.mercury_im.messenger.learning_tests.smack; + +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.sasl.SASLErrorException; +import org.jivesoftware.smack.tcp.XMPPTCPConnection; +import org.jivesoftware.smack.util.stringencoder.Base64; +import org.jivesoftware.smack.util.stringencoder.java7.Java7Base64Encoder; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static org.junit.Assume.assumeTrue; + +/** + * Learning Test to study Smacks behavior during connection process. + */ +public class XmppConnectionLoginBehaviorTest { + + public static final String CREDENTIALS_PROPERTIES = "testcredentials.properties"; + + private static final Logger LOGGER = Logger.getLogger(XmppConnectionLoginBehaviorTest.class.getName()); + private static Properties testCredentials = null; + + @BeforeClass + public static void readProperties() { + Properties properties = new Properties(); + File propertiesFile = new File(CREDENTIALS_PROPERTIES); + if (!propertiesFile.exists() || !propertiesFile.isFile()) { + LOGGER.log(Level.WARNING, "Cannot find file domain/testcredentials.properties. Some tests will be skipped."); + return; + } + + try(FileReader reader = new FileReader(propertiesFile)) { + properties.load(reader); + } catch (IOException e) { + LOGGER.log(Level.WARNING, "Error reading properties file testcredentials.properties.", e); + return; + } + testCredentials = properties; + + Base64.setEncoder(Java7Base64Encoder.getInstance()); + } + + /* + * Connecting to an invalid host causes {@link org.jivesoftware.smack.SmackException.ConnectionException} + * to be thrown. + */ + @Test(expected = SmackException.ConnectionException.class) + public void invalidHostConnectionTest() throws IOException, InterruptedException, XMPPException, SmackException { + ignoreIfNoCredentials(); + new XMPPTCPConnection( + testCredentials.getProperty("invalidHostUsername"), + testCredentials.getProperty("invalidHostPassword")) + .connect().login(); + } + + /* + * Connecting with invalid user causes {@link SASLErrorException} to be thrown. + */ + @Test(expected = SASLErrorException.class) + public void invalidUserConnectionTest() throws IOException, InterruptedException, XMPPException, SmackException { + ignoreIfNoCredentials(); + new XMPPTCPConnection( + testCredentials.getProperty("invalidUserUsername"), + testCredentials.getProperty("invalidUserPassword")) + .connect().login(); + } + + /* + * Connecting with invalid password causes {@link SASLErrorException} to be thrown. + */ + @Test(expected = SASLErrorException.class) + public void invalidPasswordConnectionTest() throws IOException, InterruptedException, XMPPException, SmackException { + ignoreIfNoCredentials(); + new XMPPTCPConnection( + testCredentials.getProperty("invalidPasswordUsername"), + testCredentials.getProperty("invalidPasswordPassword")) + .connect().login(); + } + + private void ignoreIfNoCredentials() { + assumeTrue("Test ignored as domain/testcredentials.properties file not found.", testCredentials != null); + } +} diff --git a/domain/testcredentials.properties.example b/domain/testcredentials.properties.example new file mode 100644 index 0000000..2752843 --- /dev/null +++ b/domain/testcredentials.properties.example @@ -0,0 +1,11 @@ +#Server must not exist +invalidHostUsername=invalid@example.com +invalidHostPassword=invalid123 + +#User must not exist on a server that is reachable +invalidUserUsername= +invalidPassword= + +#User must exists, but password must be invalid +invalidPasswordUsername= +invalidPasswordPassword= diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java index 3079838..cd7c66c 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -15,8 +15,14 @@ public interface Account { String getAddress(); + void setPassword(String password); + + String getPassword(); + + @Deprecated void setAuthentication(AuthMethod authentication); + @Deprecated AuthMethod getAuthentication(); void setEnabled(boolean enabled); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java index 9af4a5e..aadf418 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java @@ -4,6 +4,7 @@ public class IAccount implements Account { protected long id; protected String address; + protected String password; protected AuthMethod authentication; protected boolean enabled; @@ -28,6 +29,16 @@ public class IAccount implements Account { return address; } + @Override + public void setPassword(String password) { + this.password = password; + } + + @Override + public String getPassword() { + return password; + } + @Override public void setAuthentication(AuthMethod authentication) { this.authentication = authentication; diff --git a/settings.gradle b/settings.gradle index afa6a4f..1d606e1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,9 +1,7 @@ include ':entity', ':data', ':domain', - ':xmpp', ':app', - ':core-old', - ':view_entity' + ':core-old' includeBuild 'libs/Smack' diff --git a/view_entity/.gitignore b/view_entity/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/view_entity/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/view_entity/build.gradle b/view_entity/build.gradle deleted file mode 100644 index 7fa7473..0000000 --- a/view_entity/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 56bc35e..0000000 --- a/view_entity/src/main/java/org/mercury_im/messenger/view/entity/ViewInterlocutor.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.mercury_im.messenger.view.entity; - -import org.mercury_im.messenger.entity.contact.SubscriptionMode; -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 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, - 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 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 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(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 deleted file mode 100644 index 4187adb..0000000 --- a/view_entity/src/main/java/org/mercury_im/messenger/view/entity/definition/InterlocutorViewEntity.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.mercury_im.messenger.view.entity.definition; - -import org.mercury_im.messenger.entity.contact.SubscriptionMode; - -public interface InterlocutorViewEntity { - - String getName(); - - String getAddress(); - - String getAccountAddress(); - - SubscriptionMode getSubscriptionMode(); - - String getLastActivity(); - - boolean isTyping(); - - String getStatus(); -} diff --git a/xmpp/.gitignore b/xmpp/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/xmpp/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/xmpp/build.gradle b/xmpp/build.gradle deleted file mode 100644 index a0594e6..0000000 --- a/xmpp/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -apply plugin: 'java-library' - -dependencies { - implementation project(":entity") - implementation project(':domain') - - // 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" - testAnnotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" - - // 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" -targetCompatibility = "8" diff --git a/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppConnectionFactory.java b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppConnectionFactory.java deleted file mode 100644 index 5f07e73..0000000 --- a/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppConnectionFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.mercury_im.messenger.transport.xmpp; - -import org.jivesoftware.smack.ConnectionConfiguration; -import org.jivesoftware.smack.XMPPConnection; -import org.mercury_im.messenger.Messenger; -import org.mercury_im.messenger.transport.connection.ConnectionFactory; -import org.mercury_im.messenger.entity.Account; - -public abstract class XmppConnectionFactory - implements ConnectionFactory { - - protected final Messenger messenger; - - public XmppConnectionFactory(Messenger messenger) { - this.messenger = messenger; - } - - public Messenger getMessenger() { - return messenger; - } - - @Override - public XmppTcpConnectionMethod provideConnection(Account account) { - return new XmppTcpConnectionMethod(account, getMessenger(), createXmppConnection(getConfiguration(account))); - } - - protected abstract CF getConfiguration(Account account); - - protected abstract XMPPConnection createXmppConnection(CF connectionConfiguration); -} diff --git a/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionFactory.java b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionFactory.java deleted file mode 100644 index 2fa9808..0000000 --- a/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.mercury_im.messenger.transport.xmpp; - -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.messenger.Messenger; -import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.entity.PasswordAuthentication; - -public class XmppTcpConnectionFactory extends XmppConnectionFactory { - - public XmppTcpConnectionFactory(Messenger messenger) { - super(messenger); - } - - @Override - protected XMPPTCPConnectionConfiguration getConfiguration(Account account) { - XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); - configBuilder.setConnectTimeout(20 * 1000); - - if (account.getAuthentication() instanceof PasswordAuthentication) { - PasswordAuthentication authPassword = (PasswordAuthentication) 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/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionMethod.java b/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionMethod.java deleted file mode 100644 index 585008b..0000000 --- a/xmpp/src/main/java/org/mercury_im/messenger/transport/xmpp/XmppTcpConnectionMethod.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.mercury_im.messenger.transport.xmpp; - -import org.jivesoftware.smack.AbstractXMPPConnection; -import org.jivesoftware.smack.XMPPConnection; -import org.mercury_im.messenger.Messenger; -import org.mercury_im.messenger.transport.ConnectionType; -import org.mercury_im.messenger.transport.connection.AbstractConnectionMethod; -import org.mercury_im.messenger.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; - } -} From 2d71767ab28b9ca91bfb2ef1ebeb70ff00cbdfa7 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 01:45:30 +0100 Subject: [PATCH 48/83] Improve account login performance --- .../messenger/ui/login/AccountsFragment.java | 15 +++--- .../ui/login/AccountsRecyclerViewAdapter.java | 1 + .../messenger/ui/login/LoginActivity.java | 36 ++++++------- .../messenger/ui/login/LoginViewModel.java | 15 +++--- .../data/mapping/AccountMapping.java | 4 ++ .../data/model/AbstractAccountModel.java | 8 +++ .../repository/XmppAccountRepository.java | 5 -- .../data/mapping/AccountMappingTest.java | 9 ++-- .../repository/AccountRepositoryTest.java | 1 - .../messenger/usecase/AddAccount.java | 51 +++++++++---------- .../messenger/xmpp/MercuryConnection.java | 33 +++++++++--- .../mercury_im/messenger/entity/Account.java | 19 +++---- .../mercury_im/messenger/entity/IAccount.java | 21 ++++++-- .../entity/PasswordAuthentication.java | 15 ------ 14 files changed, 125 insertions(+), 108 deletions(-) delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/PasswordAuthentication.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java index f1e9b26..32d2477 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java @@ -49,6 +49,14 @@ public class AccountsFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + viewModel = new ViewModelProvider(this).get(AccountsViewModel.class); + this.adapter = new AccountsRecyclerViewAdapter(viewModel, accountClickListener); + } + + @Override + public void onResume() { + super.onResume(); + viewModel.getAccounts().observe(this, adapter::setValues); } @Override @@ -56,21 +64,16 @@ public class AccountsFragment extends Fragment { Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_account_list, container, false); ButterKnife.bind(this, view); - viewModel = new ViewModelProvider(this).get(AccountsViewModel.class); - // Set the adapter Context context = view.getContext(); - fab.setOnClickListener(v -> startActivity(new Intent(context, LoginActivity.class))); recyclerView.setLayoutManager(new LinearLayoutManager(context)); - this.adapter = new AccountsRecyclerViewAdapter(viewModel, accountClickListener); - viewModel.getAccounts().observe(this, roomAccountModels -> adapter.setValues(roomAccountModels)); + recyclerView.setAdapter(adapter); return view; } - @Override public void onAttach(Context context) { super.onAttach(context); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java index 969b403..deee1b3 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java @@ -68,6 +68,7 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter values) { + Log.d("AAAAA", "New values: " + values.size()); DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AccountsDiffCallback(values, mValues), true); mValues.clear(); mValues.addAll(values); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index fc28124..28b7976 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -30,29 +30,29 @@ import butterknife.ButterKnife; public class LoginActivity extends AppCompatActivity implements TextView.OnEditorActionListener { @BindView(R.id.username) - TextInputEditText mUsernameView; + TextInputEditText addressView; @BindView(R.id.password) - TextInputEditText mPasswordView; + TextInputEditText passwordView; @BindView(R.id.sign_in_button) - Button mSignInView; + Button loginButton; private LoginViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + ButterKnife.bind(this); MercuryImApplication.getApplication().getAppComponent().inject(this); - ButterKnife.bind(this); - viewModel = new ViewModelProvider(this).get(LoginViewModel.class); observeViewModel(); - setupTextInputFields(); - mSignInView.setOnClickListener(view -> viewModel.login()); + setupTextInputListeners(); + loginButton.setOnClickListener(view -> viewModel.login()); } private void observeViewModel() { @@ -64,13 +64,13 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito private void observeUsernameError() { viewModel.getUsernameError().observe(this, usernameError -> { - mUsernameView.setError(usernameError.isError() ? usernameError.getErrorMessage() : null); + addressView.setError(usernameError.isError() ? usernameError.getErrorMessage() : null); }); } private void observePasswordError() { viewModel.getPasswordError().observe(this, passwordError -> { - mPasswordView.setError(passwordError.isError() ? passwordError.getErrorMessage() : null); + passwordView.setError(passwordError.isError() ? passwordError.getErrorMessage() : null); }); } @@ -84,7 +84,7 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito private void enableLoginButtonOncePossible() { viewModel.isLoginEnabled().observe(this, isEnabled -> { - mSignInView.setEnabled(isEnabled); + loginButton.setEnabled(isEnabled); }); } @@ -125,27 +125,27 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito } if (accountEvent.getAddress() != null) { - mUsernameView.setText(accountEvent.getAddress()); + addressView.setText(accountEvent.getAddress()); } if (accountEvent.getPassword() != null) { - mPasswordView.setText(accountEvent.getPassword()); + passwordView.setText(accountEvent.getPassword()); } }); } - private void setupTextInputFields() { - mUsernameView.setOnEditorActionListener(this); - mPasswordView.setOnEditorActionListener(this); + private void setupTextInputListeners() { + addressView.setOnEditorActionListener(this); + passwordView.setOnEditorActionListener(this); - mUsernameView.addTextChangedListener(new TextChangedListener() { + addressView.addTextChangedListener(new TextChangedListener() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { viewModel.setUsername(charSequence.toString()); } }); - mPasswordView.addTextChangedListener(new TextChangedListener() { + passwordView.addTextChangedListener(new TextChangedListener() { @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { viewModel.setPassword(charSequence.toString()); @@ -158,7 +158,7 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito switch (v.getId()) { case R.id.username: if (actionId == EditorInfo.IME_ACTION_NEXT) { - mPasswordView.requestFocus(); + passwordView.requestFocus(); return true; } break; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index 138ae70..b6619cf 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -70,13 +70,16 @@ public class LoginViewModel extends AndroidViewModel { loginEnabled.setValue(username != null && !(password == null || password.isEmpty())); } - public void login() { - Account account = new IAccount(); - account.setAddress(username.asUnescapedString()); - account.setPassword(password); - account.setEnabled(true); + public synchronized void login() { + if (!loginEnabled.getValue()) { + // Prevent race condition where account would be logged in twice + return; + } loginEnabled.setValue(false); - messenger.addAccount().enableAccountAndLogin(account) + messenger.addAccount() + .setAddress(username.asEntityBareJidString()) + .setPassword(password) + .loginAndStoreOnSuccess() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .map(result -> { diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index e3976fe..f1d5103 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -27,6 +27,8 @@ public class AccountMapping extends AbstractMapping { public AccountModel mapToModel(Account entity, AccountModel model) { model.setAddress(entity.getAddress()); model.setPassword(entity.getPassword()); + model.setHost(entity.getHost()); + model.setPort(entity.getPort()); model.setEnabled(entity.isEnabled()); return model; @@ -37,6 +39,8 @@ public class AccountMapping extends AbstractMapping { entity.setId(model.getId()); entity.setAddress(model.getAddress()); entity.setPassword(model.getPassword()); + entity.setHost(model.getHost()); + entity.setPort(model.getPort()); entity.setEnabled(model.isEnabled()); return entity; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java index 943e7f1..cbad27e 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java @@ -21,8 +21,16 @@ public abstract class AbstractAccountModel implements Persistable { @Column(nullable = false) String password; + @Column + String host; + + @Column + int port; + + @Column boolean enabled; + @Column String rosterVersion; @Override diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 89e0404..cd86bf0 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -91,11 +91,6 @@ public class XmppAccountRepository public Observable> observeAllAccounts() { return dao.getAll().observableResult() .map(ResultDelegate::toList) - .scan(Collections.emptyList(), (a, b) -> { - List c = new ArrayList<>(b); - c.removeAll(a); - return c; - }) .map(this::modelsToEntities) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); diff --git a/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java b/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java index 1f921b4..6d0eb6b 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java @@ -5,7 +5,6 @@ import org.mercury_im.messenger.data.di.DaggerMappingTestComponent; import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; -import org.mercury_im.messenger.entity.PasswordAuthentication; import java.lang.reflect.Field; @@ -29,13 +28,13 @@ public class AccountMappingTest { ACCOUNT_MISSION_CONTROL.setId(1); ACCOUNT_MISSION_CONTROL.setAddress("mission-controll@planet.earth"); ACCOUNT_MISSION_CONTROL.setEnabled(true); - ACCOUNT_MISSION_CONTROL.setAuthentication(new PasswordAuthentication("notBecauseItIsEasy")); + ACCOUNT_MISSION_CONTROL.setPassword("notBecauseTheyAreEasy"); ACCOUNT_LITTLE_JOE = new IAccount(); ACCOUNT_LITTLE_JOE.setId(2); ACCOUNT_LITTLE_JOE.setAddress("little-joe@planet.earth"); ACCOUNT_LITTLE_JOE.setEnabled(false); - ACCOUNT_LITTLE_JOE.setAuthentication(new PasswordAuthentication("butBecauseItIsHard")); + ACCOUNT_LITTLE_JOE.setPassword("butBecauseTheyAreHard"); } public AccountMappingTest() { @@ -51,7 +50,7 @@ public class AccountMappingTest { 0, model.getId()); assertNotSame(ACCOUNT_MISSION_CONTROL.getId(), model.getId()); assertEquals(ACCOUNT_MISSION_CONTROL.getAddress(), model.getAddress()); - assertEquals(ACCOUNT_MISSION_CONTROL.getAuthentication().getPassword(), model.getPassword()); + assertEquals(ACCOUNT_MISSION_CONTROL.getPassword(), model.getPassword()); assertEquals(ACCOUNT_MISSION_CONTROL.isEnabled(), model.isEnabled()); } @@ -72,7 +71,7 @@ public class AccountMappingTest { assertEquals(model.getId(), entity.getId()); assertEquals(model.getAddress(), entity.getAddress()); - assertEquals(model.getPassword(), entity.getAuthentication().getPassword()); + assertEquals(model.getPassword(), entity.getPassword()); } private void setIdUsingReflections(AccountModel model, long id) throws NoSuchFieldException, IllegalAccessException { diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index c63d6cf..0348c96 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -5,7 +5,6 @@ import org.mercury_im.messenger.data.di.DaggerInMemoryDatabaseComponent; import org.mercury_im.messenger.data.di.InMemoryDatabaseComponent; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; -import org.mercury_im.messenger.entity.PasswordAuthentication; import javax.inject.Inject; diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java index 61a6953..db06ea8 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java @@ -20,77 +20,72 @@ import java.util.logging.Logger; import io.reactivex.Completable; import io.reactivex.Single; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; public class AddAccount { private static final Logger LOGGER = Logger.getLogger(AddAccount.class.getName()); - private String username; - private String server; - private BareJid address; - private String password; private Account account; private final AccountRepository accountRepository; private final Messenger messenger; + private final CompositeDisposable disposable = new CompositeDisposable(); + public AddAccount(AccountRepository accountRepository, Messenger messenger) { this.accountRepository = accountRepository; this.messenger = messenger; + this.account = new IAccount(); } - public void setAddress(String address) { - try { - this.address = JidCreate.entityBareFrom(address); - } catch (XmppStringprepException e) { - this.address = null; - throw new IllegalUsernameException(e); - } + public AddAccount setAddress(String address) { + this.account.setAddress(address); + return this; } public boolean isAddressSet() { - return address != null; + return account.getAddress() != null; } - public void setPassword(String password) { - this.password = password; + public AddAccount setPassword(String password) { + this.account.setPassword(password); + return this; } public boolean isPasswordSet() { - return password != null; - } - - public Single insertAccountIntoDatabase() { - Account account = new IAccount(); - account.setAddress(address.asUnescapedString()); - account.setPassword(password); - return accountRepository.insertAccount(account).doAfterSuccess(this::setAccount); + return account.getPassword() != null; } private void setAccount(Account account) { this.account = account; } - public Single enableAccountAndLogin(Account account) { - return enableAccount(account).andThen(login(account)); + public Single loginAndStoreOnSuccess() { + return login().map(result -> { + if (result == ConnectionResult.success) { + disposable.add(enableAccount().subscribe()); + } + return result; + }); } - private Completable enableAccount(Account account) { + private Completable enableAccount() { account.setEnabled(true); return accountRepository.upsertAccount(account) .doAfterSuccess(this::setAccount) .ignoreElement(); } - private Single login(Account account) { + private Single login() { return Single.fromCallable(() -> { - MercuryConnection connection = getOrCreateConnection(account); + MercuryConnection connection = getOrCreateConnection(); return authenticateIfNecessary(connection); }).subscribeOn(Schedulers.io()); } - private MercuryConnection getOrCreateConnection(Account account) { + private MercuryConnection getOrCreateConnection() { MercuryConnection connection = messenger.getConnection(account); if (connection == null) { connection = new MercuryConnection(account); diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java index 98bfa96..ba905a2 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -1,23 +1,27 @@ package org.mercury_im.messenger.xmpp; +import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.tcp.XMPPTCPConnection; +import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; +import org.jivesoftware.smack.util.stringencoder.BareJidEncoder; +import org.jxmpp.jid.BareJid; +import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.stringprep.XmppStringprepException; import org.mercury_im.messenger.entity.Account; +import java.net.Inet4Address; + public class MercuryConnection { - private final Account account; + private static final XmppConnectionFactory connectionFactory = new XmppConnectionFactory(); + private final Account account; private XMPPConnection connection; public MercuryConnection(Account account) { this.account = account; - try { - this.connection = new XMPPTCPConnection(account.getAddress(), account.getPassword()); - } catch (XmppStringprepException e) { - throw new AssertionError("Account has invalid address: " + account.getAddress(), e); - } + this.connection = connectionFactory.createConnection(account); } public Account getAccount() { @@ -31,4 +35,21 @@ public class MercuryConnection { public void ensureAuthenticated() { } + + public static class XmppConnectionFactory { + + public AbstractXMPPConnection createConnection(Account account) { + try { + XMPPTCPConnectionConfiguration connectionConfiguration = XMPPTCPConnectionConfiguration.builder() + .setConnectTimeout(10 * 1000) + .setXmppAddressAndPassword(account.getAddress(), account.getPassword()) + .setHost(account.getHost() != null ? account.getHost() : JidCreate.domainBareFrom(account.getAddress()).toString()) + .setPort(account.getPort() != 0 ? account.getPort() : 5222) + .build(); + return new XMPPTCPConnection(connectionConfiguration); + } catch (XmppStringprepException e) { + throw new AssertionError("Account has invalid address: " + account.getAddress(), e); + } + } + } } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java index cd7c66c..3d90113 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -19,22 +19,15 @@ public interface Account { String getPassword(); - @Deprecated - void setAuthentication(AuthMethod authentication); + void setHost(String host); - @Deprecated - AuthMethod getAuthentication(); + String getHost(); + + void setPort(int port); + + int getPort(); void setEnabled(boolean enabled); boolean isEnabled(); - - /** - * Interface to allow protocol-specific authentication information, like passwords, parameters, - * certificates etc. - */ - interface AuthMethod { - - String getPassword(); - } } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java index aadf418..a1094c2 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java @@ -5,7 +5,8 @@ public class IAccount implements Account { protected long id; protected String address; protected String password; - protected AuthMethod authentication; + protected String host; + protected int port; protected boolean enabled; @Override @@ -40,13 +41,23 @@ public class IAccount implements Account { } @Override - public void setAuthentication(AuthMethod authentication) { - this.authentication = authentication; + public void setHost(String host) { + this.host = host; } @Override - public AuthMethod getAuthentication() { - return authentication; + public String getHost() { + return host; + } + + @Override + public void setPort(int port) { + this.port = port; + } + + @Override + public int getPort() { + return port; } @Override diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/PasswordAuthentication.java b/entity/src/main/java/org/mercury_im/messenger/entity/PasswordAuthentication.java deleted file mode 100644 index e08d2e8..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/PasswordAuthentication.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.mercury_im.messenger.entity; - -public class PasswordAuthentication implements Account.AuthMethod { - - private String password; - - public PasswordAuthentication(String password) { - this.password = password; - } - - @Override - public String getPassword() { - return password; - } -} From 749c4ec89c4719b2ccb68f940b2a63ac520311c0 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 03:01:35 +0100 Subject: [PATCH 49/83] Enable/Disable foreground service depending on accounts --- .../messenger/MercuryImApplication.java | 57 ++++++++++++++++-- .../mercury_im/messenger/ui/MainActivity.java | 6 +- .../messenger/ui/login/LoginViewModel.java | 35 +++++------ .../messenger/usecase/AddAccount.java | 60 +++++++++---------- 4 files changed, 102 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index a27139d..37e4bab 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -3,12 +3,21 @@ package org.mercury_im.messenger; import android.app.Application; import android.content.Intent; import android.os.Build; +import android.util.Log; +import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.service.MercuryConnectionService; +import java.util.List; + +import javax.inject.Inject; + +import io.reactivex.disposables.CompositeDisposable; + public class MercuryImApplication extends Application { @@ -20,6 +29,10 @@ public class MercuryImApplication extends Application { private static MercuryImApplication INSTANCE; private AppComponent appComponent; private ClientStateHandler clientStateHandler = new ClientStateHandler(); + private final CompositeDisposable disposable = new CompositeDisposable(); + + @Inject + Repositories repositories; public static MercuryImApplication getApplication() { return INSTANCE; @@ -31,11 +44,12 @@ public class MercuryImApplication extends Application { super.onCreate(); INSTANCE = this; appComponent = createAppComponent(); + appComponent.inject(this); registerActivityLifecycleCallbacks(clientStateHandler); Notifications.initializeNotificationChannels(this); - startForegroundService(); + observeAccounts(); } /** @@ -55,13 +69,46 @@ public class MercuryImApplication extends Application { return appComponent; } + private void observeAccounts() { + disposable.add(repositories.getAccountRepository().observeAllAccounts() + .map(this::listContainsActiveAccount) + .distinctUntilChanged() + .subscribe(foregroundServiceNecessary -> { + if (foregroundServiceNecessary) { + Log.d("MercuryIM", "Enable foreground service."); + startForegroundService(); + } else { + Log.d("MercuryIM", "Disable foreground service."); + stopForegroundService(); + } + })); + } + + private boolean listContainsActiveAccount(List accounts) { + Log.d("MercuryIM", "listContainsActiveAccount size: " + accounts.size()); + boolean containsActiveAccount = false; + for (Account account : accounts) { + if (account.isEnabled()) { + containsActiveAccount = true; + break; + } + } + return containsActiveAccount; + } + private void startForegroundService() { - Intent foregroundService = new Intent(getApplicationContext(), MercuryConnectionService.class); - foregroundService.setAction(MercuryConnectionService.ACTION_START); + Intent startIntent = new Intent(getApplicationContext(), MercuryConnectionService.class); + startIntent.setAction(MercuryConnectionService.ACTION_START); if (Build.VERSION.SDK_INT < 26) { - startService(foregroundService); + startService(startIntent); } else { - startForegroundService(foregroundService); + startForegroundService(startIntent); } } + + private void stopForegroundService() { + Intent stopIntent = new Intent(getApplicationContext(), MercuryConnectionService.class); + stopIntent.setAction(MercuryConnectionService.ACTION_STOP); + startService(stopIntent); + } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index 6b0d4db..e1132f4 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -16,6 +16,7 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; import org.mercury_im.messenger.ui.login.AccountsFragment; @@ -41,6 +42,9 @@ public class MainActivity extends AppCompatActivity private RosterFragment rosterFragment = new RosterFragment(); private AccountsFragment accountsFragment = new AccountsFragment(); + @Inject + AccountRepository accountRepository; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -101,6 +105,6 @@ public class MainActivity extends AppCompatActivity @Override public void onAccountListItemLongClick(Account item) { - + accountRepository.deleteAccount(item).subscribe(); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index b6619cf..8520d8c 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -8,14 +8,14 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import org.jivesoftware.smack.sasl.SASLError; +import org.jivesoftware.smack.sasl.SASLErrorException; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.stringprep.XmppStringprepException; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.entity.IAccount; import javax.inject.Inject; @@ -79,29 +79,24 @@ public class LoginViewModel extends AndroidViewModel { messenger.addAccount() .setAddress(username.asEntityBareJidString()) .setPassword(password) - .loginAndStoreOnSuccess() + .loginAndStoreAccountIfSuccessful() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) - .map(result -> { - switch (result) { - case success: - loginSuccessful.setValue(true); - break; - case credential_error: - passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_incorrect_password))); - loginEnabled.setValue(true); - break; - case server_error: - case other_error: - Toast.makeText(getApplication(), "A connection error occurred", Toast.LENGTH_LONG); - loginEnabled.setValue(true); - } - return true; - }) - .ignoreElement() + .doOnComplete(() -> loginSuccessful.setValue(true)) + .doOnError(this::handleConnectionError) .subscribe(); } + private void handleConnectionError(Throwable error) { + if (error instanceof SASLErrorException) { + passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_incorrect_password))); + loginEnabled.setValue(true); + } else { + Toast.makeText(getApplication(), "A connection error occurred", Toast.LENGTH_LONG).show(); + loginEnabled.setValue(true); + } + } + public LiveData getPasswordError() { return passwordError; } diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java index db06ea8..80d2d5c 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java @@ -4,14 +4,10 @@ import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.sasl.SASLErrorException; -import org.jxmpp.jid.BareJid; -import org.jxmpp.jid.impl.JidCreate; -import org.jxmpp.stringprep.XmppStringprepException; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; -import org.mercury_im.messenger.exception.IllegalUsernameException; import org.mercury_im.messenger.xmpp.MercuryConnection; import java.io.IOException; @@ -28,6 +24,7 @@ public class AddAccount { private static final Logger LOGGER = Logger.getLogger(AddAccount.class.getName()); private Account account; + private MercuryConnection connection; private final AccountRepository accountRepository; private final Messenger messenger; @@ -58,45 +55,48 @@ public class AddAccount { return account.getPassword() != null; } - private void setAccount(Account account) { - this.account = account; + public Completable loginAndStoreAccountIfSuccessful() { + return login().andThen(insertEnabledAccountIntoDatabase()).ignoreElement() + .andThen(Completable.fromAction(() -> messenger.addConnection(connection))); } - public Single loginAndStoreOnSuccess() { - return login().map(result -> { - if (result == ConnectionResult.success) { - disposable.add(enableAccount().subscribe()); - } - return result; - }); - } - - private Completable enableAccount() { + private Single insertEnabledAccountIntoDatabase() { account.setEnabled(true); return accountRepository.upsertAccount(account) - .doAfterSuccess(this::setAccount) - .ignoreElement(); + .map(this::updateAccount); } - private Single login() { - return Single.fromCallable(() -> { - MercuryConnection connection = getOrCreateConnection(); - return authenticateIfNecessary(connection); - }).subscribeOn(Schedulers.io()); + private Account updateAccount(Account account) { + this.account = account; + updateAccountIdInConnection(account); + return account; } - private MercuryConnection getOrCreateConnection() { - MercuryConnection connection = messenger.getConnection(account); + private void updateAccountIdInConnection(Account account) { + if (connection != null) { + connection.getAccount().setId(account.getId()); + } + } + + private Completable login() { + return Completable.fromAction( + () -> { + getOrCreateConnection(); + doAuthenticateIfNecessary(); + }) + .subscribeOn(Schedulers.io()); + } + + private void getOrCreateConnection() { + connection = messenger.getConnection(account); if (connection == null) { connection = new MercuryConnection(account); - messenger.addConnection(connection); } - return connection; } - private ConnectionResult authenticateIfNecessary(MercuryConnection connection) { + private ConnectionResult authenticateIfNecessary() { try { - doAuthenticateIfNecessary(connection); + doAuthenticateIfNecessary(); return ConnectionResult.success; } catch (SASLErrorException e) { LOGGER.log(Level.WARNING, "SASL Error while connecting to account " + account.getAddress(), e); @@ -111,7 +111,7 @@ public class AddAccount { } } - private void doAuthenticateIfNecessary(MercuryConnection connection) + private void doAuthenticateIfNecessary() throws InterruptedException, XMPPException, SmackException, IOException { if (!connection.getConnection().isAuthenticated()) { ((AbstractXMPPConnection) connection.getConnection()).connect().login(); From 7d1714e47a42dfc878b2a13a6868c65788c43574 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 03:13:00 +0100 Subject: [PATCH 50/83] Improve last commit --- .../messenger/MercuryImApplication.java | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index 37e4bab..7db0992 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -3,9 +3,8 @@ package org.mercury_im.messenger; import android.app.Application; import android.content.Intent; import android.os.Build; -import android.util.Log; -import org.mercury_im.messenger.data.repository.Repositories; +import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.di.component.AppComponent; import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; @@ -32,7 +31,7 @@ public class MercuryImApplication extends Application { private final CompositeDisposable disposable = new CompositeDisposable(); @Inject - Repositories repositories; + AccountRepository accountRepository; public static MercuryImApplication getApplication() { return INSTANCE; @@ -49,7 +48,7 @@ public class MercuryImApplication extends Application { registerActivityLifecycleCallbacks(clientStateHandler); Notifications.initializeNotificationChannels(this); - observeAccounts(); + subscribeForegroundServiceToActiveAccounts(); } /** @@ -69,31 +68,26 @@ public class MercuryImApplication extends Application { return appComponent; } - private void observeAccounts() { - disposable.add(repositories.getAccountRepository().observeAllAccounts() + private void subscribeForegroundServiceToActiveAccounts() { + disposable.add(accountRepository.observeAllAccounts() .map(this::listContainsActiveAccount) .distinctUntilChanged() - .subscribe(foregroundServiceNecessary -> { - if (foregroundServiceNecessary) { - Log.d("MercuryIM", "Enable foreground service."); + .subscribe(foregroundServiceNeeded -> { + if (foregroundServiceNeeded) { startForegroundService(); } else { - Log.d("MercuryIM", "Disable foreground service."); stopForegroundService(); } })); } private boolean listContainsActiveAccount(List accounts) { - Log.d("MercuryIM", "listContainsActiveAccount size: " + accounts.size()); - boolean containsActiveAccount = false; for (Account account : accounts) { if (account.isEnabled()) { - containsActiveAccount = true; - break; + return true; } } - return containsActiveAccount; + return false; } private void startForegroundService() { From 81aab30d591d68e903fbd53426ab7a25a2b6a113 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 03:24:00 +0100 Subject: [PATCH 51/83] Setup CSI again --- .../messenger/MercuryImApplication.java | 11 ++++- .../org/mercury_im/messenger/Messenger.java | 42 ++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index 7db0992..480082c 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -33,6 +33,9 @@ public class MercuryImApplication extends Application { @Inject AccountRepository accountRepository; + @Inject + Messenger messenger; + public static MercuryImApplication getApplication() { return INSTANCE; } @@ -45,12 +48,18 @@ public class MercuryImApplication extends Application { appComponent = createAppComponent(); appComponent.inject(this); - registerActivityLifecycleCallbacks(clientStateHandler); + setupClientStateIndication(); + Notifications.initializeNotificationChannels(this); subscribeForegroundServiceToActiveAccounts(); } + private void setupClientStateIndication() { + clientStateHandler.addClientStateListener(messenger); + registerActivityLifecycleCallbacks(clientStateHandler); + } + /** * Create the Dependency Injection graph. */ diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index 22cde18..4ea055e 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -1,5 +1,8 @@ package org.mercury_im.messenger; +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smackx.csi.ClientStateIndicationManager; import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.usecase.AddAccount; @@ -7,12 +10,15 @@ import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.HashMap; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.inject.Inject; -public class Messenger { +public class Messenger implements ClientStateListener { public static final String TAG = "MercuryIM"; + private static final Logger LOGGER = Logger.getLogger(Messenger.class.getName()); private final Map connections = new HashMap<>(); private Repositories repositories; @@ -33,4 +39,38 @@ public class Messenger { public AddAccount addAccount() { return new AddAccount(repositories.getAccountRepository(), this); } + + // CSI + + @Override + public void onClientInForeground() { + LOGGER.log(Level.INFO, "CSI: active"); + for (MercuryConnection connection : connections.values()) { + tryCsiActive(connection); + } + } + + @Override + public void onClientInBackground() { + LOGGER.log(Level.INFO, "CSI: inactive"); + for (MercuryConnection connection : connections.values()) { + tryCsiInactive(connection); + } + } + + private void tryCsiActive(MercuryConnection connection) { + try { + ClientStateIndicationManager.active(connection.getConnection()); + } catch (SmackException.NotConnectedException | InterruptedException e) { + LOGGER.log(Level.WARNING, "Sending CSI state 'active' failed.", e); + } + } + + private void tryCsiInactive(MercuryConnection connection) { + try { + ClientStateIndicationManager.inactive(connection.getConnection()); + } catch (SmackException.NotConnectedException | InterruptedException e) { + LOGGER.log(Level.WARNING, "Sending CSI state 'inactive' failed.", e); + } + } } From ba7d983b9541da471d6d5e7b24270efd86e13096 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 03:46:17 +0100 Subject: [PATCH 52/83] Rename ui package login -> account --- app/src/main/AndroidManifest.xml | 2 +- .../mercury_im/messenger/di/component/AppComponent.java | 6 +++--- .../messenger/service/MercuryConnectionService.java | 9 +++------ .../java/org/mercury_im/messenger/ui/MainActivity.java | 3 +-- .../ui/{login => account}/AccountsFragment.java | 4 +--- .../{login => account}/AccountsRecyclerViewAdapter.java | 6 ++---- .../ui/{login => account}/AccountsViewModel.java | 2 +- .../ui/{login => account}/AddAccountDialog.java | 2 +- .../messenger/ui/{login => account}/LoginActivity.java | 2 +- .../messenger/ui/{login => account}/LoginViewModel.java | 3 +-- .../messenger/ui/{login => account}/package-info.java | 2 +- app/src/main/res/layout/activity_login.xml | 2 +- app/src/main/res/layout/fragment_account_list.xml | 2 +- 13 files changed, 18 insertions(+), 27 deletions(-) rename app/src/main/java/org/mercury_im/messenger/ui/{login => account}/AccountsFragment.java (96%) rename app/src/main/java/org/mercury_im/messenger/ui/{login => account}/AccountsRecyclerViewAdapter.java (94%) rename app/src/main/java/org/mercury_im/messenger/ui/{login => account}/AccountsViewModel.java (97%) rename app/src/main/java/org/mercury_im/messenger/ui/{login => account}/AddAccountDialog.java (90%) rename app/src/main/java/org/mercury_im/messenger/ui/{login => account}/LoginActivity.java (99%) rename app/src/main/java/org/mercury_im/messenger/ui/{login => account}/LoginViewModel.java (97%) rename app/src/main/java/org/mercury_im/messenger/ui/{login => account}/package-info.java (55%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f39d433..46c12f2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,7 +33,7 @@ android:name=".ui.settings.SettingsActivity" android:label="@string/title_activity_settings" /> diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index 8c8f752..6922ad4 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -11,9 +11,9 @@ import org.mercury_im.messenger.ui.chat.ChatInputFragment; import org.mercury_im.messenger.ui.chat.ChatInputViewModel; import org.mercury_im.messenger.ui.chat.ChatViewModel; import org.mercury_im.messenger.ui.chatlist.ChatListViewModel; -import org.mercury_im.messenger.ui.login.AccountsViewModel; -import org.mercury_im.messenger.ui.login.LoginActivity; -import org.mercury_im.messenger.ui.login.LoginViewModel; +import org.mercury_im.messenger.ui.account.AccountsViewModel; +import org.mercury_im.messenger.ui.account.LoginActivity; +import org.mercury_im.messenger.ui.account.LoginViewModel; import org.mercury_im.messenger.ui.roster.contacts.ContactListViewModel; import javax.inject.Singleton; diff --git a/app/src/main/java/org/mercury_im/messenger/service/MercuryConnectionService.java b/app/src/main/java/org/mercury_im/messenger/service/MercuryConnectionService.java index 981bd31..6be80c3 100644 --- a/app/src/main/java/org/mercury_im/messenger/service/MercuryConnectionService.java +++ b/app/src/main/java/org/mercury_im/messenger/service/MercuryConnectionService.java @@ -48,7 +48,6 @@ public class MercuryConnectionService extends Service { /** * PingManager will ensure the XMPP connection is kept alive. - * TODO: Move out of this service/module */ private void beginLifecycleOfPingManager() { ServerPingWithAlarmManager.onCreate(this); @@ -89,18 +88,16 @@ public class MercuryConnectionService extends Service { return START_STICKY_COMPATIBILITY; } - public void startAndDisplayForegroundNotification() { - Notification notification = getForegroundNotification(getApplicationContext()); - + private void startAndDisplayForegroundNotification() { + Notification notification = buildForegroundNotification(getApplicationContext()); startForeground(Notifications.FOREGROUND_SERVICE_ID, notification); } - static Notification getForegroundNotification(Context context) { + private static Notification buildForegroundNotification(Context context) { Intent startMainActivityIntent = new Intent(context, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, startMainActivityIntent, 0); return new NotificationCompat.Builder(context, Notifications.NOTIFICATION_CHANNEL__FOREGROUND_SERVICE) - .setContentTitle("Mercury") .setSmallIcon(R.drawable.ic_send_black_24dp) .setContentIntent(pendingIntent) .build(); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index e1132f4..d8a3bad 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -15,11 +15,10 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; -import org.mercury_im.messenger.ui.login.AccountsFragment; +import org.mercury_im.messenger.ui.account.AccountsFragment; import org.mercury_im.messenger.ui.roster.RosterFragment; import org.mercury_im.messenger.ui.settings.SettingsActivity; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java similarity index 96% rename from app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java rename to app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java index 32d2477..d391154 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java @@ -1,9 +1,8 @@ -package org.mercury_im.messenger.ui.login; +package org.mercury_im.messenger.ui.account; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,7 +14,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; -import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java similarity index 94% rename from app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java rename to app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java index deee1b3..c0ab5e8 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.ui.login; +package org.mercury_im.messenger.ui.account; import android.util.Log; import android.view.LayoutInflater; @@ -11,14 +11,12 @@ import android.widget.TextView; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; -import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.avatar.AvatarDrawable; -import org.mercury_im.messenger.ui.login.AccountsFragment.OnAccountListItemClickListener; +import org.mercury_im.messenger.ui.account.AccountsFragment.OnAccountListItemClickListener; import org.mercury_im.messenger.util.AbstractDiffCallback; -import org.mercury_im.messenger.util.ColorUtil; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java similarity index 97% rename from app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java rename to app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java index 1caa29a..57030d3 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.ui.login; +package org.mercury_im.messenger.ui.account; import android.app.Application; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AddAccountDialog.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java similarity index 90% rename from app/src/main/java/org/mercury_im/messenger/ui/login/AddAccountDialog.java rename to app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java index eb276cc..65aa6e5 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AddAccountDialog.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.ui.login; +package org.mercury_im.messenger.ui.account; import android.content.Context; import android.os.Bundle; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java similarity index 99% rename from app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java rename to app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java index 28b7976..9555957 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.ui.login; +package org.mercury_im.messenger.ui.account; import android.os.Bundle; import android.view.KeyEvent; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java similarity index 97% rename from app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java rename to app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java index 8520d8c..3f01d26 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.ui.login; +package org.mercury_im.messenger.ui.account; import android.app.Application; import android.widget.Toast; @@ -8,7 +8,6 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import org.jivesoftware.smack.sasl.SASLError; import org.jivesoftware.smack.sasl.SASLErrorException; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/package-info.java b/app/src/main/java/org/mercury_im/messenger/ui/account/package-info.java similarity index 55% rename from app/src/main/java/org/mercury_im/messenger/ui/login/package-info.java rename to app/src/main/java/org/mercury_im/messenger/ui/account/package-info.java index 39d6812..270cacb 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/package-info.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/package-info.java @@ -1,4 +1,4 @@ /** * Some Javadoc information about the package. */ -package org.mercury_im.messenger.ui.login; +package org.mercury_im.messenger.ui.account; diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 1f7b1cd..c2a4264 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -10,7 +10,7 @@ android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingBottom="@dimen/activity_vertical_margin" - tools:context=".ui.login.LoginActivity"> + tools:context=".ui.account.LoginActivity"> Date: Sat, 21 Dec 2019 04:08:59 +0100 Subject: [PATCH 53/83] More account management refactoring --- .../ui/account/AccountsFragment.java | 4 ++ .../account/AccountsRecyclerViewAdapter.java | 68 +++++++++---------- .../ui/account/AccountsViewModel.java | 12 +--- .../ui/account/AddAccountDialog.java | 21 ------ .../messenger/ui/account/LoginActivity.java | 16 ----- .../messenger/ui/account/LoginViewModel.java | 33 +++++---- .../mercury_im/messenger/entity/Account.java | 4 ++ 7 files changed, 62 insertions(+), 96 deletions(-) delete mode 100644 app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java index d391154..59a4208 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java @@ -54,6 +54,10 @@ public class AccountsFragment extends Fragment { @Override public void onResume() { super.onResume(); + observeViewModel(); + } + + private void observeViewModel() { viewModel.getAccounts().observe(this, adapter::setValues); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java index c0ab5e8..6723b91 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java @@ -1,6 +1,5 @@ package org.mercury_im.messenger.ui.account; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,7 +10,6 @@ import android.widget.TextView; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; -import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.avatar.AvatarDrawable; @@ -23,13 +21,12 @@ import java.util.List; public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - private final List mValues; - private final OnAccountListItemClickListener mListener; + private final List accounts = new ArrayList<>(); + private final OnAccountListItemClickListener onAccountClickListener; private final AccountsViewModel viewModel; public AccountsRecyclerViewAdapter(AccountsViewModel viewModel, OnAccountListItemClickListener listener) { - mValues = new ArrayList<>(); - mListener = listener; + onAccountClickListener = listener; this.viewModel = viewModel; } @@ -40,43 +37,40 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - viewModel.toggleAccountEnabled(account); - }); - holder.mView.setOnClickListener(v -> { - if (null != mListener) { - // Notify the active callbacks interface (the activity, if the - // fragment is attached to one) that an item has been selected. - mListener.onAccountListItemClick(holder.account); - } - }); - holder.mView.setOnLongClickListener(v -> { - if (null != mListener) { - mListener.onAccountListItemLongClick(holder.account); - } - return true; - }); - } - public void setValues(List values) { - Log.d("AAAAA", "New values: " + values.size()); - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AccountsDiffCallback(values, mValues), true); - mValues.clear(); - mValues.addAll(values); + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AccountsDiffCallback(values, accounts), true); + accounts.clear(); + accounts.addAll(values); diffResult.dispatchUpdatesTo(this); } @Override public int getItemCount() { - Log.d(Messenger.TAG, "Accounts Item Count: " + mValues.size()); - return mValues.size(); + return accounts.size(); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + Account account = accounts.get(position); + + holder.account = account; + holder.jid.setText(account.getAddress()); + holder.avatar.setImageDrawable(new AvatarDrawable(account.getAddress(), account.getAddress())); + holder.enabled.setChecked(account.isEnabled()); + holder.enabled.setOnCheckedChangeListener((compoundButton, checked) -> viewModel.setAccountEnabled(account, checked)); + + holder.mView.setOnClickListener(v -> { + if (null != onAccountClickListener) { + onAccountClickListener.onAccountListItemClick(holder.account); + } + }); + + holder.mView.setOnLongClickListener(v -> { + if (null != onAccountClickListener) { + onAccountClickListener.onAccountListItemLongClick(holder.account); + } + return true; + }); } public class ViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java index 57030d3..090de68 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java @@ -42,16 +42,8 @@ public class AccountsViewModel extends AndroidViewModel { return accounts; } - public void toggleAccountEnabled(Account accountModel) { - /* - MercuryConnection connection = connectionCenter.getConnection(accountModel); - if (connection == null) { - Toast.makeText(this.getApplication(), "MercuryConnection is null!", Toast.LENGTH_LONG).show(); - return; - } - */ - - accountModel.setEnabled(!accountModel.isEnabled()); + public void setAccountEnabled(Account accountModel, boolean enabled) { + accountModel.setEnabled(enabled); repository.upsertAccount(accountModel) .subscribe(); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java deleted file mode 100644 index 65aa6e5..0000000 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.mercury_im.messenger.ui.account; - -import android.content.Context; -import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; - -public class AddAccountDialog extends AlertDialog { - - protected AddAccountDialog(@NonNull Context context, int themeResId) { - super(context, themeResId); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - } - -} diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java index 9555957..2211ef8 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java @@ -118,22 +118,6 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito } } - private void displayCredentials(LiveData account) { - account.observe(this, accountEvent -> { - if (accountEvent == null) { - return; - } - - if (accountEvent.getAddress() != null) { - addressView.setText(accountEvent.getAddress()); - } - - if (accountEvent.getPassword() != null) { - passwordView.setText(accountEvent.getPassword()); - } - }); - } - private void setupTextInputListeners() { addressView.setOnEditorActionListener(this); passwordView.setOnEditorActionListener(this); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java index 3f01d26..9e21544 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java @@ -19,14 +19,17 @@ import org.mercury_im.messenger.R; import javax.inject.Inject; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; public class LoginViewModel extends AndroidViewModel { private MutableLiveData usernameError = new MutableLiveData<>(new Error()); private MutableLiveData passwordError = new MutableLiveData<>(new Error()); - private MutableLiveData loginEnabled = new MutableLiveData<>(false); - private MutableLiveData loginSuccessful = new MutableLiveData<>(false); + private MutableLiveData loginButtonEnabled = new MutableLiveData<>(false); + private MutableLiveData loginCompleted = new MutableLiveData<>(false); + + private final CompositeDisposable disposable = new CompositeDisposable(); private EntityBareJid username; private String password; @@ -66,36 +69,42 @@ public class LoginViewModel extends AndroidViewModel { } private void updateLoginEnabled() { - loginEnabled.setValue(username != null && !(password == null || password.isEmpty())); + loginButtonEnabled.setValue(username != null && !(password == null || password.isEmpty())); } public synchronized void login() { - if (!loginEnabled.getValue()) { + if (!loginButtonEnabled.getValue()) { // Prevent race condition where account would be logged in twice return; } - loginEnabled.setValue(false); - messenger.addAccount() + loginButtonEnabled.setValue(false); + disposable.add(messenger.addAccount() .setAddress(username.asEntityBareJidString()) .setPassword(password) .loginAndStoreAccountIfSuccessful() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) - .doOnComplete(() -> loginSuccessful.setValue(true)) + .doOnComplete(() -> loginCompleted.setValue(true)) .doOnError(this::handleConnectionError) - .subscribe(); + .subscribe()); } private void handleConnectionError(Throwable error) { if (error instanceof SASLErrorException) { passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_incorrect_password))); - loginEnabled.setValue(true); + loginButtonEnabled.setValue(true); } else { Toast.makeText(getApplication(), "A connection error occurred", Toast.LENGTH_LONG).show(); - loginEnabled.setValue(true); + loginButtonEnabled.setValue(true); } } + @Override + protected void onCleared() { + super.onCleared(); + disposable.clear(); + } + public LiveData getPasswordError() { return passwordError; } @@ -105,11 +114,11 @@ public class LoginViewModel extends AndroidViewModel { } public LiveData isLoginSuccessful() { - return loginSuccessful; + return loginCompleted; } public LiveData isLoginEnabled() { - return loginEnabled; + return loginButtonEnabled; } public static class Error { diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java index 3d90113..44593cc 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -30,4 +30,8 @@ public interface Account { void setEnabled(boolean enabled); boolean isEnabled(); + + default String displayName() { + return getAddress(); + } } From ff04832614480b04ada7a00fb530ab50313665c1 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 04:18:00 +0100 Subject: [PATCH 54/83] Small refactoring --- .../account/AccountsRecyclerViewAdapter.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java index 6723b91..f022fac 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java @@ -7,9 +7,11 @@ import android.widget.ImageView; import android.widget.Switch; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; +import org.jetbrains.annotations.NotNull; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.avatar.AvatarDrawable; @@ -30,6 +32,7 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter values) { - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AccountsDiffCallback(values, accounts), true); + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff( + new AccountsDiffCallback(values, accounts), true); accounts.clear(); accounts.addAll(values); diffResult.dispatchUpdatesTo(this); @@ -57,8 +61,13 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter viewModel.setAccountEnabled(account, checked)); + holder.enabled.setOnCheckedChangeListener((compoundButton, checked) -> + viewModel.setAccountEnabled(account, checked)); + setClickListenersOnViewHolder(holder); + } + + private void setClickListenersOnViewHolder(ViewHolder holder) { holder.mView.setOnClickListener(v -> { if (null != onAccountClickListener) { onAccountClickListener.onAccountListItemClick(holder.account); @@ -73,13 +82,13 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter Date: Sat, 21 Dec 2019 05:34:19 +0100 Subject: [PATCH 55/83] Work on contact list - wip! --- .../messenger/ui/chat/ChatViewModel.java | 23 +- .../ui/chat/MessagesRecyclerViewAdapter.java | 44 ++-- .../ui/chatlist/ChatListFragment.java | 6 +- .../ui/chatlist/ChatListViewModel.java | 3 +- .../roster/contacts/ContactListViewModel.java | 5 +- .../converter/MessageDirectionConverter.java | 44 ++++ .../SubscriptionDirectionConverter.java | 2 +- .../data/mapping/MessageMapping.java | 2 + .../messenger/data/mapping/PeerMapping.java | 78 +------ .../data/model/AbstractMessageModel.java | 8 + .../data/model/AbstractPeerModel.java | 2 +- .../repository/XmppMessageRepository.java | 2 +- .../data/repository/XmppPeerRepository.java | 27 +++ .../data/mapping/PeerMappingTest.java | 3 +- .../repository/AccountRepositoryTest.java | 6 +- .../org/mercury_im/messenger/Messenger.java | 9 + .../data/repository/PeerRepository.java | 8 + .../messenger/store/MercuryRosterStore.java | 207 ++++++++++++++++++ .../messenger/entity/contact/IPeer.java | 36 ++- .../messenger/entity/contact/Peer.java | 12 +- .../contact}/SubscriptionDirection.java | 2 +- .../entity/contact/SubscriptionMode.java | 55 ----- .../messenger/entity/message/IMessage.java | 12 + .../messenger/entity/message/Message.java | 8 + .../entity/message/MessageDirection.java | 6 + 25 files changed, 420 insertions(+), 190 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/converter/MessageDirectionConverter.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java rename {data/src/main/java/org/mercury_im/messenger/data/enums => entity/src/main/java/org/mercury_im/messenger/entity/contact}/SubscriptionDirection.java (64%) delete mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/message/MessageDirection.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 521d429..159335a 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -18,8 +18,11 @@ import java.util.List; import javax.inject.Inject; import io.reactivex.Completable; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.functions.Consumer; +import io.reactivex.schedulers.Schedulers; public class ChatViewModel extends ViewModel { @@ -85,22 +88,12 @@ public class ChatViewModel extends ViewModel { } public void queryTextChanged(String query) { - /* - if (query.isEmpty()) { - disposable.add(messageRepository.getAllMessagesOfChat(accountId, jid) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe((Consumer>) - messages -> ChatViewModel.this.messages.setValue(messages))); - } - disposable.add(messageRepository.findMessageByQuery(accountId, jid, query) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe((Consumer>) o -> { - messages.setValue(o); - })); + Observable> observable = query.isEmpty() ? + messageRepository.observeMessages(chat.getValue()) : + messageRepository.findMessagesWithBody(chat.getValue(), query); - */ + disposable.add(observable.subscribe(messages -> + ChatViewModel.this.messages.setValue(messages))); } public Completable requestMamMessages() { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java index c0306c0..09da304 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java @@ -1,6 +1,6 @@ package org.mercury_im.messenger.ui.chat; -import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -20,7 +20,7 @@ import java.util.List; public class MessagesRecyclerViewAdapter extends RecyclerView.Adapter { private List messages = new ArrayList<>(); - private SparseArray checkedItems = new SparseArray<>(); + private SparseBooleanArray checkedItems = new SparseBooleanArray(); public MessagesRecyclerViewAdapter() { @@ -50,22 +50,22 @@ public class MessagesRecyclerViewAdapter extends RecyclerView.Adapter { - if (chatModels == null) { - Log.d(Messenger.TAG, "Displaying null chats"); - return; - } Log.d(Messenger.TAG, "Displaying " + chatModels.size() + " chats"); recyclerViewAdapter.setModels(chatModels); }); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java index ce13c2e..cd7be0b 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java @@ -8,6 +8,7 @@ import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.data.repository.DirectChatRepository; import org.mercury_im.messenger.entity.chat.DirectChat; +import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -21,7 +22,7 @@ public class ChatListViewModel extends ViewModel { private CompositeDisposable disposable = new CompositeDisposable(); - private final MutableLiveData> chats = new MutableLiveData<>(); + private final MutableLiveData> chats = new MutableLiveData<>(new ArrayList<>()); public ChatListViewModel() { MercuryImApplication.getApplication().getAppComponent().inject(this); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index 5f4904d..86c87fc 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -31,10 +31,7 @@ public class ContactListViewModel extends ViewModel { Log.d("ContactListViewModel", "Start observing database"); // Subscribe to changes to the contacts table and update the LiveData object for the UI. compositeDisposable.add(xmppContactRepository.observeAllPeers() - .subscribe(list -> { - Log.d("ContactListViewModel", "Room changed contacts: " + list.size()); - rosterEntryList.setValue(list); - })); + .subscribe(rosterEntryList::setValue)); } @Override diff --git a/data/src/main/java/org/mercury_im/messenger/data/converter/MessageDirectionConverter.java b/data/src/main/java/org/mercury_im/messenger/data/converter/MessageDirectionConverter.java new file mode 100644 index 0000000..412b063 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/converter/MessageDirectionConverter.java @@ -0,0 +1,44 @@ +package org.mercury_im.messenger.data.converter; + +import org.mercury_im.messenger.entity.message.MessageDirection; + +import io.requery.Converter; + +public class MessageDirectionConverter implements Converter { + @Override + public Class getMappedType() { + return MessageDirection.class; + } + + @Override + public Class getPersistedType() { + return Integer.class; + } + + @Override + public Integer getPersistedSize() { + return null; + } + + @Override + public Integer convertToPersisted(MessageDirection value) { + switch (value) { + case outgoing: + return 0; + case incoming: + return 1; + default: return 1; + } + } + + @Override + public MessageDirection convertToMapped(Class type, Integer value) { + switch (value) { + case 0: + return MessageDirection.outgoing; + case 1: + return MessageDirection.incoming; + default: return MessageDirection.incoming; + } + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/converter/SubscriptionDirectionConverter.java b/data/src/main/java/org/mercury_im/messenger/data/converter/SubscriptionDirectionConverter.java index af84446..b8ecf7f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/converter/SubscriptionDirectionConverter.java +++ b/data/src/main/java/org/mercury_im/messenger/data/converter/SubscriptionDirectionConverter.java @@ -1,6 +1,6 @@ package org.mercury_im.messenger.data.converter; -import org.mercury_im.messenger.data.enums.SubscriptionDirection; +import org.mercury_im.messenger.entity.contact.SubscriptionDirection; import io.requery.Converter; diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java index 34e4c71..6b12c60 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/MessageMapping.java @@ -35,6 +35,7 @@ public class MessageMapping extends AbstractMapping { model.setSender(entity.getSender()); model.setRecipient(entity.getRecipient()); model.setTimestamp(entity.getTimestamp()); + model.setDirection(entity.getDirection()); model.getPayloads().clear(); for (PayloadContainer payload : entity.getMessagePayloads()) { @@ -52,6 +53,7 @@ public class MessageMapping extends AbstractMapping { entity.setSender(model.getSender()); entity.setRecipient(model.getRecipient()); entity.setTimestamp(model.getTimestamp()); + entity.setDirection(model.getDirection()); List payloadContainers = new ArrayList<>(entity.getMessagePayloads().size()); for (MessagePayloadContainerModel containerModel : model.getPayloads()) { diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java index 91b6141..f4d95f6 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -1,6 +1,5 @@ package org.mercury_im.messenger.data.mapping; -import org.mercury_im.messenger.data.enums.SubscriptionDirection; import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; @@ -32,7 +31,9 @@ public class PeerMapping extends AbstractMapping { model.setAddress(entity.getAddress()); model.setName(entity.getName()); - // TODO: sub direction + model.setSubscriptionDirection(entity.getSubscriptionDirection()); + model.setSubscriptionPending(entity.isSubscriptionPending()); + model.setSubscriptionPreApproved(entity.isSubscriptionApproved()); return model; } @@ -43,75 +44,10 @@ public class PeerMapping extends AbstractMapping { entity.setAddress(model.getAddress()); entity.setId(model.getId()); - // TODO: Sub direction + entity.setSubscriptionDirection(model.getSubscriptionDirection()); + entity.setSubscriptionPending(model.isSubscriptionPending()); + entity.setSubscriptionApproved(model.isSubscriptionPreApproved()); + return entity; } - - private void setSubscriptionDirectionInModel(PeerModel model, Peer entity) { - switch (entity.getSubscriptionMode()) { - case NONE: - model.setSubscriptionDirection(SubscriptionDirection.none); - model.setSubscriptionPreApproved(false); - model.setSubscriptionPending(false); - break; - - case NONE_PREAPPROVED: - model.setSubscriptionDirection(SubscriptionDirection.none); - model.setSubscriptionPreApproved(true); - model.setSubscriptionPending(false); - break; - - case TO_THEM_PENDING: - model.setSubscriptionDirection(SubscriptionDirection.to); - model.setSubscriptionPending(true); - model.setSubscriptionPreApproved(false); - break; - case TO_THEM_PENDING_PREAPPROVED: - model.setSubscriptionDirection(SubscriptionDirection.to); - model.setSubscriptionPending(true); - model.setSubscriptionPreApproved(true); - break; - case TO_THEM_ACCEPTED: - model.setSubscriptionDirection(SubscriptionDirection.to); - model.setSubscriptionPending(false); - model.setSubscriptionPreApproved(false); - break; - case TO_THEM_ACCEPTED_PREAPPROVED: - model.setSubscriptionDirection(SubscriptionDirection.to); - model.setSubscriptionPending(false); - model.setSubscriptionPreApproved(true); - break; - case FROM_THEM_PENDING: - model.setSubscriptionDirection(SubscriptionDirection.from); - model.setSubscriptionPending(true); - model.setSubscriptionPreApproved(false); - break; - case FROM_THEM_ACCEPTED: - model.setSubscriptionDirection(SubscriptionDirection.from); - model.setSubscriptionPending(false); - model.setSubscriptionPreApproved(false); - break; - case BIDIRECTIONAL: - model.setSubscriptionDirection(SubscriptionDirection.both); - model.setSubscriptionPending(false); - model.setSubscriptionPreApproved(false); - break; - } - } - - private void setSubscriptionDirectionInEntity(Peer entity, PeerModel model) { - - switch (model.getSubscriptionDirection()) { - case none: - break; - case to: - break; - case from: - break; - case both: - break; - case remove: - break; - } - } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index a773d83..81233ee 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -1,9 +1,13 @@ package org.mercury_im.messenger.data.model; +import org.mercury_im.messenger.data.converter.MessageDirectionConverter; +import org.mercury_im.messenger.entity.message.MessageDirection; + import java.util.Date; import java.util.Set; import io.requery.Column; +import io.requery.Convert; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; @@ -27,6 +31,10 @@ public abstract class AbstractMessageModel implements Persistable { @Column(name = "\"timestamp\"", nullable = false) Date timestamp; + @Column(nullable = false) + @Convert(MessageDirectionConverter.class) + MessageDirection direction; + @OneToMany Set payloads; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index 12b82fb..a4a3df5 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -1,7 +1,7 @@ package org.mercury_im.messenger.data.model; import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; -import org.mercury_im.messenger.data.enums.SubscriptionDirection; +import org.mercury_im.messenger.entity.contact.SubscriptionDirection; import io.requery.Column; import io.requery.Convert; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java index 9a5f8b7..9ef7259 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppMessageRepository.java @@ -180,7 +180,7 @@ public class XmppMessageRepository .and(DirectMessagesRelation.MESSAGE_ID.eq(message.getId())) .get().maybe() .switchIfEmpty(Single.just(message) - .map(messageMapping::toModel) + .map(messageMapping::toEntity) .flatMap(messageModel -> ) */ } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index bb7d894..a3edc87 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -2,6 +2,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.data.mapping.PeerMapping; import org.mercury_im.messenger.data.model.PeerModel; +import org.mercury_im.messenger.entity.contact.SubscriptionDirection; import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.IPeer; @@ -9,6 +10,8 @@ import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.util.ThreadUtils; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import javax.inject.Inject; @@ -130,6 +133,25 @@ public class XmppPeerRepository .observeOn(observerScheduler()); } + @Override + public Observable> observeAllContactsOfAccount(long accountId) { + return data().select(PeerModel.class) + .where(PeerModel.ACCOUNT_ID.eq(accountId)) + .and(PeerModel.SUBSCRIPTION_DIRECTION.in( + Arrays.asList(SubscriptionDirection.both, SubscriptionDirection.to))) + .get().observableResult() + .map(ResultDelegate::toList) + .map(peerModels -> { + List peerEntities = new ArrayList<>(peerModels.size()); + for (PeerModel model : peerModels) { + peerEntities.add(peerMapping.toEntity(model)); + } + return peerEntities; + }) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + @Override public Single updatePeer(Peer peer) { // In order to update, we fetch the model, update it and write it back. @@ -170,4 +192,9 @@ public class XmppPeerRepository .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } + + @Override + public Completable deletePeer(long accountId, String address) { + return null; + } } diff --git a/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java b/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java index c3d7c36..32a5dd7 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java @@ -6,7 +6,6 @@ import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; -import org.mercury_im.messenger.entity.contact.SubscriptionMode; import javax.inject.Inject; @@ -25,7 +24,7 @@ public class PeerMappingTest { PEER_GORDO.setId(1); PEER_GORDO.setAddress("gordo@big.joe"); PEER_GORDO.setName("Gordo"); - PEER_GORDO.setSubscriptionMode(SubscriptionMode.TO_THEM_ACCEPTED_PREAPPROVED); + PEER_GORDO.setSubscriptionDirection(SubscriptionMode.TO_THEM_ACCEPTED_PREAPPROVED); } public PeerMappingTest() { diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index 0348c96..dddc8f1 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -47,7 +47,7 @@ public class AccountRepositoryTest { Account a1 = new IAccount(); a1.setAddress("a1@example.com"); - a1.setAuthentication(new PasswordAuthentication("a1a1a1")); + a1.setPassword("a1a1a1"); a1.setEnabled(true); d.add(accountRepository.insertAccount(a1).subscribe()); @@ -57,7 +57,7 @@ public class AccountRepositoryTest { Account a2 = new IAccount(); a2.setAddress("a2@example.com"); - a2.setAuthentication(new PasswordAuthentication("a2a2a2")); + a2.setPassword("a2a2a2"); a2.setEnabled(false); d.add(accountRepository.insertAccount(a2).subscribe()); @@ -66,7 +66,7 @@ public class AccountRepositoryTest { Account a3 = new IAccount(); a3.setAddress("a3@example.com"); - a3.setAuthentication(new PasswordAuthentication("a3a3a3")); + a3.setPassword("a3a3a3"); a3.setEnabled(false); d.add(accountRepository.insertAccount(a3).subscribe()); diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index 4ea055e..2fbc6b6 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -2,9 +2,11 @@ package org.mercury_im.messenger; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.roster.Roster; import org.jivesoftware.smackx.csi.ClientStateIndicationManager; import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.store.MercuryRosterStore; import org.mercury_im.messenger.usecase.AddAccount; import org.mercury_im.messenger.xmpp.MercuryConnection; @@ -30,6 +32,13 @@ public class Messenger implements ClientStateListener { public void addConnection(MercuryConnection connection) { connections.put(connection.getAccount().getId(), connection); + initRosterStore(connection); + } + + private void initRosterStore(MercuryConnection connection) { + Roster.getInstanceFor(connection.getConnection()) + .setRosterStore(new MercuryRosterStore(connection.getAccount(), + repositories.getPeerRepository(), repositories.getAccountRepository())); } public MercuryConnection getConnection(Account account) { diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java index cb4a64d..ff161ba 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java @@ -41,9 +41,17 @@ public interface PeerRepository { Observable> observeAllPeers(); + default Observable> observeAllContactsOfAccount(Account account) { + return observeAllContactsOfAccount(account.getId()); + } + + Observable> observeAllContactsOfAccount(long accountId); + Single updatePeer(Peer Peer); Single upsertPeer(Peer Peer); Completable deletePeer(Peer Peer); + + Completable deletePeer(long accountId, String address); } diff --git a/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java b/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java new file mode 100644 index 0000000..e3acd82 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java @@ -0,0 +1,207 @@ +package org.mercury_im.messenger.store; + +import org.jivesoftware.smack.roster.packet.RosterPacket; +import org.jivesoftware.smack.roster.rosterstore.RosterStore; +import org.jxmpp.jid.Jid; +import org.jxmpp.jid.impl.JidCreate; +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.contact.IPeer; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.contact.SubscriptionDirection; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; + +public class MercuryRosterStore implements RosterStore { + + private static final Logger LOGGER = Logger.getLogger(RosterStore.class.getName()); + + private final PeerRepository peerRepository; + private final AccountRepository accountRepository; + private Account account; + private final CompositeDisposable disposable = new CompositeDisposable(); + + private final Map itemMap = new HashMap<>(); + private String rosterVersion; + + public MercuryRosterStore(Account account, PeerRepository rosterRepository, AccountRepository accountRepository) { + this.account = account; + this.peerRepository = rosterRepository; + this.accountRepository = accountRepository; + } + + public void subscribe() { + disposable.add(peerRepository.observeAllContactsOfAccount(account) + .observeOn(Schedulers.computation()) + .subscribe(contactsList -> { + itemMap.clear(); + for (Peer contactModel : contactsList) { + itemMap.put(contactModel.getAddress(), fromEntity(contactModel)); + LOGGER.log(Level.INFO, "Populate itemMap with " + contactsList.size() + " items"); + + } + }, + error -> LOGGER.log(Level.WARNING, "An error occurred while updating roster cache", error))); + + /* + disposable.add(peerRepository.getRosterVersion(account) + .observeOn(Schedulers.computation()) + .subscribe( + result -> setRosterVersion(result), + error -> LOGGER.log(Level.WARNING, "An error occurred updating cached roster version", error))); + + */ + } + + public void unsubscribe() { + disposable.dispose(); + } + + private void setRosterVersion(String rosterVersion) { + this.rosterVersion = rosterVersion; + } + + @Override + public List getEntries() { + return new ArrayList<>(itemMap.values()); + } + + @Override + public RosterPacket.Item getEntry(Jid bareJid) { + return itemMap.get(bareJid); + } + + @Override + public String getRosterVersion() { + return rosterVersion != null ? rosterVersion : ""; + } + + @Override + public boolean addEntry(RosterPacket.Item item, String version) { + LOGGER.log(Level.INFO, "Add entry " + item.toXML().toString()); + // Update database + Peer contact = toEntity(item); + disposable.add(peerRepository.upsertPeer(contact) + .subscribe( + success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), + error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + contact, error) + )); + /* + disposable.add(peerRepository.updateRosterVersion(account, version) + .subscribe( + success -> LOGGER.log(Level.FINE, "Upserted roster version to " + rosterVersion + " successfully"), + error -> LOGGER.log(Level.WARNING, "An error occurred upserting roster version", error) + )); + */ + + return true; + } + + @Override + public boolean resetEntries(Collection items, String version) { + LOGGER.log(Level.INFO, "Reset Entries: " + Arrays.toString(items.toArray())); + // Update database + // TODO: Delete other contacts + for (RosterPacket.Item item : items) { + Peer model = toEntity(item); + disposable.add(peerRepository.upsertPeer(model) + .subscribe( + success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), + error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + model, error) + )); + } + + /* + disposable.add(peerRepository.updateRosterVersion(account, version) + .subscribe( + success -> LOGGER.log(Level.FINE, "Upserted roster version to " + rosterVersion + " successfully"), + error -> LOGGER.log(Level.WARNING, "An error occurred upserting roster version", error) + )); + */ + + return true; + } + + @Override + public boolean removeEntry(Jid bareJid, String version) { + LOGGER.log(Level.INFO, "Remove entry " + bareJid.toString()); + + disposable.add(peerRepository.deletePeer(account.getId(), bareJid.asEntityBareJidOrThrow().asEntityBareJidString()) + .subscribe( + () -> LOGGER.log(Level.FINE, "Deletion of contact " + bareJid.toString() + " successful"), + error -> LOGGER.log(Level.WARNING, "An error occurred deleting contact " + bareJid.toString(), error) + )); + /* + disposable.add(peerRepository.updateRosterVersion(account, version) + .subscribe( + success -> LOGGER.log(Level.FINE, "Upserted roster version to " + rosterVersion + " successfully"), + error -> LOGGER.log(Level.WARNING, "An error occurred upserting roster version", error) + )); + */ + return true; + } + + @Override + public void resetStore() { + LOGGER.log(Level.INFO, "Reset Store"); + + /* + disposable.add(peerRepository.deleteAllContactsOfAccount(account) + .subscribe( + success -> LOGGER.log(Level.FINE, "Successfully reset store."), + error -> LOGGER.log(Level.WARNING, "An error occurred resetting store", error) + )); + disposable.add(peerRepository.updateRosterVersion(account, "") + .subscribe( + success -> LOGGER.log(Level.FINE, "Successfully reset roster version"), + error -> LOGGER.log(Level.WARNING, "An error occurred resetting roster version", error) + )); + */ + } + + public RosterPacket.Item fromEntity(Peer contactModel) { + RosterPacket.Item item = new RosterPacket.Item( + JidCreate.entityBareFromOrThrowUnchecked(contactModel.getAddress()), + contactModel.getName()); + if (contactModel.getSubscriptionDirection() != null) { + item.setItemType(convert(contactModel.getSubscriptionDirection())); + } + item.setApproved(contactModel.isSubscriptionApproved()); + item.setSubscriptionPending(contactModel.isSubscriptionPending()); + return item; + } + + public Peer toEntity(RosterPacket.Item item) { + Peer peer = new IPeer(); + peer.setAccount(account); + peer.setAddress(item.getJid().asEntityBareJidOrThrow().asEntityBareJidString()); + peer.setName(item.getName()); + if (item.getItemType() != null) { + peer.setSubscriptionDirection(convert(item.getItemType())); + } + peer.setSubscriptionApproved(item.isApproved()); + peer.setSubscriptionPending(item.isSubscriptionPending()); + + return peer; + } + + public SubscriptionDirection convert(RosterPacket.ItemType type) { + return SubscriptionDirection.valueOf(type.toString()); + + } + + public RosterPacket.ItemType convert(SubscriptionDirection direction) { + return RosterPacket.ItemType.fromString(direction.toString()); + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java index f461042..e8be5d1 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java @@ -8,7 +8,9 @@ public class IPeer implements Peer { protected Account account; protected String address; protected String name; - protected SubscriptionMode subscriptionMode; + protected SubscriptionDirection subscriptionDirection; + protected boolean pending; + protected boolean approved; @Override public long getId() { @@ -51,18 +53,38 @@ public class IPeer implements Peer { } @Override - public SubscriptionMode getSubscriptionMode() { - return subscriptionMode; + public SubscriptionDirection getSubscriptionDirection() { + return subscriptionDirection; } @Override - public void setSubscriptionMode(SubscriptionMode mode) { - this.subscriptionMode = mode; + public void setSubscriptionDirection(SubscriptionDirection mode) { + this.subscriptionDirection = mode; + } + + @Override + public boolean isSubscriptionPending() { + return pending; + } + + @Override + public void setSubscriptionPending(boolean pending) { + this.pending = pending; + } + + @Override + public boolean isSubscriptionApproved() { + return approved; + } + + @Override + public void setSubscriptionApproved(boolean approved) { + this.approved = approved; } @Override public boolean isContact() { - return subscriptionMode != SubscriptionMode.NONE - && subscriptionMode != SubscriptionMode.FROM_THEM_PENDING; + return subscriptionDirection != SubscriptionDirection.none + && subscriptionDirection != SubscriptionDirection.from; } } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java index d91a5e1..cd57826 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java @@ -26,9 +26,17 @@ public interface Peer { void setName(String name); - SubscriptionMode getSubscriptionMode(); + SubscriptionDirection getSubscriptionDirection(); - void setSubscriptionMode(SubscriptionMode mode); + void setSubscriptionDirection(SubscriptionDirection mode); + + boolean isSubscriptionPending(); + + void setSubscriptionPending(boolean pending); + + boolean isSubscriptionApproved(); + + void setSubscriptionApproved(boolean approved); boolean isContact(); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/enums/SubscriptionDirection.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionDirection.java similarity index 64% rename from data/src/main/java/org/mercury_im/messenger/data/enums/SubscriptionDirection.java rename to entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionDirection.java index 38ea670..90a3671 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/enums/SubscriptionDirection.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionDirection.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.data.enums; +package org.mercury_im.messenger.entity.contact; public enum SubscriptionDirection { none, diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java deleted file mode 100644 index aeb728f..0000000 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/SubscriptionMode.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.mercury_im.messenger.entity.contact; - -/** - * Enum describing the relationship between the user and another entity. - */ -public enum SubscriptionMode { - /** - * No subscription between us an them. - */ - NONE, - - /** - * No subscription between us and them. - * However, we pre-approved their subscription, should they decide to subscribe to us. - */ - NONE_PREAPPROVED, - - /** - * We sent a subscription request, which is now pending to be accepted. - * We do not pre-approve their subscription to us. - */ - TO_THEM_PENDING, - - /** - * We sent a subscription request, which is now pending to be accepted. - * Also, we pre-approved their subscription to us. - */ - TO_THEM_PENDING_PREAPPROVED, - - /** - * We sent a subscription request and they approved it. - */ - TO_THEM_ACCEPTED, - - /** - * We sent a subscription request and they approved it. - * Also, we pre-approved their subscription, should they decide to subscribe back. - */ - TO_THEM_ACCEPTED_PREAPPROVED, - - /** - * They sent us a subscription request, but we did not yet accept it. - */ - FROM_THEM_PENDING, - - /** - * They sent us a subscription request and we accepted it. - */ - FROM_THEM_ACCEPTED, - - /** - * They accepted us and we accepted them. - */ - BIDIRECTIONAL -} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java index b052aca..c708497 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java @@ -12,6 +12,8 @@ public class IMessage implements Message { protected List payloads; protected MessageDeliveryState deliveryState; protected MessageMetadata metadata; + protected MessageDirection direction; + @Override public long getId() { @@ -53,6 +55,16 @@ public class IMessage implements Message { this.timestamp = timestamp; } + @Override + public MessageDirection getDirection() { + return direction; + } + + @Override + public void setDirection(MessageDirection direction) { + this.direction = direction; + } + @Override public List getMessagePayloads() { return payloads; diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java index 81eab37..9253823 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java @@ -21,6 +21,14 @@ public interface Message { void setTimestamp(Date timestamp); + MessageDirection getDirection(); + + void setDirection(MessageDirection direction); + + default boolean isIncoming() { + return getDirection() == MessageDirection.incoming; + } + List getMessagePayloads(); void setMessagePayloads(List payloadContainers); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/MessageDirection.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessageDirection.java new file mode 100644 index 0000000..1315138 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/MessageDirection.java @@ -0,0 +1,6 @@ +package org.mercury_im.messenger.entity.message; + +public enum MessageDirection { + incoming, + outgoing +} From 7905693fc7fc646004316ac7bd10ed4630b4ef2b Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 16:30:14 +0100 Subject: [PATCH 56/83] Fix duplicates from inserting --- .../mercury_im/messenger/Notifications.java | 8 ++++--- .../messenger/ui/account/LoginActivity.java | 2 +- .../messenger/ui/chat/ChatActivity.java | 8 ++++--- .../messenger/ui/chat/ChatViewModel.java | 3 ++- .../ContactListRecyclerViewAdapter.java | 2 +- .../messenger/data/di/RepositoryModule.java | 5 +++-- .../data/mapping/AccountMapping.java | 1 + .../data/mapping/DirectChatMapping.java | 1 + .../messenger/data/mapping/PeerMapping.java | 3 ++- .../data/model/AbstractAccountModel.java | 8 +++++-- .../data/model/AbstractDirectChatModel.java | 12 ++++++++--- .../data/model/AbstractGroupChatModel.java | 9 ++++++-- .../data/model/AbstractMessageModel.java | 7 +++++-- .../data/model/AbstractPeerModel.java | 12 ++++++++--- .../repository/XmppAccountRepository.java | 5 +++-- .../repository/XmppDirectChatRepository.java | 18 +++++++++------- .../repository/XmppGroupChatRepository.java | 9 ++++---- .../data/repository/XmppPeerRepository.java | 21 ++++++++++--------- .../data/repository/dao/AccountDao.java | 6 ++++-- .../data/repository/dao/DirectChatDao.java | 8 ++++--- .../data/repository/dao/GroupChatDao.java | 8 ++++--- .../data/repository/dao/MessageDao.java | 4 +++- .../data/mapping/AccountMappingTest.java | 16 +------------- .../data/mapping/PeerMappingTest.java | 4 ++-- .../repository/AccountRepositoryTest.java | 1 - .../org/mercury_im/messenger/Messenger.java | 3 ++- .../data/repository/AccountRepository.java | 5 +++-- .../data/repository/DirectChatRepository.java | 5 +++-- .../data/repository/GroupChatRepository.java | 9 ++++---- .../data/repository/PeerRepository.java | 15 ++++++------- .../messenger/store/MercuryRosterStore.java | 9 ++++++++ .../mercury_im/messenger/entity/Account.java | 6 ++++-- .../mercury_im/messenger/entity/IAccount.java | 13 ++++++++---- .../messenger/entity/chat/Chat.java | 6 ++++-- .../messenger/entity/chat/IDirectChat.java | 12 ++++++++--- .../messenger/entity/chat/IGroupChat.java | 11 +++++++--- .../messenger/entity/contact/IPeer.java | 12 ++++++++--- .../messenger/entity/contact/Peer.java | 6 ++++-- .../messenger/entity/message/IMessage.java | 7 ++++--- .../messenger/entity/message/Message.java | 5 +++-- 40 files changed, 190 insertions(+), 115 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/Notifications.java b/app/src/main/java/org/mercury_im/messenger/Notifications.java index 4d22b87..823d844 100644 --- a/app/src/main/java/org/mercury_im/messenger/Notifications.java +++ b/app/src/main/java/org/mercury_im/messenger/Notifications.java @@ -14,6 +14,8 @@ import androidx.core.app.NotificationManagerCompat; import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.ui.chat.ChatActivity; +import java.util.UUID; + public class Notifications { public static final String NOTIFICATION_CHANNEL__FOREGROUND_SERVICE = "foreground_service"; @@ -62,7 +64,7 @@ public class Notifications { public static int directChatMessageReceived(Context context, DirectChat chat, String contactName, String body) { NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); - int id = (int) chat.getId(); + UUID id = chat.getId(); Intent tapAction = new Intent(context, ChatActivity.class); tapAction.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); @@ -78,9 +80,9 @@ public class Notifications { builder.setContentIntent(pendingIntent); builder.setAutoCancel(true); - notificationManagerCompat.notify(id, builder.build()); + notificationManagerCompat.notify(id.hashCode(), builder.build()); - return id; + return id.hashCode(); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java index 2211ef8..300f9d3 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java @@ -149,7 +149,7 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito case R.id.password: if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL) { - viewModel.login(); + //viewModel.login(); return true; } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java index 9d3d934..a6e2064 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java @@ -19,6 +19,8 @@ import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; +import java.util.UUID; + import butterknife.BindView; import butterknife.ButterKnife; import io.reactivex.disposables.CompositeDisposable; @@ -44,7 +46,7 @@ public class ChatActivity extends AppCompatActivity private EntityBareJid jid; - private long accountId; + private UUID accountId; @Override protected void onCreate(Bundle savedInstanceState) { @@ -72,7 +74,7 @@ public class ChatActivity extends AppCompatActivity jid = JidCreate.entityBareFromOrThrowUnchecked(jidString); // JID will never change, so just set it once getSupportActionBar().setSubtitle(jid.asUnescapedString()); - accountId = savedInstanceState.getLong(EXTRA_ACCOUNT); + accountId = UUID.fromString(savedInstanceState.getString(EXTRA_ACCOUNT)); chatViewModel = new ViewModelProvider(this).get(ChatViewModel.class); chatViewModel.init(accountId, jid); @@ -144,7 +146,7 @@ public class ChatActivity extends AppCompatActivity @Override protected void onSaveInstanceState(@NonNull Bundle outState) { outState.putString(EXTRA_JID, jid.toString()); - outState.putLong(EXTRA_ACCOUNT, accountId); + outState.putString(EXTRA_ACCOUNT, accountId.toString()); super.onSaveInstanceState(outState); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 159335a..626c1f3 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -14,6 +14,7 @@ import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.message.Message; import java.util.List; +import java.util.UUID; import javax.inject.Inject; @@ -47,7 +48,7 @@ public class ChatViewModel extends ViewModel { MercuryImApplication.getApplication().getAppComponent().inject(this); } - public void init(long accountId, EntityBareJid jid) { + public void init(UUID accountId, EntityBareJid jid) { disposable.add(contactRepository.getOrCreatePeer(accountId, jid.toString()) .subscribe((Consumer) this::init)); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java index f6d075c..eefffda 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java @@ -74,7 +74,7 @@ public class ContactListRecyclerViewAdapter Intent intent = new Intent(context, ChatActivity.class); intent.putExtra(ChatActivity.EXTRA_JID, address); - intent.putExtra(ChatActivity.EXTRA_ACCOUNT, contact.getAccount().getId()); + intent.putExtra(ChatActivity.EXTRA_ACCOUNT, contact.getAccount().getId().toString()); context.startActivity(intent); }); diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index 9d2a91e..c0aeb38 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -50,8 +50,9 @@ public class RepositoryModule { ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, - PeerMapping peerMapping) { - return new XmppPeerRepository(data, ioScheduler, uiScheduler, peerMapping); + PeerMapping peerMapping, + AccountRepository accountRepository) { + return new XmppPeerRepository(data, ioScheduler, uiScheduler, peerMapping, accountRepository); } @Provides diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java index f1d5103..88bd641 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AccountMapping.java @@ -25,6 +25,7 @@ public class AccountMapping extends AbstractMapping { @Override public AccountModel mapToModel(Account entity, AccountModel model) { + model.setId(entity.getId()); model.setAddress(entity.getAddress()); model.setPassword(entity.getPassword()); model.setHost(entity.getHost()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java index 11b5c4e..54f1017 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/DirectChatMapping.java @@ -28,6 +28,7 @@ public class DirectChatMapping extends AbstractMapping { @Override public PeerModel mapToModel(Peer entity, PeerModel model) { + model.setId(entity.getId()); model.setAccount(accountMapping.toModel(entity.getAccount(), model.getAccount())); model.setAddress(entity.getAddress()); model.setName(entity.getName()); @@ -40,9 +41,9 @@ public class PeerMapping extends AbstractMapping { @Override public Peer mapToEntity(PeerModel model, Peer entity) { + entity.setId(model.getId()); entity.setAccount(accountMapping.toEntity(model.getAccount(), entity.getAccount())); entity.setAddress(model.getAddress()); - entity.setId(model.getId()); entity.setSubscriptionDirection(model.getSubscriptionDirection()); entity.setSubscriptionPending(model.isSubscriptionPending()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java index cbad27e..126693b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractAccountModel.java @@ -1,19 +1,23 @@ package org.mercury_im.messenger.data.model; +import java.util.UUID; + import io.requery.Column; +import io.requery.Convert; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; import io.requery.Persistable; import io.requery.Table; +import io.requery.converter.UUIDConverter; @Table(name = "accounts") @Entity public abstract class AbstractAccountModel implements Persistable { @Key - @Generated - long id; + @Convert(UUIDConverter.class) + UUID id; @Column(nullable = false) String address; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java index b9137a8..a79a2bc 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractDirectChatModel.java @@ -1,5 +1,9 @@ package org.mercury_im.messenger.data.model; +import java.util.UUID; + +import io.requery.CascadeAction; +import io.requery.Convert; import io.requery.Entity; import io.requery.ForeignKey; import io.requery.Generated; @@ -7,15 +11,17 @@ import io.requery.Key; import io.requery.OneToOne; import io.requery.Persistable; import io.requery.Table; +import io.requery.converter.UUIDConverter; @Entity @Table(name = "chats") public abstract class AbstractDirectChatModel implements Persistable { - @Key @Generated - long id; + @Key + @Convert(UUIDConverter.class) + UUID id; - @OneToOne + @OneToOne(cascade = CascadeAction.NONE) @ForeignKey(referencedColumn = "id") PeerModel peer; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java index ff66520..ae103f8 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractGroupChatModel.java @@ -1,19 +1,24 @@ package org.mercury_im.messenger.data.model; +import java.util.UUID; + import io.requery.Column; +import io.requery.Convert; import io.requery.Entity; import io.requery.Generated; import io.requery.Key; import io.requery.ManyToOne; import io.requery.Persistable; import io.requery.Table; +import io.requery.converter.UUIDConverter; @Entity @Table(name = "groupchats") public abstract class AbstractGroupChatModel implements Persistable { - @Key @Generated - long id; + @Key + @Convert(UUIDConverter.class) + UUID id; @Column(nullable = false) @ManyToOne diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java index 81233ee..279c07c 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractMessageModel.java @@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.message.MessageDirection; import java.util.Date; import java.util.Set; +import java.util.UUID; import io.requery.Column; import io.requery.Convert; @@ -14,13 +15,15 @@ import io.requery.Key; import io.requery.OneToMany; import io.requery.Persistable; import io.requery.Table; +import io.requery.converter.UUIDConverter; @Entity @Table(name = "messages") public abstract class AbstractMessageModel implements Persistable { - @Key @Generated - long id; + @Key + @Convert(UUIDConverter.class) + UUID id; @Column(nullable = false) String sender; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index a4a3df5..0029a06 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -3,6 +3,9 @@ package org.mercury_im.messenger.data.model; import org.mercury_im.messenger.data.converter.SubscriptionDirectionConverter; import org.mercury_im.messenger.entity.contact.SubscriptionDirection; +import java.util.UUID; + +import io.requery.CascadeAction; import io.requery.Column; import io.requery.Convert; import io.requery.Entity; @@ -11,16 +14,19 @@ import io.requery.Generated; import io.requery.Key; import io.requery.ManyToOne; import io.requery.Persistable; +import io.requery.ReferentialAction; import io.requery.Table; +import io.requery.converter.UUIDConverter; @Entity @Table(name = "contacts") public abstract class AbstractPeerModel implements Persistable { - @Key @Generated - long id; + @Key + @Convert(UUIDConverter.class) + UUID id; - @ManyToOne + @ManyToOne(cascade = CascadeAction.NONE) @ForeignKey(referencedColumn = "id") AccountModel account; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index cd86bf0..5774bbb 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -10,6 +10,7 @@ import org.mercury_im.messenger.util.ThreadUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.UUID; import javax.inject.Inject; import javax.inject.Named; @@ -52,7 +53,7 @@ public class XmppAccountRepository } @Override - public Observable> observeAccount(long accountId) { + public Observable> observeAccount(UUID accountId) { return dao.get(accountId).observableResult() .map(ResultDelegate::firstOrNull) .map(accountMapping::toEntity) @@ -62,7 +63,7 @@ public class XmppAccountRepository } @Override - public Maybe getAccount(long accountId) { + public Maybe getAccount(UUID accountId) { return dao.get(accountId).maybe() .map(accountMapping::toEntity) .subscribeOn(subscriberScheduler()) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index ce37e84..28930b0 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -11,6 +11,7 @@ import org.mercury_im.messenger.util.ThreadUtils; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import javax.inject.Inject; import javax.inject.Named; @@ -57,7 +58,7 @@ public class XmppDirectChatRepository } @Override - public Observable> observeDirectChat(long chatId) { + public Observable> observeDirectChat(UUID chatId) { return dao.get(chatId).observableResult() .map(ResultDelegate::firstOrNull) .map(directChatMapping::toEntity) @@ -67,7 +68,7 @@ public class XmppDirectChatRepository } @Override - public Maybe getDirectChat(long chatId) { + public Maybe getDirectChat(UUID chatId) { return dao.get(chatId).maybe() .map(directChatMapping::toEntity) .subscribeOn(subscriberScheduler()) @@ -77,12 +78,13 @@ public class XmppDirectChatRepository @Override public Single getOrCreateChatWithPeer(Peer peer) { return getDirectChatByPeer(peer) - .switchIfEmpty(insertDirectChat(new IDirectChat(){ - { - setAccount(peer.getAccount()); - setPeer(peer); - } - })) + .switchIfEmpty(Single.just(new IDirectChat()) + .map(chat -> { + chat.setAccount(peer.getAccount()); + chat.setPeer(peer); + return chat; + }) + .flatMap(this::insertDirectChat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index 98ece17..f83d82a 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -11,6 +11,7 @@ import org.mercury_im.messenger.util.ThreadUtils; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import javax.inject.Inject; import javax.inject.Named; @@ -54,7 +55,7 @@ public class XmppGroupChatRepository } @Override - public Observable> observeGroupChat(long chatId) { + public Observable> observeGroupChat(UUID chatId) { return dao.get(chatId).observableResult() .map(ResultDelegate::firstOrNull) .map(groupChatMapping::toEntity) @@ -64,7 +65,7 @@ public class XmppGroupChatRepository } @Override - public Maybe getGroupChat(long chatId) { + public Maybe getGroupChat(UUID chatId) { return dao.get(chatId).maybe() .map(groupChatMapping::toEntity) .subscribeOn(subscriberScheduler()) @@ -87,7 +88,7 @@ public class XmppGroupChatRepository } @Override - public Observable> observeGroupChatByRoomAddress(long accountId, String roomAddress) { + public Observable> observeGroupChatByRoomAddress(UUID accountId, String roomAddress) { return dao.get(accountId, roomAddress).observableResult() .map(ResultDelegate::firstOrNull) .map(groupChatMapping::toEntity) @@ -97,7 +98,7 @@ public class XmppGroupChatRepository } @Override - public Maybe getGroupChatByRoomAddress(long accountId, String roomAddress) { + public Maybe getGroupChatByRoomAddress(UUID accountId, String roomAddress) { return dao.get(accountId, roomAddress).maybe() .map(groupChatMapping::toEntity) .subscribeOn(subscriberScheduler()) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index a3edc87..f297825 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.UUID; import javax.inject.Inject; import javax.inject.Named; @@ -30,8 +31,7 @@ public class XmppPeerRepository extends RequeryRepository implements PeerRepository { - @Inject - AccountRepository accountRepository; + private final AccountRepository accountRepository; private final PeerMapping peerMapping; @@ -39,9 +39,10 @@ public class XmppPeerRepository public XmppPeerRepository(ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, - PeerMapping peerMapping) { + PeerMapping peerMapping, AccountRepository accountRepository) { super(data, subscriberScheduler, observerScheduler); this.peerMapping = peerMapping; + this.accountRepository = accountRepository; } @Override @@ -53,7 +54,7 @@ public class XmppPeerRepository } @Override - public Observable> observePeer(long peerId) { + public Observable> observePeer(UUID peerId) { return data().select(PeerModel.class) .where(PeerModel.ID.eq(peerId)) .get().observableResult() @@ -63,7 +64,7 @@ public class XmppPeerRepository } @Override - public Maybe getPeer(long peerId) { + public Maybe getPeer(UUID peerId) { return data().select(PeerModel.class) .where(PeerModel.ID.eq(peerId)) .get().maybe() @@ -73,7 +74,7 @@ public class XmppPeerRepository } @Override - public Observable> observePeerByAddress(long accountId, String address) { + public Observable> observePeerByAddress(UUID accountId, String address) { return data().select(PeerModel.class) .where(PeerModel.ACCOUNT_ID.eq(accountId)) .and(PeerModel.ADDRESS.eq(address)) @@ -86,13 +87,13 @@ public class XmppPeerRepository } @Override - public Single getOrCreatePeer(long accountId, String address) { + public Single getOrCreatePeer(UUID accountId, String address) { return accountRepository.getAccount(accountId).toSingle() .flatMap(account -> getOrCreatePeer(account, address)); } @Override - public Maybe getPeerByAddress(long accountId, String address) { + public Maybe getPeerByAddress(UUID accountId, String address) { return data().select(PeerModel.class) .where(PeerModel.ACCOUNT_ID.eq(accountId)) .and(PeerModel.ADDRESS.eq(address)) @@ -134,7 +135,7 @@ public class XmppPeerRepository } @Override - public Observable> observeAllContactsOfAccount(long accountId) { + public Observable> observeAllContactsOfAccount(UUID accountId) { return data().select(PeerModel.class) .where(PeerModel.ACCOUNT_ID.eq(accountId)) .and(PeerModel.SUBSCRIPTION_DIRECTION.in( @@ -194,7 +195,7 @@ public class XmppPeerRepository } @Override - public Completable deletePeer(long accountId, String address) { + public Completable deletePeer(UUID accountId, String address) { return null; } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/AccountDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/AccountDao.java index 2aa5cca..3aaf9d4 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/AccountDao.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/AccountDao.java @@ -2,6 +2,8 @@ package org.mercury_im.messenger.data.repository.dao; import org.mercury_im.messenger.data.model.AccountModel; +import java.util.UUID; + import javax.inject.Inject; import io.reactivex.Single; @@ -20,7 +22,7 @@ public class AccountDao extends RequeryDao { return data().insert(account); } - public ReactiveResult get(long accountId) { + public ReactiveResult get(UUID accountId) { return data().select(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get(); @@ -37,7 +39,7 @@ public class AccountDao extends RequeryDao { .get(); } - public Single delete(long accountId) { + public Single delete(UUID accountId) { return data().delete(AccountModel.class) .where(AccountModel.ID.eq(accountId)) .get().single(); diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java index ffe372b..6f7f68b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/DirectChatDao.java @@ -2,6 +2,8 @@ package org.mercury_im.messenger.data.repository.dao; import org.mercury_im.messenger.data.model.DirectChatModel; +import java.util.UUID; + import javax.inject.Inject; import io.reactivex.Single; @@ -20,13 +22,13 @@ public class DirectChatDao extends RequeryDao { return data().insert(chat); } - public ReactiveResult get(long chatId) { + public ReactiveResult get(UUID chatId) { return data().select(DirectChatModel.class) .where(DirectChatModel.ID.eq(chatId)) .get(); } - public ReactiveResult getByPeer(long peerId) { + public ReactiveResult getByPeer(UUID peerId) { return data().select(DirectChatModel.class) .where(DirectChatModel.PEER_ID.eq(peerId)) .get(); @@ -37,7 +39,7 @@ public class DirectChatDao extends RequeryDao { .get(); } - public Single delete(long chatId) { + public Single delete(UUID chatId) { return data().delete(DirectChatModel.class) .where(DirectChatModel.ID.eq(chatId)) .get() diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/GroupChatDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/GroupChatDao.java index 571f5c9..9997ceb 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/GroupChatDao.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/GroupChatDao.java @@ -2,6 +2,8 @@ package org.mercury_im.messenger.data.repository.dao; import org.mercury_im.messenger.data.model.GroupChatModel; +import java.util.UUID; + import javax.inject.Inject; import io.reactivex.Single; @@ -20,13 +22,13 @@ public class GroupChatDao extends RequeryDao { return data().insert(chat); } - public ReactiveResult get(long chatId) { + public ReactiveResult get(UUID chatId) { return data().select(GroupChatModel.class) .where(GroupChatModel.ID.eq(chatId)) .get(); } - public ReactiveResult get(long accountId, String address) { + public ReactiveResult get(UUID accountId, String address) { return data().select(GroupChatModel.class) .where(GroupChatModel.ACCOUNT_ID.eq(accountId)) .and(GroupChatModel.ADDRESS.eq(address)) @@ -38,7 +40,7 @@ public class GroupChatDao extends RequeryDao { .get(); } - public Single delete(long chatId) { + public Single delete(UUID chatId) { return data().delete(GroupChatModel.class) .where(GroupChatModel.ID.eq(chatId)) .get() diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java index 5e8bc8f..c9c6a5f 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/dao/MessageDao.java @@ -6,6 +6,8 @@ import org.mercury_im.messenger.data.model.GroupChatModel; import org.mercury_im.messenger.data.model.GroupMessagesRelation; import org.mercury_im.messenger.data.model.MessageModel; +import java.util.UUID; + import io.reactivex.Single; import io.requery.Persistable; import io.requery.reactivex.ReactiveEntityStore; @@ -26,7 +28,7 @@ public class MessageDao extends RequeryDao { return data().insert(message); } - public ReactiveResult get(long messageId) { + public ReactiveResult get(UUID messageId) { return data().select(MessageModel.class) .where(MessageModel.ID.eq(messageId)) .get(); diff --git a/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java b/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java index 6d0eb6b..19bf72e 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java @@ -25,13 +25,11 @@ public class AccountMappingTest { static { ACCOUNT_MISSION_CONTROL = new IAccount(); - ACCOUNT_MISSION_CONTROL.setId(1); ACCOUNT_MISSION_CONTROL.setAddress("mission-controll@planet.earth"); ACCOUNT_MISSION_CONTROL.setEnabled(true); ACCOUNT_MISSION_CONTROL.setPassword("notBecauseTheyAreEasy"); ACCOUNT_LITTLE_JOE = new IAccount(); - ACCOUNT_LITTLE_JOE.setId(2); ACCOUNT_LITTLE_JOE.setAddress("little-joe@planet.earth"); ACCOUNT_LITTLE_JOE.setEnabled(false); ACCOUNT_LITTLE_JOE.setPassword("butBecauseTheyAreHard"); @@ -47,7 +45,7 @@ public class AccountMappingTest { AccountModel model = accountMapping.toModel(ACCOUNT_MISSION_CONTROL); assertEquals("Since we cannot set the id of the model in the mapper, it is still 0.", - 0, model.getId()); + ACCOUNT_MISSION_CONTROL.getId(), model.getId()); assertNotSame(ACCOUNT_MISSION_CONTROL.getId(), model.getId()); assertEquals(ACCOUNT_MISSION_CONTROL.getAddress(), model.getAddress()); assertEquals(ACCOUNT_MISSION_CONTROL.getPassword(), model.getPassword()); @@ -62,22 +60,10 @@ public class AccountMappingTest { model.setEnabled(true); model.setPassword("12345"); - // I hate reflections... Set ID to 12 - setIdUsingReflections(model, 12L); - - assertEquals(12L, model.getId()); - Account entity = accountMapping.toEntity(model); assertEquals(model.getId(), entity.getId()); assertEquals(model.getAddress(), entity.getAddress()); assertEquals(model.getPassword(), entity.getPassword()); } - - private void setIdUsingReflections(AccountModel model, long id) throws NoSuchFieldException, IllegalAccessException { - Field field = model.getClass().getDeclaredField("$proxy"); - field.setAccessible(true); - EntityProxy proxy = (EntityProxy) field.get(model); - proxy.set(AccountModel.ID, id); - } } diff --git a/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java b/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java index 32a5dd7..84745ca 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/mapping/PeerMappingTest.java @@ -6,6 +6,7 @@ import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.contact.SubscriptionDirection; import javax.inject.Inject; @@ -21,10 +22,9 @@ public class PeerMappingTest { static { PEER_GORDO = new IPeer(); PEER_GORDO.setAccount(AccountMappingTest.ACCOUNT_MISSION_CONTROL); - PEER_GORDO.setId(1); PEER_GORDO.setAddress("gordo@big.joe"); PEER_GORDO.setName("Gordo"); - PEER_GORDO.setSubscriptionDirection(SubscriptionMode.TO_THEM_ACCEPTED_PREAPPROVED); + PEER_GORDO.setSubscriptionDirection(SubscriptionDirection.both); } public PeerMappingTest() { diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index dddc8f1..d3383ca 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -53,7 +53,6 @@ public class AccountRepositoryTest { d.add(accountRepository.insertAccount(a1).subscribe()); Thread.sleep(100); - a1.setId(1); Account a2 = new IAccount(); a2.setAddress("a2@example.com"); diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index 2fbc6b6..012cda8 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -12,6 +12,7 @@ import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.HashMap; import java.util.Map; +import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; @@ -22,7 +23,7 @@ public class Messenger implements ClientStateListener { public static final String TAG = "MercuryIM"; private static final Logger LOGGER = Logger.getLogger(Messenger.class.getName()); - private final Map connections = new HashMap<>(); + private final Map connections = new HashMap<>(); private Repositories repositories; @Inject diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java index 9b8baea..5524d0a 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java @@ -4,6 +4,7 @@ import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.util.Optional; import java.util.List; +import java.util.UUID; import io.reactivex.Completable; import io.reactivex.Maybe; @@ -14,9 +15,9 @@ public interface AccountRepository { Single insertAccount(Account account); - Observable> observeAccount(long accountId); + Observable> observeAccount(UUID accountId); - Maybe getAccount(long accountId); + Maybe getAccount(UUID accountId); Observable> observeAccountByAddress(String address); diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index ed592d0..ad8bf09 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.entity.contact.Peer; import java.util.List; +import java.util.UUID; import io.reactivex.Completable; import io.reactivex.Maybe; @@ -19,9 +20,9 @@ public interface DirectChatRepository { return observeDirectChat(chat.getId()); } - Observable> observeDirectChat(long chatId); + Observable> observeDirectChat(UUID chatId); - Maybe getDirectChat(long chatId); + Maybe getDirectChat(UUID chatId); Single getOrCreateChatWithPeer(Peer peer); diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java index a86abad..b9a980b 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java @@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.chat.GroupChat; import org.mercury_im.messenger.util.Optional; import java.util.List; +import java.util.UUID; import io.reactivex.Completable; import io.reactivex.Maybe; @@ -15,9 +16,9 @@ public interface GroupChatRepository { Single insertGroupChat(GroupChat chat); - Observable> observeGroupChat(long chatId); + Observable> observeGroupChat(UUID chatId); - Maybe getGroupChat(long chatId); + Maybe getGroupChat(UUID chatId); Single getOrCreateGroupChat(Account account, String roomAddress); @@ -25,13 +26,13 @@ public interface GroupChatRepository { return observeGroupChatByRoomAddress(account.getId(), roomAddress); } - Observable> observeGroupChatByRoomAddress(long accountId, String roomAddress); + Observable> observeGroupChatByRoomAddress(UUID accountId, String roomAddress); default Maybe getGroupChatByRoomAddress(Account account, String roomAddress) { return getGroupChatByRoomAddress(account.getId(), roomAddress); } - Maybe getGroupChatByRoomAddress(long accountId, String roomAddress); + Maybe getGroupChatByRoomAddress(UUID accountId, String roomAddress); Observable> observeAllGroupChats(); diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java index ff161ba..d3585c7 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java @@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.Peer; import java.util.List; +import java.util.UUID; import io.reactivex.Completable; import io.reactivex.Maybe; @@ -19,25 +20,25 @@ public interface PeerRepository { return observePeer(peer.getId()); } - Observable> observePeer(long PeerId); + Observable> observePeer(UUID PeerId); - Maybe getPeer(long PeerId); + Maybe getPeer(UUID PeerId); default Observable> observePeerByAddress(Account account, String address) { return observePeerByAddress(account.getId(), address); } - Observable> observePeerByAddress(long accountId, String address); + Observable> observePeerByAddress(UUID accountId, String address); default Maybe getPeerByAddress(Account account, String address) { return getPeerByAddress(account.getId(), address); } - Maybe getPeerByAddress(long accountId, String address); + Maybe getPeerByAddress(UUID accountId, String address); Single getOrCreatePeer(Account account, String address); - Single getOrCreatePeer(long accountId, String address); + Single getOrCreatePeer(UUID accountId, String address); Observable> observeAllPeers(); @@ -45,7 +46,7 @@ public interface PeerRepository { return observeAllContactsOfAccount(account.getId()); } - Observable> observeAllContactsOfAccount(long accountId); + Observable> observeAllContactsOfAccount(UUID accountId); Single updatePeer(Peer Peer); @@ -53,5 +54,5 @@ public interface PeerRepository { Completable deletePeer(Peer Peer); - Completable deletePeer(long accountId, String address); + Completable deletePeer(UUID accountId, String address); } diff --git a/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java b/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java index e3acd82..71e94f2 100644 --- a/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java +++ b/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java @@ -39,6 +39,7 @@ public class MercuryRosterStore implements RosterStore { this.account = account; this.peerRepository = rosterRepository; this.accountRepository = accountRepository; + LOGGER.log(Level.INFO, "Construct Roster Store for " + account.getId()); } public void subscribe() { @@ -93,6 +94,10 @@ public class MercuryRosterStore implements RosterStore { // Update database Peer contact = toEntity(item); disposable.add(peerRepository.upsertPeer(contact) + .map(p -> { + LOGGER.log(Level.INFO, "Unserted Peer for account " + p.getAccount().getId()); + return p; + }) .subscribe( success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + contact, error) @@ -116,6 +121,10 @@ public class MercuryRosterStore implements RosterStore { for (RosterPacket.Item item : items) { Peer model = toEntity(item); disposable.add(peerRepository.upsertPeer(model) + .map(p -> { + LOGGER.log(Level.INFO, "Unserted Peer for account " + p.getAccount().getId()); + return p; + }) .subscribe( success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + model, error) diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java index 44593cc..814f813 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -1,5 +1,7 @@ package org.mercury_im.messenger.entity; +import java.util.UUID; + /** * User Account entity. * @@ -7,9 +9,9 @@ package org.mercury_im.messenger.entity; */ public interface Account { - void setId(long id); + void setId(UUID id); - long getId(); + UUID getId(); void setAddress(String address); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java index a1094c2..3248b5c 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java @@ -1,22 +1,27 @@ package org.mercury_im.messenger.entity; +import java.util.UUID; + public class IAccount implements Account { - protected long id; + protected UUID id; protected String address; protected String password; protected String host; protected int port; protected boolean enabled; - @Override - public void setId(long id) { + public IAccount() { + this.id = UUID.randomUUID(); + } + @Override + public void setId(UUID id) { this.id = id; } @Override - public long getId() { + public UUID getId() { return id; } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java index 19fd2c6..a100aba 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/Chat.java @@ -2,6 +2,8 @@ package org.mercury_im.messenger.entity.chat; import org.mercury_im.messenger.entity.Account; +import java.util.UUID; + /** * Generic interface defining shared properties of chats. * @@ -9,9 +11,9 @@ import org.mercury_im.messenger.entity.Account; */ public interface Chat { - long getId(); + UUID getId(); - void setId(long id); + void setId(UUID id); Account getAccount(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java index 5a37e9c..892d592 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java @@ -3,13 +3,19 @@ package org.mercury_im.messenger.entity.chat; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.Peer; +import java.util.UUID; + public class IDirectChat implements DirectChat { - protected long id; + protected UUID id; protected Peer peer; protected Account account; protected ChatPreferences preferences; + public IDirectChat() { + this.id = UUID.randomUUID(); + } + @Override public Peer getPeer() { return peer; @@ -21,12 +27,12 @@ public class IDirectChat implements DirectChat { } @Override - public long getId() { + public UUID getId() { return id; } @Override - public void setId(long id) { + public void setId(UUID id) { this.id = id; } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java index b7e87f6..1233321 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java @@ -4,16 +4,21 @@ import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.Peer; import java.util.Set; +import java.util.UUID; public class IGroupChat implements GroupChat { - private long id; + private UUID id; private Account account; private String roomAddress; private String roomName; protected ChatPreferences preferences; protected Set participants; + public IGroupChat() { + this.id = UUID.randomUUID(); + } + @Override public Set getParticipants() { return participants; @@ -45,12 +50,12 @@ public class IGroupChat implements GroupChat { } @Override - public long getId() { + public UUID getId() { return id; } @Override - public void setId(long id) { + public void setId(UUID id) { this.id = id; } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java index e8be5d1..0cadba8 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java @@ -2,9 +2,11 @@ package org.mercury_im.messenger.entity.contact; import org.mercury_im.messenger.entity.Account; +import java.util.UUID; + public class IPeer implements Peer { - protected long id; + protected UUID id; protected Account account; protected String address; protected String name; @@ -12,13 +14,17 @@ public class IPeer implements Peer { protected boolean pending; protected boolean approved; + public IPeer() { + this.id = UUID.randomUUID(); + } + @Override - public long getId() { + public UUID getId() { return id; } @Override - public void setId(long id) { + public void setId(UUID id) { this.id = id; } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java index cd57826..5d82b26 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java @@ -2,6 +2,8 @@ package org.mercury_im.messenger.entity.contact; import org.mercury_im.messenger.entity.Account; +import java.util.UUID; + /** * 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. @@ -10,9 +12,9 @@ import org.mercury_im.messenger.entity.Account; */ public interface Peer { - long getId(); + UUID getId(); - void setId(long id); + void setId(UUID id); Account getAccount(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java index c708497..1035831 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java @@ -2,10 +2,11 @@ package org.mercury_im.messenger.entity.message; import java.util.Date; import java.util.List; +import java.util.UUID; public class IMessage implements Message { - protected long id; + protected UUID id; protected String sender; protected String recipient; protected Date timestamp; @@ -16,12 +17,12 @@ public class IMessage implements Message { @Override - public long getId() { + public UUID getId() { return id; } @Override - public void setId(long id) { + public void setId(UUID id) { this.id = id; } diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java index 9253823..affed75 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java @@ -2,12 +2,13 @@ package org.mercury_im.messenger.entity.message; import java.util.Date; import java.util.List; +import java.util.UUID; public interface Message { - long getId(); + UUID getId(); - void setId(long id); + void setId(UUID id); String getSender(); From 946a66ed38d8a420a333e98173f77ede33b6574a Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 16:47:41 +0100 Subject: [PATCH 57/83] Fix name displaying and use AvatarDrawable --- .../ui/chatlist/ChatListRecyclerViewAdapter.java | 11 ++++++----- .../contacts/ContactListRecyclerViewAdapter.java | 7 ++++--- .../messenger/data/mapping/PeerMapping.java | 1 + .../org/mercury_im/messenger/entity/contact/Peer.java | 4 ++++ 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java index 7a03d56..cfc53b7 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java @@ -17,6 +17,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.ui.avatar.AvatarDrawable; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter; import org.mercury_im.messenger.util.ColorUtil; @@ -42,15 +43,15 @@ public class ChatListRecyclerViewAdapter @Override public void onBindViewHolder(@NonNull ChatHolder holder, int position) { DirectChat model = getItemAt(position); - holder.nameView.setText(model.getPeer().getAddress() != null ? - model.getPeer().getAddress() : model.toString()); - holder.avatarView.setColorFilter(ColorUtil.consistentColor(model.getPeer().getAddress())); - + String name = model.getPeer().getDisplayName(); + String address = model.getPeer().getAddress(); + holder.nameView.setText(name); + holder.avatarView.setImageDrawable(new AvatarDrawable(name, address)); holder.itemView.setOnClickListener(view -> { Intent intent = new Intent(holder.context, ChatActivity.class); intent.putExtra(ChatActivity.EXTRA_JID, model.getPeer().getAddress()); - intent.putExtra(ChatActivity.EXTRA_ACCOUNT, model.getPeer().getAccount().getId()); + intent.putExtra(ChatActivity.EXTRA_ACCOUNT, model.getPeer().getAccount().getId().toString()); holder.context.startActivity(intent); }); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java index eefffda..584f866 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.ui.avatar.AvatarDrawable; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter; import org.mercury_im.messenger.util.ColorUtil; @@ -65,11 +66,11 @@ public class ContactListRecyclerViewAdapter } void bind(Peer contact) { - String name = contact.getName(); + String name = contact.getDisplayName(); String address = contact.getAddress(); - nameView.setText(name != null ? name : address); + nameView.setText(name); jidView.setText(address); - avatarView.setColorFilter(ColorUtil.consistentColor(address)); + avatarView.setImageDrawable(new AvatarDrawable(name, address)); view.setOnClickListener(view -> { Intent intent = new Intent(context, ChatActivity.class); diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java index 9e95219..864dc98 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/PeerMapping.java @@ -44,6 +44,7 @@ public class PeerMapping extends AbstractMapping { entity.setId(model.getId()); entity.setAccount(accountMapping.toEntity(model.getAccount(), entity.getAccount())); entity.setAddress(model.getAddress()); + entity.setName(model.getName()); entity.setSubscriptionDirection(model.getSubscriptionDirection()); entity.setSubscriptionPending(model.isSubscriptionPending()); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java index 5d82b26..3a33a44 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/Peer.java @@ -41,4 +41,8 @@ public interface Peer { void setSubscriptionApproved(boolean approved); boolean isContact(); + + default String getDisplayName() { + return getName() != null ? getName() : getAddress(); + } } From 80579e5e8da4b8b9ca7749f3498ab748c9673b8f Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 00:13:41 +0100 Subject: [PATCH 58/83] Fix test --- .../mercury_im/messenger/data/mapping/AccountMappingTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java b/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java index 19bf72e..b2bdb99 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/mapping/AccountMappingTest.java @@ -44,9 +44,7 @@ public class AccountMappingTest { AccountModel model = accountMapping.toModel(ACCOUNT_MISSION_CONTROL); - assertEquals("Since we cannot set the id of the model in the mapper, it is still 0.", - ACCOUNT_MISSION_CONTROL.getId(), model.getId()); - assertNotSame(ACCOUNT_MISSION_CONTROL.getId(), model.getId()); + assertEquals(ACCOUNT_MISSION_CONTROL.getId(), model.getId()); assertEquals(ACCOUNT_MISSION_CONTROL.getAddress(), model.getAddress()); assertEquals(ACCOUNT_MISSION_CONTROL.getPassword(), model.getPassword()); assertEquals(ACCOUNT_MISSION_CONTROL.isEnabled(), model.isEnabled()); From 1a973fe725f34c40aaf2a6d358d7cd5be5a6bd93 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 00:13:54 +0100 Subject: [PATCH 59/83] Improve entity constructors --- .../java/org/mercury_im/messenger/entity/IAccount.java | 6 +++++- .../org/mercury_im/messenger/entity/chat/IDirectChat.java | 6 +++++- .../org/mercury_im/messenger/entity/chat/IGroupChat.java | 6 +++++- .../org/mercury_im/messenger/entity/contact/IPeer.java | 6 +++++- .../org/mercury_im/messenger/entity/message/IMessage.java | 7 +++++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java index 3248b5c..aed9b81 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java @@ -12,7 +12,11 @@ public class IAccount implements Account { protected boolean enabled; public IAccount() { - this.id = UUID.randomUUID(); + this(UUID.randomUUID()); + } + + public IAccount(UUID id) { + this.id = id; } @Override diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java index 892d592..dd4b78c 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IDirectChat.java @@ -13,7 +13,11 @@ public class IDirectChat implements DirectChat { protected ChatPreferences preferences; public IDirectChat() { - this.id = UUID.randomUUID(); + this(UUID.randomUUID()); + } + + public IDirectChat(UUID id) { + this.id = id; } @Override diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java index 1233321..3f2c248 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/IGroupChat.java @@ -16,7 +16,11 @@ public class IGroupChat implements GroupChat { protected Set participants; public IGroupChat() { - this.id = UUID.randomUUID(); + this(UUID.randomUUID()); + } + + public IGroupChat(UUID id) { + this.id = id; } @Override diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java index 0cadba8..a1e282a 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/contact/IPeer.java @@ -15,7 +15,11 @@ public class IPeer implements Peer { protected boolean approved; public IPeer() { - this.id = UUID.randomUUID(); + this(UUID.randomUUID()); + } + + public IPeer(UUID id) { + this.id = id; } @Override diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java index 1035831..313c11f 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/IMessage.java @@ -15,6 +15,13 @@ public class IMessage implements Message { protected MessageMetadata metadata; protected MessageDirection direction; + public IMessage() { + this(UUID.randomUUID()); + } + + public IMessage(UUID id) { + this.id = id; + } @Override public UUID getId() { From 5c403cef24ee992c50e4542aa0f023493b1b72e3 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 00:36:18 +0100 Subject: [PATCH 60/83] Refactor DiffUtil --- .../mercury_im/messenger/util/DiffUtil.java | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/domain/src/main/java/org/mercury_im/messenger/util/DiffUtil.java b/domain/src/main/java/org/mercury_im/messenger/util/DiffUtil.java index 2a22abc..ee472d7 100644 --- a/domain/src/main/java/org/mercury_im/messenger/util/DiffUtil.java +++ b/domain/src/main/java/org/mercury_im/messenger/util/DiffUtil.java @@ -5,25 +5,40 @@ import java.util.List; public class DiffUtil { - public static Diff diff(List a, List b) { - List removed = new ArrayList<>(a); - removed.removeAll(b); - List added = new ArrayList<>(b); - added.removeAll(a); - List preserved = new ArrayList<>(a); - preserved.retainAll(b); - return new Diff<>(added, preserved, removed); + public static Diff diff(List before, List after) { + List removed = getRemovedItems(before, after); + List added = getAddedItems(before, after); + List retained = getRetainedItems(before, after); + return new Diff<>(added, retained, removed); + } + + private static List getRemovedItems(List before, List after) { + List withoutRetained = new ArrayList<>(before); + withoutRetained.removeAll(after); + return withoutRetained; + } + + private static List getAddedItems(List before, List after) { + List withoutPrevious = new ArrayList<>(after); + withoutPrevious.removeAll(before); + return withoutPrevious; + } + + private static List getRetainedItems(List before, List after) { + List retained = new ArrayList<>(before); + retained.retainAll(after); + return retained; } public static class Diff { private final List added; - private final List preserved; + private final List retained; private final List removed; - public Diff(List added, List preserved, List removed) { + public Diff(List added, List retained, List removed) { this.added = added; - this.preserved = preserved; + this.retained = retained; this.removed = removed; } @@ -31,8 +46,8 @@ public class DiffUtil { return added; } - public List getPreserved() { - return preserved; + public List getRetained() { + return retained; } public List getRemoved() { From 83c3245c36fd06e2c4bdca4e08fc90277231ccf5 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 00:38:40 +0100 Subject: [PATCH 61/83] Generalize ThreadUtils javadoc --- .../main/java/org/mercury_im/messenger/util/ThreadUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/src/main/java/org/mercury_im/messenger/util/ThreadUtils.java b/domain/src/main/java/org/mercury_im/messenger/util/ThreadUtils.java index 6a5d196..d630b73 100644 --- a/domain/src/main/java/org/mercury_im/messenger/util/ThreadUtils.java +++ b/domain/src/main/java/org/mercury_im/messenger/util/ThreadUtils.java @@ -1,7 +1,7 @@ package org.mercury_im.messenger.util; /** - * Name constants used by dagger in combination with the @Named annotation. + * Names for identifying scheduler instances during dependency injection. */ public class ThreadUtils { /** From 647695b081caf8fc16556072d7c852db2e263b6c Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 00:49:30 +0100 Subject: [PATCH 62/83] Refactor XmppConnectionFactory --- .../messenger/xmpp/MercuryConnection.java | 30 ---------------- .../messenger/xmpp/XmppConnectionFactory.java | 35 +++++++++++++++++++ 2 files changed, 35 insertions(+), 30 deletions(-) create mode 100644 domain/src/main/java/org/mercury_im/messenger/xmpp/XmppConnectionFactory.java diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java index ba905a2..31e25f8 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -1,17 +1,8 @@ package org.mercury_im.messenger.xmpp; -import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.tcp.XMPPTCPConnection; -import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; -import org.jivesoftware.smack.util.stringencoder.BareJidEncoder; -import org.jxmpp.jid.BareJid; -import org.jxmpp.jid.impl.JidCreate; -import org.jxmpp.stringprep.XmppStringprepException; import org.mercury_im.messenger.entity.Account; -import java.net.Inet4Address; - public class MercuryConnection { private static final XmppConnectionFactory connectionFactory = new XmppConnectionFactory(); @@ -31,25 +22,4 @@ public class MercuryConnection { public XMPPConnection getConnection() { return connection; } - - public void ensureAuthenticated() { - - } - - public static class XmppConnectionFactory { - - public AbstractXMPPConnection createConnection(Account account) { - try { - XMPPTCPConnectionConfiguration connectionConfiguration = XMPPTCPConnectionConfiguration.builder() - .setConnectTimeout(10 * 1000) - .setXmppAddressAndPassword(account.getAddress(), account.getPassword()) - .setHost(account.getHost() != null ? account.getHost() : JidCreate.domainBareFrom(account.getAddress()).toString()) - .setPort(account.getPort() != 0 ? account.getPort() : 5222) - .build(); - return new XMPPTCPConnection(connectionConfiguration); - } catch (XmppStringprepException e) { - throw new AssertionError("Account has invalid address: " + account.getAddress(), e); - } - } - } } diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppConnectionFactory.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppConnectionFactory.java new file mode 100644 index 0000000..f1da4d9 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppConnectionFactory.java @@ -0,0 +1,35 @@ +package org.mercury_im.messenger.xmpp; + +import org.jivesoftware.smack.AbstractXMPPConnection; +import org.jivesoftware.smack.tcp.XMPPTCPConnection; +import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; +import org.jxmpp.jid.impl.JidCreate; +import org.jxmpp.stringprep.XmppStringprepException; +import org.mercury_im.messenger.entity.Account; + +public class XmppConnectionFactory { + + private static final int DEFAULT_PORT = 5222; + private static final int CONNECTION_TIMEOUT = 30 * 1000; + + public AbstractXMPPConnection createConnection(Account account) { + try { + return new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder() + .setConnectTimeout(CONNECTION_TIMEOUT) + .setXmppAddressAndPassword(account.getAddress(), account.getPassword()) + .setHost(determineHost(account)) + .setPort(determinePort(account)) + .build()); + } catch (XmppStringprepException e) { + throw new AssertionError("Account has invalid address: " + account.getAddress(), e); + } + } + + private String determineHost(Account account) throws XmppStringprepException { + return account.getHost() != null ? account.getHost() : JidCreate.domainBareFrom(account.getAddress()).toString(); + } + + private int determinePort(Account account) { + return account.getPort() != 0 ? account.getPort() : DEFAULT_PORT; + } +} From 6504170d5870425e147611d38495c84ba8a536a0 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 02:06:51 +0100 Subject: [PATCH 63/83] Fix duplicate contacts on rename --- .../messenger/ui/account/LoginViewModel.java | 53 ++++++++++--------- .../data/model/AbstractPeerModel.java | 5 +- .../data/repository/XmppPeerRepository.java | 11 ++-- .../messenger/store/MercuryRosterStore.java | 44 +++++++-------- .../messenger/usecase/AddAccount.java | 33 ++++++------ 5 files changed, 73 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java index 9e21544..4e5e8ea 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java @@ -44,31 +44,30 @@ public class LoginViewModel extends AndroidViewModel { public void setUsername(String username) { if (username == null || username.isEmpty()) { + this.username = null; usernameError.setValue(new Error(getApplication().getResources().getString(R.string.error_field_required))); - this.username = null; - updateLoginEnabled(); - return; - } - - try { - this.username = JidCreate.entityBareFrom(username); - updateLoginEnabled(); - } catch (XmppStringprepException e) { - usernameError.setValue(new Error(getApplication().getResources().getString(R.string.error_invalid_username))); - this.username = null; - updateLoginEnabled(); + } else { + try { + this.username = JidCreate.entityBareFrom(username); + } catch (XmppStringprepException e) { + this.username = null; + usernameError.setValue(new Error(getApplication().getResources().getString(R.string.error_invalid_username))); + } } + updateLoginButtonState(); } public void setPassword(String password) { - this.password = password; - updateLoginEnabled(); if (password == null || password.isEmpty()) { + this.password = null; passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_field_required))); + } else { + this.password = password; } + updateLoginButtonState(); } - private void updateLoginEnabled() { + private void updateLoginButtonState() { loginButtonEnabled.setValue(username != null && !(password == null || password.isEmpty())); } @@ -81,15 +80,19 @@ public class LoginViewModel extends AndroidViewModel { disposable.add(messenger.addAccount() .setAddress(username.asEntityBareJidString()) .setPassword(password) - .loginAndStoreAccountIfSuccessful() + .execute() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) - .doOnComplete(() -> loginCompleted.setValue(true)) - .doOnError(this::handleConnectionError) + .doOnComplete(this::signalLoginSuccessful) + .doOnError(this::signalLoginError) .subscribe()); } - private void handleConnectionError(Throwable error) { + private void signalLoginSuccessful() { + loginCompleted.setValue(true); + } + + private void signalLoginError(Throwable error) { if (error instanceof SASLErrorException) { passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_incorrect_password))); loginButtonEnabled.setValue(true); @@ -99,12 +102,6 @@ public class LoginViewModel extends AndroidViewModel { } } - @Override - protected void onCleared() { - super.onCleared(); - disposable.clear(); - } - public LiveData getPasswordError() { return passwordError; } @@ -121,6 +118,12 @@ public class LoginViewModel extends AndroidViewModel { return loginButtonEnabled; } + @Override + protected void onCleared() { + super.onCleared(); + disposable.clear(); + } + public static class Error { private String message; diff --git a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java index 0029a06..5a4e13e 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java +++ b/data/src/main/java/org/mercury_im/messenger/data/model/AbstractPeerModel.java @@ -11,6 +11,7 @@ import io.requery.Convert; import io.requery.Entity; import io.requery.ForeignKey; import io.requery.Generated; +import io.requery.Index; import io.requery.Key; import io.requery.ManyToOne; import io.requery.Persistable; @@ -19,17 +20,19 @@ import io.requery.Table; import io.requery.converter.UUIDConverter; @Entity -@Table(name = "contacts") +@Table(name = "contacts", uniqueIndexes = "unique_address") public abstract class AbstractPeerModel implements Persistable { @Key @Convert(UUIDConverter.class) UUID id; + @Index("unique_address") @ManyToOne(cascade = CascadeAction.NONE) @ForeignKey(referencedColumn = "id") AccountModel account; + @Index("unique_address") @Column(nullable = false) String address; diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index f297825..bd3bb96 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -107,11 +107,11 @@ public class XmppPeerRepository public Single getOrCreatePeer(Account account, String address) { return getPeerByAddress(account, address) .switchIfEmpty(Single - .just(new IPeer(){ - { - setAccount(account); - setAddress(address); - } + .just(new IPeer()) + .map(peer -> { + peer.setAccount(account); + peer.setAddress(address); + return peer; }) .flatMap(this::insertPeer)) .subscribeOn(subscriberScheduler()) @@ -121,6 +121,7 @@ public class XmppPeerRepository @Override public Observable> observeAllPeers() { return data().select(PeerModel.class) + .orderBy(PeerModel.ADDRESS) .get().observableResult() .map(ResultDelegate::toList) .map(peerModels -> { diff --git a/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java b/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java index 71e94f2..c5b8ad5 100644 --- a/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java +++ b/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java @@ -7,7 +7,6 @@ import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.data.repository.PeerRepository; import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.entity.contact.SubscriptionDirection; @@ -80,7 +79,7 @@ public class MercuryRosterStore implements RosterStore { @Override public RosterPacket.Item getEntry(Jid bareJid) { - return itemMap.get(bareJid); + return itemMap.get(bareJid.asUnescapedString()); } @Override @@ -90,27 +89,30 @@ public class MercuryRosterStore implements RosterStore { @Override public boolean addEntry(RosterPacket.Item item, String version) { - LOGGER.log(Level.INFO, "Add entry " + item.toXML().toString()); - // Update database - Peer contact = toEntity(item); - disposable.add(peerRepository.upsertPeer(contact) - .map(p -> { - LOGGER.log(Level.INFO, "Unserted Peer for account " + p.getAccount().getId()); - return p; - }) + writeEntryToDatabase(item); + writeRosterVersionToDatabase(version); + + return true; + } + + private void writeEntryToDatabase(RosterPacket.Item item) { + disposable.add(peerRepository.getOrCreatePeer(account, item.getJid().asUnescapedString()) + .map(peer -> toEntity(item, peer)) + .flatMap(peerRepository::updatePeer) .subscribe( success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), - error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + contact, error) + error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + item.getJid().asUnescapedString(), error) )); - /* + } + + private void writeRosterVersionToDatabase(String version) { + /* disposable.add(peerRepository.updateRosterVersion(account, version) .subscribe( success -> LOGGER.log(Level.FINE, "Upserted roster version to " + rosterVersion + " successfully"), error -> LOGGER.log(Level.WARNING, "An error occurred upserting roster version", error) )); */ - - return true; } @Override @@ -119,16 +121,7 @@ public class MercuryRosterStore implements RosterStore { // Update database // TODO: Delete other contacts for (RosterPacket.Item item : items) { - Peer model = toEntity(item); - disposable.add(peerRepository.upsertPeer(model) - .map(p -> { - LOGGER.log(Level.INFO, "Unserted Peer for account " + p.getAccount().getId()); - return p; - }) - .subscribe( - success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), - error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + model, error) - )); + writeEntryToDatabase(item); } /* @@ -191,8 +184,7 @@ public class MercuryRosterStore implements RosterStore { return item; } - public Peer toEntity(RosterPacket.Item item) { - Peer peer = new IPeer(); + public Peer toEntity(RosterPacket.Item item, Peer peer) { peer.setAccount(account); peer.setAddress(item.getJid().asEntityBareJidOrThrow().asEntityBareJidString()); peer.setName(item.getName()); diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java index 80d2d5c..8e3fc8c 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java @@ -23,6 +23,13 @@ public class AddAccount { private static final Logger LOGGER = Logger.getLogger(AddAccount.class.getName()); + public enum ConnectionResult { + success, + credential_error, + server_error, + other_error + } + private Account account; private MercuryConnection connection; @@ -42,22 +49,19 @@ public class AddAccount { return this; } - public boolean isAddressSet() { - return account.getAddress() != null; - } - public AddAccount setPassword(String password) { this.account.setPassword(password); return this; } - public boolean isPasswordSet() { - return account.getPassword() != null; + public Completable execute() { + return loginAndStoreAccountIfSuccessful(); } public Completable loginAndStoreAccountIfSuccessful() { - return login().andThen(insertEnabledAccountIntoDatabase()).ignoreElement() - .andThen(Completable.fromAction(() -> messenger.addConnection(connection))); + return logIntoAccount() + .andThen(insertEnabledAccountIntoDatabase()).ignoreElement() + .andThen(addConnectionToMessenger()); } private Single insertEnabledAccountIntoDatabase() { @@ -66,6 +70,10 @@ public class AddAccount { .map(this::updateAccount); } + private Completable addConnectionToMessenger() { + return Completable.fromAction(() -> messenger.addConnection(connection)); + } + private Account updateAccount(Account account) { this.account = account; updateAccountIdInConnection(account); @@ -78,7 +86,7 @@ public class AddAccount { } } - private Completable login() { + private Completable logIntoAccount() { return Completable.fromAction( () -> { getOrCreateConnection(); @@ -117,11 +125,4 @@ public class AddAccount { ((AbstractXMPPConnection) connection.getConnection()).connect().login(); } } - - public enum ConnectionResult { - success, - credential_error, - server_error, - other_error - } } From c165d7a633e989df22fbfeac64915aa43bfc70ad Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 02:21:19 +0100 Subject: [PATCH 64/83] deleteAccount(uuid) --- .../messenger/data/repository/XmppAccountRepository.java | 4 ++-- .../messenger/data/repository/AccountRepository.java | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 5774bbb..8ef730c 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -132,8 +132,8 @@ public class XmppAccountRepository } @Override - public Completable deleteAccount(Account account) { - return dao.delete(account.getId()).ignoreElement() + public Completable deleteAccount(UUID accountId) { + return dao.delete(accountId).ignoreElement() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java index 5524d0a..c8c87b0 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java @@ -31,6 +31,10 @@ public interface AccountRepository { Single upsertAccount(Account account); - Completable deleteAccount(Account account); + default Completable deleteAccount(Account account) { + return deleteAccount(account.getId()); + } + + Completable deleteAccount(UUID accountId); } From 7606a3c35131965e6017fda2537cc6cd25456224 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 02:36:38 +0100 Subject: [PATCH 65/83] Readability improvements XmppPeerRepository --- .../data/repository/XmppPeerRepository.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index bd3bb96..994c5a0 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -24,6 +24,9 @@ import io.reactivex.Observable; import io.reactivex.Scheduler; import io.reactivex.Single; import io.requery.Persistable; +import io.requery.query.Conditional; +import io.requery.query.Expression; +import io.requery.query.LogicalCondition; import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; @@ -139,8 +142,7 @@ public class XmppPeerRepository public Observable> observeAllContactsOfAccount(UUID accountId) { return data().select(PeerModel.class) .where(PeerModel.ACCOUNT_ID.eq(accountId)) - .and(PeerModel.SUBSCRIPTION_DIRECTION.in( - Arrays.asList(SubscriptionDirection.both, SubscriptionDirection.to))) + .and(isContact()) .get().observableResult() .map(ResultDelegate::toList) .map(peerModels -> { @@ -154,6 +156,12 @@ public class XmppPeerRepository .observeOn(observerScheduler()); } + private LogicalCondition, ?> isContact() { + return PeerModel.SUBSCRIPTION_DIRECTION.in(Arrays.asList( + SubscriptionDirection.both, + SubscriptionDirection.to)); + } + @Override public Single updatePeer(Peer peer) { // In order to update, we fetch the model, update it and write it back. From 266bc1f55ac4a990ae544c09e3375f87df0b1951 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 02:46:52 +0100 Subject: [PATCH 66/83] Further refactoring of XmppPeerRepo --- .../data/repository/XmppPeerRepository.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index 994c5a0..c39f7db 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -1,6 +1,8 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.mapping.PeerMapping; +import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.model.PeerModel; import org.mercury_im.messenger.entity.contact.SubscriptionDirection; import org.mercury_im.messenger.util.Optional; @@ -127,17 +129,19 @@ public class XmppPeerRepository .orderBy(PeerModel.ADDRESS) .get().observableResult() .map(ResultDelegate::toList) - .map(peerModels -> { - List peerEntities = new ArrayList<>(peerModels.size()); - for (PeerModel model : peerModels) { - peerEntities.add(peerMapping.toEntity(model)); - } - return peerEntities; - }) + .map(this::peerModelsToEntities) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } + private List peerModelsToEntities(List peerModels) { + List peerEntities = new ArrayList<>(peerModels.size()); + for (PeerModel model : peerModels) { + peerEntities.add(peerMapping.toEntity(model)); + } + return peerEntities; + } + @Override public Observable> observeAllContactsOfAccount(UUID accountId) { return data().select(PeerModel.class) @@ -145,13 +149,7 @@ public class XmppPeerRepository .and(isContact()) .get().observableResult() .map(ResultDelegate::toList) - .map(peerModels -> { - List peerEntities = new ArrayList<>(peerModels.size()); - for (PeerModel model : peerModels) { - peerEntities.add(peerMapping.toEntity(model)); - } - return peerEntities; - }) + .map(this::peerModelsToEntities) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -205,6 +203,11 @@ public class XmppPeerRepository @Override public Completable deletePeer(UUID accountId, String address) { - return null; + return data().delete(PeerModel.class) + .where(PeerModel.ACCOUNT_ID.eq(accountId) + .and(PeerModel.ADDRESS.eq(address))) + .get().single().ignoreElement() + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } } From d76d0fb2f2df52dfe2557279963b1daeb0f21126 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 02:49:39 +0100 Subject: [PATCH 67/83] Remove unused imports --- .../messenger/data/repository/XmppPeerRepository.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index c39f7db..835a26a 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -1,19 +1,16 @@ package org.mercury_im.messenger.data.repository; -import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.mapping.PeerMapping; -import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.model.PeerModel; -import org.mercury_im.messenger.entity.contact.SubscriptionDirection; -import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.contact.IPeer; import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.contact.SubscriptionDirection; +import org.mercury_im.messenger.util.Optional; import org.mercury_im.messenger.util.ThreadUtils; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.UUID; @@ -26,7 +23,6 @@ import io.reactivex.Observable; import io.reactivex.Scheduler; import io.reactivex.Single; import io.requery.Persistable; -import io.requery.query.Conditional; import io.requery.query.Expression; import io.requery.query.LogicalCondition; import io.requery.query.ResultDelegate; From 4491df0dd3fbb054efbd799912335ba376d178db Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 02:57:24 +0100 Subject: [PATCH 68/83] Improve GroupChatRepo --- .../repository/XmppGroupChatRepository.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index f83d82a..b052739 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -76,13 +76,13 @@ public class XmppGroupChatRepository public Single getOrCreateGroupChat(Account account, String roomAddress) { return getGroupChatByRoomAddress(account, roomAddress) .switchIfEmpty( - Single.just((GroupChat) new IGroupChat() { - { - setAccount(account); - setRoomAddress(roomAddress); - } - }) - .flatMap(this::insertGroupChat)) + Single.just(new IGroupChat()) + .map(chat -> { + chat.setAccount(account); + chat.setRoomAddress(roomAddress); + return chat; + }) + .flatMap(this::insertGroupChat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -109,17 +109,19 @@ public class XmppGroupChatRepository public Observable> observeAllGroupChats() { return dao.getAll().observableResult() .map(ResultDelegate::toList) - .map(list -> { - List entities = new ArrayList<>(list.size()); - for (GroupChatModel model : list) { - entities.add(groupChatMapping.toEntity(model)); - } - return entities; - }) + .map(this::modelsToEntities) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } + private List modelsToEntities(List models) { + List entities = new ArrayList<>(models.size()); + for (GroupChatModel model : models) { + entities.add(groupChatMapping.toEntity(model)); + } + return entities; + } + @Override public Single updateGroupChat(GroupChat chat) { return dao.get(chat.getId()).maybe().toSingle() From 875321ed001effde6c20e2ef5621b102fc8b3bfb Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 02:58:58 +0100 Subject: [PATCH 69/83] Reformat --- .../data/repository/XmppGroupChatRepository.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index b052739..6d84001 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -75,14 +75,13 @@ public class XmppGroupChatRepository @Override public Single getOrCreateGroupChat(Account account, String roomAddress) { return getGroupChatByRoomAddress(account, roomAddress) - .switchIfEmpty( - Single.just(new IGroupChat()) - .map(chat -> { - chat.setAccount(account); - chat.setRoomAddress(roomAddress); - return chat; - }) - .flatMap(this::insertGroupChat)) + .switchIfEmpty(Single.just(new IGroupChat()) + .map(chat -> { + chat.setAccount(account); + chat.setRoomAddress(roomAddress); + return chat; + }) + .flatMap(this::insertGroupChat)) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } From f7fae590626554d22736a9d348fe8a8666a9804b Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 03:18:14 +0100 Subject: [PATCH 70/83] More chat repo methods --- .../repository/XmppDirectChatRepository.java | 20 ++++++++++--------- .../repository/XmppGroupChatRepository.java | 15 ++++++++++++-- .../data/repository/DirectChatRepository.java | 6 +++++- .../data/repository/GroupChatRepository.java | 12 ++++++++++- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index 28930b0..cfa197b 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -111,17 +111,19 @@ public class XmppDirectChatRepository public Observable> observeAllDirectChats() { return dao.getAll().observableResult() .map(ResultDelegate::toList) - .map(list -> { - List entities = new ArrayList<>(list.size()); - for (DirectChatModel model : list) { - entities.add(directChatMapping.toEntity(model)); - } - return entities; - }) + .map(this::chatModelsToEntities) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } + private List chatModelsToEntities(List models) { + List entities = new ArrayList<>(models.size()); + for (DirectChatModel model : models) { + entities.add(directChatMapping.toEntity(model)); + } + return entities; + } + @Override public Single updateDirectChat(DirectChat chat) { return dao.get(chat.getId()).maybe().toSingle() @@ -144,8 +146,8 @@ public class XmppDirectChatRepository } @Override - public Completable deleteDirectChat(DirectChat chat) { - return dao.delete(chat.getId()) + public Completable deleteDirectChat(UUID chatId) { + return dao.delete(chatId) .ignoreElement() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index 6d84001..b0d5cf3 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -113,6 +113,17 @@ public class XmppGroupChatRepository .observeOn(observerScheduler()); } + @Override + public Observable> observeAllGroupChatsOfAccount(UUID accountId) { + return data().select(GroupChatModel.class) + .where(GroupChatModel.ACCOUNT_ID.eq(accountId)) + .get().observableResult() + .map(ResultDelegate::toList) + .map(this::modelsToEntities) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + private List modelsToEntities(List models) { List entities = new ArrayList<>(models.size()); for (GroupChatModel model : models) { @@ -144,8 +155,8 @@ public class XmppGroupChatRepository } @Override - public Completable deleteGroupChat(GroupChat chat) { - return dao.delete(chat.getId()).ignoreElement() + public Completable deleteGroupChat(UUID chatId) { + return dao.delete(chatId).ignoreElement() .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java index ad8bf09..e15c442 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/DirectChatRepository.java @@ -36,6 +36,10 @@ public interface DirectChatRepository { Single upsertDirectChat(DirectChat chat); - Completable deleteDirectChat(DirectChat chat); + default Completable deleteDirectChat(DirectChat chat) { + return deleteDirectChat(chat.getId()); + } + + Completable deleteDirectChat(UUID chatId); } diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java index b9a980b..0c79ef2 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java @@ -36,10 +36,20 @@ public interface GroupChatRepository { Observable> observeAllGroupChats(); + default Observable> observeAllGroupChatsOfAccount(Account account) { + return observeAllGroupChatsOfAccount(account.getId()); + } + + Observable> observeAllGroupChatsOfAccount(UUID accountId); + Single updateGroupChat(GroupChat chat); Single upsertGroupChat(GroupChat chat); - Completable deleteGroupChat(GroupChat chat); + default Completable deleteGroupChat(GroupChat chat) { + return deleteGroupChat(chat.getId()); + } + + Completable deleteGroupChat(UUID chatId); } From 866772f577b2cbe50c8145c8a3b70a7f41354242 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 05:47:17 +0100 Subject: [PATCH 71/83] Improve observation of chat list --- .../ui/chatlist/ChatListFragment.java | 24 ++++++++----------- .../chatlist/ChatListRecyclerViewAdapter.java | 6 ++++- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java index 50b519a..f14b263 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListFragment.java @@ -1,7 +1,6 @@ package org.mercury_im.messenger.ui.chatlist; -import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -17,13 +16,11 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; -import butterknife.BindView; -import butterknife.ButterKnife; - import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; -import java.util.ArrayList; +import butterknife.BindView; +import butterknife.ButterKnife; public class ChatListFragment extends Fragment { @@ -36,8 +33,10 @@ public class ChatListFragment extends Fragment { @BindView(R.id.fab) ExtendedFloatingActionButton fab; - public ChatListFragment() { - + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + viewModel = new ViewModelProvider(this).get(ChatListViewModel.class); } @Nullable @@ -55,15 +54,12 @@ public class ChatListFragment extends Fragment { } @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - + public void onResume() { + super.onResume(); + observeViewModel(); } - @Override - public void onAttach(Context context) { - super.onAttach(context); - viewModel = new ViewModelProvider(getActivity()).get(ChatListViewModel.class); + private void observeViewModel() { viewModel.getChats().observe(this, chatModels -> { Log.d(Messenger.TAG, "Displaying " + chatModels.size() + " chats"); recyclerViewAdapter.setModels(chatModels); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java index cfc53b7..13a1e1f 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListRecyclerViewAdapter.java @@ -22,6 +22,9 @@ import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter; import org.mercury_im.messenger.util.ColorUtil; +import java.util.logging.Level; +import java.util.logging.Logger; + import butterknife.BindView; import butterknife.ButterKnife; @@ -42,6 +45,7 @@ public class ChatListRecyclerViewAdapter @Override public void onBindViewHolder(@NonNull ChatHolder holder, int position) { + Logger.getAnonymousLogger().log(Level.INFO, "BIND"); DirectChat model = getItemAt(position); String name = model.getPeer().getDisplayName(); String address = model.getPeer().getAddress(); @@ -98,7 +102,7 @@ public class ChatListRecyclerViewAdapter @Override public boolean areContentsTheSame(DirectChat oldItem, DirectChat newItem) { - return areItemsTheSame(oldItem, newItem); + return oldItem.getPeer().getName().equals(newItem.getPeer().getName()); } } From 6ae00a936b3fe64155a047c6e34ead57ee520174 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 22 Dec 2019 05:48:07 +0100 Subject: [PATCH 72/83] Login on startup --- .../org/mercury_im/messenger/Messenger.java | 16 +++++ .../messenger/usecase/AddAccount.java | 42 +---------- .../usecase/ConnectAccountsOnStartup.java | 47 +++++++++++++ .../messenger/usecase/LogIntoAccount.java | 69 +++++++++++++++++++ 4 files changed, 134 insertions(+), 40 deletions(-) create mode 100644 domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index 012cda8..43ad318 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -8,6 +8,7 @@ import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.store.MercuryRosterStore; import org.mercury_im.messenger.usecase.AddAccount; +import org.mercury_im.messenger.usecase.ConnectAccountsOnStartup; import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.HashMap; @@ -18,6 +19,10 @@ import java.util.logging.Logger; import javax.inject.Inject; +import io.reactivex.Scheduler; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; + public class Messenger implements ClientStateListener { public static final String TAG = "MercuryIM"; @@ -26,9 +31,20 @@ public class Messenger implements ClientStateListener { private final Map connections = new HashMap<>(); private Repositories repositories; + private CompositeDisposable disposable = new CompositeDisposable(); + @Inject public Messenger(Repositories repositories) { this.repositories = repositories; + initialLogin(); + } + + public void initialLogin() { + disposable.add(repositories.getAccountRepository().observeAllAccounts().firstOrError() + .subscribeOn(Schedulers.newThread()) + .subscribe(initialAccounts -> ConnectAccountsOnStartup + .with(this, initialAccounts) + .execute())); } public void addConnection(MercuryConnection connection) { diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java index 8e3fc8c..3b0db1a 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java @@ -1,17 +1,11 @@ package org.mercury_im.messenger.usecase; -import org.jivesoftware.smack.AbstractXMPPConnection; -import org.jivesoftware.smack.SmackException; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.sasl.SASLErrorException; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.xmpp.MercuryConnection; -import java.io.IOException; -import java.util.logging.Level; import java.util.logging.Logger; import io.reactivex.Completable; @@ -23,13 +17,6 @@ public class AddAccount { private static final Logger LOGGER = Logger.getLogger(AddAccount.class.getName()); - public enum ConnectionResult { - success, - credential_error, - server_error, - other_error - } - private Account account; private MercuryConnection connection; @@ -87,11 +74,8 @@ public class AddAccount { } private Completable logIntoAccount() { - return Completable.fromAction( - () -> { - getOrCreateConnection(); - doAuthenticateIfNecessary(); - }) + return Completable.fromAction(this::getOrCreateConnection) + .andThen(LogIntoAccount.with(connection).executeAndPossiblyThrow()) .subscribeOn(Schedulers.io()); } @@ -102,27 +86,5 @@ public class AddAccount { } } - private ConnectionResult authenticateIfNecessary() { - try { - doAuthenticateIfNecessary(); - return ConnectionResult.success; - } catch (SASLErrorException e) { - LOGGER.log(Level.WARNING, "SASL Error while connecting to account " + account.getAddress(), e); - return ConnectionResult.credential_error; - } catch (SmackException.ConnectionException e) { - LOGGER.log(Level.WARNING, "Connectivity error while connecting to account " + account.getAddress(), e); - return ConnectionResult.server_error; - } - catch (IOException | XMPPException | SmackException | InterruptedException e) { - LOGGER.log(Level.WARNING, "Error connecting to account " + account.getAddress(), e); - return ConnectionResult.other_error; - } - } - private void doAuthenticateIfNecessary() - throws InterruptedException, XMPPException, SmackException, IOException { - if (!connection.getConnection().isAuthenticated()) { - ((AbstractXMPPConnection) connection.getConnection()).connect().login(); - } - } } diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java b/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java new file mode 100644 index 0000000..e7c7c3e --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java @@ -0,0 +1,47 @@ +package org.mercury_im.messenger.usecase; + +import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.xmpp.MercuryConnection; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; + +public class ConnectAccountsOnStartup { + + private static final Logger LOGGER = Logger.getLogger(ConnectAccountsOnStartup.class.getName()); + + private final Messenger messenger; + private final List accounts = new ArrayList<>(); + + private CompositeDisposable disposable = new CompositeDisposable(); + + private ConnectAccountsOnStartup(Messenger messenger, List initialAccounts) { + this.messenger = messenger; + this.accounts.addAll(initialAccounts); + } + + public static ConnectAccountsOnStartup with(Messenger messenger, List initialAccounts) { + return new ConnectAccountsOnStartup(messenger, initialAccounts); + } + + public void execute() { + for (Account account : accounts) { + if (account.isEnabled()) { + MercuryConnection connection = new MercuryConnection(account); + disposable.add(LogIntoAccount.with(connection) + .executeAndPossiblyThrow() + .subscribeOn(Schedulers.newThread()) + .doOnComplete(() -> messenger.addConnection(connection)) + .subscribe( + () -> LOGGER.log(Level.INFO, "Successfully logged into account " + account.getAddress()), + error -> LOGGER.log(Level.SEVERE, "Error logging into account " + account.getAddress(), error))); + } + } + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java new file mode 100644 index 0000000..0c7072a --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java @@ -0,0 +1,69 @@ +package org.mercury_im.messenger.usecase; + +import org.jivesoftware.smack.AbstractXMPPConnection; +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.sasl.SASLErrorException; +import org.mercury_im.messenger.xmpp.MercuryConnection; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import io.reactivex.Completable; +import io.reactivex.Single; + +public class LogIntoAccount { + + public enum ConnectionResult { + success, + credential_error, + server_error, + other_error + } + + private static final Logger LOGGER = Logger.getLogger(LogIntoAccount.class.getName()); + + private final MercuryConnection connection; + + private LogIntoAccount(MercuryConnection connection) { + this.connection = connection; + } + + public static LogIntoAccount with(MercuryConnection connection) { + return new LogIntoAccount(connection); + } + + public Completable executeAndPossiblyThrow() { + return Completable.fromAction(this::doAuthenticateIfNecessary); + } + + public Single execute() { + return Single.fromCallable(this::authenticateIfNecessary); + } + + private ConnectionResult authenticateIfNecessary() { + try { + doAuthenticateIfNecessary(); + return ConnectionResult.success; + } catch (SASLErrorException e) { + LOGGER.log(Level.WARNING, "SASL Error while connecting to account " + connection.getAccount().getAddress(), e); + return ConnectionResult.credential_error; + } catch (SmackException.ConnectionException e) { + LOGGER.log(Level.WARNING, "Connectivity error while connecting to account " + connection.getAccount().getAddress(), e); + return ConnectionResult.server_error; + } + catch (IOException | XMPPException | SmackException | InterruptedException e) { + LOGGER.log(Level.WARNING, "Error connecting to account " + connection.getAccount().getAddress(), e); + return ConnectionResult.other_error; + } + } + + private void doAuthenticateIfNecessary() + throws InterruptedException, XMPPException, SmackException, IOException { + if (!connection.getConnection().isAuthenticated()) { + ((AbstractXMPPConnection) connection.getConnection()).connect().login(); + } + } + +} From 6cb9ce53628c861660329cfa824b694aae8a1b61 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 26 Dec 2019 08:46:55 +0100 Subject: [PATCH 73/83] Fix faulty use of .map(ResultDelegate::firstOrNull) --- .../data/mapping/AbstractMapping.java | 20 +++++++++++++++++++ .../messenger/data/mapping/Mapping.java | 6 ++++++ .../repository/XmppAccountRepository.java | 6 ++---- .../repository/XmppDirectChatRepository.java | 6 ++---- .../repository/XmppGroupChatRepository.java | 6 ++---- .../data/repository/XmppPeerRepository.java | 3 +-- .../mercury_im/messenger/util/Optional.java | 4 ++++ .../xmpp/MercuryConnectionManager.java | 4 ++++ 8 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/AbstractMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/AbstractMapping.java index c615d1f..b64142d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/AbstractMapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/AbstractMapping.java @@ -1,5 +1,7 @@ package org.mercury_im.messenger.data.mapping; +import org.mercury_im.messenger.util.Optional; + import lombok.NonNull; public abstract class AbstractMapping implements Mapping { @@ -12,6 +14,15 @@ public abstract class AbstractMapping implements Mapping { return toModel(entity, newModel(entity)); } + @Override + public Optional toModel(Optional entity) { + if (entity.isPresent()) { + return new Optional<>(toModel(entity.getItem())); + } else { + return new Optional<>(); + } + } + @Override public E toEntity(M model) { if (model == null) { @@ -20,6 +31,15 @@ public abstract class AbstractMapping implements Mapping { return toEntity(model, newEntity(model)); } + @Override + public Optional toEntity(Optional model) { + if (model.isPresent()) { + return new Optional<>(toEntity(model.getItem())); + } else { + return new Optional<>(); + } + } + @Override public M toModel(E entity, M model) { if (entity == null) { diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java index 8b7a10e..922facc 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/Mapping.java @@ -1,5 +1,7 @@ package org.mercury_im.messenger.data.mapping; +import org.mercury_im.messenger.util.Optional; + /** * Interface that defines a mapping between entities and database models. * @@ -16,6 +18,8 @@ public interface Mapping { */ M toModel(E entity); + Optional toModel(Optional entity); + /** * Copy data from the model to a new entity. * @param model database model @@ -23,6 +27,8 @@ public interface Mapping { */ E toEntity(M model); + Optional toEntity(Optional model); + /** * Map an entity to a model. * diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java index 8ef730c..f683023 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppAccountRepository.java @@ -55,9 +55,8 @@ public class XmppAccountRepository @Override public Observable> observeAccount(UUID accountId) { return dao.get(accountId).observableResult() - .map(ResultDelegate::firstOrNull) + .map(result -> new Optional<>(result.firstOrNull())) .map(accountMapping::toEntity) - .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -73,9 +72,8 @@ public class XmppAccountRepository @Override public Observable> observeAccountByAddress(String address) { return dao.get(address).observableResult() - .map(ResultDelegate::firstOrNull) + .map(result -> new Optional<>(result.firstOrNull())) .map(accountMapping::toEntity) - .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java index cfa197b..08462a4 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppDirectChatRepository.java @@ -60,9 +60,8 @@ public class XmppDirectChatRepository @Override public Observable> observeDirectChat(UUID chatId) { return dao.get(chatId).observableResult() - .map(ResultDelegate::firstOrNull) + .map(result -> new Optional<>(result.firstOrNull())) .map(directChatMapping::toEntity) - .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -92,9 +91,8 @@ public class XmppDirectChatRepository @Override public Observable> observeDirectChatByPeer(Peer peer) { return dao.getByPeer(peer.getId()).observableResult() - .map(ReactiveResult::firstOrNull) + .map(result -> new Optional<>(result.firstOrNull())) .map(directChatMapping::toEntity) - .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index b0d5cf3..d43c316 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -57,9 +57,8 @@ public class XmppGroupChatRepository @Override public Observable> observeGroupChat(UUID chatId) { return dao.get(chatId).observableResult() - .map(ResultDelegate::firstOrNull) + .map(result -> new Optional<>(result.firstOrNull())) .map(groupChatMapping::toEntity) - .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } @@ -89,9 +88,8 @@ public class XmppGroupChatRepository @Override public Observable> observeGroupChatByRoomAddress(UUID accountId, String roomAddress) { return dao.get(accountId, roomAddress).observableResult() - .map(ResultDelegate::firstOrNull) + .map(result -> new Optional<>(result.firstOrNull())) .map(groupChatMapping::toEntity) - .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java index 835a26a..b4194d4 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppPeerRepository.java @@ -80,9 +80,8 @@ public class XmppPeerRepository .where(PeerModel.ACCOUNT_ID.eq(accountId)) .and(PeerModel.ADDRESS.eq(address)) .get().observableResult() - .map(ResultDelegate::firstOrNull) + .map(result -> new Optional<>(result.firstOrNull())) .map(peerMapping::toEntity) - .map(Optional::new) .subscribeOn(subscriberScheduler()) .observeOn(observerScheduler()); } diff --git a/domain/src/main/java/org/mercury_im/messenger/util/Optional.java b/domain/src/main/java/org/mercury_im/messenger/util/Optional.java index ced8945..4fae342 100644 --- a/domain/src/main/java/org/mercury_im/messenger/util/Optional.java +++ b/domain/src/main/java/org/mercury_im/messenger/util/Optional.java @@ -9,6 +9,10 @@ public class Optional { private final T item; + public Optional() { + this(null); + } + public Optional(T item) { this.item = item; } diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java new file mode 100644 index 0000000..d32d006 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java @@ -0,0 +1,4 @@ +package org.mercury_im.messenger.xmpp; + +public class MercuryConnectionManager { +} From 86c16f32bfd8dcb89b2524cef8d2db8168ae2b52 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 26 Dec 2019 08:48:38 +0100 Subject: [PATCH 74/83] Test that uncovered the NPE fixed in last commit --- .../repository/AccountRepositoryTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index d3383ca..eb384d2 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -6,6 +6,10 @@ import org.mercury_im.messenger.data.di.InMemoryDatabaseComponent; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; +import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; + import javax.inject.Inject; import io.reactivex.disposables.CompositeDisposable; @@ -14,6 +18,8 @@ import io.requery.reactivex.ReactiveEntityStore; public class AccountRepositoryTest { + private static final Logger LOGGER = Logger.getLogger(AccountRepositoryTest.class.getName()); + @Inject ReactiveEntityStore dataStore; @@ -78,4 +84,37 @@ public class AccountRepositoryTest { Thread.sleep(100); } + + @Test + public void observeDeletionTest() throws InterruptedException { + CompositeDisposable d = new CompositeDisposable(); + + UUID uuid = UUID.randomUUID(); + d.add(accountRepository.observeAccount(uuid) + .subscribe(optAccount -> { + LOGGER.log(Level.INFO, "Changed"); + if (!optAccount.isPresent()) { + LOGGER.log(Level.INFO, "Changed: Account " + uuid.toString() + " is not present."); + } else { + LOGGER.log(Level.INFO, "Changed: Account " + uuid.toString() + ": " + optAccount.getItem().toString()); + } + })); + + Account account = new IAccount(uuid); + account.setEnabled(true); + account.setAddress("hello@world"); + account.setPassword("wooooooh"); + + d.add(accountRepository.insertAccount(account) + .subscribe(insert -> LOGGER.log(Level.INFO, "Inserted."), + error -> LOGGER.log(Level.SEVERE, "Inserted", error))); + + Thread.sleep(100); + + d.add(accountRepository.deleteAccount(uuid) + .subscribe(() -> LOGGER.log(Level.INFO, "Deleted"))); + + Thread.sleep(1000); + d.dispose(); + } } From dc50bf9468c501272b0661b67f4d823362eef626 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 26 Dec 2019 12:14:52 +0100 Subject: [PATCH 75/83] Initial design of MercuryConnectionRegistry --- .../xmpp/MercuryConnectionManager.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java index d32d006..5fc997d 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java @@ -1,4 +1,100 @@ package org.mercury_im.messenger.xmpp; +import org.jivesoftware.smack.AbstractXMPPConnection; +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.usecase.LogIntoAccount; +import org.mercury_im.messenger.util.Optional; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.inject.Inject; + +import io.reactivex.Observable; +import io.reactivex.disposables.CompositeDisposable; + public class MercuryConnectionManager { + + private static final Logger LOGGER = Logger.getLogger(MercuryConnectionManager.class.getName()); + + private Map connections = new ConcurrentHashMap<>(); + private final AccountRepository accountRepository; + + private final CompositeDisposable disposable = new CompositeDisposable(); + + @Inject + public MercuryConnectionManager(AccountRepository accountRepository) { + this.accountRepository = accountRepository; + } + + public void registerConnection(MercuryConnection connection) { + if (connection.getConnection().isAuthenticated()) { + registerLiveConnection(connection); + } else { + registerDeadConnection(connection); + } + } + + private void registerLiveConnection(MercuryConnection connection) { + Observable> observableAccount = accountRepository + .observeAccount(connection.getAccount().getId()); + disposable.add(observableAccount.subscribe(event -> + handleAccountChangedEvent(connection, event))); + + } + + private void handleAccountChangedEvent(MercuryConnection connection, Optional event) { + if (event.isPresent()) { + handleAccountChangedEvent(connection, event.getItem()); + } else { + handleAccountRemoved(connection); + } + } + + private void handleAccountChangedEvent(MercuryConnection connection, Account account) { + if (account.isEnabled()) { + handleAccountEnabled(connection); + } else { + handleAccountDisabled(connection); + } + } + + private void handleAccountDisabled(MercuryConnection connection) { + if (connection.getConnection().isAuthenticated()) { + shutdownConnection(connection); + } + removeConnection(connection); + } + + private void handleAccountEnabled(MercuryConnection connection) { + disposable.add(LogIntoAccount.with(connection).executeAndPossiblyThrow() + .subscribe(() -> LOGGER.log(Level.INFO, "Logged in."), + error -> LOGGER.log(Level.SEVERE, "Connection error!", error))); + } + + private void handleAccountRemoved(MercuryConnection connection) { + shutdownConnection(connection); + removeConnection(connection); + } + + private void shutdownConnection(MercuryConnection connection) { + if (connection.getConnection().isAuthenticated()) { + ((AbstractXMPPConnection) connection.getConnection()).instantShutdown(); + } + } + + private void registerDeadConnection(MercuryConnection connection) { + if (connection.getAccount().isEnabled()) { + + } + } + + private void removeConnection(MercuryConnection connection) { + connections.remove(connection.getAccount().getId()); + } + } From 84b5461c113f657e166bc192b5294579cbb554da Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 4 Jan 2020 22:56:34 +0100 Subject: [PATCH 76/83] Temp --- .../messenger/ui/account/LoginViewModel.java | 9 ++- .../repository/AccountRepositoryTest.java | 11 +++ .../messenger/ConnectionRegistry.java | 17 +++++ .../org/mercury_im/messenger/Messenger.java | 28 ++++---- .../messenger/store/MercuryRosterStore.java | 2 +- .../messenger/usecase/AddAccount.java | 69 +++++++++---------- .../messenger/usecase/AddAccountUseCase.java | 17 +++++ .../messenger/usecase/LogIntoAccount.java | 5 ++ .../messenger/usecase/RosterStoreBinder.java | 30 ++++++++ .../messenger/usecase/SendDirectMessage.java | 23 ------- .../smack/AddAccountUseCaseTest.java | 17 +++++ .../smack/ConnectionRegistrationTest.java | 27 ++++++++ .../mercury_im/messenger/entity/Account.java | 2 + .../mercury_im/messenger/entity/IAccount.java | 4 ++ 14 files changed, 182 insertions(+), 79 deletions(-) create mode 100644 domain/src/main/java/org/mercury_im/messenger/ConnectionRegistry.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/usecase/AddAccountUseCase.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/usecase/RosterStoreBinder.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/usecase/SendDirectMessage.java create mode 100644 domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/AddAccountUseCaseTest.java create mode 100644 domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/ConnectionRegistrationTest.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java index 4e5e8ea..eef223c 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java @@ -15,6 +15,8 @@ import org.jxmpp.stringprep.XmppStringprepException; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.IAccount; import javax.inject.Inject; @@ -77,10 +79,11 @@ public class LoginViewModel extends AndroidViewModel { return; } loginButtonEnabled.setValue(false); + Account account = new IAccount(); + account.setAddress(username.asUnescapedString()); + account.setPassword(password); disposable.add(messenger.addAccount() - .setAddress(username.asEntityBareJidString()) - .setPassword(password) - .execute() + .execute(account) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnComplete(this::signalLoginSuccessful) diff --git a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java index eb384d2..0aba3d7 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java +++ b/data/src/test/java/org/mercury_im/messenger/data/repository/AccountRepositoryTest.java @@ -6,6 +6,7 @@ import org.mercury_im.messenger.data.di.InMemoryDatabaseComponent; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; +import java.util.NoSuchElementException; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; @@ -117,4 +118,14 @@ public class AccountRepositoryTest { Thread.sleep(1000); d.dispose(); } + + @Test(expected = NoSuchElementException.class) + public void updateMissingEntityFails() { + Account missingAccount = new IAccount(); + missingAccount.setAddress("this@account.is.missing"); + missingAccount.setPassword("inTheDatabase"); + + accountRepository.updateAccount(missingAccount) + .blockingGet(); + } } diff --git a/domain/src/main/java/org/mercury_im/messenger/ConnectionRegistry.java b/domain/src/main/java/org/mercury_im/messenger/ConnectionRegistry.java new file mode 100644 index 0000000..9676f4b --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/ConnectionRegistry.java @@ -0,0 +1,17 @@ +package org.mercury_im.messenger; + +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.xmpp.MercuryConnection; + +import java.util.UUID; + +interface ConnectionRegistry { + + default MercuryConnection getConnection(Account account) { + return getConnection(account.getId()); + } + + MercuryConnection getConnection(UUID accountId); + + void addConnection(MercuryConnection connection); +} diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index 43ad318..2099b9a 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -1,14 +1,11 @@ package org.mercury_im.messenger; import org.jivesoftware.smack.SmackException; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.roster.Roster; import org.jivesoftware.smackx.csi.ClientStateIndicationManager; import org.mercury_im.messenger.data.repository.Repositories; -import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.store.MercuryRosterStore; import org.mercury_im.messenger.usecase.AddAccount; import org.mercury_im.messenger.usecase.ConnectAccountsOnStartup; +import org.mercury_im.messenger.usecase.RosterStoreBinder; import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.HashMap; @@ -19,11 +16,10 @@ import java.util.logging.Logger; import javax.inject.Inject; -import io.reactivex.Scheduler; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; -public class Messenger implements ClientStateListener { +public class Messenger implements ConnectionRegistry, ClientStateListener { public static final String TAG = "MercuryIM"; private static final Logger LOGGER = Logger.getLogger(Messenger.class.getName()); @@ -31,15 +27,18 @@ public class Messenger implements ClientStateListener { private final Map connections = new HashMap<>(); private Repositories repositories; + private final RosterStoreBinder rosterStoreBinder; + private CompositeDisposable disposable = new CompositeDisposable(); @Inject public Messenger(Repositories repositories) { this.repositories = repositories; - initialLogin(); + this.rosterStoreBinder = new RosterStoreBinder(repositories.getAccountRepository(), repositories.getPeerRepository()); + performInitialLogin(); } - public void initialLogin() { + public void performInitialLogin() { disposable.add(repositories.getAccountRepository().observeAllAccounts().firstOrError() .subscribeOn(Schedulers.newThread()) .subscribe(initialAccounts -> ConnectAccountsOnStartup @@ -47,19 +46,18 @@ public class Messenger implements ClientStateListener { .execute())); } + @Override public void addConnection(MercuryConnection connection) { connections.put(connection.getAccount().getId(), connection); - initRosterStore(connection); } - private void initRosterStore(MercuryConnection connection) { - Roster.getInstanceFor(connection.getConnection()) - .setRosterStore(new MercuryRosterStore(connection.getAccount(), - repositories.getPeerRepository(), repositories.getAccountRepository())); + @Override + public MercuryConnection getConnection(UUID accountId) { + return connections.get(accountId); } - public MercuryConnection getConnection(Account account) { - return connections.get(account.getId()); + public void bindConnection(MercuryConnection connection) { + rosterStoreBinder.setRosterStoreOn(connection); } public AddAccount addAccount() { diff --git a/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java b/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java index c5b8ad5..63e9450 100644 --- a/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java +++ b/domain/src/main/java/org/mercury_im/messenger/store/MercuryRosterStore.java @@ -98,7 +98,7 @@ public class MercuryRosterStore implements RosterStore { private void writeEntryToDatabase(RosterPacket.Item item) { disposable.add(peerRepository.getOrCreatePeer(account, item.getJid().asUnescapedString()) .map(peer -> toEntity(item, peer)) - .flatMap(peerRepository::updatePeer) + .flatMap(peerRepository::upsertPeer) .subscribe( success -> LOGGER.log(Level.FINE, "Upserted contact model " + success + " successfully"), error -> LOGGER.log(Level.WARNING, "An error occurred upserting contact " + item.getJid().asUnescapedString(), error) diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java index 3b0db1a..cdae34f 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java @@ -3,7 +3,6 @@ package org.mercury_im.messenger.usecase; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.entity.IAccount; import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.logging.Logger; @@ -17,9 +16,6 @@ public class AddAccount { private static final Logger LOGGER = Logger.getLogger(AddAccount.class.getName()); - private Account account; - private MercuryConnection connection; - private final AccountRepository accountRepository; private final Messenger messenger; @@ -28,63 +24,62 @@ public class AddAccount { public AddAccount(AccountRepository accountRepository, Messenger messenger) { this.accountRepository = accountRepository; this.messenger = messenger; - this.account = new IAccount(); } - public AddAccount setAddress(String address) { - this.account.setAddress(address); - return this; + public Completable execute(Account account) { + return loginAndStoreAccountIfSuccessful(account); } - public AddAccount setPassword(String password) { - this.account.setPassword(password); - return this; + private Completable loginAndStoreAccountIfSuccessful(Account account) { + + return logIntoAccount(account).flatMap(connection -> + insertEnabledAccountIntoDatabase(account).flatMap(insertedAccount -> + updateAccountIdInConnectionSingle(insertedAccount, connection))) + .map(this::addConnectionToMessenger) + .ignoreElement(); } - public Completable execute() { - return loginAndStoreAccountIfSuccessful(); + private Single logIntoAccount(Account account) { + return getOrCreateConnectionSingle(account) + .doAfterSuccess(con -> LogIntoAccount.with(con).executeAndPossiblyThrow()) + .subscribeOn(Schedulers.io()); } - public Completable loginAndStoreAccountIfSuccessful() { - return logIntoAccount() - .andThen(insertEnabledAccountIntoDatabase()).ignoreElement() - .andThen(addConnectionToMessenger()); + private Single getOrCreateConnectionSingle(Account account) { + return Single.fromCallable(() -> getOrCreateConnection(account)); } - private Single insertEnabledAccountIntoDatabase() { + private MercuryConnection getOrCreateConnection(Account account) { + MercuryConnection connection = messenger.getConnection(account); + if (connection == null) { + connection = new MercuryConnection(account); + } + return connection; + } + + private Single insertEnabledAccountIntoDatabase(Account account) { account.setEnabled(true); - return accountRepository.upsertAccount(account) - .map(this::updateAccount); + return accountRepository.upsertAccount(account); } - private Completable addConnectionToMessenger() { + private Completable addConnectionToMessenger(MercuryConnection connection) { return Completable.fromAction(() -> messenger.addConnection(connection)); } - private Account updateAccount(Account account) { - this.account = account; - updateAccountIdInConnection(account); - return account; + private Single updateAccountIdInConnectionSingle(Account account, MercuryConnection connection) { + return Single.fromCallable(() -> { + updateAccountIdInConnection(account, connection); + return connection; + }); } - private void updateAccountIdInConnection(Account account) { + private void updateAccountIdInConnection(Account account, MercuryConnection connection) { if (connection != null) { connection.getAccount().setId(account.getId()); } } - private Completable logIntoAccount() { - return Completable.fromAction(this::getOrCreateConnection) - .andThen(LogIntoAccount.with(connection).executeAndPossiblyThrow()) - .subscribeOn(Schedulers.io()); - } - private void getOrCreateConnection() { - connection = messenger.getConnection(account); - if (connection == null) { - connection = new MercuryConnection(account); - } - } } diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccountUseCase.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccountUseCase.java new file mode 100644 index 0000000..6316d3d --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccountUseCase.java @@ -0,0 +1,17 @@ +package org.mercury_im.messenger.usecase; + +import io.reactivex.Completable; + +public interface AddAccountUseCase { + + AddAccountTask create(); + + Completable execute(AddAccountTask task); + + interface AddAccountTask { + + void setAddress(String address); + + void setPassword(String password); + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java index 0c7072a..a3b74da 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/LogIntoAccount.java @@ -31,6 +31,9 @@ public class LogIntoAccount { } public static LogIntoAccount with(MercuryConnection connection) { + if (connection == null) { + throw new NullPointerException("MercuryConnection cannot be null."); + } return new LogIntoAccount(connection); } @@ -62,7 +65,9 @@ public class LogIntoAccount { private void doAuthenticateIfNecessary() throws InterruptedException, XMPPException, SmackException, IOException { if (!connection.getConnection().isAuthenticated()) { + LOGGER.log(Level.INFO, "Logging in"); ((AbstractXMPPConnection) connection.getConnection()).connect().login(); + LOGGER.log(Level.INFO, "Login complete"); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/RosterStoreBinder.java b/domain/src/main/java/org/mercury_im/messenger/usecase/RosterStoreBinder.java new file mode 100644 index 0000000..2d0fa87 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/RosterStoreBinder.java @@ -0,0 +1,30 @@ +package org.mercury_im.messenger.usecase; + +import org.jivesoftware.smack.roster.Roster; +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.store.MercuryRosterStore; +import org.mercury_im.messenger.xmpp.MercuryConnection; + +public class RosterStoreBinder { + + private final AccountRepository accountRepository; + private final PeerRepository peerRepository; + + public RosterStoreBinder(AccountRepository accountRepository, PeerRepository peerRepository) { + this.accountRepository = accountRepository; + this.peerRepository = peerRepository; + } + + public void setRosterStoreOn(MercuryConnection connection) { + MercuryRosterStore store = + createRosterStore(connection.getAccount(), accountRepository, peerRepository); + Roster roster = Roster.getInstanceFor(connection.getConnection()); + roster.setRosterStore(store); + } + + private MercuryRosterStore createRosterStore(Account account, AccountRepository accountRepository, PeerRepository peerRepository) { + return new MercuryRosterStore(account, peerRepository, accountRepository); + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/SendDirectMessage.java b/domain/src/main/java/org/mercury_im/messenger/usecase/SendDirectMessage.java deleted file mode 100644 index 9fd0c42..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/SendDirectMessage.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.mercury_im.messenger.usecase; - -import org.mercury_im.messenger.entity.chat.DirectChat; -import org.mercury_im.messenger.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/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/AddAccountUseCaseTest.java b/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/AddAccountUseCaseTest.java new file mode 100644 index 0000000..cf41f75 --- /dev/null +++ b/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/AddAccountUseCaseTest.java @@ -0,0 +1,17 @@ +package org.mercury_im.messenger.learning_tests.smack; + +import org.junit.Test; +import org.mercury_im.messenger.usecase.AddAccountUseCase; + +import java.util.UUID; + +public class AddAccountUseCaseTest { + + @Test + public void test() { + AddAccountUseCase useCase; + AddAccountUseCase.AddAccountTask task; + + System.out.println(UUID.randomUUID()); + } +} diff --git a/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/ConnectionRegistrationTest.java b/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/ConnectionRegistrationTest.java new file mode 100644 index 0000000..6009748 --- /dev/null +++ b/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/ConnectionRegistrationTest.java @@ -0,0 +1,27 @@ +package org.mercury_im.messenger.learning_tests.smack; + +import org.junit.Test; +import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.IAccount; +import org.mercury_im.messenger.xmpp.MercuryConnection; +import org.mercury_im.messenger.xmpp.MercuryConnectionManager; + +import java.util.UUID; + +public class ConnectionRegistrationTest { + + AccountRepository accountRepository; + + @Test + public void test() { + MercuryConnectionManager manager = new MercuryConnectionManager(accountRepository); + UUID accountId = UUID.randomUUID(); + Account account = new IAccount(accountId); + account.setAddress("test@add.res"); + account.setPassword("monomono"); + MercuryConnection connection = new MercuryConnection(account); + + manager.registerConnection(connection); + } +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java index 814f813..e1e52c2 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -9,6 +9,8 @@ import java.util.UUID; */ public interface Account { + UUID UNASSIGNED = UUID.fromString("00000000-0000-0000-0000-000000000000"); + void setId(UUID id); UUID getId(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java index aed9b81..7c22ac8 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/IAccount.java @@ -19,6 +19,10 @@ public class IAccount implements Account { this.id = id; } + public static Account createUnassignedAccount() { + return new IAccount(Account.UNASSIGNED); + } + @Override public void setId(UUID id) { this.id = id; From ed31f5c8c8686bacb4139b49209a46e1bfafe274 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 5 Jan 2020 15:50:11 +0100 Subject: [PATCH 77/83] Remove unused ConnectionRegistry --- .../messenger/ConnectionRegistry.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 domain/src/main/java/org/mercury_im/messenger/ConnectionRegistry.java diff --git a/domain/src/main/java/org/mercury_im/messenger/ConnectionRegistry.java b/domain/src/main/java/org/mercury_im/messenger/ConnectionRegistry.java deleted file mode 100644 index 9676f4b..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/ConnectionRegistry.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.mercury_im.messenger; - -import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.xmpp.MercuryConnection; - -import java.util.UUID; - -interface ConnectionRegistry { - - default MercuryConnection getConnection(Account account) { - return getConnection(account.getId()); - } - - MercuryConnection getConnection(UUID accountId); - - void addConnection(MercuryConnection connection); -} From fc48b35f05ce6021133b5e236954d529ce153f6e Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 5 Jan 2020 15:50:35 +0100 Subject: [PATCH 78/83] Add handy methods to AccountRepository --- .../messenger/data/repository/AccountRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java index c8c87b0..18eae4a 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/AccountRepository.java @@ -15,8 +15,16 @@ public interface AccountRepository { Single insertAccount(Account account); + default Observable> observeAccount(Account account) { + return observeAccount(account.getId()); + } + Observable> observeAccount(UUID accountId); + default Maybe getAccount(Account account) { + return getAccount(account.getId()); + } + Maybe getAccount(UUID accountId); Observable> observeAccountByAddress(String address); From bc85fe432d46da153e4c15479e5c284fed95aab5 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 5 Jan 2020 15:54:44 +0100 Subject: [PATCH 79/83] Move connection handling to MercuryConnectionManager --- .../org/mercury_im/messenger/Messenger.java | 34 ++++----- .../messenger/usecase/AddAccount.java | 15 ++-- .../usecase/ConnectAccountsOnStartup.java | 19 ++--- .../messenger/xmpp/MercuryConnection.java | 70 ++++++++++++++++++- .../xmpp/MercuryConnectionManager.java | 54 ++++++++++---- .../xmpp/XmppDirectMessageCenter.java | 4 +- 6 files changed, 140 insertions(+), 56 deletions(-) diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index 2099b9a..f2d4340 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -7,10 +7,8 @@ import org.mercury_im.messenger.usecase.AddAccount; import org.mercury_im.messenger.usecase.ConnectAccountsOnStartup; import org.mercury_im.messenger.usecase.RosterStoreBinder; import org.mercury_im.messenger.xmpp.MercuryConnection; +import org.mercury_im.messenger.xmpp.MercuryConnectionManager; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; @@ -19,49 +17,43 @@ import javax.inject.Inject; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; -public class Messenger implements ConnectionRegistry, ClientStateListener { +public class Messenger implements ClientStateListener { public static final String TAG = "MercuryIM"; private static final Logger LOGGER = Logger.getLogger(Messenger.class.getName()); - private final Map connections = new HashMap<>(); - private Repositories repositories; - + private final MercuryConnectionManager connectionManager; + private final Repositories repositories; private final RosterStoreBinder rosterStoreBinder; private CompositeDisposable disposable = new CompositeDisposable(); @Inject public Messenger(Repositories repositories) { + this.connectionManager = new MercuryConnectionManager(this, repositories.getAccountRepository()); this.repositories = repositories; this.rosterStoreBinder = new RosterStoreBinder(repositories.getAccountRepository(), repositories.getPeerRepository()); performInitialLogin(); } + public MercuryConnectionManager getConnectionManager() { + return connectionManager; + } + public void performInitialLogin() { disposable.add(repositories.getAccountRepository().observeAllAccounts().firstOrError() .subscribeOn(Schedulers.newThread()) .subscribe(initialAccounts -> ConnectAccountsOnStartup - .with(this, initialAccounts) + .with(this.connectionManager, repositories.getAccountRepository(), initialAccounts) .execute())); } - @Override - public void addConnection(MercuryConnection connection) { - connections.put(connection.getAccount().getId(), connection); - } - - @Override - public MercuryConnection getConnection(UUID accountId) { - return connections.get(accountId); - } - public void bindConnection(MercuryConnection connection) { rosterStoreBinder.setRosterStoreOn(connection); } public AddAccount addAccount() { - return new AddAccount(repositories.getAccountRepository(), this); + return new AddAccount(repositories.getAccountRepository(), this.connectionManager); } // CSI @@ -69,7 +61,7 @@ public class Messenger implements ConnectionRegistry, ClientStateListener { @Override public void onClientInForeground() { LOGGER.log(Level.INFO, "CSI: active"); - for (MercuryConnection connection : connections.values()) { + for (MercuryConnection connection : connectionManager.getConnections()) { tryCsiActive(connection); } } @@ -77,7 +69,7 @@ public class Messenger implements ConnectionRegistry, ClientStateListener { @Override public void onClientInBackground() { LOGGER.log(Level.INFO, "CSI: inactive"); - for (MercuryConnection connection : connections.values()) { + for (MercuryConnection connection : connectionManager.getConnections()) { tryCsiInactive(connection); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java index cdae34f..a28bcb6 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java @@ -1,9 +1,9 @@ package org.mercury_im.messenger.usecase; -import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.xmpp.MercuryConnection; +import org.mercury_im.messenger.xmpp.MercuryConnectionManager; import java.util.logging.Logger; @@ -17,13 +17,13 @@ public class AddAccount { private static final Logger LOGGER = Logger.getLogger(AddAccount.class.getName()); private final AccountRepository accountRepository; - private final Messenger messenger; + private final MercuryConnectionManager connectionManager; private final CompositeDisposable disposable = new CompositeDisposable(); - public AddAccount(AccountRepository accountRepository, Messenger messenger) { + public AddAccount(AccountRepository accountRepository, MercuryConnectionManager connectionManager) { this.accountRepository = accountRepository; - this.messenger = messenger; + this.connectionManager = connectionManager; } public Completable execute(Account account) { @@ -31,7 +31,6 @@ public class AddAccount { } private Completable loginAndStoreAccountIfSuccessful(Account account) { - return logIntoAccount(account).flatMap(connection -> insertEnabledAccountIntoDatabase(account).flatMap(insertedAccount -> updateAccountIdInConnectionSingle(insertedAccount, connection))) @@ -50,9 +49,9 @@ public class AddAccount { } private MercuryConnection getOrCreateConnection(Account account) { - MercuryConnection connection = messenger.getConnection(account); + MercuryConnection connection = connectionManager.getConnection(account); if (connection == null) { - connection = new MercuryConnection(account); + connection = new MercuryConnection(accountRepository, account); } return connection; } @@ -63,7 +62,7 @@ public class AddAccount { } private Completable addConnectionToMessenger(MercuryConnection connection) { - return Completable.fromAction(() -> messenger.addConnection(connection)); + return Completable.fromAction(() -> connectionManager.registerConnection(connection)); } private Single updateAccountIdInConnectionSingle(Account account, MercuryConnection connection) { diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java b/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java index e7c7c3e..b78c74e 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java @@ -1,8 +1,9 @@ package org.mercury_im.messenger.usecase; -import org.mercury_im.messenger.Messenger; +import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.xmpp.MercuryConnection; +import org.mercury_im.messenger.xmpp.MercuryConnectionManager; import java.util.ArrayList; import java.util.List; @@ -16,28 +17,30 @@ public class ConnectAccountsOnStartup { private static final Logger LOGGER = Logger.getLogger(ConnectAccountsOnStartup.class.getName()); - private final Messenger messenger; + private final MercuryConnectionManager connectionManager; + private final AccountRepository accountRepository; private final List accounts = new ArrayList<>(); private CompositeDisposable disposable = new CompositeDisposable(); - private ConnectAccountsOnStartup(Messenger messenger, List initialAccounts) { - this.messenger = messenger; + private ConnectAccountsOnStartup(MercuryConnectionManager connectionManager, AccountRepository accountRepository, List initialAccounts) { + this.connectionManager = connectionManager; + this.accountRepository = accountRepository; this.accounts.addAll(initialAccounts); } - public static ConnectAccountsOnStartup with(Messenger messenger, List initialAccounts) { - return new ConnectAccountsOnStartup(messenger, initialAccounts); + public static ConnectAccountsOnStartup with(MercuryConnectionManager connectionManager, AccountRepository accountRepository, List initialAccounts) { + return new ConnectAccountsOnStartup(connectionManager, accountRepository, initialAccounts); } public void execute() { for (Account account : accounts) { if (account.isEnabled()) { - MercuryConnection connection = new MercuryConnection(account); + MercuryConnection connection = new MercuryConnection(accountRepository, account); disposable.add(LogIntoAccount.with(connection) .executeAndPossiblyThrow() .subscribeOn(Schedulers.newThread()) - .doOnComplete(() -> messenger.addConnection(connection)) + .doOnComplete(() -> connectionManager.registerConnection(connection)) .subscribe( () -> LOGGER.log(Level.INFO, "Successfully logged into account " + account.getAddress()), error -> LOGGER.log(Level.SEVERE, "Error logging into account " + account.getAddress(), error))); diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java index 31e25f8..3401845 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -1,18 +1,73 @@ package org.mercury_im.messenger.xmpp; +import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.XMPPConnection; +import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.util.Optional; + +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.subjects.BehaviorSubject; public class MercuryConnection { private static final XmppConnectionFactory connectionFactory = new XmppConnectionFactory(); - private final Account account; + private final CompositeDisposable disposable = new CompositeDisposable(); + private final AccountRepository accountRepository; + + private Account account; private XMPPConnection connection; - public MercuryConnection(Account account) { + private BehaviorSubject enabled = BehaviorSubject.create(); + private BehaviorSubject state = BehaviorSubject.createDefault(ConnectionState.closed); + + public MercuryConnection(AccountRepository accountRepository, Account account) { + this.accountRepository = accountRepository; this.account = account; this.connection = connectionFactory.createConnection(account); + observeAccountAndConnection(); + } + + private void observeAccountAndConnection() { + observeAccount(); + observeConnection(); + } + + private void observeAccount() { + disposable.add(accountRepository.observeAccount(account.getId()) + .filter(Optional::isPresent) + .map(Optional::getItem) + .subscribe(this::setAccount)); + } + + private void observeConnection() { + connection.addConnectionListener(new ConnectionListener() { + @Override + public void connected(XMPPConnection connection) { + state.onNext(ConnectionState.connected); + } + + @Override + public void authenticated(XMPPConnection connection, boolean resumed) { + state.onNext(ConnectionState.authenticated); + } + + @Override + public void connectionClosed() { + state.onNext(ConnectionState.closed); + } + + @Override + public void connectionClosedOnError(Exception e) { + state.onNext(ConnectionState.closedOnError); + } + }); + } + + private void setAccount(Account account) { + this.account = account; + enabled.onNext(account.isEnabled()); } public Account getAccount() { @@ -22,4 +77,15 @@ public class MercuryConnection { public XMPPConnection getConnection() { return connection; } + + public void dispose() { + disposable.dispose(); + } + + public enum ConnectionState { + connected, + authenticated, + closedOnError, + closed + } } diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java index 5fc997d..5f59226 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java @@ -1,11 +1,14 @@ package org.mercury_im.messenger.xmpp; import org.jivesoftware.smack.AbstractXMPPConnection; +import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.usecase.LogIntoAccount; import org.mercury_im.messenger.util.Optional; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -21,17 +24,32 @@ public class MercuryConnectionManager { private static final Logger LOGGER = Logger.getLogger(MercuryConnectionManager.class.getName()); - private Map connections = new ConcurrentHashMap<>(); + private final Map connections = new ConcurrentHashMap<>(); private final AccountRepository accountRepository; + private final Messenger messenger; private final CompositeDisposable disposable = new CompositeDisposable(); @Inject - public MercuryConnectionManager(AccountRepository accountRepository) { + public MercuryConnectionManager(Messenger messenger, AccountRepository accountRepository) { + this.messenger = messenger; this.accountRepository = accountRepository; } + public List getConnections() { + return new ArrayList<>(connections.values()); + } + + public MercuryConnection getConnection(Account account) { + return getConnection(account.getId()); + } + + public MercuryConnection getConnection(UUID id) { + return connections.get(id); + } + public void registerConnection(MercuryConnection connection) { + messenger.bindConnection(connection); if (connection.getConnection().isAuthenticated()) { registerLiveConnection(connection); } else { @@ -43,11 +61,17 @@ public class MercuryConnectionManager { Observable> observableAccount = accountRepository .observeAccount(connection.getAccount().getId()); disposable.add(observableAccount.subscribe(event -> - handleAccountChangedEvent(connection, event))); + handleOptionalAccountChangedEvent(connection, event))); } - private void handleAccountChangedEvent(MercuryConnection connection, Optional event) { + private void registerDeadConnection(MercuryConnection connection) { + if (connection.getAccount().isEnabled()) { + connectionLogin(connection); + } + } + + private void handleOptionalAccountChangedEvent(MercuryConnection connection, Optional event) { if (event.isPresent()) { handleAccountChangedEvent(connection, event.getItem()); } else { @@ -64,21 +88,26 @@ public class MercuryConnectionManager { } private void handleAccountDisabled(MercuryConnection connection) { - if (connection.getConnection().isAuthenticated()) { - shutdownConnection(connection); - } + disconnectAndRemoveConnection(connection); + } + + private void disconnectAndRemoveConnection(MercuryConnection connection) { + shutdownConnection(connection); removeConnection(connection); } private void handleAccountEnabled(MercuryConnection connection) { + connectionLogin(connection); + } + + private void connectionLogin(MercuryConnection connection) { disposable.add(LogIntoAccount.with(connection).executeAndPossiblyThrow() .subscribe(() -> LOGGER.log(Level.INFO, "Logged in."), error -> LOGGER.log(Level.SEVERE, "Connection error!", error))); } private void handleAccountRemoved(MercuryConnection connection) { - shutdownConnection(connection); - removeConnection(connection); + disconnectAndRemoveConnection(connection); } private void shutdownConnection(MercuryConnection connection) { @@ -87,14 +116,9 @@ public class MercuryConnectionManager { } } - private void registerDeadConnection(MercuryConnection connection) { - if (connection.getAccount().isEnabled()) { - - } - } - private void removeConnection(MercuryConnection connection) { connections.remove(connection.getAccount().getId()); + connection.dispose(); } } diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppDirectMessageCenter.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppDirectMessageCenter.java index ba8f8f4..35b8f30 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppDirectMessageCenter.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/XmppDirectMessageCenter.java @@ -53,7 +53,7 @@ public class XmppDirectMessageCenter this.directChatRepository = repositories.getDirectChatRepository(); this.messageRepository = repositories.getMessageRepository(); - XMPPConnection connection = getMessenger().getConnection(account).getConnection(); + XMPPConnection connection = getMessenger().getConnectionManager().getConnection(account).getConnection(); ChatManager.getInstanceFor(connection).addIncomingListener(this); } @@ -98,7 +98,7 @@ public class XmppDirectMessageCenter } protected ChatManager getChatManager(DirectChat chat) { - MercuryConnection mercuryConnection = getMessenger().getConnection(chat.getAccount()); + MercuryConnection mercuryConnection = getMessenger().getConnectionManager().getConnection(chat.getAccount()); return ChatManager.getInstanceFor(mercuryConnection.getConnection()); } From ae6d3ef9d4ae33c697e0e177ccbe5347be1c1f14 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 5 Jan 2020 23:13:58 +0100 Subject: [PATCH 80/83] Use connection instead of account in account fragment --- .../ui/account/AccountsFragment.java | 2 +- .../account/AccountsRecyclerViewAdapter.java | 28 +++++++++++-------- .../ui/account/AccountsViewModel.java | 19 +++++++++---- .../messenger/xmpp/MercuryConnection.java | 5 ++++ .../xmpp/MercuryConnectionManager.java | 25 +++++++++++++---- 5 files changed, 55 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java index 59a4208..84da9b0 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java @@ -58,7 +58,7 @@ public class AccountsFragment extends Fragment { } private void observeViewModel() { - viewModel.getAccounts().observe(this, adapter::setValues); + viewModel.getConnections().observe(this, adapter::setValues); } @Override diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java index f022fac..716a169 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java @@ -17,13 +17,14 @@ import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.avatar.AvatarDrawable; import org.mercury_im.messenger.ui.account.AccountsFragment.OnAccountListItemClickListener; import org.mercury_im.messenger.util.AbstractDiffCallback; +import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.ArrayList; import java.util.List; public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - private final List accounts = new ArrayList<>(); + private final List connections = new ArrayList<>(); private final OnAccountListItemClickListener onAccountClickListener; private final AccountsViewModel viewModel; @@ -40,22 +41,23 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter values) { + public void setValues(List values) { DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff( - new AccountsDiffCallback(values, accounts), true); - accounts.clear(); - accounts.addAll(values); + new AccountsDiffCallback(values, connections), true); + connections.clear(); + connections.addAll(values); diffResult.dispatchUpdatesTo(this); } @Override public int getItemCount() { - return accounts.size(); + return connections.size(); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { - Account account = accounts.get(position); + MercuryConnection connection = connections.get(position); + Account account = connection.getAccount(); holder.account = account; holder.jid.setText(account.getAddress()); @@ -64,6 +66,8 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter viewModel.setAccountEnabled(account, checked)); + connection.getState().subscribe(state -> holder.status.setText(state.toString())); + setClickListenersOnViewHolder(holder); } @@ -100,21 +104,21 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { + public class AccountsDiffCallback extends AbstractDiffCallback { - public AccountsDiffCallback(List newItems, List oldItems) { + public AccountsDiffCallback(List newItems, List oldItems) { super(newItems, oldItems); } @Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { - return oldItems.get(oldItemPosition).getId() == newItems.get(newItemPosition).getId(); + return oldItems.get(oldItemPosition).getAccount().getId() == newItems.get(newItemPosition).getAccount().getId(); } @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { - Account oldM = oldItems.get(oldItemPosition); - Account newM = newItems.get(newItemPosition); + Account oldM = oldItems.get(oldItemPosition).getAccount(); + Account newM = newItems.get(newItemPosition).getAccount(); return oldM.equals(newM); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java index 090de68..6db3209 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java @@ -7,10 +7,14 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.xmpp.MercuryConnection; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import javax.inject.Inject; @@ -21,15 +25,20 @@ public class AccountsViewModel extends AndroidViewModel { @Inject AccountRepository repository; - private final MutableLiveData> accounts = new MutableLiveData<>(); + @Inject + Messenger messenger; + + private final MutableLiveData> connections = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); @Inject public AccountsViewModel(Application application) { super(application); MercuryImApplication.getApplication().getAppComponent().inject(this); - compositeDisposable.add(repository.observeAllAccounts() - .subscribe(accounts::setValue)); + compositeDisposable.add(messenger.getConnectionManager() + .observeConnections() + .map(Map::values) + .subscribe(conns -> connections.postValue(new ArrayList<>(conns)))); } @Override @@ -38,8 +47,8 @@ public class AccountsViewModel extends AndroidViewModel { compositeDisposable.clear(); } - public LiveData> getAccounts() { - return accounts; + public LiveData> getConnections() { + return connections; } public void setAccountEnabled(Account accountModel, boolean enabled) { diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java index 3401845..7b47e6c 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -6,6 +6,7 @@ import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.util.Optional; +import io.reactivex.Observable; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.subjects.BehaviorSubject; @@ -29,6 +30,10 @@ public class MercuryConnection { observeAccountAndConnection(); } + public Observable getState() { + return state; + } + private void observeAccountAndConnection() { observeAccount(); observeConnection(); diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java index 5f59226..0336b00 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java @@ -19,12 +19,14 @@ import javax.inject.Inject; import io.reactivex.Observable; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.subjects.BehaviorSubject; public class MercuryConnectionManager { private static final Logger LOGGER = Logger.getLogger(MercuryConnectionManager.class.getName()); private final Map connections = new ConcurrentHashMap<>(); + private final BehaviorSubject> connectionsSubject = BehaviorSubject.createDefault(connections); private final AccountRepository accountRepository; private final Messenger messenger; @@ -40,6 +42,10 @@ public class MercuryConnectionManager { return new ArrayList<>(connections.values()); } + public Observable> observeConnections() { + return connectionsSubject; + } + public MercuryConnection getConnection(Account account) { return getConnection(account.getId()); } @@ -49,7 +55,7 @@ public class MercuryConnectionManager { } public void registerConnection(MercuryConnection connection) { - messenger.bindConnection(connection); + putConnection(connection); if (connection.getConnection().isAuthenticated()) { registerLiveConnection(connection); } else { @@ -57,6 +63,12 @@ public class MercuryConnectionManager { } } + private void putConnection(MercuryConnection connection) { + connections.put(connection.getAccount().getId(), connection); + connectionsSubject.onNext(connections); + messenger.bindConnection(connection); + } + private void registerLiveConnection(MercuryConnection connection) { Observable> observableAccount = accountRepository .observeAccount(connection.getAccount().getId()); @@ -88,12 +100,7 @@ public class MercuryConnectionManager { } private void handleAccountDisabled(MercuryConnection connection) { - disconnectAndRemoveConnection(connection); - } - - private void disconnectAndRemoveConnection(MercuryConnection connection) { shutdownConnection(connection); - removeConnection(connection); } private void handleAccountEnabled(MercuryConnection connection) { @@ -110,6 +117,11 @@ public class MercuryConnectionManager { disconnectAndRemoveConnection(connection); } + private void disconnectAndRemoveConnection(MercuryConnection connection) { + shutdownConnection(connection); + removeConnection(connection); + } + private void shutdownConnection(MercuryConnection connection) { if (connection.getConnection().isAuthenticated()) { ((AbstractXMPPConnection) connection.getConnection()).instantShutdown(); @@ -118,6 +130,7 @@ public class MercuryConnectionManager { private void removeConnection(MercuryConnection connection) { connections.remove(connection.getAccount().getId()); + connectionsSubject.onNext(connections); connection.dispose(); } From 25011cb7340aa07327c6385c6afd695359dce524 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 6 Jan 2020 01:27:11 +0100 Subject: [PATCH 81/83] Update some dependencies --- app/build.gradle | 7 ++- .../account/AccountsRecyclerViewAdapter.java | 6 +- build.gradle | 2 +- data/build.gradle | 2 +- domain/build.gradle | 3 + .../messenger/MercurySchedulers.java | 24 ++++++++ .../org/mercury_im/messenger/Messenger.java | 18 ++---- .../usecase/ConnectAccountsOnStartup.java | 50 ----------------- .../messenger/usecase/RosterStoreBinder.java | 3 + .../messenger/xmpp/MercuryConnection.java | 4 ++ .../xmpp/MercuryConnectionManager.java | 56 +++++++++++-------- .../smack/ConnectionRegistrationTest.java | 27 --------- version.gradle | 6 +- 13 files changed, 87 insertions(+), 121 deletions(-) create mode 100644 domain/src/main/java/org/mercury_im/messenger/MercurySchedulers.java delete mode 100644 domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java delete mode 100644 domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/ConnectionRegistrationTest.java diff --git a/app/build.gradle b/app/build.gradle index 872bc4f..e5189a2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,6 +84,9 @@ dependencies { implementation "com.google.dagger:dagger:$daggerVersion" annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" + compileOnly 'org.projectlombok:lombok:1.18.10' + annotationProcessor 'org.projectlombok:lombok:1.18.10' + // ViewModel and LiveData implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion" annotationProcessor "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion" @@ -97,11 +100,11 @@ dependencies { // support libraries implementation "androidx.appcompat:appcompat:$appCompatVersion" - implementation 'com.google.android.material:material:1.2.0-alpha02' + implementation 'com.google.android.material:material:1.2.0-alpha03' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'androidx.recyclerview:recyclerview:1.1.0' // circular image viewer for avatars diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java index 716a169..3ec969d 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java @@ -22,6 +22,8 @@ import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.ArrayList; import java.util.List; +import io.reactivex.android.schedulers.AndroidSchedulers; + public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { private final List connections = new ArrayList<>(); @@ -66,7 +68,9 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter viewModel.setAccountEnabled(account, checked)); - connection.getState().subscribe(state -> holder.status.setText(state.toString())); + connection.getState() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(state -> holder.status.setText(state.toString())); setClickListenersOnViewHolder(holder); } diff --git a/build.gradle b/build.gradle index 5e4e892..d4febc9 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.android.tools.build:gradle:3.5.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/data/build.gradle b/data/build.gradle index 5cc048d..af39365 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -30,7 +30,7 @@ dependencies { // JUnit for testing testImplementation "junit:junit:$junitVersion" - testImplementation "org.xerial:sqlite-jdbc:3.28.0" + testImplementation 'org.xerial:sqlite-jdbc:3.30.1' } sourceCompatibility = "8" diff --git a/domain/build.gradle b/domain/build.gradle index 7b7739b..187c55a 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -21,6 +21,9 @@ dependencies { implementation "com.google.dagger:dagger:$daggerVersion" annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion" + compileOnly 'org.projectlombok:lombok:1.18.10' + annotationProcessor 'org.projectlombok:lombok:1.18.10' + // JUnit for testing testImplementation "junit:junit:$junitVersion" } diff --git a/domain/src/main/java/org/mercury_im/messenger/MercurySchedulers.java b/domain/src/main/java/org/mercury_im/messenger/MercurySchedulers.java new file mode 100644 index 0000000..a51d9c1 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/MercurySchedulers.java @@ -0,0 +1,24 @@ +package org.mercury_im.messenger; + +import org.mercury_im.messenger.util.ThreadUtils; + +import javax.inject.Inject; +import javax.inject.Named; + +import io.reactivex.Scheduler; +import lombok.Getter; + +public class MercurySchedulers { + + @Getter + private final Scheduler subscriberScheduler; + @Getter + private final Scheduler observerScheduler; + + @Inject + public MercurySchedulers(@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + this.subscriberScheduler = subscriberScheduler; + this.observerScheduler = observerScheduler; + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/Messenger.java b/domain/src/main/java/org/mercury_im/messenger/Messenger.java index f2d4340..1e53829 100644 --- a/domain/src/main/java/org/mercury_im/messenger/Messenger.java +++ b/domain/src/main/java/org/mercury_im/messenger/Messenger.java @@ -4,7 +4,6 @@ import org.jivesoftware.smack.SmackException; import org.jivesoftware.smackx.csi.ClientStateIndicationManager; import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.usecase.AddAccount; -import org.mercury_im.messenger.usecase.ConnectAccountsOnStartup; import org.mercury_im.messenger.usecase.RosterStoreBinder; import org.mercury_im.messenger.xmpp.MercuryConnection; import org.mercury_im.messenger.xmpp.MercuryConnectionManager; @@ -13,10 +12,12 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; +import javax.inject.Singleton; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; +@Singleton public class Messenger implements ClientStateListener { public static final String TAG = "MercuryIM"; @@ -24,15 +25,13 @@ public class Messenger implements ClientStateListener { private final MercuryConnectionManager connectionManager; private final Repositories repositories; - private final RosterStoreBinder rosterStoreBinder; private CompositeDisposable disposable = new CompositeDisposable(); @Inject - public Messenger(Repositories repositories) { - this.connectionManager = new MercuryConnectionManager(this, repositories.getAccountRepository()); + public Messenger(Repositories repositories, MercuryConnectionManager connectionManager) { this.repositories = repositories; - this.rosterStoreBinder = new RosterStoreBinder(repositories.getAccountRepository(), repositories.getPeerRepository()); + this.connectionManager = connectionManager; performInitialLogin(); } @@ -41,15 +40,10 @@ public class Messenger implements ClientStateListener { } public void performInitialLogin() { + LOGGER.log(Level.INFO, "Perform initial login."); disposable.add(repositories.getAccountRepository().observeAllAccounts().firstOrError() .subscribeOn(Schedulers.newThread()) - .subscribe(initialAccounts -> ConnectAccountsOnStartup - .with(this.connectionManager, repositories.getAccountRepository(), initialAccounts) - .execute())); - } - - public void bindConnection(MercuryConnection connection) { - rosterStoreBinder.setRosterStoreOn(connection); + .subscribe(connectionManager::registerConnections)); } public AddAccount addAccount() { diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java b/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java deleted file mode 100644 index b78c74e..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/ConnectAccountsOnStartup.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.mercury_im.messenger.usecase; - -import org.mercury_im.messenger.data.repository.AccountRepository; -import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.xmpp.MercuryConnection; -import org.mercury_im.messenger.xmpp.MercuryConnectionManager; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.schedulers.Schedulers; - -public class ConnectAccountsOnStartup { - - private static final Logger LOGGER = Logger.getLogger(ConnectAccountsOnStartup.class.getName()); - - private final MercuryConnectionManager connectionManager; - private final AccountRepository accountRepository; - private final List accounts = new ArrayList<>(); - - private CompositeDisposable disposable = new CompositeDisposable(); - - private ConnectAccountsOnStartup(MercuryConnectionManager connectionManager, AccountRepository accountRepository, List initialAccounts) { - this.connectionManager = connectionManager; - this.accountRepository = accountRepository; - this.accounts.addAll(initialAccounts); - } - - public static ConnectAccountsOnStartup with(MercuryConnectionManager connectionManager, AccountRepository accountRepository, List initialAccounts) { - return new ConnectAccountsOnStartup(connectionManager, accountRepository, initialAccounts); - } - - public void execute() { - for (Account account : accounts) { - if (account.isEnabled()) { - MercuryConnection connection = new MercuryConnection(accountRepository, account); - disposable.add(LogIntoAccount.with(connection) - .executeAndPossiblyThrow() - .subscribeOn(Schedulers.newThread()) - .doOnComplete(() -> connectionManager.registerConnection(connection)) - .subscribe( - () -> LOGGER.log(Level.INFO, "Successfully logged into account " + account.getAddress()), - error -> LOGGER.log(Level.SEVERE, "Error logging into account " + account.getAddress(), error))); - } - } - } -} diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/RosterStoreBinder.java b/domain/src/main/java/org/mercury_im/messenger/usecase/RosterStoreBinder.java index 2d0fa87..795916f 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/RosterStoreBinder.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/RosterStoreBinder.java @@ -7,11 +7,14 @@ import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.store.MercuryRosterStore; import org.mercury_im.messenger.xmpp.MercuryConnection; +import javax.inject.Inject; + public class RosterStoreBinder { private final AccountRepository accountRepository; private final PeerRepository peerRepository; + @Inject public RosterStoreBinder(AccountRepository accountRepository, PeerRepository peerRepository) { this.accountRepository = accountRepository; this.peerRepository = peerRepository; diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java index 7b47e6c..8a6302b 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -6,6 +6,9 @@ import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.util.Optional; +import java.util.logging.Level; +import java.util.logging.Logger; + import io.reactivex.Observable; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.subjects.BehaviorSubject; @@ -60,6 +63,7 @@ public class MercuryConnection { @Override public void connectionClosed() { + Logger.getLogger(MercuryConnection.class.getName()).log(Level.INFO, "connectionClosed."); state.onNext(ConnectionState.closed); } diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java index 0336b00..e1addc5 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java @@ -3,8 +3,10 @@ package org.mercury_im.messenger.xmpp; import org.jivesoftware.smack.AbstractXMPPConnection; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.usecase.LogIntoAccount; +import org.mercury_im.messenger.usecase.RosterStoreBinder; import org.mercury_im.messenger.util.Optional; import java.util.ArrayList; @@ -16,11 +18,15 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; +import javax.inject.Singleton; import io.reactivex.Observable; +import io.reactivex.Scheduler; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.BehaviorSubject; +@Singleton public class MercuryConnectionManager { private static final Logger LOGGER = Logger.getLogger(MercuryConnectionManager.class.getName()); @@ -28,14 +34,14 @@ public class MercuryConnectionManager { private final Map connections = new ConcurrentHashMap<>(); private final BehaviorSubject> connectionsSubject = BehaviorSubject.createDefault(connections); private final AccountRepository accountRepository; - private final Messenger messenger; + private final RosterStoreBinder rosterStoreBinder; private final CompositeDisposable disposable = new CompositeDisposable(); @Inject - public MercuryConnectionManager(Messenger messenger, AccountRepository accountRepository) { - this.messenger = messenger; - this.accountRepository = accountRepository; + public MercuryConnectionManager(Repositories repositories, RosterStoreBinder rosterStoreBinder) { + this.accountRepository = repositories.getAccountRepository(); + this.rosterStoreBinder = rosterStoreBinder; } public List getConnections() { @@ -54,33 +60,32 @@ public class MercuryConnectionManager { return connections.get(id); } - public void registerConnection(MercuryConnection connection) { - putConnection(connection); - if (connection.getConnection().isAuthenticated()) { - registerLiveConnection(connection); - } else { - registerDeadConnection(connection); + public void registerConnections(List accounts) { + for (Account account : accounts) { + MercuryConnection connection = new MercuryConnection(accountRepository, account); + registerConnection(connection); } } + public void registerConnection(MercuryConnection connection) { + LOGGER.log(Level.INFO, "Register Connection " + connection.getAccount().getAddress()); + putConnection(connection); + disposable.add(accountRepository + .observeAccount(connection.getAccount().getId()) + .subscribeOn(Schedulers.newThread()) + .observeOn(Schedulers.newThread()) + .subscribe(event -> + handleOptionalAccountChangedEvent(connection, event))); + } + private void putConnection(MercuryConnection connection) { connections.put(connection.getAccount().getId(), connection); connectionsSubject.onNext(connections); - messenger.bindConnection(connection); + bindConnection(connection); } - private void registerLiveConnection(MercuryConnection connection) { - Observable> observableAccount = accountRepository - .observeAccount(connection.getAccount().getId()); - disposable.add(observableAccount.subscribe(event -> - handleOptionalAccountChangedEvent(connection, event))); - - } - - private void registerDeadConnection(MercuryConnection connection) { - if (connection.getAccount().isEnabled()) { - connectionLogin(connection); - } + public void bindConnection(MercuryConnection connection) { + rosterStoreBinder.setRosterStoreOn(connection); } private void handleOptionalAccountChangedEvent(MercuryConnection connection, Optional event) { @@ -100,15 +105,18 @@ public class MercuryConnectionManager { } private void handleAccountDisabled(MercuryConnection connection) { + LOGGER.log(Level.INFO, "HandleAccountDisabled: " + connection.getAccount().getAddress()); shutdownConnection(connection); } private void handleAccountEnabled(MercuryConnection connection) { + LOGGER.log(Level.INFO, "HandleAccountEnabled: " + connection.getAccount().getAddress()); connectionLogin(connection); } private void connectionLogin(MercuryConnection connection) { disposable.add(LogIntoAccount.with(connection).executeAndPossiblyThrow() + .subscribeOn(Schedulers.newThread()) .subscribe(() -> LOGGER.log(Level.INFO, "Logged in."), error -> LOGGER.log(Level.SEVERE, "Connection error!", error))); } @@ -124,7 +132,7 @@ public class MercuryConnectionManager { private void shutdownConnection(MercuryConnection connection) { if (connection.getConnection().isAuthenticated()) { - ((AbstractXMPPConnection) connection.getConnection()).instantShutdown(); + ((AbstractXMPPConnection) connection.getConnection()).disconnect(); } } diff --git a/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/ConnectionRegistrationTest.java b/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/ConnectionRegistrationTest.java deleted file mode 100644 index 6009748..0000000 --- a/domain/src/test/java/org/mercury_im/messenger/learning_tests/smack/ConnectionRegistrationTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.mercury_im.messenger.learning_tests.smack; - -import org.junit.Test; -import org.mercury_im.messenger.data.repository.AccountRepository; -import org.mercury_im.messenger.entity.Account; -import org.mercury_im.messenger.entity.IAccount; -import org.mercury_im.messenger.xmpp.MercuryConnection; -import org.mercury_im.messenger.xmpp.MercuryConnectionManager; - -import java.util.UUID; - -public class ConnectionRegistrationTest { - - AccountRepository accountRepository; - - @Test - public void test() { - MercuryConnectionManager manager = new MercuryConnectionManager(accountRepository); - UUID accountId = UUID.randomUUID(); - Account account = new IAccount(accountId); - account.setAddress("test@add.res"); - account.setPassword("monomono"); - MercuryConnection connection = new MercuryConnection(account); - - manager.registerConnection(connection); - } -} diff --git a/version.gradle b/version.gradle index 7adc839..802b20a 100644 --- a/version.gradle +++ b/version.gradle @@ -86,16 +86,16 @@ ext { rxAndroidVersion = "2.1.1" // Dagger 2 - daggerVersion = '2.25.2' + daggerVersion = '2.25.4' // Android Support Library supportLibVersion = "28.0.0" // Butter Knife - butterKnifeVersion = '10.2.0' + butterKnifeVersion = '10.2.1' // JUnit - junitVersion = "4.12" + junitVersion = '4.13' andxTestJunitVersion = "1.1.1" // androidx.test:runner From 6a1c20a54825e2aded946ae57bf393f871c3e258 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 6 Jan 2020 01:27:29 +0100 Subject: [PATCH 82/83] Disable core-old module --- settings.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.gradle b/settings.gradle index 1d606e1..7f2ec34 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ include ':entity', ':data', ':domain', - ':app', - ':core-old' + ':app' + // ':core-old' includeBuild 'libs/Smack' From 7a30921a9c947823b895ee5716a11468f725d19d Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 6 Jan 2020 03:41:37 +0100 Subject: [PATCH 83/83] Reimplement entity caps caching --- .../messenger/di/component/AppComponent.java | 3 + .../account/AccountsRecyclerViewAdapter.java | 4 +- .../ui/account/AccountsViewModel.java | 5 ++ .../messenger/ui/account/LoginViewModel.java | 7 +- .../messenger/data/di/MappingModule.java | 7 ++ .../messenger/data/di/RepositoryModule.java | 14 ++-- .../data/mapping/EntityCapsMapping.java | 41 ++++++++++ .../repository/XmppEntityCapsRepository.java | 74 ++++++++++++++++++- .../data/di/MappingTestComponent.java | 3 + .../data/mapping/EntityCapsMappingTest.java | 74 +++++++++++++++++++ .../data/repository/EntityCapsRepository.java | 20 +++++ .../data/repository/Repositories.java | 15 +++- .../mercury_im/messenger/logging/Tags.java | 9 +++ .../store/MercuryEntityCapsStore.java | 63 ++++++++++++++++ .../messenger/usecase/AddAccount.java | 6 +- .../messenger/xmpp/MercuryConnection.java | 6 +- .../xmpp/MercuryConnectionManager.java | 48 +++++++++--- .../entity/caps/EntityCapsRecord.java | 12 +++ .../entity/caps/IEntityCapsRecord.java | 27 +++++++ 19 files changed, 411 insertions(+), 27 deletions(-) create mode 100644 data/src/main/java/org/mercury_im/messenger/data/mapping/EntityCapsMapping.java create mode 100644 data/src/test/java/org/mercury_im/messenger/data/mapping/EntityCapsMappingTest.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/logging/Tags.java create mode 100644 domain/src/main/java/org/mercury_im/messenger/store/MercuryEntityCapsStore.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/caps/EntityCapsRecord.java create mode 100644 entity/src/main/java/org/mercury_im/messenger/entity/caps/IEntityCapsRecord.java diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index 6922ad4..ca69c42 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -5,6 +5,7 @@ import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.di.module.AppModule; import org.mercury_im.messenger.service.MercuryConnectionService; +import org.mercury_im.messenger.store.MercuryEntityCapsStore; import org.mercury_im.messenger.ui.MainActivity; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.chat.ChatInputFragment; @@ -68,4 +69,6 @@ public interface AppComponent { void inject(MercuryConnectionService service); + + void inject(MercuryEntityCapsStore store); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java index 3ec969d..97dc0e9 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java @@ -68,9 +68,9 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter viewModel.setAccountEnabled(account, checked)); - connection.getState() + viewModel.getDisposable().add(connection.getState() .observeOn(AndroidSchedulers.mainThread()) - .subscribe(state -> holder.status.setText(state.toString())); + .subscribe(state -> holder.status.setText(state.toString()))); setClickListenersOnViewHolder(holder); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java index 6db3209..09b0ffb 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java @@ -19,6 +19,7 @@ import java.util.Map; import javax.inject.Inject; import io.reactivex.disposables.CompositeDisposable; +import lombok.Getter; public class AccountsViewModel extends AndroidViewModel { @@ -47,6 +48,10 @@ public class AccountsViewModel extends AndroidViewModel { compositeDisposable.clear(); } + public CompositeDisposable getDisposable() { + return compositeDisposable; + } + public LiveData> getConnections() { return connections; } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java index eef223c..29a8245 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java @@ -18,6 +18,9 @@ import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.IAccount; +import java.util.logging.Level; +import java.util.logging.Logger; + import javax.inject.Inject; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -74,7 +77,8 @@ public class LoginViewModel extends AndroidViewModel { } public synchronized void login() { - if (!loginButtonEnabled.getValue()) { + Boolean loginEnabled = loginButtonEnabled.getValue(); + if (loginEnabled != null && !loginEnabled) { // Prevent race condition where account would be logged in twice return; } @@ -92,6 +96,7 @@ public class LoginViewModel extends AndroidViewModel { } private void signalLoginSuccessful() { + Logger.getAnonymousLogger().log(Level.INFO, "Signal Login Successful"); loginCompleted.setValue(true); } diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java index 63ff9e6..e1aa7d8 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/MappingModule.java @@ -2,6 +2,7 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; +import org.mercury_im.messenger.data.mapping.EntityCapsMapping; import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.mapping.MessagePayloadMapping; import org.mercury_im.messenger.data.mapping.MessageMapping; @@ -57,4 +58,10 @@ public class MappingModule { static MessagePayloadMapping provideMessageContentMapping() { return new MessagePayloadMapping(); } + + @Provides + @Singleton + static EntityCapsMapping provideEntityCapsMapping() { + return new EntityCapsMapping(); + } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java index c0aeb38..00875cb 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java +++ b/data/src/main/java/org/mercury_im/messenger/data/di/RepositoryModule.java @@ -2,10 +2,12 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.mapping.AccountMapping; import org.mercury_im.messenger.data.mapping.DirectChatMapping; +import org.mercury_im.messenger.data.mapping.EntityCapsMapping; import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.mapping.MessageMapping; import org.mercury_im.messenger.data.mapping.PeerMapping; import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.data.repository.EntityCapsRepository; import org.mercury_im.messenger.data.repository.GroupChatRepository; import org.mercury_im.messenger.data.repository.MessageRepository; import org.mercury_im.messenger.data.repository.PeerRepository; @@ -90,11 +92,12 @@ public class RepositoryModule { @Provides @Singleton - static XmppEntityCapsRepository provideCapsRepository( + static EntityCapsRepository provideCapsRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) { - return new XmppEntityCapsRepository(data, ioScheduler, uiScheduler); + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler, + EntityCapsMapping entityCapsMapping) { + return new XmppEntityCapsRepository(data, ioScheduler, uiScheduler, entityCapsMapping); } @Provides @@ -104,8 +107,9 @@ public class RepositoryModule { DirectChatRepository directChatRepository, GroupChatRepository groupChatRepository, MessageRepository messageRepository, - PeerRepository peerRepository) { + PeerRepository peerRepository, + XmppEntityCapsRepository entityCapsRepository) { return new Repositories(accountRepository, directChatRepository, groupChatRepository, - messageRepository, peerRepository); + messageRepository, peerRepository, entityCapsRepository); } } diff --git a/data/src/main/java/org/mercury_im/messenger/data/mapping/EntityCapsMapping.java b/data/src/main/java/org/mercury_im/messenger/data/mapping/EntityCapsMapping.java new file mode 100644 index 0000000..7c04840 --- /dev/null +++ b/data/src/main/java/org/mercury_im/messenger/data/mapping/EntityCapsMapping.java @@ -0,0 +1,41 @@ +package org.mercury_im.messenger.data.mapping; + +import org.mercury_im.messenger.data.model.EntityCapsModel; +import org.mercury_im.messenger.entity.caps.EntityCapsRecord; +import org.mercury_im.messenger.entity.caps.IEntityCapsRecord; + +import javax.inject.Inject; + +import lombok.NonNull; + +public class EntityCapsMapping extends AbstractMapping { + + @Inject + public EntityCapsMapping() { + + } + + @Override + protected EntityCapsRecord newEntity(@NonNull EntityCapsModel model) { + return new IEntityCapsRecord(); + } + + @Override + protected EntityCapsModel newModel(@NonNull EntityCapsRecord entity) { + return new EntityCapsModel(); + } + + @Override + protected EntityCapsModel mapToModel(@NonNull EntityCapsRecord entity, @NonNull EntityCapsModel model) { + model.setNodeVer(entity.getNodeVer()); + model.setXml(entity.getXml()); + return model; + } + + @Override + protected EntityCapsRecord mapToEntity(@NonNull EntityCapsModel model, @NonNull EntityCapsRecord entity) { + entity.setNodeVer(model.getNodeVer()); + entity.setXml(model.getXml()); + return entity; + } +} diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppEntityCapsRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppEntityCapsRepository.java index e7073ed..ce9d4cf 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppEntityCapsRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppEntityCapsRepository.java @@ -1,21 +1,91 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.data.mapping.EntityCapsMapping; +import org.mercury_im.messenger.data.model.EntityCapsModel; +import org.mercury_im.messenger.entity.caps.EntityCapsRecord; import org.mercury_im.messenger.util.ThreadUtils; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import javax.inject.Inject; import javax.inject.Named; +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; import io.reactivex.Scheduler; import io.requery.Persistable; +import io.requery.query.Expression; +import io.requery.query.ResultDelegate; import io.requery.reactivex.ReactiveEntityStore; +import io.requery.reactivex.ReactiveResult; -public class XmppEntityCapsRepository extends RequeryRepository { +public class XmppEntityCapsRepository extends RequeryRepository implements EntityCapsRepository { + + private final EntityCapsMapping entityCapsMapping; @Inject public XmppEntityCapsRepository( ReactiveEntityStore data, @Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler, - @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) { + @Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler, + EntityCapsMapping mapping) { super(data, subscriberScheduler, observerScheduler); + this.entityCapsMapping = mapping; + } + + @Override + public Observable> observeAllEntityCapsRecords() { + return data().select(EntityCapsModel.class).get() + .observableResult() + .map(result -> result.toMap(EntityCapsModel.NODE_VER, new ConcurrentHashMap<>())) + .map(this::mapModelsToEntities) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + private Map mapModelsToEntities(Map models) { + Map entities = new ConcurrentHashMap<>(); + for (String key : models.keySet()) { + entities.put(key, entityCapsMapping.toEntity(models.get(key))); + } + return entities; + } + + private Map mapEntitiesToModels(Map entities) { + Map models = new ConcurrentHashMap<>(); + for (String key : entities.keySet()) { + models.put(key, entityCapsMapping.toModel(entities.get(key))); + } + return models; + } + + @Override + public Observable observeEntityCapsRecords() { + return data().select(EntityCapsModel.class) + .get().observableResult() + .flatMap(ReactiveResult::observable) + .map(entityCapsMapping::toEntity) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Maybe maybeGetEntityCapsRecord(String nodeVer) { + return data().select(EntityCapsModel.class) + .where(EntityCapsModel.NODE_VER.eq(nodeVer)) + .get().maybe() + .map(entityCapsMapping::toEntity) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Completable insertEntityCapsRecord(EntityCapsRecord entityCapsRecord) { + return data().upsert(entityCapsMapping.toModel(entityCapsRecord)) + .ignoreElement() + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); } } diff --git a/data/src/test/java/org/mercury_im/messenger/data/di/MappingTestComponent.java b/data/src/test/java/org/mercury_im/messenger/data/di/MappingTestComponent.java index c804283..6c8ff56 100644 --- a/data/src/test/java/org/mercury_im/messenger/data/di/MappingTestComponent.java +++ b/data/src/test/java/org/mercury_im/messenger/data/di/MappingTestComponent.java @@ -2,6 +2,7 @@ package org.mercury_im.messenger.data.di; import org.mercury_im.messenger.data.mapping.AccountMappingTest; +import org.mercury_im.messenger.data.mapping.EntityCapsMappingTest; import org.mercury_im.messenger.data.mapping.PeerMappingTest; import javax.inject.Singleton; @@ -15,4 +16,6 @@ public interface MappingTestComponent { void inject(AccountMappingTest test); void inject(PeerMappingTest test); + + void inject(EntityCapsMappingTest test); } diff --git a/data/src/test/java/org/mercury_im/messenger/data/mapping/EntityCapsMappingTest.java b/data/src/test/java/org/mercury_im/messenger/data/mapping/EntityCapsMappingTest.java new file mode 100644 index 0000000..f684810 --- /dev/null +++ b/data/src/test/java/org/mercury_im/messenger/data/mapping/EntityCapsMappingTest.java @@ -0,0 +1,74 @@ +package org.mercury_im.messenger.data.mapping; + +import org.junit.Test; +import org.mercury_im.messenger.data.di.DaggerMappingTestComponent; +import org.mercury_im.messenger.data.model.EntityCapsModel; +import org.mercury_im.messenger.entity.caps.EntityCapsRecord; +import org.mercury_im.messenger.entity.caps.IEntityCapsRecord; + +import javax.inject.Inject; + +import static junit.framework.TestCase.assertEquals; + +public class EntityCapsMappingTest { + + @Inject + EntityCapsMapping mapping; + + public EntityCapsMappingTest() { + DaggerMappingTestComponent.create().inject(this); + } + + @Test + public void mapEntityToModelTest() { + EntityCapsRecord entity = new IEntityCapsRecord(); + entity.setNodeVer("thisisahash"); + entity.setXml(""); + + EntityCapsModel model = mapping.toModel(entity); + + assertEquals(entity.getNodeVer(), model.getNodeVer()); + assertEquals(entity.getXml(), model.getXml()); + } + + @Test + public void mapModelToEntityTest() { + EntityCapsModel model = new EntityCapsModel(); + model.setNodeVer("q07IKJEyjvHSyhy//CH0CxmKi8w="); + model.setXml("" + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " urn:xmpp:dataforms:softwareinfo" + + " " + + " " + + " ipv4" + + " ipv6" + + " " + + " " + + " Mac" + + " " + + " " + + " 10.5.1" + + " " + + " " + + " Psi" + + " " + + " " + + " 0.11" + + " " + + " " + + " "); + + EntityCapsRecord entity = mapping.toEntity(model); + + assertEquals(model.getNodeVer(), entity.getNodeVer()); + assertEquals(model.getXml(), entity.getXml()); + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java new file mode 100644 index 0000000..6273464 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/EntityCapsRepository.java @@ -0,0 +1,20 @@ +package org.mercury_im.messenger.data.repository; + +import org.mercury_im.messenger.entity.caps.EntityCapsRecord; + +import java.util.Map; + +import io.reactivex.Completable; +import io.reactivex.Maybe; +import io.reactivex.Observable; + +public interface EntityCapsRepository { + + Observable> observeAllEntityCapsRecords(); + + Observable observeEntityCapsRecords(); + + Maybe maybeGetEntityCapsRecord(String nodeVer); + + Completable insertEntityCapsRecord(EntityCapsRecord entityCapsRecord); +} diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/Repositories.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/Repositories.java index 4500aaf..bacdfd1 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/Repositories.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/Repositories.java @@ -1,7 +1,11 @@ package org.mercury_im.messenger.data.repository; -import javax.inject.Inject; +import org.mercury_im.messenger.entity.caps.EntityCapsRecord; +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton public class Repositories { private final AccountRepository accountRepository; @@ -9,18 +13,21 @@ public class Repositories { private final GroupChatRepository groupChatRepository; private final MessageRepository messageRepository; private final PeerRepository peerRepository; + private final EntityCapsRepository entityCapsRepository; @Inject public Repositories(AccountRepository accountRepository, DirectChatRepository directChatRepository, GroupChatRepository groupChatRepository, MessageRepository messageRepository, - PeerRepository peerRepository) { + PeerRepository peerRepository, + EntityCapsRepository entityCapsRepository) { this.accountRepository = accountRepository; this.directChatRepository = directChatRepository; this.groupChatRepository = groupChatRepository; this.messageRepository = messageRepository; this.peerRepository = peerRepository; + this.entityCapsRepository = entityCapsRepository; } public AccountRepository getAccountRepository() { @@ -42,4 +49,8 @@ public class Repositories { public PeerRepository getPeerRepository() { return peerRepository; } + + public EntityCapsRepository getEntityCapsRepository() { + return entityCapsRepository; + } } diff --git a/domain/src/main/java/org/mercury_im/messenger/logging/Tags.java b/domain/src/main/java/org/mercury_im/messenger/logging/Tags.java new file mode 100644 index 0000000..6ace309 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/logging/Tags.java @@ -0,0 +1,9 @@ +package org.mercury_im.messenger.logging; + +public class Tags { + + public static final String TAG_XMPP = "MercuryXMPP"; + public static final String TAG_DB = "MercuryDB"; + public static final String TAG_ANDROID = "MercuryAndroid"; + public static final String TAG_DOMAIN = "MercuryDomain"; +} diff --git a/domain/src/main/java/org/mercury_im/messenger/store/MercuryEntityCapsStore.java b/domain/src/main/java/org/mercury_im/messenger/store/MercuryEntityCapsStore.java new file mode 100644 index 0000000..10700a1 --- /dev/null +++ b/domain/src/main/java/org/mercury_im/messenger/store/MercuryEntityCapsStore.java @@ -0,0 +1,63 @@ +package org.mercury_im.messenger.store; + +import org.jivesoftware.smack.util.PacketParserUtils; +import org.jivesoftware.smack.xml.XmlPullParser; +import org.jivesoftware.smackx.caps.cache.EntityCapsPersistentCache; +import org.jivesoftware.smackx.disco.packet.DiscoverInfo; +import org.mercury_im.messenger.data.repository.EntityCapsRepository; +import org.mercury_im.messenger.entity.caps.EntityCapsRecord; +import org.mercury_im.messenger.entity.caps.IEntityCapsRecord; +import org.mercury_im.messenger.logging.Tags; + +import java.io.StringReader; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import io.reactivex.disposables.CompositeDisposable; + +@Singleton +public class MercuryEntityCapsStore implements EntityCapsPersistentCache { + + private static final Logger LOGGER = Logger.getLogger(Tags.TAG_DOMAIN); + + private final CompositeDisposable disposable = new CompositeDisposable(); + private final EntityCapsRepository repository; + + @Inject + public MercuryEntityCapsStore(EntityCapsRepository entityCapsRepository) { + this.repository = entityCapsRepository; + } + + @Override + public void addDiscoverInfoByNodePersistent(String nodeVer, DiscoverInfo info) { + LOGGER.log(Level.INFO, "MercuryEntityCapsStore: addDiscoverInfoByNodePersistent: " + nodeVer); + EntityCapsRecord record = new IEntityCapsRecord(); + record.setNodeVer(nodeVer); + record.setXml(info.toXML().toString()); + + disposable.add(repository.insertEntityCapsRecord(record).subscribe()); + } + + @Override + public DiscoverInfo lookup(String nodeVer) { + LOGGER.log(Level.INFO, "MercuryEntityCapsStore: lookup: " + nodeVer); + return repository.maybeGetEntityCapsRecord(nodeVer) + .map(this::parseDiscoverInfo) + .onErrorComplete() + .blockingGet(); + } + + private DiscoverInfo parseDiscoverInfo(EntityCapsRecord record) throws Exception { + XmlPullParser parser = PacketParserUtils.getParserFor(new StringReader(record.getXml())); + return (DiscoverInfo) PacketParserUtils.parseIQ(parser); + } + + @Override + public void emptyCache() { + LOGGER.log(Level.INFO, "MercuryEntityCapsStore: emptyCache."); + // Not needed? + } +} diff --git a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java index a28bcb6..87d0b46 100644 --- a/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java +++ b/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java @@ -5,6 +5,7 @@ import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.xmpp.MercuryConnection; import org.mercury_im.messenger.xmpp.MercuryConnectionManager; +import java.util.logging.Level; import java.util.logging.Logger; import io.reactivex.Completable; @@ -31,6 +32,7 @@ public class AddAccount { } private Completable loginAndStoreAccountIfSuccessful(Account account) { + LOGGER.log(Level.INFO, "loginAndStoreIfSuccessful"); return logIntoAccount(account).flatMap(connection -> insertEnabledAccountIntoDatabase(account).flatMap(insertedAccount -> updateAccountIdInConnectionSingle(insertedAccount, connection))) @@ -77,8 +79,4 @@ public class AddAccount { connection.getAccount().setId(account.getId()); } } - - - - } diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java index 8a6302b..1cadeff 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -15,6 +15,7 @@ import io.reactivex.subjects.BehaviorSubject; public class MercuryConnection { + private static final Logger LOGGER = Logger.getLogger("MercuryConnection"); private static final XmppConnectionFactory connectionFactory = new XmppConnectionFactory(); private final CompositeDisposable disposable = new CompositeDisposable(); @@ -53,22 +54,25 @@ public class MercuryConnection { connection.addConnectionListener(new ConnectionListener() { @Override public void connected(XMPPConnection connection) { + LOGGER.log(Level.FINER, "connected"); state.onNext(ConnectionState.connected); } @Override public void authenticated(XMPPConnection connection, boolean resumed) { + LOGGER.log(Level.FINER, "authenticated. resumed? " + resumed); state.onNext(ConnectionState.authenticated); } @Override public void connectionClosed() { - Logger.getLogger(MercuryConnection.class.getName()).log(Level.INFO, "connectionClosed."); + LOGGER.log(Level.FINER, "connectionClosed"); state.onNext(ConnectionState.closed); } @Override public void connectionClosedOnError(Exception e) { + LOGGER.log(Level.WARNING, "connectionClosedOnError"); state.onNext(ConnectionState.closedOnError); } }); diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java index e1addc5..2b3a6c9 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnectionManager.java @@ -1,10 +1,13 @@ package org.mercury_im.messenger.xmpp; import org.jivesoftware.smack.AbstractXMPPConnection; -import org.mercury_im.messenger.Messenger; +import org.jivesoftware.smack.ReconnectionListener; +import org.jivesoftware.smack.ReconnectionManager; +import org.jivesoftware.smackx.caps.EntityCapsManager; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.data.repository.Repositories; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.store.MercuryEntityCapsStore; import org.mercury_im.messenger.usecase.LogIntoAccount; import org.mercury_im.messenger.usecase.RosterStoreBinder; import org.mercury_im.messenger.util.Optional; @@ -21,7 +24,6 @@ import javax.inject.Inject; import javax.inject.Singleton; import io.reactivex.Observable; -import io.reactivex.Scheduler; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.BehaviorSubject; @@ -29,19 +31,32 @@ import io.reactivex.subjects.BehaviorSubject; @Singleton public class MercuryConnectionManager { - private static final Logger LOGGER = Logger.getLogger(MercuryConnectionManager.class.getName()); + private static final Logger LOGGER = Logger.getLogger("ConnectionManager"); private final Map connections = new ConcurrentHashMap<>(); private final BehaviorSubject> connectionsSubject = BehaviorSubject.createDefault(connections); + private final AccountRepository accountRepository; + private final RosterStoreBinder rosterStoreBinder; + private final MercuryEntityCapsStore entityCapsStore; private final CompositeDisposable disposable = new CompositeDisposable(); + static { + ReconnectionManager.setEnabledPerDefault(true); + ReconnectionManager.setDefaultReconnectionPolicy(ReconnectionManager.ReconnectionPolicy.RANDOM_INCREASING_DELAY); + } + @Inject - public MercuryConnectionManager(Repositories repositories, RosterStoreBinder rosterStoreBinder) { + public MercuryConnectionManager(Repositories repositories, + RosterStoreBinder rosterStoreBinder, + MercuryEntityCapsStore entityCapsStore) { this.accountRepository = repositories.getAccountRepository(); this.rosterStoreBinder = rosterStoreBinder; + this.entityCapsStore = entityCapsStore; + + EntityCapsManager.setPersistentCache(entityCapsStore); } public List getConnections() { @@ -86,6 +101,18 @@ public class MercuryConnectionManager { public void bindConnection(MercuryConnection connection) { rosterStoreBinder.setRosterStoreOn(connection); + ReconnectionManager.getInstanceFor((AbstractXMPPConnection) connection.getConnection()) + .addReconnectionListener(new ReconnectionListener() { + @Override + public void reconnectingIn(int seconds) { + LOGGER.log(Level.FINER, "Reconnecting connection " + connection.getAccount().getAddress() + " in " + seconds + " seconds."); + } + + @Override + public void reconnectionFailed(Exception e) { + LOGGER.log(Level.WARNING, "Reconnection of connection " + connection.getAccount().getAddress() + " failed.", e); + } + }); } private void handleOptionalAccountChangedEvent(MercuryConnection connection, Optional event) { @@ -105,19 +132,19 @@ public class MercuryConnectionManager { } private void handleAccountDisabled(MercuryConnection connection) { - LOGGER.log(Level.INFO, "HandleAccountDisabled: " + connection.getAccount().getAddress()); - shutdownConnection(connection); + LOGGER.log(Level.FINER, "HandleAccountDisabled: " + connection.getAccount().getAddress()); + connectionDisconnect(connection); } private void handleAccountEnabled(MercuryConnection connection) { - LOGGER.log(Level.INFO, "HandleAccountEnabled: " + connection.getAccount().getAddress()); + LOGGER.log(Level.FINER, "HandleAccountEnabled: " + connection.getAccount().getAddress()); connectionLogin(connection); } private void connectionLogin(MercuryConnection connection) { disposable.add(LogIntoAccount.with(connection).executeAndPossiblyThrow() .subscribeOn(Schedulers.newThread()) - .subscribe(() -> LOGGER.log(Level.INFO, "Logged in."), + .subscribe(() -> LOGGER.log(Level.FINER, "Logged in."), error -> LOGGER.log(Level.SEVERE, "Connection error!", error))); } @@ -126,17 +153,18 @@ public class MercuryConnectionManager { } private void disconnectAndRemoveConnection(MercuryConnection connection) { - shutdownConnection(connection); + connectionDisconnect(connection); removeConnection(connection); } - private void shutdownConnection(MercuryConnection connection) { + private void connectionDisconnect(MercuryConnection connection) { if (connection.getConnection().isAuthenticated()) { ((AbstractXMPPConnection) connection.getConnection()).disconnect(); } } private void removeConnection(MercuryConnection connection) { + LOGGER.log(Level.FINER, "Remove Connection: " + connection.getAccount().getAddress()); connections.remove(connection.getAccount().getId()); connectionsSubject.onNext(connections); connection.dispose(); diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/caps/EntityCapsRecord.java b/entity/src/main/java/org/mercury_im/messenger/entity/caps/EntityCapsRecord.java new file mode 100644 index 0000000..bc3ad16 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/caps/EntityCapsRecord.java @@ -0,0 +1,12 @@ +package org.mercury_im.messenger.entity.caps; + +public interface EntityCapsRecord { + + String getNodeVer(); + + void setNodeVer(String nodeVer); + + String getXml(); + + void setXml(String xml); +} diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/caps/IEntityCapsRecord.java b/entity/src/main/java/org/mercury_im/messenger/entity/caps/IEntityCapsRecord.java new file mode 100644 index 0000000..c740cf5 --- /dev/null +++ b/entity/src/main/java/org/mercury_im/messenger/entity/caps/IEntityCapsRecord.java @@ -0,0 +1,27 @@ +package org.mercury_im.messenger.entity.caps; + +public class IEntityCapsRecord implements EntityCapsRecord { + + private String nodeVer; + private String xml; + + @Override + public String getNodeVer() { + return nodeVer; + } + + @Override + public void setNodeVer(String nodeVer) { + this.nodeVer = nodeVer; + } + + @Override + public String getXml() { + return xml; + } + + @Override + public void setXml(String xml) { + this.xml = xml; + } +}