From 7e2fe55b56c0b9c9b2b3f8fa99c926c08b0b0876 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 21 Dec 2019 04:08:59 +0100 Subject: [PATCH] More account management refactoring --- .../ui/account/AccountsFragment.java | 4 ++ .../account/AccountsRecyclerViewAdapter.java | 68 +++++++++---------- .../ui/account/AccountsViewModel.java | 12 +--- .../ui/account/AddAccountDialog.java | 21 ------ .../messenger/ui/account/LoginActivity.java | 16 ----- .../messenger/ui/account/LoginViewModel.java | 33 +++++---- .../mercury_im/messenger/entity/Account.java | 4 ++ 7 files changed, 62 insertions(+), 96 deletions(-) delete mode 100644 app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java index d391154..59a4208 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsFragment.java @@ -54,6 +54,10 @@ public class AccountsFragment extends Fragment { @Override public void onResume() { super.onResume(); + observeViewModel(); + } + + private void observeViewModel() { viewModel.getAccounts().observe(this, adapter::setValues); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java index c0ab5e8..6723b91 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter.java @@ -1,6 +1,5 @@ package org.mercury_im.messenger.ui.account; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,7 +10,6 @@ import android.widget.TextView; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; -import org.mercury_im.messenger.Messenger; import org.mercury_im.messenger.R; import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.ui.avatar.AvatarDrawable; @@ -23,13 +21,12 @@ import java.util.List; public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - private final List mValues; - private final OnAccountListItemClickListener mListener; + private final List accounts = new ArrayList<>(); + private final OnAccountListItemClickListener onAccountClickListener; private final AccountsViewModel viewModel; public AccountsRecyclerViewAdapter(AccountsViewModel viewModel, OnAccountListItemClickListener listener) { - mValues = new ArrayList<>(); - mListener = listener; + onAccountClickListener = listener; this.viewModel = viewModel; } @@ -40,43 +37,40 @@ public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter { - viewModel.toggleAccountEnabled(account); - }); - holder.mView.setOnClickListener(v -> { - if (null != mListener) { - // Notify the active callbacks interface (the activity, if the - // fragment is attached to one) that an item has been selected. - mListener.onAccountListItemClick(holder.account); - } - }); - holder.mView.setOnLongClickListener(v -> { - if (null != mListener) { - mListener.onAccountListItemLongClick(holder.account); - } - return true; - }); - } - public void setValues(List values) { - Log.d("AAAAA", "New values: " + values.size()); - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AccountsDiffCallback(values, mValues), true); - mValues.clear(); - mValues.addAll(values); + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AccountsDiffCallback(values, accounts), true); + accounts.clear(); + accounts.addAll(values); diffResult.dispatchUpdatesTo(this); } @Override public int getItemCount() { - Log.d(Messenger.TAG, "Accounts Item Count: " + mValues.size()); - return mValues.size(); + return accounts.size(); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + Account account = accounts.get(position); + + holder.account = account; + holder.jid.setText(account.getAddress()); + holder.avatar.setImageDrawable(new AvatarDrawable(account.getAddress(), account.getAddress())); + holder.enabled.setChecked(account.isEnabled()); + holder.enabled.setOnCheckedChangeListener((compoundButton, checked) -> viewModel.setAccountEnabled(account, checked)); + + holder.mView.setOnClickListener(v -> { + if (null != onAccountClickListener) { + onAccountClickListener.onAccountListItemClick(holder.account); + } + }); + + holder.mView.setOnLongClickListener(v -> { + if (null != onAccountClickListener) { + onAccountClickListener.onAccountListItemLongClick(holder.account); + } + return true; + }); } public class ViewHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java index 57030d3..090de68 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsViewModel.java @@ -42,16 +42,8 @@ public class AccountsViewModel extends AndroidViewModel { return accounts; } - public void toggleAccountEnabled(Account accountModel) { - /* - MercuryConnection connection = connectionCenter.getConnection(accountModel); - if (connection == null) { - Toast.makeText(this.getApplication(), "MercuryConnection is null!", Toast.LENGTH_LONG).show(); - return; - } - */ - - accountModel.setEnabled(!accountModel.isEnabled()); + public void setAccountEnabled(Account accountModel, boolean enabled) { + accountModel.setEnabled(enabled); repository.upsertAccount(accountModel) .subscribe(); } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java b/app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java deleted file mode 100644 index 65aa6e5..0000000 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/AddAccountDialog.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.mercury_im.messenger.ui.account; - -import android.content.Context; -import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; - -public class AddAccountDialog extends AlertDialog { - - protected AddAccountDialog(@NonNull Context context, int themeResId) { - super(context, themeResId); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - } - -} diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java index 9555957..2211ef8 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginActivity.java @@ -118,22 +118,6 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito } } - private void displayCredentials(LiveData account) { - account.observe(this, accountEvent -> { - if (accountEvent == null) { - return; - } - - if (accountEvent.getAddress() != null) { - addressView.setText(accountEvent.getAddress()); - } - - if (accountEvent.getPassword() != null) { - passwordView.setText(accountEvent.getPassword()); - } - }); - } - private void setupTextInputListeners() { addressView.setOnEditorActionListener(this); passwordView.setOnEditorActionListener(this); diff --git a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java index 3f01d26..9e21544 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java @@ -19,14 +19,17 @@ import org.mercury_im.messenger.R; import javax.inject.Inject; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; public class LoginViewModel extends AndroidViewModel { private MutableLiveData usernameError = new MutableLiveData<>(new Error()); private MutableLiveData passwordError = new MutableLiveData<>(new Error()); - private MutableLiveData loginEnabled = new MutableLiveData<>(false); - private MutableLiveData loginSuccessful = new MutableLiveData<>(false); + private MutableLiveData loginButtonEnabled = new MutableLiveData<>(false); + private MutableLiveData loginCompleted = new MutableLiveData<>(false); + + private final CompositeDisposable disposable = new CompositeDisposable(); private EntityBareJid username; private String password; @@ -66,36 +69,42 @@ public class LoginViewModel extends AndroidViewModel { } private void updateLoginEnabled() { - loginEnabled.setValue(username != null && !(password == null || password.isEmpty())); + loginButtonEnabled.setValue(username != null && !(password == null || password.isEmpty())); } public synchronized void login() { - if (!loginEnabled.getValue()) { + if (!loginButtonEnabled.getValue()) { // Prevent race condition where account would be logged in twice return; } - loginEnabled.setValue(false); - messenger.addAccount() + loginButtonEnabled.setValue(false); + disposable.add(messenger.addAccount() .setAddress(username.asEntityBareJidString()) .setPassword(password) .loginAndStoreAccountIfSuccessful() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) - .doOnComplete(() -> loginSuccessful.setValue(true)) + .doOnComplete(() -> loginCompleted.setValue(true)) .doOnError(this::handleConnectionError) - .subscribe(); + .subscribe()); } private void handleConnectionError(Throwable error) { if (error instanceof SASLErrorException) { passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_incorrect_password))); - loginEnabled.setValue(true); + loginButtonEnabled.setValue(true); } else { Toast.makeText(getApplication(), "A connection error occurred", Toast.LENGTH_LONG).show(); - loginEnabled.setValue(true); + loginButtonEnabled.setValue(true); } } + @Override + protected void onCleared() { + super.onCleared(); + disposable.clear(); + } + public LiveData getPasswordError() { return passwordError; } @@ -105,11 +114,11 @@ public class LoginViewModel extends AndroidViewModel { } public LiveData isLoginSuccessful() { - return loginSuccessful; + return loginCompleted; } public LiveData isLoginEnabled() { - return loginEnabled; + return loginButtonEnabled; } public static class Error { diff --git a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java index 3d90113..44593cc 100644 --- a/entity/src/main/java/org/mercury_im/messenger/entity/Account.java +++ b/entity/src/main/java/org/mercury_im/messenger/entity/Account.java @@ -30,4 +30,8 @@ public interface Account { void setEnabled(boolean enabled); boolean isEnabled(); + + default String displayName() { + return getAddress(); + } }