diff --git a/app/build.gradle b/app/build.gradle index d2781f6..998f4a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,6 +73,7 @@ check.configure { dependencies { // Depend on the core project for XMPP related stuff + implementation project(":entity") implementation project(":domain") implementation project(":data") diff --git a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java index a50bc02..8953c9b 100644 --- a/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java +++ b/app/src/main/java/org/mercury_im/messenger/MercuryImApplication.java @@ -9,7 +9,9 @@ import android.content.Context; import android.content.Intent; import android.os.Build; +import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.component.AppComponent; +import org.mercury_im.messenger.di.component.DaggerAppComponent; import org.mercury_im.messenger.di.module.AppModule; import org.mercury_im.messenger.service.XmppConnectionService; import org.mercury_im.messenger.util.AbstractActivityLifecycleCallbacks; @@ -24,7 +26,7 @@ public class MercuryImApplication extends Application { static { // Initialize Smack etc. - new MercuryConfiguration(); + // new MercuryConfiguration(); } private static MercuryImApplication INSTANCE; @@ -70,6 +72,7 @@ public class MercuryImApplication extends Application { public AppComponent createAppComponent() { AppComponent appComponent = DaggerAppComponent.builder() .appModule(new AppModule(this)) + .repositoryModule(new RepositoryModule()) .build(); appComponent.inject(this); diff --git a/app/src/main/java/org/mercury_im/messenger/Notifications.java b/app/src/main/java/org/mercury_im/messenger/Notifications.java index bdab127..51f99ff 100644 --- a/app/src/main/java/org/mercury_im/messenger/Notifications.java +++ b/app/src/main/java/org/mercury_im/messenger/Notifications.java @@ -7,7 +7,7 @@ import android.content.Intent; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; -import org.mercury_im.messenger.entity.chat.Chat; +import org.mercury_im.messenger.entity.chat.DirectChat; import org.mercury_im.messenger.ui.chat.ChatActivity; public class Notifications { @@ -20,13 +20,13 @@ public class Notifications { // Notification IDs public static final int FOREGROUND_SERVICE_ID = 1; // must not be 0 - public static int chatMessageReceived(Context context, Chat chat, String contactName, String body) { + public static int directChatMessageReceived(Context context, DirectChat chat, String contactName, String body) { NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); int id = (int) chat.getId(); Intent tapAction = new Intent(context, ChatActivity.class); tapAction.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - tapAction.putExtra(ChatActivity.EXTRA_JID, chat.getPeer().getJid().toString()); + tapAction.putExtra(ChatActivity.EXTRA_JID, chat.getPeer().getAddress()); tapAction.putExtra(ChatActivity.EXTRA_ACCOUNT, chat.getPeer().getAccount().getId()); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, tapAction, 0); diff --git a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java index c1a4b62..f7eda00 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/mercury_im/messenger/di/component/AppComponent.java @@ -1,6 +1,7 @@ package org.mercury_im.messenger.di.component; import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.di.module.AppModule; import org.mercury_im.messenger.service.XmppConnectionService; @@ -31,6 +32,16 @@ import dagger.Component; }) public interface AppComponent { + @Component.Builder + interface Builder { + + AppComponent build(); + + Builder appModule(AppModule appModule); + + Builder repositoryModule(RepositoryModule module); + } + // Application void inject(MercuryImApplication mercuryImApplication); diff --git a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java index a306090..0ea8b80 100644 --- a/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java +++ b/app/src/main/java/org/mercury_im/messenger/di/module/AndroidPersistenceModule.java @@ -2,9 +2,9 @@ package org.mercury_im.messenger.di.module; import android.app.Application; +import org.mercury_im.messenger.data.model.Models; import org.mercury_im.messenger.util.ThreadUtils; import org.mercury_im.messenger.BuildConfig; -import org.mercury_im.messenger.xmpp.model.Models; import javax.inject.Named; import javax.inject.Singleton; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java index a974333..6b0d4db 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/MainActivity.java @@ -16,6 +16,7 @@ import com.google.android.material.navigation.NavigationView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.chatlist.ChatListFragment; import org.mercury_im.messenger.ui.login.AccountsFragment; import org.mercury_im.messenger.ui.roster.RosterFragment; @@ -30,9 +31,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, AccountsFragment.OnAccountListItemClickListener { - @Inject - ChatRepository chatRepository; - @BindView(R.id.toolbar) Toolbar toolbar; @@ -97,12 +95,12 @@ public class MainActivity extends AppCompatActivity } @Override - public void onAccountListItemClick(AccountModel item) { + public void onAccountListItemClick(Account item) { } @Override - public void onAccountListItemLongClick(AccountModel item) { + public void onAccountListItemLongClick(Account item) { } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java index b53b524..9d3d934 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatActivity.java @@ -14,25 +14,15 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import butterknife.BindView; -import butterknife.ButterKnife; - -import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.schedulers.Schedulers; - -import org.jivesoftware.smack.SmackException; -import org.jivesoftware.smack.chat2.ChatManager; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; - import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.core.centers.ConnectionCenter; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.inject.Inject; +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; public class ChatActivity extends AppCompatActivity implements ChatInputFragment.OnChatInputActionListener, SearchView.OnQueryTextListener { @@ -40,18 +30,12 @@ public class ChatActivity extends AppCompatActivity public static final String EXTRA_JID = "JID"; public static final String EXTRA_ACCOUNT = "ACCOUNT"; - @Inject - ConnectionCenter connectionCenter; - @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.recyclerView) RecyclerView recyclerView; - @Inject - ChatRepository chatRepository; - private final MessagesRecyclerViewAdapter recyclerViewAdapter = new MessagesRecyclerViewAdapter(); private ChatViewModel chatViewModel; @@ -186,6 +170,7 @@ public class ChatActivity extends AppCompatActivity return; } + /* // TODO: Improve by using rx new Thread() { @Override @@ -200,6 +185,8 @@ public class ChatActivity extends AppCompatActivity } } }.start(); + + */ } @Override diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java index 17066fe..677aae7 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/ChatViewModel.java @@ -6,12 +6,11 @@ import androidx.lifecycle.ViewModel; import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.xmpp.model.ChatModel; -import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.xmpp.model.EntityModel; -import org.mercury_im.messenger.xmpp.model.MessageModel; -import org.mercury_im.messenger.data.repository.XmppPeerRepository; +import org.mercury_im.messenger.data.repository.DirectChatRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.chat.DirectChat; +import org.mercury_im.messenger.entity.contact.Peer; +import org.mercury_im.messenger.entity.message.Message; import java.util.List; @@ -26,22 +25,15 @@ public class ChatViewModel extends ViewModel { private final CompositeDisposable disposable = new CompositeDisposable(); @Inject - MessageRepository messageRepository; + PeerRepository contactRepository; @Inject - XmppPeerRepository xmppContactRepository; + DirectChatRepository chatRepository; - @Inject - ChatRepository chatRepository; - - @Inject - ConnectionCenter connectionCenter; - - private MutableLiveData entity = new MutableLiveData<>(); - private MutableLiveData contact = new MutableLiveData<>(); - private MutableLiveData> messages = new MutableLiveData<>(); + private MutableLiveData contact = new MutableLiveData<>(); + private MutableLiveData> messages = new MutableLiveData<>(); private MutableLiveData contactDisplayName = new MutableLiveData<>(); - private MutableLiveData chat = new MutableLiveData<>(); + private MutableLiveData chat = new MutableLiveData<>(); public ChatViewModel() { super(); @@ -49,24 +41,25 @@ public class ChatViewModel extends ViewModel { } public void init(long accountId, EntityBareJid jid) { - disposable.add(xmppContactRepository.getOrCreateEntity(accountId, jid) - .subscribe((Consumer) this::init)); + disposable.add(contactRepository.getOrCreatePeer(accountId, jid.toString()) + .subscribe((Consumer) this::init)); } - public void init(EntityModel entityModel) { + public void init(Peer peer) { + disposable.add(chatRepository.getOrCreateChatWithPeer(peer) + .subscribe((Consumer) this::init)); + } - disposable.add(xmppContactRepository.getContact(entityModel.getAccount().getId(), entityModel.getJid()) - .subscribe(reactiveResult -> { - ContactModel model = reactiveResult.first(); - ChatViewModel.this.contact.setValue(model); - contactDisplayName.setValue(model.getRostername()); - })); + public void init(DirectChat chat) { + this.chat.setValue(chat); - disposable.add(messageRepository.getAllMessagesOfEntity(entityModel) - .subscribe(reactiveResult -> { - List messages = reactiveResult.toList(); - ChatViewModel.this.messages.setValue(messages); - })); + // Subscribe peer + disposable.add(contactRepository.observePeer(chat.getPeer().getId()) + .subscribe(peer -> contactDisplayName.setValue(peer.getItem().getName()))); + + // Subscribe messages + disposable.add(chatRepository.observeMessages(chat) + .subscribe(ChatViewModel.this.messages::setValue)); } @Override @@ -75,11 +68,11 @@ public class ChatViewModel extends ViewModel { disposable.clear(); } - public LiveData> getMessages() { + public LiveData> getMessages() { return messages; } - public LiveData getContact() { + public LiveData getContact() { return contact; } @@ -107,6 +100,7 @@ public class ChatViewModel extends ViewModel { } public Completable requestMamMessages() { + /* return Completable.fromAction(() -> { ChatModel chatModel = ChatViewModel.this.chat.getValue(); if (chatModel == null) { @@ -115,5 +109,7 @@ public class ChatViewModel extends ViewModel { connectionCenter.requestMamMessagesFor(chatModel); }); + */ + return null; } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java index 67536f9..3f80d73 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chat/MessagesRecyclerViewAdapter.java @@ -10,7 +10,8 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.MessageModel; +import org.mercury_im.messenger.entity.message.Message; +import org.mercury_im.messenger.entity.message.content.TextMessageContent; import org.mercury_im.messenger.ui.util.MessageBackgroundDrawable; import java.util.ArrayList; @@ -18,14 +19,14 @@ import java.util.List; public class MessagesRecyclerViewAdapter extends RecyclerView.Adapter { - private List messages = new ArrayList<>(); + private List messages = new ArrayList<>(); private SparseArray checkedItems = new SparseArray<>(); public MessagesRecyclerViewAdapter() { } - public void updateMessages(List messages) { + public void updateMessages(List messages) { this.messages.clear(); this.messages.addAll(messages); notifyDataSetChanged(); @@ -47,24 +48,24 @@ public class MessagesRecyclerViewAdapter extends RecyclerView.Adapter { + extends AbstractRecyclerViewAdapter { public ChatListRecyclerViewAdapter() { super(new ChatMessageDiffCallback(true)); @@ -41,15 +41,15 @@ public class ChatListRecyclerViewAdapter @Override public void onBindViewHolder(@NonNull ChatHolder holder, int position) { - ChatModel model = getModelAt(position); - holder.nameView.setText(model.getPeer().getJid() != null ? - model.getPeer().getJid() : model.toString()); - holder.avatarView.setColorFilter(ColorUtil.consistentColor(model.getPeer().getJid().toString())); + DirectChat model = getItemAt(position); + holder.nameView.setText(model.getPeer().getAddress() != null ? + model.getPeer().getAddress() : model.toString()); + holder.avatarView.setColorFilter(ColorUtil.consistentColor(model.getPeer().getAddress())); holder.itemView.setOnClickListener(view -> { Intent intent = new Intent(holder.context, ChatActivity.class); - intent.putExtra(ChatActivity.EXTRA_JID, model.getPeer().getJid().toString()); + intent.putExtra(ChatActivity.EXTRA_JID, model.getPeer().getAddress()); intent.putExtra(ChatActivity.EXTRA_ACCOUNT, model.getPeer().getAccount().getId()); holder.context.startActivity(intent); @@ -84,19 +84,19 @@ public class ChatListRecyclerViewAdapter } } - private static class ChatMessageDiffCallback extends AbstractDiffCallback { + private static class ChatMessageDiffCallback extends AbstractDiffCallback { ChatMessageDiffCallback(boolean detectMoves) { super(detectMoves); } @Override - public boolean areItemsTheSame(ChatModel oldItem, ChatModel newItem) { + public boolean areItemsTheSame(DirectChat oldItem, DirectChat newItem) { return oldItem.getId() == newItem.getId(); } @Override - public boolean areContentsTheSame(ChatModel oldItem, ChatModel newItem) { + public boolean areContentsTheSame(DirectChat oldItem, DirectChat newItem) { return areItemsTheSame(oldItem, newItem); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java index f9df7d8..ce13c2e 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/chatlist/ChatListViewModel.java @@ -5,7 +5,8 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.xmpp.model.ChatModel; +import org.mercury_im.messenger.data.repository.DirectChatRepository; +import org.mercury_im.messenger.entity.chat.DirectChat; import java.util.List; @@ -16,23 +17,20 @@ import io.reactivex.disposables.CompositeDisposable; public class ChatListViewModel extends ViewModel { @Inject - ChatRepository chatRepository; - - @Inject - MessageRepository messageRepository; + DirectChatRepository chatRepository; private CompositeDisposable disposable = new CompositeDisposable(); - private final MutableLiveData> chats = new MutableLiveData<>(); + private final MutableLiveData> chats = new MutableLiveData<>(); public ChatListViewModel() { MercuryImApplication.getApplication().getAppComponent().inject(this); - disposable.add(chatRepository.getVisibleChats() - .subscribe(result -> chats.setValue(result.toList()))); + disposable.add(chatRepository.observeAllDirectChats() + .subscribe(chats::setValue)); } - public LiveData> getChats() { + public LiveData> getChats() { return chats; } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java index 9440ae8..094bae9 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsFragment.java @@ -17,7 +17,7 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.entity.Account; import butterknife.BindView; import butterknife.ButterKnife; @@ -109,8 +109,8 @@ public class AccountsFragment extends Fragment { * >Communicating with Other Fragments for more information. */ public interface OnAccountListItemClickListener { - void onAccountListItemClick(AccountModel item); + void onAccountListItemClick(Account item); - void onAccountListItemLongClick(AccountModel item); + void onAccountListItemLongClick(Account item); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java index deba1d2..564494e 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/AccountsRecyclerViewAdapter.java @@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.AccountModel; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.login.AccountsFragment.OnAccountListItemClickListener; import org.mercury_im.messenger.util.AbstractDiffCallback; import org.mercury_im.messenger.util.ColorUtil; @@ -23,7 +23,7 @@ import java.util.List; public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - private final List mValues; + private final List mValues; private final OnAccountListItemClickListener mListener; private final AccountsViewModel viewModel; @@ -42,11 +42,11 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { viewModel.toggleAccountEnabled(account); }); @@ -54,18 +54,18 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { if (null != mListener) { - mListener.onAccountListItemLongClick(holder.accountModel); + mListener.onAccountListItemLongClick(holder.account); } return true; }); } - public void setValues(List values) { + public void setValues(List values) { DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AccountsDiffCallback(values, mValues), true); mValues.clear(); mValues.addAll(values); @@ -79,7 +79,7 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { + public class AccountsDiffCallback extends AbstractDiffCallback { - public AccountsDiffCallback(List newItems, List oldItems) { + public AccountsDiffCallback(List newItems, List oldItems) { super(newItems, oldItems); } @@ -109,8 +109,8 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter> accounts = new MutableLiveData<>(); + private final MutableLiveData> accounts = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); @Inject public AccountsViewModel(Application application) { super(application); MercuryImApplication.getApplication().getAppComponent().inject(this); - compositeDisposable.add(repository.getAll() - .subscribe(accountModels -> accounts.setValue(accountModels.toList()))); + compositeDisposable.add(repository.observeAllAccounts() + .subscribe(accounts::setValue)); } @Override @@ -44,19 +38,21 @@ public class AccountsViewModel extends AndroidViewModel { compositeDisposable.clear(); } - public LiveData> getAccounts() { + public LiveData> getAccounts() { return accounts; } - public void toggleAccountEnabled(AccountModel accountModel) { + public void toggleAccountEnabled(Account accountModel) { + /* MercuryConnection connection = connectionCenter.getConnection(accountModel); if (connection == null) { Toast.makeText(this.getApplication(), "MercuryConnection is null!", Toast.LENGTH_LONG).show(); return; } + */ accountModel.setEnabled(!accountModel.isEnabled()); - repository.upsert(accountModel) + repository.upsertAccount(accountModel) .subscribe(); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index 54a0bab..1a1f98d 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -15,7 +15,7 @@ import com.google.android.material.textfield.TextInputEditText; import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.data.model.AccountModel; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.util.TextChangedListener; import butterknife.BindView; @@ -121,18 +121,18 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito }); } - private void displayCredentials(LiveData account) { - account.observe(this, accountModel -> { - if (accountModel == null) { + private void displayCredentials(LiveData account) { + account.observe(this, accountEvent -> { + if (accountEvent == null) { return; } - if (accountModel.getAddress() != null) { - mJidView.setText(accountModel.getAddress()); + if (accountEvent.getAddress() != null) { + mJidView.setText(accountEvent.getAddress()); } - if (accountModel.getPassword() != null) { - mPasswordView.setText(accountModel.getPassword()); + if (accountEvent.getAuthentication() != null) { + mPasswordView.setText(accountEvent.getAuthentication().getPassword()); } }); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index 115a101..27decc0 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -1,7 +1,5 @@ package org.mercury_im.messenger.ui.login; -import static org.mercury_im.messenger.core.connection.MercuryConnection.TAG; - import android.text.TextUtils; import android.util.Log; @@ -16,9 +14,10 @@ import io.reactivex.observers.DisposableSingleObserver; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.core.centers.ConnectionCenter; -import org.mercury_im.messenger.data.model.AccountModel; import org.mercury_im.messenger.data.repository.AccountRepository; +import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.entity.IAccount; +import org.mercury_im.messenger.entity.PasswordAuthentication; import javax.inject.Inject; @@ -27,8 +26,8 @@ public class LoginViewModel extends ViewModel { @Inject AccountRepository accountRepository; - @Inject - ConnectionCenter connectionCenter; + // @Inject + // ConnectionCenter connectionCenter; private String jid; private String password; @@ -36,14 +35,14 @@ public class LoginViewModel extends ViewModel { private MutableLiveData jidError = new MutableLiveData<>(); private MutableLiveData passwordError = new MutableLiveData<>(); - private MutableLiveData account = new MutableLiveData<>(); + private MutableLiveData account = new MutableLiveData<>(); private MutableLiveData signinSuccessful = new MutableLiveData<>(); public LoginViewModel() { super(); MercuryImApplication.getApplication().getAppComponent().inject(this); - init(new AccountModel()); + init(new IAccount()); } public LiveData getSigninSuccessful() { @@ -95,18 +94,18 @@ public class LoginViewModel extends ViewModel { return !password.isEmpty(); } - public void init(@NonNull AccountModel account) { + public void init(@NonNull Account account) { this.account.setValue(account); } - public MutableLiveData getAccount() { + public MutableLiveData getAccount() { return account; } public void login() { - AccountModel account = getAccount().getValue(); - if (account != null && account.getJid() != null && !TextUtils.isEmpty(account.getPassword())) { - accountRepository.upsert(account); + Account account = getAccount().getValue(); + if (account != null && account.getAddress() != null && !TextUtils.isEmpty(account.getAuthentication().getPassword())) { + accountRepository.upsertAccount(account); } } @@ -129,22 +128,22 @@ public class LoginViewModel extends ViewModel { } if (loginIntact) { - AccountModel accountModel = new AccountModel(); - accountModel.setEnabled(true); - accountModel.setJid(bareJid); - accountModel.setPassword(password); - Single insert = accountRepository.upsert(accountModel); - insert.subscribe(new DisposableSingleObserver() { + Account account = new IAccount(); + account.setEnabled(true); + account.setAddress(bareJid.toString()); + account.setAuthentication(new PasswordAuthentication(password)); + Single insert = accountRepository.upsertAccount(account); + insert.subscribe(new DisposableSingleObserver() { @Override - public void onSuccess(AccountModel inserted) { + public void onSuccess(Account inserted) { Log.d(MercuryImApplication.TAG, "LoginActivity.loginDetailsEntered: Account " + inserted.getId() + " inserted."); - connectionCenter.createConnection(accountModel); + // connectionCenter.createConnection(account); signinSuccessful.setValue(true); } @Override public void onError(Throwable e) { - Log.e(TAG, "Could not insert new Account data.", e); + Log.e("Mercury", "Could not insert new Account data.", e); } }); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java index 8115d00..d12eece 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListFragment.java @@ -12,7 +12,6 @@ import android.widget.Toast; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; -import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java index baa12ad..ea26a71 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListItemViewModel.java @@ -6,17 +6,17 @@ import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; -import org.mercury_im.messenger.xmpp.model.ContactModel; -import org.mercury_im.messenger.data.repository.XmppPeerRepository; +import org.mercury_im.messenger.data.repository.PeerRepository; +import org.mercury_im.messenger.entity.contact.Peer; import javax.inject.Inject; public class ContactListItemViewModel extends AndroidViewModel { @Inject - XmppPeerRepository contactRepository; + PeerRepository contactRepository; - private LiveData contact; + private LiveData contact; @Inject public ContactListItemViewModel(@NonNull Application application) { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java index 352e9ab..f6d075c 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListRecyclerViewAdapter.java @@ -11,9 +11,8 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import org.jxmpp.jid.EntityBareJid; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.xmpp.model.ContactModel; +import org.mercury_im.messenger.entity.contact.Peer; import org.mercury_im.messenger.ui.chat.ChatActivity; import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter; import org.mercury_im.messenger.util.ColorUtil; @@ -24,7 +23,7 @@ import butterknife.BindView; import butterknife.ButterKnife; public class ContactListRecyclerViewAdapter - extends AbstractRecyclerViewAdapter { + extends AbstractRecyclerViewAdapter { public ContactListRecyclerViewAdapter() { super(new ContactDiffCallback()); @@ -39,8 +38,8 @@ public class ContactListRecyclerViewAdapter @Override public void onBindViewHolder(@NonNull RosterItemViewHolder holder, int position) { - ContactModel model = getModelAt(position); - holder.bind(model); + Peer peer = getItemAt(position); + holder.bind(peer); } public class RosterItemViewHolder extends RecyclerView.ViewHolder { @@ -65,38 +64,38 @@ public class ContactListRecyclerViewAdapter ButterKnife.bind(this, view); } - void bind(ContactModel contactModel) { - String name = contactModel.getRostername(); - nameView.setText(name != null ? name : contactModel.getEntity().getJid().getLocalpart().asUnescapedString()); - EntityBareJid jid = contactModel.getEntity().getJid(); - jidView.setText(jid.toString()); - avatarView.setColorFilter(ColorUtil.consistentColor(jid.toString())); + void bind(Peer contact) { + String name = contact.getName(); + String address = contact.getAddress(); + nameView.setText(name != null ? name : address); + jidView.setText(address); + avatarView.setColorFilter(ColorUtil.consistentColor(address)); view.setOnClickListener(view -> { Intent intent = new Intent(context, ChatActivity.class); - intent.putExtra(ChatActivity.EXTRA_JID, jid.toString()); - intent.putExtra(ChatActivity.EXTRA_ACCOUNT, contactModel.getEntity().getAccount().getId()); + intent.putExtra(ChatActivity.EXTRA_JID, address); + intent.putExtra(ChatActivity.EXTRA_ACCOUNT, contact.getAccount().getId()); context.startActivity(intent); }); } } - private static class ContactDiffCallback extends AbstractDiffCallback { + private static class ContactDiffCallback extends AbstractDiffCallback { ContactDiffCallback() { super(true); } @Override - public boolean areItemsTheSame(ContactModel oldItem, ContactModel newItem) { + public boolean areItemsTheSame(Peer oldItem, Peer newItem) { return oldItem.getId() == newItem.getId(); } @Override - public boolean areContentsTheSame(ContactModel oldItem, ContactModel newItem) { + public boolean areContentsTheSame(Peer oldItem, Peer newItem) { return areItemsTheSame(oldItem, newItem) && - Objects.equals(oldItem.getRostername(), newItem.getRostername()); + Objects.equals(oldItem.getName(), newItem.getName()); } } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java index 1c04349..5f4904d 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/roster/contacts/ContactListViewModel.java @@ -7,16 +7,14 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.mercury_im.messenger.MercuryImApplication; -import org.mercury_im.messenger.xmpp.model.ContactModel; import org.mercury_im.messenger.data.repository.XmppPeerRepository; +import org.mercury_im.messenger.entity.contact.Peer; import java.util.List; import javax.inject.Inject; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.schedulers.Schedulers; public class ContactListViewModel extends ViewModel { @@ -24,7 +22,7 @@ public class ContactListViewModel extends ViewModel { @Inject XmppPeerRepository xmppContactRepository; - private final MutableLiveData> rosterEntryList = new MutableLiveData<>(); + private final MutableLiveData> rosterEntryList = new MutableLiveData<>(); private final CompositeDisposable compositeDisposable = new CompositeDisposable(); public ContactListViewModel() { @@ -32,11 +30,8 @@ public class ContactListViewModel extends ViewModel { MercuryImApplication.getApplication().getAppComponent().inject(this); Log.d("ContactListViewModel", "Start observing database"); // Subscribe to changes to the contacts table and update the LiveData object for the UI. - compositeDisposable.add(xmppContactRepository.getAllContacts() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(o -> { - List list = o.toList(); + compositeDisposable.add(xmppContactRepository.observeAllPeers() + .subscribe(list -> { Log.d("ContactListViewModel", "Room changed contacts: " + list.size()); rosterEntryList.setValue(list); })); @@ -48,7 +43,7 @@ public class ContactListViewModel extends ViewModel { compositeDisposable.clear(); } - public LiveData> getRosterEntryList() { + public LiveData> getRosterEntryList() { return rosterEntryList; } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java index 2b23247..8301ff9 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/util/AbstractRecyclerViewAdapter.java @@ -27,7 +27,7 @@ public abstract class AbstractRecyclerViewAdapter getOrCreatePeer(long accountId, String address) { + return accountRepository.getAccount(accountId).toSingle() + .flatMap(account -> getOrCreatePeer(account, address)); + } + @Override public Maybe getPeerByAddress(long accountId, String address) { return data().select(PeerModel.class) diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java index 57469b1..8e081e0 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/PeerRepository.java @@ -15,6 +15,10 @@ public interface PeerRepository { Single insertPeer(Peer Peer); + default Observable> observePeer(Peer peer) { + return observePeer(peer.getId()); + } + Observable> observePeer(long PeerId); Maybe getPeer(long PeerId); @@ -33,6 +37,8 @@ public interface PeerRepository { Single getOrCreatePeer(Account account, String address); + Single getOrCreatePeer(long accountId, String address); + Observable> observeAllPeers(); Single updatePeer(Peer Peer); diff --git a/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java b/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java deleted file mode 100644 index e06803d..0000000 --- a/domain/src/main/java/org/mercury_im/messenger/di/component/MessengerComponent.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.mercury_im.messenger.di.component; - -import org.mercury_im.messenger.Messenger; - -import javax.inject.Singleton; - -import dagger.Component; - -@Singleton -@Component -public interface MessengerComponent { - - void inject(Messenger messenger); -}