From fa496047a4690a4cb8430e96c2b886dfe7d5c43c Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Wed, 8 Feb 2023 20:23:14 +0800 Subject: [PATCH] Refine RFPS enrolling v2 1. Fix skip button doesn't work case 2. Support rotation during enrollment 3. Show error dialog page 4. Show icon touched dialog page Bug: 260957939 Test: atest FingerprintEnrollFindSensorViewModelTest FingerprintEnrollProgressViewModelTest FingerprintEnrollmentViewModelTest FingerprintEnrollmentActivityTest Change-Id: I617e3e64a130682002b07551d11aff2864fd4538 --- ...rprintEnrollEnrollingIconTouchDialog.java} | 33 ++--- ...ingerprintEnrollEnrollingRfpsFragment.java | 134 +++++------------- .../FingerprintEnrollFindRfpsFragment.java | 5 +- .../FingerprintEnrollFindSfpsFragment.java | 1 - .../view/FingerprintEnrollmentActivity.java | 109 ++++++++------ .../FingerprintEnrollEnrollingViewModel.java | 53 +++---- .../FingerprintEnrollProgressViewModel.java | 6 + ...ingerprintEnrollProgressViewModelTest.java | 16 +-- 8 files changed, 157 insertions(+), 200 deletions(-) rename src/com/android/settings/biometrics2/ui/view/{IconTouchDialog.java => FingerprintEnrollEnrollingIconTouchDialog.java} (65%) diff --git a/src/com/android/settings/biometrics2/ui/view/IconTouchDialog.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java similarity index 65% rename from src/com/android/settings/biometrics2/ui/view/IconTouchDialog.java rename to src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java index 38d6a5b3bde..e86d755526e 100644 --- a/src/com/android/settings/biometrics2/ui/view/IconTouchDialog.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java @@ -18,27 +18,29 @@ package com.android.settings.biometrics2.ui.view; import android.app.Dialog; import android.app.settings.SettingsEnums; -import android.content.DialogInterface; +import android.content.Context; import android.os.Bundle; import androidx.appcompat.app.AlertDialog; +import androidx.lifecycle.ViewModelProvider; import com.android.settings.R; +import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; /** * Icon Touch dialog */ -public class IconTouchDialog extends InstrumentedDialogFragment { +public class FingerprintEnrollEnrollingIconTouchDialog extends InstrumentedDialogFragment { -// private FingerprintEnrollEnrollingViewModel mViewModel; -// -// @Override -// public void onAttach(Context context) { -// mViewModel = new ViewModelProvider(getActivity()).get( -// FingerprintEnrollEnrollingViewModel.class); -// super.onAttach(context); -// } + private FingerprintEnrollEnrollingViewModel mViewModel; + + @Override + public void onAttach(Context context) { + mViewModel = new ViewModelProvider(getActivity()).get( + FingerprintEnrollEnrollingViewModel.class); + super.onAttach(context); + } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -46,12 +48,11 @@ public class IconTouchDialog extends InstrumentedDialogFragment { R.style.Theme_AlertDialog); builder.setTitle(R.string.security_settings_fingerprint_enroll_touch_dialog_title) .setMessage(R.string.security_settings_fingerprint_enroll_touch_dialog_message) - .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } + .setPositiveButton( + R.string.security_settings_fingerprint_enroll_dialog_ok, + (dialog, which) -> { + dialog.dismiss(); + mViewModel.onIconTouchDialogDismiss(); }); return builder.create(); } diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java index 30823ea792a..f72e6c44502 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java @@ -34,6 +34,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.widget.ProgressBar; @@ -41,12 +42,11 @@ import android.widget.TextView; import androidx.annotation.IdRes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; -import androidx.transition.Transition; -import androidx.transition.TransitionSet; import com.android.settings.R; import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog; @@ -56,7 +56,6 @@ import com.android.settings.biometrics2.ui.viewmodel.DeviceRotationViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel; import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel; -import com.airbnb.lottie.LottieAnimationView; import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupdesign.GlifLayout; @@ -70,6 +69,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { private static final boolean DEBUG = false; private static final int PROGRESS_BAR_MAX = 10000; + private static final long ANIMATION_DURATION = 250L; private static final long ICON_TOUCH_DURATION_UNTIL_DIALOG_SHOWN = 500; private static final int ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN = 3; @@ -96,16 +96,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { private AnimatedVectorDrawable mIconAnimationDrawable; private AnimatedVectorDrawable mIconBackgroundBlinksDrawable; - private LottieAnimationView mIllustrationLottie; - private boolean mShouldShowLottie; - private boolean mIsAccessibilityEnabled; - - private boolean mHaveShownSfpsNoAnimationLottie; - private boolean mHaveShownSfpsCenterLottie; - private boolean mHaveShownSfpsTipLottie; - private boolean mHaveShownSfpsLeftEdgeLottie; - private boolean mHaveShownSfpsRightEdgeLottie; - private final View.OnClickListener mOnSkipClickListener = v -> { mProgressViewModel.cancelEnrollment(); mEnrollingViewModel.onSkipButtonClick(); @@ -115,7 +105,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { if (DEBUG) { Log.d(TAG, "mProgressObserver(" + progress + ")"); } - if (progress != null) { + if (progress != null && progress.getSteps() >= 0) { onEnrollmentProgressChange(progress); } }; @@ -128,6 +118,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { onEnrollmentHelp(helpMessage); } }; + private final Observer mErrorMessageObserver = errorMessage -> { if (DEBUG) { Log.d(TAG, "mErrorMessageObserver(" + errorMessage + ")"); @@ -136,15 +127,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { onEnrollmentError(errorMessage); } }; - private final Observer mAcquireObserver = isAcquiredGood -> { - // TODO - }; - private final Observer mPointerDownObserver = sensorId -> { - // TODO - }; - private final Observer mPointerUpObserver = sensorId -> { - // TODO - }; private int mIconTouchCount; @@ -156,40 +138,39 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { mRotationViewModel = provider.get(DeviceRotationViewModel.class); mProgressViewModel = provider.get(FingerprintEnrollProgressViewModel.class); super.onAttach(context); - final TransitionSet transitionSet = (TransitionSet) getSharedElementEnterTransition(); - if (transitionSet != null) { - transitionSet.addListener(new Transition.TransitionListener() { - @Override - public void onTransitionStart(@NonNull Transition transition) { - } + } - @Override - public void onTransitionEnd(@NonNull Transition transition) { - transition.removeListener(this); - mAnimationCancelled = false; - startIconAnimation(); - } + @Nullable + @Override + public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { + if (enter && nextAnim == R.anim.sud_slide_next_in) { + final Animation animation = AnimationUtils.loadAnimation(getActivity(), nextAnim); + if (animation != null) { + animation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } - @Override - public void onTransitionCancel(@NonNull Transition transition) { - } + @Override + public void onAnimationEnd(Animation animation) { + mAnimationCancelled = false; + startIconAnimation(); + } - @Override - public void onTransitionPause(@NonNull Transition transition) { - } - - @Override - public void onTransitionResume(@NonNull Transition transition) { - } - }); + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + return animation; + } } + return super.onCreateAnimation(transit, enter, nextAnim); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mEnrollingViewModel.restoreSavedState(savedInstanceState); - mIsAccessibilityEnabled = mEnrollingViewModel.isAccessibilityEnabled(); } @Override @@ -215,12 +196,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { R.string.security_settings_fingerprint_enroll_start_message)); glifLayoutHelper.setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title); -// mShouldShowLottie = shouldShowLottie(); // TODO move this call into updateOrientation()? -// boolean isLandscape = BiometricUtils.isReverseLandscape(activity) -// || BiometricUtils.isLandscape(activity); -// updateOrientation(containView, (isLandscape -// ? Configuration.ORIENTATION_LANDSCAPE : Configuration.ORIENTATION_PORTRAIT)); - mErrorText = containView.findViewById(R.id.error_text); mProgressBar = containView.findViewById(R.id.fingerprint_progress_bar); mFooterBarMixin = containView.getMixin(FooterBarMixin.class); @@ -273,9 +248,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { startEnrollment(); updateProgress(false /* animate */, mProgressViewModel.getProgressLiveData().getValue()); updateTitleAndDescription(); - if (true /* TODO check mRestoring */) { - startIconAnimation(); - } } private void startIconAnimation() { @@ -292,6 +264,7 @@ 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; @@ -319,9 +292,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { mProgressViewModel.getProgressLiveData().removeObserver(mProgressObserver); mProgressViewModel.getHelpMessageLiveData().removeObserver(mHelpMessageObserver); mProgressViewModel.getErrorMessageLiveData().removeObserver(mErrorMessageObserver); - mProgressViewModel.getAcquireLiveData().removeObserver(mAcquireObserver); - mProgressViewModel.getPointerDownLiveData().removeObserver(mPointerDownObserver); - mProgressViewModel.getPointerUpLiveData().removeObserver(mPointerUpObserver); } private void cancelEnrollment() { @@ -330,13 +300,13 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { } private void startEnrollment() { + final boolean startResult = mProgressViewModel.startEnrollment(ENROLL_ENROLL); + if (!startResult) { + Log.e(TAG, "startEnrollment(), failed"); + } mProgressViewModel.getProgressLiveData().observe(this, mProgressObserver); mProgressViewModel.getHelpMessageLiveData().observe(this, mHelpMessageObserver); mProgressViewModel.getErrorMessageLiveData().observe(this, mErrorMessageObserver); - mProgressViewModel.getAcquireLiveData().observe(this, mAcquireObserver); - mProgressViewModel.getPointerDownLiveData().observe(this, mPointerDownObserver); - mProgressViewModel.getPointerUpLiveData().observe(this, mPointerUpObserver); - mProgressViewModel.startEnrollment(ENROLL_ENROLL); } private void onEnrollmentHelp(@NonNull EnrollmentStatusMessage helpMessage) { @@ -443,7 +413,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { mProgressBar.getProgress(), progress); anim.addListener(mProgressAnimationListener); anim.setInterpolator(mFastOutSlowInInterpolator); - anim.setDuration(250); + anim.setDuration(ANIMATION_DURATION); anim.start(); mProgressAnim = anim; } @@ -457,24 +427,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { } }; -// private void updateOrientation(@NonNull GlifLayout glifLayout, int orientation) { -// switch (orientation) { -// case Configuration.ORIENTATION_LANDSCAPE: { -// mIllustrationLottie = null; -// break; -// } -// case Configuration.ORIENTATION_PORTRAIT: { -// if (shouldShowLottie()) { -// mIllustrationLottie = glifLayout.findViewById(R.id.illustration_lottie); -// } -// break; -// } -// default: -// Log.e(TAG, "Error unhandled configuration change"); -// break; -// } -// } - private void animateFlash() { if (mIconBackgroundBlinksDrawable != null) { mIconBackgroundBlinksDrawable.start(); @@ -512,9 +464,8 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { @Override public void onAnimationEnd(Animator animation) { stopIconAnimation(); - if (mProgressBar.getProgress() >= PROGRESS_BAR_MAX) { - mProgressBar.postDelayed(mDelayedFinishRunnable, 250L); + mProgressBar.postDelayed(mDelayedFinishRunnable, ANIMATION_DURATION); } } @@ -523,13 +474,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { }; // Give the user a chance to see progress completed before jumping to the next stage. - private final Runnable mDelayedFinishRunnable = new Runnable() { - @Override - public void run() { - mEnrollingViewModel.onSkipButtonClick(); - /* TODO launchFinish(); */ - } - }; + private final Runnable mDelayedFinishRunnable = () -> mEnrollingViewModel.onEnrollingDone(); private final Animatable2.AnimationCallback mIconAnimationCallback = new Animatable2.AnimationCallback() { @@ -540,12 +485,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { } // Start animation after it has ended. - mProgressBar.post(new Runnable() { - @Override - public void run() { - startIconAnimation(); - } - }); + mProgressBar.post(() -> startIconAnimation()); } }; } diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.java index fd181d4be85..1ea26fa20a7 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.java @@ -172,7 +172,7 @@ public class FingerprintEnrollFindRfpsFragment extends Fragment { Log.d(TAG, "onStop(), current enrolling: " + isEnrolling + ", animation exist:" + (mAnimation != null)); } - if (!isEnrolling) { + if (isEnrolling) { stopLookingForFingerprint(false); } } @@ -184,12 +184,11 @@ public class FingerprintEnrollFindRfpsFragment extends Fragment { return; } - mProgressViewModel.clearProgressLiveData(); - mProgressViewModel.getProgressLiveData().observe(this, mProgressObserver); final boolean startResult = mProgressViewModel.startEnrollment(ENROLL_FIND_SENSOR); if (!startResult) { Log.e(TAG, "startLookingForFingerprint(), failed to start enrollment"); } + mProgressViewModel.getProgressLiveData().observe(this, mProgressObserver); } private void stopLookingForFingerprint(boolean waitForLastCancelErrMsg) { diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.java index aad503e4eda..c363f04e1e5 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.java @@ -98,7 +98,6 @@ public class FingerprintEnrollFindSfpsFragment extends Fragment { Log.d(TAG, "mProgressObserver(" + progress + ")"); } if (progress != null && !progress.isInitialStep()) { - mProgressViewModel.clearProgressLiveData(); mViewModel.onStartButtonClick(); } }; diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java index e12e982fd79..c0b0b4d62c9 100644 --- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java +++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java @@ -27,6 +27,14 @@ import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewMo import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_IS_GENERATING_CHALLENGE; import static com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.CREDENTIAL_VALID; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.ErrorDialogData; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG; +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_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; +import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FingerprintErrorDialogAction; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP; import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START; @@ -122,12 +130,12 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { onFindSensorAction(action); } }; - private final Observer mEnrollingDoneObserver = isDone -> { + private final Observer mEnrollingActionObserver = action -> { if (DEBUG) { - Log.d(TAG, "mEnrollingDoneObserver(" + isDone + ")"); + Log.d(TAG, "mEnrollingActionObserver(" + action + ")"); } - if (isDone != null) { - onEnrollingDone(isDone); + if (action != null) { + onEnrollingAction(action); } }; private final Observer mEnrollingErrorDialogObserver = data -> { @@ -135,7 +143,16 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { Log.d(TAG, "mEnrollingErrorDialogObserver(" + data + ")"); } if (data != null) { - startEnrollingErrorDialog(); + new FingerprintEnrollEnrollingErrorDialog().show(getSupportFragmentManager(), + ENROLLING_ERROR_DIALOG_TAG); + } + }; + private final Observer mEnrollingErrorDialogActionObserver = action -> { + if (DEBUG) { + Log.d(TAG, "mEnrollingErrorDialogActionObserver(" + action + ")"); + } + if (action != null) { + onEnrollingErrorDialogAction(action); } }; private final ActivityResultCallback mNextActivityResultCallback = @@ -292,6 +309,7 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { tag = ENROLLING_RFPS_TAG; fragmentClass = FingerprintEnrollEnrollingRfpsFragment.class; } + getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .setCustomAnimations(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out, @@ -304,15 +322,18 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { private void attachEnrollingViewModel() { final FingerprintEnrollEnrollingViewModel enrollingViewModel = mViewModelProvider.get(FingerprintEnrollEnrollingViewModel.class); - enrollingViewModel.clearBackPressedData(); + enrollingViewModel.clearActionLiveData(); + enrollingViewModel.getActionLiveData().observe(this, mEnrollingActionObserver); enrollingViewModel.getErrorDialogLiveData().observe(this, mEnrollingErrorDialogObserver); - - final FingerprintEnrollProgressViewModel progressViewModel = - mViewModelProvider.get(FingerprintEnrollProgressViewModel.class); - progressViewModel.getDoneLiveData().observe(this, mEnrollingDoneObserver); + enrollingViewModel.getErrorDialogActionLiveData().observe(this, + mEnrollingErrorDialogActionObserver); } private void startFinishActivity() { + final FingerprintEnrollEnrollingViewModel enrollingViewModel = + mViewModelProvider.get(FingerprintEnrollEnrollingViewModel.class); + enrollingViewModel.clearActionLiveData(); + final boolean isSuw = mViewModel.getRequest().isSuw(); if (!mViewModel.isWaitingActivityResult().compareAndSet(false, true)) { Log.w(TAG, "startNext, isSuw:" + isSuw + ", fail to set isWaiting flag"); @@ -325,16 +346,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { mNextActivityLauncher.launch(intent); } - private void startSkipSetupFindFpsDialog() { - new SkipSetupFindFpsDialog().show(getSupportFragmentManager(), - SKIP_SETUP_FIND_FPS_DIALOG_TAG); - } - - private void startEnrollingErrorDialog() { - new FingerprintEnrollEnrollingErrorDialog().show(getSupportFragmentManager(), - ENROLLING_ERROR_DIALOG_TAG); - } - private void onGenerateChallengeFailed(@NonNull Boolean ignoredBoolean) { onSetActivityResult(new ActivityResult(RESULT_CANCELED, null)); } @@ -366,6 +377,10 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { final Intent intent = resultCode == BiometricEnrollBase.RESULT_FINISHED ? createSetResultIntentWithGeneratingChallengeExtra(result.getData()) : result.getData(); + if (DEBUG) { + Log.d(TAG, "onSetActivityResult(" + result + "), call setResult(" + resultCode + + ", " + intent + ")"); + } setResult(resultCode, intent); finish(); } @@ -443,7 +458,8 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { return; } case FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG: { - startSkipSetupFindFpsDialog(); + new SkipSetupFindFpsDialog().show(getSupportFragmentManager(), + SKIP_SETUP_FIND_FPS_DIALOG_TAG); return; } case FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START: { @@ -452,15 +468,37 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { } } - private void onEnrollingDone(boolean isDone) { - if (!isDone) { - return; + private void onEnrollingAction(@FingerprintEnrollEnrollingAction int action) { + switch (action) { + case FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE: { + startFinishActivity(); + break; + } + case FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP: { + onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_SKIP, null)); + break; + } + case FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG: { + new FingerprintEnrollEnrollingIconTouchDialog().show(getSupportFragmentManager(), + SKIP_SETUP_FIND_FPS_DIALOG_TAG); + break; + } + case FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG: { + onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_TIMEOUT, null)); + break; + } } - final FingerprintEnrollProgressViewModel progressViewModel = - mViewModelProvider.get(FingerprintEnrollProgressViewModel.class); - progressViewModel.clearProgressLiveData(); + } - startFinishActivity(); + private void onEnrollingErrorDialogAction(@FingerprintErrorDialogAction int action) { + switch (action) { + case FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH: + onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_FINISHED, null)); + break; + case FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT: + onSetActivityResult(new ActivityResult(BiometricEnrollBase.RESULT_TIMEOUT, null)); + break; + } } @Override @@ -469,21 +507,6 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { mViewModel.checkFinishActivityDuringOnPause(isFinishing(), isChangingConfigurations()); } - @Override - public void onBackPressed() { - final FragmentManager manager = getSupportFragmentManager(); - final String[] tags = new String[] {ENROLLING_UDFPS_TAG, ENROLLING_SFPS_TAG, - ENROLLING_RFPS_TAG }; - for (String tag: tags) { - final Fragment fragment = manager.findFragmentByTag(tag); - if (fragment != null) { - mViewModelProvider.get(FingerprintEnrollEnrollingViewModel.class).onBackPressed(); - break; - } - } - super.onBackPressed(); - } - @Override protected void onApplyThemeResource(Resources.Theme theme, @StyleRes int resid, boolean first) { theme.applyStyle(R.style.SetupWizardPartnerResource, true); diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java index 2877c9acf7c..08109caedaf 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java @@ -64,18 +64,18 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { /** * Icon touch dialog show */ - public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_DIALOG = 2; + public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG = 2; /** * Icon touch dialog dismiss */ - public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_DIALOG = 3; + public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG = 3; @IntDef(prefix = { "FINGERPRINT_ENROLL_ENROLLING_ACTION_" }, value = { FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP, FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE, - FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_DIALOG, - FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_DIALOG + FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG, + FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG }) @Retention(RetentionPolicy.SOURCE) public @interface FingerprintEnrollEnrollingAction {} @@ -109,8 +109,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { private final AccessibilityRepository mAccessibilityRepository; private final VibratorRepository mVibratorRepository; - private final MutableLiveData mBackPressedLiveData = new MutableLiveData<>(false); - private final MutableLiveData mEnrollingLiveData = new MutableLiveData<>(); + private final MutableLiveData mActionLiveData = new MutableLiveData<>(); private final MutableLiveData mIconTouchDialogLiveData = new MutableLiveData<>(); private final MutableLiveData mErrorDialogLiveData = new MutableLiveData<>(); private final MutableLiveData mErrorDialogActionLiveData = new MutableLiveData<>(); @@ -138,6 +137,21 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { return mErrorDialogLiveData; } + public LiveData getErrorDialogActionLiveData() { + return mErrorDialogActionLiveData; + } + + public LiveData getActionLiveData() { + return mActionLiveData; + } + + /** + * Clears action live data + */ + public void clearActionLiveData() { + mActionLiveData.setValue(null); + } + /** * Saves new user dialog action to mErrorDialogActionLiveData */ @@ -148,20 +162,6 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { mErrorDialogActionLiveData.postValue(action); } - /** - * Clears back press data - */ - public void clearBackPressedData() { - mBackPressedLiveData.setValue(false); - } - - /** - * User trigger back pressed - */ - public void onBackPressed() { - mBackPressedLiveData.postValue(true); - } - /** * User clicks skip button */ @@ -170,25 +170,25 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { if (DEBUG) { Log.d(TAG, "onSkipButtonClick, post action " + action); } - mEnrollingLiveData.postValue(action); + mActionLiveData.postValue(action); } /** * Is enrolling finished */ public void onEnrollingDone() { - final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_SKIP; + final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE; if (DEBUG) { Log.d(TAG, "onEnrollingDone, post action " + action); } - mEnrollingLiveData.postValue(action); + mActionLiveData.postValue(action); } /** * Icon touch dialog show */ public void onIconTouchDialogShow() { - final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_DIALOG; + final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG; if (DEBUG) { Log.d(TAG, "onIconTouchDialogShow, post action " + action); } @@ -199,7 +199,7 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { * Icon touch dialog dismiss */ public void onIconTouchDialogDismiss() { - final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_DIALOG; + final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_DISMISS_ICON_TOUCH_DIALOG; if (DEBUG) { Log.d(TAG, "onIconTouchDialogDismiss, post action " + action); } @@ -313,7 +313,8 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel { @Override public String toString() { - return ErrorDialogData.class.getSimpleName() + "{id:" + mErrMsgId + "}"; + return getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()) + + "{id:" + mErrMsgId + "}"; } } } diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java index 2cb94ec799b..eebbc4270e9 100644 --- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java +++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java @@ -190,6 +190,12 @@ public class FingerprintEnrollProgressViewModel extends AndroidViewModel { Log.e(TAG, "startEnrollment(" + reason + ")"); } + // Clear data + mProgressLiveData.setValue(new EnrollmentProgress(INITIAL_STEPS, INITIAL_REMAINING)); + mDoneLiveData.setValue(false); + mHelpMessageLiveData.setValue(null); + mErrorMessageLiveData.setValue(null); + mCancellationSignal = new CancellationSignal(); mFingerprintUpdater.enroll(mToken, mCancellationSignal, mUserId, mMessageDisplayController != null ? mMessageDisplayController : mEnrollmentCallback, 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 9e3a6e6fc31..634514f8710 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 @@ -21,8 +21,6 @@ import static android.hardware.fingerprint.FingerprintManager.ENROLL_FIND_SENSOR import static android.hardware.fingerprint.FingerprintManager.EnrollReason; import static android.hardware.fingerprint.FingerprintManager.EnrollmentCallback; -import static com.android.settings.biometrics2.ui.model.EnrollmentProgress.INITIAL_STEPS; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; @@ -147,24 +145,14 @@ public class FingerprintEnrollProgressViewModelTest { EnrollmentProgress progress = mViewModel.getProgressLiveData().getValue(); assertThat(progress).isNotNull(); assertThat(progress.getSteps()).isEqualTo(25); - // TODO(b/260957933) verify getRemaining() when it is really used - //assertThat(progress.getRemaining()).isEqualTo(25); + assertThat(progress.getRemaining()).isEqualTo(25); // Update second progress callbackWrapper.mValue.onEnrollmentProgress(20); progress = mViewModel.getProgressLiveData().getValue(); assertThat(progress).isNotNull(); assertThat(progress.getSteps()).isEqualTo(25); - // TODO(b/260957933) verify getRemaining() when it is really used - //assertThat(progress.getRemaining()).isEqualTo(20); - - // Clear progress - mViewModel.clearProgressLiveData(); - progress = mViewModel.getProgressLiveData().getValue(); - assertThat(progress).isNotNull(); - assertThat(progress.getSteps()).isEqualTo(INITIAL_STEPS); - // TODO(b/260957933) verify getRemaining() when it is really used - //assertThat(progress.getRemaining()).isEqualTo(INITIAL_REMAINING); + assertThat(progress.getRemaining()).isEqualTo(20); } // TODO(b/260957933): FingerprintEnrollProgressViewModel::getErrorLiveData() and