diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsActivity.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsActivity.java index 94619fe..4458f84 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsActivity.java @@ -7,7 +7,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import org.mercury_im.messenger.R; -import org.mercury_im.messenger.android.crypto.ikey.IkeyBackupCreationFragment; +import org.mercury_im.messenger.android.ui.account.login.IkeyBackupCreationFragment; import org.mercury_im.messenger.android.ui.account.login.IkeyBackupRestoreOrSkipFragment; import org.mercury_im.messenger.android.ui.account.login.IkeyKeyInfoFragment; import org.mercury_im.messenger.android.ui.account.login.IkeySetupNavigator; diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java index a814891..2880f19 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/detail/AccountDetailsFragment.java @@ -23,7 +23,7 @@ import com.google.android.material.card.MaterialCardView; import org.mercury_im.messenger.R; import org.mercury_im.messenger.android.MercuryImApplication; -import org.mercury_im.messenger.android.crypto.ikey.IkeyBackupCreationFragment; +import org.mercury_im.messenger.android.ui.account.login.IkeyBackupCreationFragment; import org.mercury_im.messenger.android.ui.account.login.IkeySetupFragment; import org.mercury_im.messenger.android.ui.openpgp.ToggleableFingerprintsAdapter; import org.mercury_im.messenger.android.ui.openpgp.OpenPgpV4FingerprintFormatter; diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/list/AccountListFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/list/AccountListFragment.java index 8145d91..a3dc9b0 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/list/AccountListFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/list/AccountListFragment.java @@ -18,7 +18,6 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu import org.mercury_im.messenger.R; import org.mercury_im.messenger.android.ui.account.OnAccountListItemClickListener; import org.mercury_im.messenger.android.ui.account.login.AddAccountActivity; -import org.mercury_im.messenger.android.ui.account.login.AddAccountDialogFragment; import java.util.ArrayList; @@ -102,11 +101,6 @@ public class AccountListFragment extends Fragment implements SearchView.OnQueryT accountClickListener = null; } - private void displayAddAccountDialog() { - AddAccountDialogFragment addAccountDialogFragment = new AddAccountDialogFragment(); - addAccountDialogFragment.show(getParentFragmentManager(), "addAccount"); - } - @Override public boolean onQueryTextSubmit(String query) { return false; diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountActivity.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountActivity.java index e3ea5fd..2f6598f 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountActivity.java @@ -13,7 +13,6 @@ import androidx.viewpager2.widget.ViewPager2; import org.mercury_im.messenger.R; import org.mercury_im.messenger.android.MercuryImApplication; -import org.mercury_im.messenger.android.crypto.ikey.IkeyBackupCreationFragment; import org.mercury_im.messenger.android.di.component.AppComponent; import org.mercury_im.messenger.core.util.Optional; import org.mercury_im.messenger.entity.Account; diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountDialogFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountDialogFragment.java deleted file mode 100644 index 9fd8e8e..0000000 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AddAccountDialogFragment.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.mercury_im.messenger.android.ui.account.login; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.os.Bundle; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.inputmethod.EditorInfo; -import android.widget.Button; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatDialogFragment; - -import com.google.android.material.textfield.TextInputEditText; -import com.google.android.material.textfield.TextInputLayout; - -import org.mercury_im.messenger.android.MercuryImApplication; -import org.mercury_im.messenger.R; - -import butterknife.BindView; -import butterknife.ButterKnife; - -public class AddAccountDialogFragment extends AppCompatDialogFragment { - - @BindView(R.id.username) - TextInputEditText addressView; - - @BindView(R.id.username_layout) - TextInputLayout addressLayout; - - @BindView(R.id.password) - TextInputEditText passwordView; - - @BindView(R.id.password_layout) - TextInputLayout passwordLayout; - - private AndroidLoginViewModel viewModel; - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - LayoutInflater inflater = requireActivity().getLayoutInflater(); - View dialogView = inflater.inflate(R.layout.view_account_credentials, null); - ButterKnife.bind(this, dialogView); - - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - - builder.setTitle(R.string.action_add_account) - .setView(dialogView) - .setCancelable(false) - .setPositiveButton(R.string.action_sign_in, null) - .setNegativeButton(R.string.button_cancel, cancelButtonClickListener); - - return builder.create(); - } - - private final DialogInterface.OnClickListener cancelButtonClickListener = - (dialog, which) -> AddAccountDialogFragment.this.onCancel(dialog); - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - } - - @Override - public void onResume() { - super.onResume(); - final AlertDialog d = (AlertDialog)getDialog(); - if(d == null) { - return; - } - - viewModel = new AndroidLoginViewModel(MercuryImApplication.getApplication()); - - Button positiveButton = d.getButton(Dialog.BUTTON_POSITIVE); - positiveButton.setOnClickListener(v -> viewModel.onLoginButtonClicked()); - - viewModel.getLoginUsernameError().observe(this, error -> addressLayout.setError(error)); - viewModel.getLoginPasswordError().observe(this, error -> passwordLayout.setError(error)); - viewModel.isLoginButtonEnabled().observe(this, positiveButton::setEnabled); - - viewModel.isLoginFinished().observe(this, optAccount -> { - if (optAccount.isPresent()) { - dismiss(); - } - }); - - addressView.addTextChangedListener(viewModel.getUsernameTextChangedListener()); - passwordView.addTextChangedListener(viewModel.getPasswordTextChangedListener()); - - addressView.setOnEditorActionListener(focusPasswordFieldOnEnterPressed); - passwordView.setOnEditorActionListener(loginOnEnterPressed); - } - - private final TextView.OnEditorActionListener focusPasswordFieldOnEnterPressed = new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_NEXT) { - passwordView.requestFocus(); - return true; - } - return false; - } - }; - - private final TextView.OnEditorActionListener loginOnEnterPressed = new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL) { - viewModel.getCommonViewModel().login(); - return true; - } - return false; - } - }; - - @Override - public void onDestroy() { - super.onDestroy(); - } - -} diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AndroidLoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AndroidLoginViewModel.java index c3a7544..de67b4f 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AndroidLoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/AndroidLoginViewModel.java @@ -26,6 +26,7 @@ public class AndroidLoginViewModel extends AndroidViewModel implements MercuryAn private final MutableLiveData loginPasswordError = new MutableLiveData<>(); private final MutableLiveData loginButtonEnabled = new MutableLiveData<>(true); private final MutableLiveData> loginFinished = new MutableLiveData<>(new Optional<>()); + private final MutableLiveData displayProgressBar = new MutableLiveData<>(false); @Inject LoginViewModel commonViewModel; @@ -49,6 +50,8 @@ public class AndroidLoginViewModel extends AndroidViewModel implements MercuryAn .subscribe(loginButtonEnabled::setValue)); addDisposable(getCommonViewModel().isLoginSuccessful() .subscribe(loginFinished::setValue)); + addDisposable(getCommonViewModel().isDisplayProgressBar() + .subscribe(displayProgressBar::setValue)); } private final ObservableTransformer, Optional> usernameErrorToErrorMessage = @@ -120,6 +123,10 @@ public class AndroidLoginViewModel extends AndroidViewModel implements MercuryAn return loginFinished; } + public LiveData isDisplayProgressBar() { + return displayProgressBar; + } + @Override public LoginViewModel getCommonViewModel() { return commonViewModel; diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/EnterAccountDetailsFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/EnterAccountDetailsFragment.java index 005900a..5215bcd 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/EnterAccountDetailsFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/EnterAccountDetailsFragment.java @@ -76,8 +76,8 @@ public class EnterAccountDetailsFragment extends Fragment { viewModel.getLoginUsernameError().observe(this, error -> usernameLayout.setError(error)); viewModel.getLoginPasswordError().observe(this, error -> passwordLayout.setError(error)); viewModel.isLoginButtonEnabled().observe(this, loginButton::setEnabled); - viewModel.isLoginButtonEnabled().observe(this, enabled -> - progressBar.setVisibility(enabled ? View.GONE : View.VISIBLE)); + viewModel.isDisplayProgressBar().observe(this, visible -> + progressBar.setVisibility(visible ? View.VISIBLE : View.GONE)); viewModel.isLoginFinished().observe(this, optAccount -> ((AddAccountActivity) getActivity()).loginFinished(optAccount)); diff --git a/app/src/main/java/org/mercury_im/messenger/android/crypto/ikey/IkeyBackupCreationFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupCreationFragment.java similarity index 84% rename from app/src/main/java/org/mercury_im/messenger/android/crypto/ikey/IkeyBackupCreationFragment.java rename to app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupCreationFragment.java index 538de9a..d2addce 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/crypto/ikey/IkeyBackupCreationFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupCreationFragment.java @@ -1,4 +1,4 @@ -package org.mercury_im.messenger.android.crypto.ikey; +package org.mercury_im.messenger.android.ui.account.login; import androidx.lifecycle.ViewModelProvider; @@ -11,16 +11,13 @@ import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; -import org.bouncycastle.openpgp.PGPException; -import org.jivesoftware.smack.SmackException; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smackx.pubsub.PubSubException; import org.mercury_im.messenger.R; +import org.mercury_im.messenger.android.crypto.ikey.AndroidIkeyBackupCreationViewModel; -import java.io.IOException; import java.util.UUID; import butterknife.BindView; @@ -36,6 +33,9 @@ public class IkeyBackupCreationFragment extends Fragment { @BindView(R.id.qr_code) ImageView qrCode; + @BindView(R.id.btn_done) + Button doneButton; + private final UUID accountId; private IkeyBackupCreationFragment(UUID accountId) { @@ -60,10 +60,11 @@ public class IkeyBackupCreationFragment extends Fragment { viewModel = new ViewModelProvider(this).get(AndroidIkeyBackupCreationViewModel.class); viewModel.initialize(accountId); - viewModel.uploadBackup(); + viewModel.uploadBackup(); viewModel.getPassphrase().observe(getViewLifecycleOwner(), passphrase -> backupCode.setText(passphrase)); viewModel.getPassphraseAsQrCode().observe(getViewLifecycleOwner(), bitmap -> qrCode.setImageBitmap(bitmap)); + doneButton.setOnClickListener(v -> getActivity().finish()); } } diff --git a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupRestoreOrSkipFragment.java b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupRestoreOrSkipFragment.java index ed02721..206cf8e 100644 --- a/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupRestoreOrSkipFragment.java +++ b/app/src/main/java/org/mercury_im/messenger/android/ui/account/login/IkeyBackupRestoreOrSkipFragment.java @@ -16,8 +16,12 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import org.bouncycastle.openpgp.PGPException; import org.mercury_im.messenger.R; +import java.security.InvalidAlgorithmParameterException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; import java.util.UUID; import butterknife.BindView; @@ -66,8 +70,20 @@ public class IkeyBackupRestoreOrSkipFragment extends Fragment { viewModel = new ViewModelProvider(requireActivity()).get(AndroidIkeySetupViewModel.class); restoreButton.setOnClickListener(v -> onRestore()); - regenerateButton.setOnClickListener(v -> - ((IkeySetupNavigator) getActivity()).generateIkeyBackup(accountId)); + regenerateButton.setOnClickListener(v -> { + try { + viewModel.generateIdentityKey(); + } catch (PGPException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchProviderException e) { + e.printStackTrace(); + } catch (InvalidAlgorithmParameterException e) { + e.printStackTrace(); + } + ((IkeySetupNavigator) getActivity()).displayInfo(accountId); + }); viewModel.getPassphraseError().observe(this, opt -> { if (opt.isPresent()) { diff --git a/app/src/main/res/layout/fragment_contact_details.xml b/app/src/main/res/layout/fragment_contact_details.xml index afee307..8fb3d32 100644 --- a/app/src/main/res/layout/fragment_contact_details.xml +++ b/app/src/main/res/layout/fragment_contact_details.xml @@ -164,15 +164,18 @@ + android:layout_height="wrap_content" + + android:layout_marginTop="6dp" + android:layout_marginStart="12dp" + android:layout_marginEnd="12dp" + android:layout_marginBottom="6dp"> + android:padding="8dp"> + tools:context=".android.ui.account.login.IkeyBackupCreationFragment"> + + +