From f7845d823b84fac2eafb79d9ff35c6b83df79c3e Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Tue, 14 Feb 2023 11:08:13 +0800 Subject: [PATCH] Biometrics v2 RFPS enrolling refine 1. Fix back key in enrolling page 2. Fix 0.5 sec black screen if user presses skip Bug: 260957939 Test: atest FingerprintEnrollmentActivity Change-Id: If5308246ed380c2e3dd12f19f13aa38fc8c178a8 --- ...ingerprintEnrollEnrollingRfpsFragment.java | 80 +++++++++++-------- ...ingerprintEnrollEnrollingSfpsFragment.java | 2 +- ...ngerprintEnrollEnrollingUdfpsFragment.java | 2 +- .../view/FingerprintEnrollmentActivity.java | 8 +- .../FingerprintEnrollEnrollingViewModel.java | 48 ++++++++++- 5 files changed, 98 insertions(+), 42 deletions(-) diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java index f72e6c44502..842bf423d89 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java @@ -27,6 +27,7 @@ import android.graphics.drawable.Animatable2; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; +import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; @@ -40,7 +41,7 @@ import android.view.animation.Interpolator; import android.widget.ProgressBar; import android.widget.TextView; -import androidx.annotation.IdRes; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; @@ -52,7 +53,6 @@ import com.android.settings.R; import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog; import com.android.settings.biometrics2.ui.model.EnrollmentProgress; import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage; -import com.android.settings.biometrics2.ui.viewmodel.DeviceRotationViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel; @@ -80,7 +80,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { private static final int HINT_TIMEOUT_DURATION = 2500; private FingerprintEnrollEnrollingViewModel mEnrollingViewModel; - private DeviceRotationViewModel mRotationViewModel; private FingerprintEnrollProgressViewModel mProgressViewModel; private Interpolator mFastOutSlowInInterpolator; @@ -92,13 +91,13 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { private ProgressBar mProgressBar; private ObjectAnimator mProgressAnim; private TextView mErrorText; - private FooterBarMixin mFooterBarMixin; private AnimatedVectorDrawable mIconAnimationDrawable; private AnimatedVectorDrawable mIconBackgroundBlinksDrawable; + private int mIconTouchCount; private final View.OnClickListener mOnSkipClickListener = v -> { - mProgressViewModel.cancelEnrollment(); - mEnrollingViewModel.onSkipButtonClick(); + mEnrollingViewModel.setOnSkipPressed(); + cancelEnrollment(); }; private final Observer mProgressObserver = progress -> { @@ -128,16 +127,21 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { } }; - private int mIconTouchCount; - @Override public void onAttach(@NonNull Context context) { final FragmentActivity activity = getActivity(); final ViewModelProvider provider = new ViewModelProvider(activity); mEnrollingViewModel = provider.get(FingerprintEnrollEnrollingViewModel.class); - mRotationViewModel = provider.get(DeviceRotationViewModel.class); mProgressViewModel = provider.get(FingerprintEnrollProgressViewModel.class); super.onAttach(context); + requireActivity().getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + setEnabled(false); + mEnrollingViewModel.setOnBackPressed(); + cancelEnrollment(); + } + }); } @Nullable @@ -198,8 +202,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { mErrorText = containView.findViewById(R.id.error_text); mProgressBar = containView.findViewById(R.id.fingerprint_progress_bar); - mFooterBarMixin = containView.getMixin(FooterBarMixin.class); - mFooterBarMixin.setSecondaryButton( + containView.getMixin(FooterBarMixin.class).setSecondaryButton( new FooterButton.Builder(activity) .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip) .setListener(mOnSkipClickListener) @@ -263,39 +266,28 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { } } - private void onCancelEnrollment(@IdRes int errorMsgId) { - // TODO - // showErrorDialog() will cause onWindowFocusChanged(false), set mIsCanceled to false - // before showErrorDialog() to prevent that another error dialog is triggered again. -// TODO mIsCanceled = true; -// TODO mIsOrientationChanged = false; - mEnrollingViewModel.showErrorDialog(new FingerprintEnrollEnrollingViewModel.ErrorDialogData( - mView.getContext().getString(FingerprintErrorDialog.getErrorMessage(errorMsgId)), - mView.getContext().getString(FingerprintErrorDialog.getErrorTitle(errorMsgId)), - errorMsgId - )); - cancelEnrollment(); - stopIconAnimation(); - } - @Override public void onStop() { stopIconAnimation(); - removeEnrollmentObserver(); - if (!getActivity().isChangingConfigurations()) { + removeEnrollmentObservers(); + if (!getActivity().isChangingConfigurations() && mProgressViewModel.isEnrolling()) { mProgressViewModel.cancelEnrollment(); } super.onStop(); } - private void removeEnrollmentObserver() { - mProgressViewModel.getProgressLiveData().removeObserver(mProgressObserver); - mProgressViewModel.getHelpMessageLiveData().removeObserver(mHelpMessageObserver); + private void removeEnrollmentObservers() { + preRemoveEnrollmentObservers(); mProgressViewModel.getErrorMessageLiveData().removeObserver(mErrorMessageObserver); } + private void preRemoveEnrollmentObservers() { + mProgressViewModel.getProgressLiveData().removeObserver(mProgressObserver); + mProgressViewModel.getHelpMessageLiveData().removeObserver(mHelpMessageObserver); + } + private void cancelEnrollment() { - removeEnrollmentObserver(); + preRemoveEnrollmentObservers(); mProgressViewModel.cancelEnrollment(); } @@ -318,7 +310,27 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { } private void onEnrollmentError(@NonNull EnrollmentStatusMessage errorMessage) { - onCancelEnrollment(errorMessage.getMsgId()); + stopIconAnimation(); + removeEnrollmentObservers(); + + if (mEnrollingViewModel.getOnBackPressed() + && errorMessage.getMsgId() == FingerprintManager.FINGERPRINT_ERROR_CANCELED) { + mEnrollingViewModel.onCancelledDueToOnBackPressed(); + } else if (mEnrollingViewModel.getOnSkipPressed() + && errorMessage.getMsgId() == FingerprintManager.FINGERPRINT_ERROR_CANCELED) { + mEnrollingViewModel.onCancelledDueToOnSkipPressed(); + } else { + final int errMsgId = errorMessage.getMsgId(); + mEnrollingViewModel.showErrorDialog( + new FingerprintEnrollEnrollingViewModel.ErrorDialogData( + mView.getContext().getString( + FingerprintErrorDialog.getErrorMessage(errMsgId)), + mView.getContext().getString( + FingerprintErrorDialog.getErrorTitle(errMsgId)), + errMsgId + )); + mProgressViewModel.cancelEnrollment(); + } } private void onEnrollmentProgressChange(@NonNull EnrollmentProgress progress) { @@ -398,7 +410,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { } } - @Override public void onDestroy() { // TODO stopListenOrientationEvent(); @@ -444,7 +455,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { private void showIconTouchDialog() { mIconTouchCount = 0; - //TODO EnrollingActivity should observe live data and add dialog fragment mEnrollingViewModel.onIconTouchDialogShow(); } diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java index 57b86654da5..7d2ef9fdbb4 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.java @@ -113,7 +113,7 @@ public class FingerprintEnrollEnrollingSfpsFragment extends Fragment { private boolean mHaveShownSfpsRightEdgeLottie; private final View.OnClickListener mOnSkipClickListener = - (v) -> mEnrollingViewModel.onSkipButtonClick(); + (v) -> mEnrollingViewModel.onCancelledDueToOnSkipPressed(); private final Observer mProgressObserver = progress -> { // TODO }; diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.java index 18a7c259c83..ad6abf1b47f 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.java @@ -107,7 +107,7 @@ public class FingerprintEnrollEnrollingUdfpsFragment extends Fragment { private boolean mIsAccessibilityEnabled; private final View.OnClickListener mOnSkipClickListener = - (v) -> mEnrollingViewModel.onSkipButtonClick(); + (v) -> mEnrollingViewModel.onCancelledDueToOnSkipPressed(); private final Observer mProgressObserver = progress -> { // TODO }; diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java index c0b0b4d62c9..74486787baf 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java @@ -31,6 +31,7 @@ import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnr import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingAction; @@ -453,8 +454,7 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { private void onFindSensorAction(@FingerprintEnrollFindSensorAction int action) { switch (action) { case FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP: { - onSetActivityResult( - new ActivityResult(BiometricEnrollBase.RESULT_SKIP, null)); + onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_SKIP, null)); return; } case FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG: { @@ -487,6 +487,10 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_TIMEOUT, null)); break; } + case FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED: { + getSupportFragmentManager().popBackStack(); + break; + } } } diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java index 08109caedaf..bf7b0acb7b5 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java @@ -71,11 +71,17 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { */ public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG = 3; + /** + * Has got latest cancelled event due to back key + */ + public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED = 4; + @IntDef(prefix = { "FINGERPRINT_ENROLL_ENROLLING_ACTION_" }, value = { FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP, FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE, FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG, - FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG + FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG, + FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED }) @Retention(RetentionPolicy.SOURCE) public @interface FingerprintEnrollEnrollingAction {} @@ -103,8 +109,9 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { @Retention(RetentionPolicy.SOURCE) public @interface FingerprintErrorDialogAction {} - private final int mUserId; + private boolean mOnBackPressed; + private boolean mOnSkipPressed; private final FingerprintRepository mFingerprintRepository; private final AccessibilityRepository mAccessibilityRepository; private final VibratorRepository mVibratorRepository; @@ -162,14 +169,26 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { mErrorDialogActionLiveData.postValue(action); } + public boolean getOnSkipPressed() { + return mOnSkipPressed; + } + /** * User clicks skip button */ - public void onSkipButtonClick() { + public void setOnSkipPressed() { + mOnSkipPressed = true; + } + + /** + * Enrolling is cacelled because user clicks skip + */ + public void onCancelledDueToOnSkipPressed() { final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP; if (DEBUG) { Log.d(TAG, "onSkipButtonClick, post action " + action); } + mOnSkipPressed = false; mActionLiveData.postValue(action); } @@ -184,6 +203,29 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { mActionLiveData.postValue(action); } + public boolean getOnBackPressed() { + return mOnBackPressed; + } + + /** + * Back key is pressed. + */ + public void setOnBackPressed() { + mOnBackPressed = true; + } + + /** + * Enrollment is cancelled because back key is pressed. + */ + public void onCancelledDueToOnBackPressed() { + final int action = FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED; + if (DEBUG) { + Log.d(TAG, "onCancelledEventReceivedAfterOnBackPressed, post action " + action); + } + mOnBackPressed = false; + mActionLiveData.postValue(action); + } + /** * Icon touch dialog show */