From da9179b0499ae6cffd327ae90c0dc6c8fc9822f0 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 3 Nov 2019 06:33:52 +0100 Subject: [PATCH] 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'