From 562bbc81931ce9233746e2f82e2293fd4646a572 Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Wed, 12 Apr 2023 14:41:35 +0800 Subject: [PATCH] [BiometricsV2] fix enrolling rotate failed Clean help message during progress changed, and reload help message from ViewModel in onStart of enrolling page. Bug: 275513362 Test: atest FingerprintEnrollProgressViewModelTest Test: enable biometrics v2, and manully rotate screen when help msg is shown, and check help msg is kept after screen rotation. Change-Id: I44220050806038ee62750f8945b8ba8f8bb9c282 --- ...ingerprintEnrollEnrollingSfpsFragment.java | 10 ++++- ...ngerprintEnrollEnrollingUdfpsFragment.java | 17 ++++++--- .../FingerprintEnrollProgressViewModel.java | 1 + ...ingerprintEnrollProgressViewModelTest.java | 38 +++++++++++++++++++ 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java index 720857c32b0..f2dad238b72 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java @@ -219,7 +219,13 @@ public class FingerprintEnrollEnrollingSfpsFragment extends Fragment { super.onStart(); startEnrollment(); updateProgress(false /* animate */, mProgressViewModel.getProgressLiveData().getValue()); - updateTitleAndDescription(); + final EnrollmentStatusMessage msg = mProgressViewModel.getHelpMessageLiveData().getValue(); + if (msg != null) { + onEnrollmentHelp(msg); + } else { + clearError(); + updateTitleAndDescription(); + } } @Override @@ -373,7 +379,7 @@ public class FingerprintEnrollEnrollingSfpsFragment extends Fragment { mView.setHeaderText(error); mView.getHeaderTextView().setContentDescription(error); new GlifLayoutHelper(getActivity(), mView).setDescriptionText(""); - if (!mHelpAnimation.isRunning()) { + if (isResumed() && !mHelpAnimation.isRunning()) { mHelpAnimation.start(); } applySfpsErrorDynamicColors(true); diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.java index 0fdfd2ee63e..40d571330d6 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.java @@ -105,7 +105,7 @@ public class FingerprintEnrollEnrollingUdfpsFragment extends Fragment { }; private final Observer mHelpMessageObserver = helpMessage -> { if (helpMessage != null) { - onEnrollmentHelp(helpMessage.getStr()); + onEnrollmentHelp(helpMessage); } }; private final Observer mErrorMessageObserver = errorMessage -> { @@ -198,7 +198,12 @@ public class FingerprintEnrollEnrollingUdfpsFragment extends Fragment { super.onStart(); startEnrollment(); updateProgress(false /* animate */, mProgressViewModel.getProgressLiveData().getValue()); - updateTitleAndDescription(); + final EnrollmentStatusMessage msg = mProgressViewModel.getHelpMessageLiveData().getValue(); + if (msg != null) { + onEnrollmentHelp(msg); + } else { + updateTitleAndDescription(); + } } @Override @@ -484,13 +489,13 @@ public class FingerprintEnrollEnrollingUdfpsFragment extends Fragment { } - private void onEnrollmentHelp(CharSequence helpString) { - if (!TextUtils.isEmpty(helpString)) { - showError(helpString); + private void onEnrollmentHelp(@NonNull EnrollmentStatusMessage helpMessage) { + final CharSequence helpStr = helpMessage.getStr(); + if (!TextUtils.isEmpty(helpStr)) { + showError(helpStr); mUdfpsEnrollView.onEnrollmentHelp(); } } - private void onEnrollmentError(@NonNull EnrollmentStatusMessage errorMessage) { removeEnrollmentObservers(); diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java index 695ea0d0c0f..d77d9d3f7e8 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java @@ -77,6 +77,7 @@ public class FingerprintEnrollProgressViewModel extends AndroidViewModel { Log.d(TAG, "onEnrollmentProgress(" + remaining + "), steps: " + currentSteps + ", post progress as " + progress); } + mHelpMessageLiveData.setValue(null); mProgressLiveData.postValue(progress); } diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java index 6190c5e3f8f..bdb45b0300f 100644 --- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java +++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java @@ -224,6 +224,44 @@ public class FingerprintEnrollProgressViewModelTest { assertThat(progress.getRemaining()).isEqualTo(0); } + @Test + public void testProgressUpdateClearHelpMessage() { + // Start enrollment + mViewModel.setToken(new byte[] { 1, 2, 3 }); + final boolean ret = mViewModel.startEnrollment(ENROLL_ENROLL); + assertThat(ret).isTrue(); + assertThat(mCallbackWrapper.mValue).isNotNull(); + final LiveData progressLiveData = mViewModel.getProgressLiveData(); + final LiveData helpMsgLiveData = + mViewModel.getHelpMessageLiveData(); + + // Update first progress + mCallbackWrapper.mValue.onEnrollmentProgress(25); + EnrollmentProgress progress = progressLiveData.getValue(); + assertThat(progress).isNotNull(); + assertThat(progress.getSteps()).isEqualTo(25); + assertThat(progress.getRemaining()).isEqualTo(25); + + // Update help message + final int testHelpMsgId = 3; + final String testHelpString = "Test Help String"; + mCallbackWrapper.mValue.onEnrollmentHelp(testHelpMsgId, testHelpString); + final EnrollmentStatusMessage helpMsg = helpMsgLiveData.getValue(); + assertThat(helpMsg).isNotNull(); + assertThat(helpMsg.getMsgId()).isEqualTo(testHelpMsgId); + assertThat(helpMsg.getStr().toString()).isEqualTo(testHelpString); + + // Update second progress + mCallbackWrapper.mValue.onEnrollmentProgress(20); + progress = progressLiveData.getValue(); + assertThat(progress).isNotNull(); + assertThat(progress.getSteps()).isEqualTo(25); + assertThat(progress.getRemaining()).isEqualTo(20); + + // Help message shall be set to null + assertThat(helpMsgLiveData.getValue()).isNull(); + } + @Test public void testProgressUpdateWithMessageDisplayController() { // Enable MessageDisplayController and mock handler for it