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
This commit is contained in:
@@ -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) {
|
||||
.setPositiveButton(
|
||||
R.string.security_settings_fingerprint_enroll_dialog_ok,
|
||||
(dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
}
|
||||
mViewModel.onIconTouchDialogDismiss();
|
||||
});
|
||||
return builder.create();
|
||||
}
|
@@ -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<EnrollmentStatusMessage> mErrorMessageObserver = errorMessage -> {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "mErrorMessageObserver(" + errorMessage + ")");
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public void onTransitionStart(@NonNull Transition transition) {
|
||||
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 onTransitionEnd(@NonNull Transition transition) {
|
||||
transition.removeListener(this);
|
||||
public void onAnimationEnd(Animation animation) {
|
||||
mAnimationCancelled = false;
|
||||
startIconAnimation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionCancel(@NonNull Transition transition) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionPause(@NonNull Transition transition) {
|
||||
}
|
||||
|
||||
@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
|
||||
@@ -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());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -98,7 +98,6 @@ public class FingerprintEnrollFindSfpsFragment extends Fragment {
|
||||
Log.d(TAG, "mProgressObserver(" + progress + ")");
|
||||
}
|
||||
if (progress != null && !progress.isInitialStep()) {
|
||||
mProgressViewModel.clearProgressLiveData();
|
||||
mViewModel.onStartButtonClick();
|
||||
}
|
||||
};
|
||||
|
@@ -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<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 -> {
|
||||
@@ -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 =
|
||||
@@ -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;
|
||||
}
|
||||
final FingerprintEnrollProgressViewModel progressViewModel =
|
||||
mViewModelProvider.get(FingerprintEnrollProgressViewModel.class);
|
||||
progressViewModel.clearProgressLiveData();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
@@ -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<Boolean> mBackPressedLiveData = new MutableLiveData<>(false);
|
||||
private final MutableLiveData<Integer> mEnrollingLiveData = new MutableLiveData<>();
|
||||
private final MutableLiveData<Integer> mActionLiveData = new MutableLiveData<>();
|
||||
private final MutableLiveData<Integer> mIconTouchDialogLiveData = new MutableLiveData<>();
|
||||
private final MutableLiveData<ErrorDialogData> mErrorDialogLiveData = new MutableLiveData<>();
|
||||
private final MutableLiveData<Integer> mErrorDialogActionLiveData = new MutableLiveData<>();
|
||||
@@ -138,6 +137,21 @@ public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel {
|
||||
return mErrorDialogLiveData;
|
||||
}
|
||||
|
||||
public LiveData<Integer> getErrorDialogActionLiveData() {
|
||||
return mErrorDialogActionLiveData;
|
||||
}
|
||||
|
||||
public LiveData<Integer> 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 + "}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user