Loading src/com/android/settings/biometrics2/ui/view/IconTouchDialog.java→src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java +17 −16 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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) { .setPositiveButton( R.string.security_settings_fingerprint_enroll_dialog_ok, (dialog, which) -> { dialog.dismiss(); } mViewModel.onIconTouchDialogDismiss(); }); return builder.create(); } Loading src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java +37 −97 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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(); Loading @@ -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); } }; Loading @@ -128,6 +118,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { onEnrollmentHelp(helpMessage); } }; private final Observer<EnrollmentStatusMessage> mErrorMessageObserver = errorMessage -> { if (DEBUG) { Log.d(TAG, "mErrorMessageObserver(" + errorMessage + ")"); Loading @@ -136,15 +127,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { onEnrollmentError(errorMessage); } }; private final Observer<Boolean> mAcquireObserver = isAcquiredGood -> { // TODO }; private final Observer<Integer> mPointerDownObserver = sensorId -> { // TODO }; private final Observer<Integer> mPointerUpObserver = sensorId -> { // TODO }; private int mIconTouchCount; Loading @@ -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) { } @Nullable @Override public void onTransitionEnd(@NonNull Transition transition) { transition.removeListener(this); mAnimationCancelled = false; startIconAnimation(); } 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 onTransitionCancel(@NonNull Transition transition) { public void onAnimationStart(Animation animation) { } @Override public void onTransitionPause(@NonNull Transition transition) { public void onAnimationEnd(Animation animation) { mAnimationCancelled = false; startIconAnimation(); } @Override public void onTransitionResume(@NonNull Transition transition) { 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 Loading @@ -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); Loading Loading @@ -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() { Loading @@ -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; Loading Loading @@ -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() { Loading @@ -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) { Loading Loading @@ -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; } Loading @@ -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(); Loading Loading @@ -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); } } Loading @@ -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() { Loading @@ -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()); } }; } src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.java +2 −3 Original line number Diff line number Diff line Loading @@ -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); } } Loading @@ -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) { Loading src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,6 @@ public class FingerprintEnrollFindSfpsFragment extends Fragment { Log.d(TAG, "mProgressObserver(" + progress + ")"); } if (progress != null && !progress.isInitialStep()) { mProgressViewModel.clearProgressLiveData(); mViewModel.onStartButtonClick(); } }; Loading src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java +66 −43 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -122,12 +130,12 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { onFindSensorAction(action); } }; private final Observer<Boolean> mEnrollingDoneObserver = isDone -> { private final Observer<Integer> 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<ErrorDialogData> mEnrollingErrorDialogObserver = data -> { Loading @@ -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<Integer> mEnrollingErrorDialogActionObserver = action -> { if (DEBUG) { Log.d(TAG, "mEnrollingErrorDialogActionObserver(" + action + ")"); } if (action != null) { onEnrollingErrorDialogAction(action); } }; private final ActivityResultCallback<ActivityResult> mNextActivityResultCallback = Loading Loading @@ -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, Loading @@ -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"); Loading @@ -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)); } Loading Loading @@ -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(); } Loading Loading @@ -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: { Loading @@ -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 Loading @@ -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); Loading Loading
src/com/android/settings/biometrics2/ui/view/IconTouchDialog.java→src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.java +17 −16 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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) { .setPositiveButton( R.string.security_settings_fingerprint_enroll_dialog_ok, (dialog, which) -> { dialog.dismiss(); } mViewModel.onIconTouchDialogDismiss(); }); return builder.create(); } Loading
src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.java +37 −97 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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(); Loading @@ -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); } }; Loading @@ -128,6 +118,7 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { onEnrollmentHelp(helpMessage); } }; private final Observer<EnrollmentStatusMessage> mErrorMessageObserver = errorMessage -> { if (DEBUG) { Log.d(TAG, "mErrorMessageObserver(" + errorMessage + ")"); Loading @@ -136,15 +127,6 @@ public class FingerprintEnrollEnrollingRfpsFragment extends Fragment { onEnrollmentError(errorMessage); } }; private final Observer<Boolean> mAcquireObserver = isAcquiredGood -> { // TODO }; private final Observer<Integer> mPointerDownObserver = sensorId -> { // TODO }; private final Observer<Integer> mPointerUpObserver = sensorId -> { // TODO }; private int mIconTouchCount; Loading @@ -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) { } @Nullable @Override public void onTransitionEnd(@NonNull Transition transition) { transition.removeListener(this); mAnimationCancelled = false; startIconAnimation(); } 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 onTransitionCancel(@NonNull Transition transition) { public void onAnimationStart(Animation animation) { } @Override public void onTransitionPause(@NonNull Transition transition) { public void onAnimationEnd(Animation animation) { mAnimationCancelled = false; startIconAnimation(); } @Override public void onTransitionResume(@NonNull Transition transition) { 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 Loading @@ -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); Loading Loading @@ -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() { Loading @@ -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; Loading Loading @@ -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() { Loading @@ -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) { Loading Loading @@ -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; } Loading @@ -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(); Loading Loading @@ -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); } } Loading @@ -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() { Loading @@ -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()); } }; }
src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.java +2 −3 Original line number Diff line number Diff line Loading @@ -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); } } Loading @@ -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) { Loading
src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,6 @@ public class FingerprintEnrollFindSfpsFragment extends Fragment { Log.d(TAG, "mProgressObserver(" + progress + ")"); } if (progress != null && !progress.isInitialStep()) { mProgressViewModel.clearProgressLiveData(); mViewModel.onStartButtonClick(); } }; Loading
src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.java +66 −43 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -122,12 +130,12 @@ public class FingerprintEnrollmentActivity extends FragmentActivity { onFindSensorAction(action); } }; private final Observer<Boolean> mEnrollingDoneObserver = isDone -> { private final Observer<Integer> 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<ErrorDialogData> mEnrollingErrorDialogObserver = data -> { Loading @@ -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<Integer> mEnrollingErrorDialogActionObserver = action -> { if (DEBUG) { Log.d(TAG, "mEnrollingErrorDialogActionObserver(" + action + ")"); } if (action != null) { onEnrollingErrorDialogAction(action); } }; private final ActivityResultCallback<ActivityResult> mNextActivityResultCallback = Loading Loading @@ -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, Loading @@ -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"); Loading @@ -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)); } Loading Loading @@ -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(); } Loading Loading @@ -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: { Loading @@ -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 Loading @@ -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); Loading