From 10ed5348763a2d1b03947be5b77430abe9d702a9 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 16 May 2020 17:13:51 +0200 Subject: [PATCH] Wip: Work on enabling accounts from accounts fragment --- .../ui/account/AccountsFragment.java | 10 +--- .../account/AccountsRecyclerViewAdapter.java | 48 +++++++------------ .../ui/account/AccountsViewModel.java | 18 +++++++ .../messenger/ui/account/LoginViewModel.java | 6 +-- .../messenger/xmpp/MercuryConnection.java | 18 ++++--- .../messenger/xmpp/state/ConnectionState.java | 3 +- .../messenger/entity/chat/GroupChat.java | 2 + .../messenger/entity/message/Message.java | 2 - gradle.properties | 2 +- libs/Smack | 2 +- version.gradle | 3 +- 11 files changed, 54 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java index 1abd5c6..109a19e 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java @@ -64,14 +64,8 @@ public class AccountsFragment extends Fragment { } private void observeViewModel() { - viewModel.getConnectionPool().observe(this, pool -> { - Collection connectionStateList = pool.getConnectionStates().values(); - List connections = new ArrayList<>(connectionStateList.size()); - for (ConnectionState state : connectionStateList) { - connections.add(state.getConnection()); - } - adapter.setValues(connections); - }); + viewModel.getConnectionPool().observe(this, pool -> + adapter.setValues(new ArrayList<>(pool.getConnectionStates().values()))); } @Override diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java index 567a73e..6656eb0 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java @@ -7,7 +7,6 @@ import android.widget.ImageView; import android.widget.Switch; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; @@ -18,15 +17,14 @@ import org.mercury_im.messenger.ui.avatar.AvatarDrawable; import org.mercury_im.messenger.ui.account.AccountsFragment.OnAccountListItemClickListener; import org.mercury_im.messenger.util.AbstractDiffCallback; import org.mercury_im.messenger.xmpp.MercuryConnection; +import org.mercury_im.messenger.xmpp.state.ConnectionState; import java.util.ArrayList; import java.util.List; -import io.reactivex.android.schedulers.AndroidSchedulers; - public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - private final List connections = new ArrayList<>(); + private final List connectionStates = new ArrayList<>(); private final OnAccountListItemClickListener onAccountClickListener; private final AccountsViewModel viewModel; @@ -43,22 +41,23 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter values) { + public void setValues(List values) { DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff( - new AccountsDiffCallback(values, connections), true); - connections.clear(); - connections.addAll(values); + new AccountsDiffCallback(values, connectionStates), true); + connectionStates.clear(); + connectionStates.addAll(values); diffResult.dispatchUpdatesTo(this); } @Override public int getItemCount() { - return connections.size(); + return connectionStates.size(); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { - MercuryConnection connection = connections.get(position); + ConnectionState state = connectionStates.get(position); + MercuryConnection connection = state.getConnection(); Account account = connection.getAccount(); holder.account = account; @@ -67,23 +66,7 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter viewModel.setAccountEnabled(account, checked)); - - setClickListenersOnViewHolder(holder); - } - - private void setClickListenersOnViewHolder(ViewHolder holder) { - holder.mView.setOnClickListener(v -> { - if (null != onAccountClickListener) { - onAccountClickListener.onAccountListItemClick(holder.account); - } - }); - - holder.mView.setOnLongClickListener(v -> { - if (null != onAccountClickListener) { - onAccountClickListener.onAccountListItemLongClick(holder.account); - } - return true; - }); + holder.status.setText(state.getConnectivity().toString()); } class ViewHolder extends RecyclerView.ViewHolder { @@ -104,21 +87,22 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { + public class AccountsDiffCallback extends AbstractDiffCallback { - public AccountsDiffCallback(List newItems, List oldItems) { + public AccountsDiffCallback(List newItems, List oldItems) { super(newItems, oldItems); } @Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { - return oldItems.get(oldItemPosition).getAccount().getId().equals(newItems.get(newItemPosition).getAccount().getId()); + return oldItems.get(oldItemPosition).getConnection().getAccount().getId() + .equals(newItems.get(newItemPosition).getConnection().getAccount().getId()); } @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { - Account oldM = oldItems.get(oldItemPosition).getAccount(); - Account newM = newItems.get(newItemPosition).getAccount(); + ConnectionState oldM = oldItems.get(oldItemPosition); + ConnectionState newM = newItems.get(newItemPosition); return oldM.equals(newM); } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java index dfb2753..fbdfe34 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java @@ -10,11 +10,17 @@ import org.mercury_im.messenger.MercuryImApplication; import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.data.repository.AccountRepository; import org.mercury_im.messenger.entity.Account; +import org.mercury_im.messenger.xmpp.MercuryConnection; +import org.mercury_im.messenger.xmpp.exception.InvalidCredentialsException; +import org.mercury_im.messenger.xmpp.exception.ServerUnreachableException; import org.mercury_im.messenger.xmpp.state.ConnectionPoolState; import javax.inject.Inject; +import io.reactivex.Scheduler; +import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; public class AccountsViewModel extends AndroidViewModel { @@ -54,5 +60,17 @@ public class AccountsViewModel extends AndroidViewModel { accountModel.setEnabled(enabled); repository.upsertAccount(accountModel) .subscribe(); + MercuryConnection connection = messenger.getConnectionManager().getConnection(accountModel); + if (connection != null) { + if (enabled) { + connection.connect() + .andThen(connection.login()) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + } else { + connection.shutdown(); + } + } } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java index 36f8359..1121c74 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java @@ -24,6 +24,7 @@ import java.util.logging.Logger; import javax.inject.Inject; import io.reactivex.Completable; +import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; @@ -88,9 +89,8 @@ public class LoginViewModel extends AndroidViewModel { account.setAddress(username.asUnescapedString()); account.setPassword(password); MercuryConnection connection = messenger.getConnectionManager().createConnection(account); - disposable.add(Completable.fromAction(() -> { - connection.connect().login(); - }) + disposable.add(connection.connect() + .andThen(connection.login()) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnComplete(this::signalLoginSuccessful) diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java index c91454e..e5a73f3 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/MercuryConnection.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.util.UUID; import java.util.logging.Logger; +import io.reactivex.Completable; import io.reactivex.Observable; import io.reactivex.subjects.BehaviorSubject; import lombok.Getter; @@ -48,19 +49,17 @@ public class MercuryConnection { return state; } - public MercuryConnection connect() throws ServerUnreachableException { + public Completable connect() { if (getConnection().isConnected()) { - return this; + return Completable.complete(); } - doConnect(); - return this; + return Completable.fromAction(this::doConnect); } - private MercuryConnection doConnect() throws ServerUnreachableException { + private void doConnect() throws ServerUnreachableException { AbstractXMPPConnection connection = (AbstractXMPPConnection) getConnection(); try { connection.connect(); - return this; } catch (SmackException.EndpointConnectionException e) { connection.disconnect(); throw new ServerUnreachableException("Cannot connect to server " + connection.getXMPPServiceDomain().asUnescapedString(), e); @@ -69,16 +68,15 @@ public class MercuryConnection { } } - public void login() throws ServerUnreachableException, InvalidCredentialsException { + public Completable login() { if (getConnection().isAuthenticated()) { - return; + return Completable.complete(); } - doLogin(); + return Completable.fromAction(this::doLogin); } private void doLogin() throws InvalidCredentialsException, ServerUnreachableException { try { - connect(); ((AbstractXMPPConnection) getConnection()).login(); } catch (SASLErrorException e) { throw new InvalidCredentialsException("Credentials of account " + account.getId() + " are invalid.", e); diff --git a/domain/src/main/java/org/mercury_im/messenger/xmpp/state/ConnectionState.java b/domain/src/main/java/org/mercury_im/messenger/xmpp/state/ConnectionState.java index c6e2d67..b825286 100644 --- a/domain/src/main/java/org/mercury_im/messenger/xmpp/state/ConnectionState.java +++ b/domain/src/main/java/org/mercury_im/messenger/xmpp/state/ConnectionState.java @@ -1,16 +1,17 @@ package org.mercury_im.messenger.xmpp.state; -import org.jivesoftware.smack.XMPPConnection; import org.mercury_im.messenger.xmpp.MercuryConnection; import java.util.UUID; +import lombok.EqualsAndHashCode; import lombok.ToString; import lombok.Value; import lombok.With; @Value @ToString +@EqualsAndHashCode public class ConnectionState { UUID id; diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java b/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java index 1105524..9cab193 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/chat/GroupChat.java @@ -5,11 +5,13 @@ import org.mercury_im.messenger.entity.contact.Peer; import java.util.Set; import lombok.Data; +import lombok.EqualsAndHashCode; /** * An interface that describes a group chat entity. */ @Data +@EqualsAndHashCode(callSuper = true) public class GroupChat extends Chat { Set participants; String roomAddress; diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java index 36ea7cd..5120582 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/message/Message.java @@ -4,9 +4,7 @@ import java.util.Date; import java.util.List; import java.util.UUID; -import lombok.AllArgsConstructor; import lombok.Data; -import lombok.With; @Data public class Message { diff --git a/gradle.properties b/gradle.properties index dbf9c12..5f193ab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -android.enableJetifier=true +android.enableJetifier=false android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. diff --git a/libs/Smack b/libs/Smack index e797108..f00acbf 160000 --- a/libs/Smack +++ b/libs/Smack @@ -1 +1 @@ -Subproject commit e79710840be6d6b3301e078a23688eafaa06013c +Subproject commit f00acbff891ba0edd0a51e7147e0e07d0de7e4b5 diff --git a/version.gradle b/version.gradle index cb6289a..fbc1140 100644 --- a/version.gradle +++ b/version.gradle @@ -1,7 +1,6 @@ ext { - apply from: 'libs/Smack/version.gradle' - + shortVersion = 1 // Smack Versions // Quickly switch between unique and normal releases using the toggle below