From 6b61725c6ae36453c6d07861b8ed79f912fcd916 Mon Sep 17 00:00:00 2001 From: Daniel Lublin Date: Wed, 3 Feb 2021 15:33:42 +0100 Subject: [PATCH] Condition display of progressbar on a isCreatingAccount LiveData MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Avoiding the mess with saving onSaveInstanceState, and the (in this case) unwanted restoring of it upon back-button tap. Closes #1919 Test instructions: - Precondition: fresh install, setting up a new account - Testing specific bug fix: - Choose a name, tap next - Choose a password, tap next - Not testable on some devices which display "Create account" instead of "Next" - You are now on Background connections screen - Tap Back-button ◁ - Ensure that password can be changed again - During setup process, rotate device and ensure that: - entered text is kept - progressbar is continuously displayed --- .../briar/android/account/DozeFragment.java | 20 ++++++------- .../android/account/SetPasswordFragment.java | 28 ++++++++----------- .../briar/android/account/SetupFragment.java | 26 ----------------- .../briar/android/account/SetupViewModel.java | 9 ++++++ 4 files changed, 30 insertions(+), 53 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/DozeFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/account/DozeFragment.java index e51c9497d..94f5feb1f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/account/DozeFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/DozeFragment.java @@ -33,7 +33,6 @@ public class DozeFragment extends SetupFragment private DozeView dozeView; private HuaweiView huaweiView; private Button next; - private ProgressBar progressBar; private boolean secondAttempt = false; public static DozeFragment newInstance() { @@ -58,11 +57,19 @@ public class DozeFragment extends SetupFragment huaweiView = v.findViewById(R.id.huaweiView); huaweiView.setOnCheckedChangedListener(this); next = v.findViewById(R.id.next); - progressBar = v.findViewById(R.id.progress); + ProgressBar progressBar = v.findViewById(R.id.progress); dozeView.setOnButtonClickListener(this::askForDozeWhitelisting); next.setOnClickListener(this); + viewModel.getIsCreatingAccount() + .observe(getViewLifecycleOwner(), isCreatingAccount -> { + if (isCreatingAccount) { + next.setVisibility(INVISIBLE); + progressBar.setVisibility(VISIBLE); + } + }); + return v; } @@ -104,15 +111,6 @@ public class DozeFragment extends SetupFragment @Override public void onClick(View view) { - setNextClicked(); viewModel.dozeExceptionConfirmed(); } - - @Override - void setNextClicked() { - super.setNextClicked(); - - next.setVisibility(INVISIBLE); - progressBar.setVisibility(VISIBLE); - } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/SetPasswordFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/account/SetPasswordFragment.java index d7cb2b385..94dc5fb13 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/account/SetPasswordFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/SetPasswordFragment.java @@ -38,7 +38,6 @@ public class SetPasswordFragment extends SetupFragment { private TextInputEditText passwordConfirmation; private StrengthMeter strengthMeter; private Button nextButton; - private ProgressBar progressBar; public static SetPasswordFragment newInstance() { return new SetPasswordFragment(); @@ -64,7 +63,7 @@ public class SetPasswordFragment extends SetupFragment { v.findViewById(R.id.password_confirm_wrapper); passwordConfirmation = v.findViewById(R.id.password_confirm); nextButton = v.findViewById(R.id.next); - progressBar = v.findViewById(R.id.progress); + ProgressBar progressBar = v.findViewById(R.id.progress); passwordEntry.addTextChangedListener(this); passwordConfirmation.addTextChangedListener(this); @@ -75,6 +74,17 @@ public class SetPasswordFragment extends SetupFragment { passwordConfirmation.setImeOptions(IME_ACTION_DONE); } + viewModel.getIsCreatingAccount() + .observe(getViewLifecycleOwner(), isCreatingAccount -> { + if (isCreatingAccount) { + nextButton.setVisibility(INVISIBLE); + progressBar.setVisibility(VISIBLE); + // this also avoids the keyboard popping up + passwordEntry.setFocusable(false); + passwordConfirmation.setFocusable(false); + } + }); + return v; } @@ -116,20 +126,6 @@ public class SetPasswordFragment extends SetupFragment { IBinder token = passwordEntry.getWindowToken(); Object o = getContext().getSystemService(INPUT_METHOD_SERVICE); ((InputMethodManager) o).hideSoftInputFromWindow(token, 0); - - setNextClicked(); viewModel.setPassword(passwordEntry.getText().toString()); } - - @Override - void setNextClicked() { - super.setNextClicked(); - - passwordEntry.setFocusable(false); - passwordConfirmation.setFocusable(false); - if (!viewModel.needToShowDozeFragment()) { - nextButton.setVisibility(INVISIBLE); - progressBar.setVisibility(VISIBLE); - } - } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/SetupFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/account/SetupFragment.java index dac85947b..decd7d009 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/account/SetupFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/SetupFragment.java @@ -7,7 +7,6 @@ import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; @@ -19,8 +18,6 @@ import org.briarproject.briar.android.fragment.BaseFragment; import javax.inject.Inject; -import androidx.annotation.CallSuper; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; @@ -35,7 +32,6 @@ abstract class SetupFragment extends BaseFragment implements TextWatcher, OnEditorActionListener, OnClickListener { private final static String STATE_KEY_CLICKED = "setupFragmentClicked"; - private boolean clicked = false; @Inject ViewModelProvider.Factory viewModelFactory; @@ -48,27 +44,6 @@ abstract class SetupFragment extends BaseFragment implements TextWatcher, .get(SetupViewModel.class); } - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - if (savedInstanceState != null) { - clicked = savedInstanceState.getBoolean(STATE_KEY_CLICKED); - } - if (clicked) { - setNextClicked(); - } - } - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - outState.putBoolean(STATE_KEY_CLICKED, clicked); - } - - @CallSuper - void setNextClicked() { - this.clicked = true; - } - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.help_action, menu); @@ -114,5 +89,4 @@ abstract class SetupFragment extends BaseFragment implements TextWatcher, public void afterTextChanged(Editable editable) { // noop } - } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/SetupViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/account/SetupViewModel.java index d659e9475..322d4fd24 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/account/SetupViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/account/SetupViewModel.java @@ -17,6 +17,8 @@ import javax.inject.Inject; import androidx.annotation.Nullable; import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; import static java.util.logging.Logger.getLogger; import static org.briarproject.briar.android.account.SetupViewModel.State.AUTHOR_NAME; @@ -36,6 +38,8 @@ class SetupViewModel extends AndroidViewModel { @Nullable private String authorName, password; private final MutableLiveEvent state = new MutableLiveEvent<>(); + private final MutableLiveData isCreatingAccount = + new MutableLiveData<>(false); private final AccountManager accountManager; private final Executor ioExecutor; @@ -67,6 +71,10 @@ class SetupViewModel extends AndroidViewModel { return state; } + LiveData getIsCreatingAccount() { + return isCreatingAccount; + } + void setAuthorName(String authorName) { this.authorName = authorName; state.setEvent(SET_PASSWORD); @@ -97,6 +105,7 @@ class SetupViewModel extends AndroidViewModel { private void createAccount() { if (authorName == null) throw new IllegalStateException(); if (password == null) throw new IllegalStateException(); + isCreatingAccount.setValue(true); ioExecutor.execute(() -> { if (accountManager.createAccount(authorName, password)) { LOG.info("Created account");