Refine UdfpsEnrollCalibration

Remove most implementation from Settings

Test: FingerprintEnrollIntroductionTest FingerprintEnrollFindSensorTest
Bug: 301226085
Change-Id: Ib3438c740919f38f3d2f86d508fcd20bef522023
This commit is contained in:
MiltonWu
2023-10-25 06:46:26 +00:00
committed by Milton Wu
parent f610b1938b
commit 07361691cd
8 changed files with 64 additions and 173 deletions

View File

@@ -67,7 +67,6 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
public static final String EXTRA_FINISHED_ENROLL_FACE = "finished_enrolling_face"; public static final String EXTRA_FINISHED_ENROLL_FACE = "finished_enrolling_face";
public static final String EXTRA_FINISHED_ENROLL_FINGERPRINT = "finished_enrolling_fingerprint"; public static final String EXTRA_FINISHED_ENROLL_FINGERPRINT = "finished_enrolling_fingerprint";
public static final String EXTRA_LAUNCHED_POSTURE_GUIDANCE = "launched_posture_guidance"; public static final String EXTRA_LAUNCHED_POSTURE_GUIDANCE = "launched_posture_guidance";
public static final String KEY_CALIBRATOR_UUID = "calibrator_uuid";
/** /**
* Used by the choose fingerprint wizard to indicate the wizard is * Used by the choose fingerprint wizard to indicate the wizard is

View File

@@ -70,6 +70,7 @@ import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.BiometricsEnrollEnrolling; import com.android.settings.biometrics.BiometricsEnrollEnrolling;
import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature; import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.flags.Flags;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.display.DisplayDensityUtils; import com.android.settingslib.display.DisplayDensityUtils;
@@ -197,6 +198,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
@NonNull @NonNull
private SfpsEnrollmentFeature mSfpsEnrollmentFeature = new EmptySfpsEnrollmentFeature(); private SfpsEnrollmentFeature mSfpsEnrollmentFeature = new EmptySfpsEnrollmentFeature();
@Nullable
private UdfpsEnrollCalibrator mCalibrator;
@VisibleForTesting @VisibleForTesting
protected boolean shouldShowLottie() { protected boolean shouldShowLottie() {
@@ -245,6 +248,12 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
setContentView(layout); setContentView(layout);
setDescriptionText(R.string.security_settings_udfps_enroll_start_message); setDescriptionText(R.string.security_settings_udfps_enroll_start_message);
if (Flags.udfpsEnrollCalibration()) {
mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider()
.getUdfpsEnrollCalibrator(getApplicationContext(), savedInstanceState,
getIntent());
}
} else if (mCanAssumeSfps) { } else if (mCanAssumeSfps) {
mSfpsEnrollmentFeature = FeatureFactory.getFeatureFactory() mSfpsEnrollmentFeature = FeatureFactory.getFeatureFactory()
.getFingerprintFeatureProvider().getSfpsEnrollmentFeature(); .getFingerprintFeatureProvider().getSfpsEnrollmentFeature();
@@ -364,6 +373,11 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putBoolean(KEY_STATE_CANCELED, mIsCanceled); outState.putBoolean(KEY_STATE_CANCELED, mIsCanceled);
outState.putInt(KEY_STATE_PREVIOUS_ROTATION, mPreviousRotation); outState.putInt(KEY_STATE_PREVIOUS_ROTATION, mPreviousRotation);
if (Flags.udfpsEnrollCalibration()) {
if (mCalibrator != null) {
mCalibrator.onSaveInstanceState(outState);
}
}
} }
private void restoreSavedState(Bundle savedInstanceState) { private void restoreSavedState(Bundle savedInstanceState) {

View File

@@ -25,8 +25,6 @@ import android.content.res.Resources;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.view.OrientationEventListener; import android.view.OrientationEventListener;
import android.view.Surface; import android.view.Surface;
@@ -35,15 +33,12 @@ import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricEnrollSidecar; import com.android.settings.biometrics.BiometricEnrollSidecar;
import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.fingerprint.UdfpsEnrollCalibrator.Result;
import com.android.settings.biometrics.fingerprint.UdfpsEnrollCalibrator.Status;
import com.android.settings.flags.Flags; import com.android.settings.flags.Flags;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ChooseLockSettingsHelper;
@@ -56,7 +51,6 @@ import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupcompat.template.FooterButton;
import java.util.List; import java.util.List;
import java.util.UUID;
/** /**
* Activity explaining the fingerprint sensor location for fingerprint enrollment. * Activity explaining the fingerprint sensor location for fingerprint enrollment.
@@ -85,8 +79,6 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
private boolean mIsReverseDefaultRotation; private boolean mIsReverseDefaultRotation;
@Nullable @Nullable
private UdfpsEnrollCalibrator mCalibrator; private UdfpsEnrollCalibrator mCalibrator;
@Nullable
private Observer<Status> mCalibratorStatusObserver;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -172,13 +164,15 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
if (mCanAssumeUdfps) { if (mCanAssumeUdfps) {
if (Flags.udfpsEnrollCalibration()) { if (Flags.udfpsEnrollCalibration()) {
mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider()
.getUdfpsEnrollCalibrator( .getUdfpsEnrollCalibrator(getApplicationContext(), savedInstanceState,
(savedInstanceState != null) getIntent());
? savedInstanceState.getParcelable(KEY_CALIBRATOR_UUID, UUID.class) if (mCalibrator != null) {
: getIntent().getSerializableExtra(KEY_CALIBRATOR_UUID, UUID.class) mCalibrator.onFindSensorPage(
); getLifecycle(),
if (mCalibrator == null getSupportFragmentManager(),
|| mCalibrator.getStatusLiveData().getValue() == Status.FINISHED) { this::enableUdfpsLottieAndNextButton
);
} else {
enableUdfpsLottieAndNextButton(); enableUdfpsLottieAndNextButton();
} }
} else { } else {
@@ -193,14 +187,19 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
} }
private void enableUdfpsLottieAndNextButton() { private void enableUdfpsLottieAndNextButton() {
mFooterBarMixin.setPrimaryButton( if (isFinishing()) {
new FooterButton.Builder(this) return;
.setText(R.string.security_settings_udfps_enroll_find_sensor_start_button) }
.setListener(this::onStartButtonClick)
.setButtonType(FooterButton.ButtonType.NEXT) if (mFooterBarMixin.getPrimaryButton() == null) {
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary) mFooterBarMixin.setPrimaryButton(new FooterButton.Builder(this)
.build() .setText(R.string.security_settings_udfps_enroll_find_sensor_start_button)
); .setListener(this::onStartButtonClick)
.setButtonType(FooterButton.ButtonType.NEXT)
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
.build()
);
}
if (mIllustrationLottie != null) { if (mIllustrationLottie != null) {
mIllustrationLottie.setOnClickListener(this::onStartButtonClick); mIllustrationLottie.setOnClickListener(this::onStartButtonClick);
} }
@@ -285,7 +284,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
outState.putBoolean(SAVED_STATE_IS_NEXT_CLICKED, mNextClicked); outState.putBoolean(SAVED_STATE_IS_NEXT_CLICKED, mNextClicked);
if (Flags.udfpsEnrollCalibration()) { if (Flags.udfpsEnrollCalibration()) {
if (mCalibrator != null) { if (mCalibrator != null) {
outState.putSerializable(KEY_CALIBRATOR_UUID, mCalibrator.getUuid()); mCalibrator.onSaveInstanceState(outState);
} }
} }
} }
@@ -317,39 +316,6 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
if (mAnimation != null) { if (mAnimation != null) {
mAnimation.startAnimation(); mAnimation.startAnimation();
} }
if (Flags.udfpsEnrollCalibration()) {
if (mCalibrator != null) {
final Status current = mCalibrator.getStatusLiveData().getValue();
if (current == Status.PROCESSING) {
if (mCalibratorStatusObserver == null) {
mCalibratorStatusObserver = status -> {
if (status == Status.GOT_RESULT) {
onGotCalibrationResult();
}
};
}
mCalibrator.getStatusLiveData().observe(this, mCalibratorStatusObserver);
} else if (current == Status.GOT_RESULT) {
onGotCalibrationResult();
}
}
}
}
private void onGotCalibrationResult() {
if (Flags.udfpsEnrollCalibration()) {
if (mCalibrator != null) {
mCalibrator.setFinished();
if (mCalibrator.getResult() == Result.NEED_CALIBRATION) {
UdfpsEnrollCalibrationDialog.newInstance(
mCalibrator.getCalibrationDialogTitleTextId(),
mCalibrator.getCalibrationDialogMessageTextId(),
mCalibrator.getCalibrationDialogDismissButtonTextId()
).show(getSupportFragmentManager(), "findsensor-calibration-dialog");
}
}
new Handler(Looper.getMainLooper()).post(this::enableUdfpsLottieAndNextButton);
}
} }
private void stopLookingForFingerprint() { private void stopLookingForFingerprint() {
@@ -407,12 +373,6 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
if (mAnimation != null) { if (mAnimation != null) {
mAnimation.pauseAnimation(); mAnimation.pauseAnimation();
} }
if (Flags.udfpsEnrollCalibration()) {
if (mCalibrator != null && mCalibratorStatusObserver != null) {
mCalibrator.getStatusLiveData().removeObserver(mCalibratorStatusObserver);
mCalibratorStatusObserver = null;
}
}
} }
@Override @Override

View File

@@ -57,7 +57,6 @@ import com.google.android.setupdesign.span.LinkSpan;
import com.google.android.setupdesign.util.DeviceHelper; import com.google.android.setupdesign.util.DeviceHelper;
import java.util.List; import java.util.List;
import java.util.UUID;
public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
@@ -92,12 +91,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
if (Flags.udfpsEnrollCalibration()) { if (Flags.udfpsEnrollCalibration()) {
mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider()
.getUdfpsEnrollCalibrator( .getUdfpsEnrollCalibrator(getApplicationContext(), savedInstanceState, null);
(savedInstanceState != null)
? savedInstanceState.getParcelable(
KEY_CALIBRATOR_UUID, UUID.class)
: null
);
} }
final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint); final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint);
@@ -175,7 +169,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
if (Flags.udfpsEnrollCalibration()) { if (Flags.udfpsEnrollCalibration()) {
if (mCalibrator != null) { if (mCalibrator != null) {
outState.putSerializable(KEY_CALIBRATOR_UUID, mCalibrator.getUuid()); mCalibrator.onSaveInstanceState(outState);
} }
} }
} }
@@ -391,7 +385,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
} }
if (Flags.udfpsEnrollCalibration()) { if (Flags.udfpsEnrollCalibration()) {
if (mCalibrator != null) { if (mCalibrator != null) {
intent.putExtra(KEY_CALIBRATOR_UUID, mCalibrator.getUuid()); intent.putExtras(mCalibrator.getExtrasForNextIntent());
} }
} }
return intent; return intent;

View File

@@ -16,12 +16,15 @@
package com.android.settings.biometrics.fingerprint; package com.android.settings.biometrics.fingerprint;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature; import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature;
import java.util.UUID;
public interface FingerprintFeatureProvider { public interface FingerprintFeatureProvider {
/** /**
* Gets the feature implementation of SFPS enrollment. * Gets the feature implementation of SFPS enrollment.
@@ -29,11 +32,16 @@ public interface FingerprintFeatureProvider {
*/ */
SfpsEnrollmentFeature getSfpsEnrollmentFeature(); SfpsEnrollmentFeature getSfpsEnrollmentFeature();
/** /**
* Gets calibrator to calibrate the FPS before enrolling udfps * Gets calibrator for udfps pre-enroll
* @param uuid unique id for passed between different activities * @param appContext application context
* @return udfps calibrator * @param activitySavedInstanceState activity savedInstanceState
* @param activityIntent activity intent
*/ */
@Nullable @Nullable
UdfpsEnrollCalibrator getUdfpsEnrollCalibrator(@Nullable UUID uuid); default UdfpsEnrollCalibrator getUdfpsEnrollCalibrator(@NonNull Context appContext,
@Nullable Bundle activitySavedInstanceState, @Nullable Intent activityIntent) {
return null;
}
} }

View File

@@ -21,8 +21,6 @@ import androidx.annotation.Nullable;
import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature; import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature;
import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeatureImpl; import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeatureImpl;
import java.util.UUID;
public class FingerprintFeatureProviderImpl implements FingerprintFeatureProvider { public class FingerprintFeatureProviderImpl implements FingerprintFeatureProvider {
@Nullable @Nullable
@@ -35,10 +33,4 @@ public class FingerprintFeatureProviderImpl implements FingerprintFeatureProvide
} }
return mSfpsEnrollmentFeatureImpl; return mSfpsEnrollmentFeatureImpl;
} }
@Nullable
@Override
public UdfpsEnrollCalibrator getUdfpsEnrollCalibrator(@Nullable UUID uuid) {
return null;
}
} }

View File

@@ -1,58 +0,0 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.biometrics.fingerprint
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import com.android.settings.R
class UdfpsEnrollCalibrationDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
AlertDialog.Builder(requireActivity(), R.style.Theme_AlertDialog)
.setTitle(arguments!!.getInt(KEY_TITLE_TEXT_ID))
.setMessage(arguments!!.getInt(KEY_MESSAGE_TEXT_ID))
.setPositiveButton(arguments!!.getInt(KEY_DISMISS_BUTTON_TEXT_ID)) {
dialog: DialogInterface?, _: Int -> dialog?.dismiss()
}
.create().also {
isCancelable = false
}
companion object {
private const val KEY_TITLE_TEXT_ID = "title_text_id"
private const val KEY_MESSAGE_TEXT_ID = "message_text_id"
private const val KEY_DISMISS_BUTTON_TEXT_ID = "dismiss_button_text_id"
@JvmStatic
fun newInstance(
@StringRes titleTextId: Int,
@StringRes messageTextId: Int,
@StringRes dismissButtonTextId: Int
) = UdfpsEnrollCalibrationDialog().apply {
arguments = Bundle().apply {
putInt(KEY_TITLE_TEXT_ID, titleTextId)
putInt(KEY_MESSAGE_TEXT_ID, messageTextId)
putInt(KEY_DISMISS_BUTTON_TEXT_ID, dismissButtonTextId)
}
}
}
}

View File

@@ -1,36 +1,18 @@
package com.android.settings.biometrics.fingerprint package com.android.settings.biometrics.fingerprint
import androidx.annotation.StringRes import android.os.Bundle
import androidx.lifecycle.LiveData import androidx.fragment.app.FragmentManager
import java.util.UUID import androidx.lifecycle.Lifecycle
interface UdfpsEnrollCalibrator { interface UdfpsEnrollCalibrator {
enum class Status { val extrasForNextIntent: Bundle
PROCESSING,
GOT_RESULT,
FINISHED,
}
enum class Result { fun onSaveInstanceState(outState: Bundle)
NEED_CALIBRATION,
NO_NEED_CALIBRATION,
}
val uuid: UUID fun onFindSensorPage(
lifecycle: Lifecycle,
val statusLiveData: LiveData<Status> fragmentManager: FragmentManager,
enableEnrollingRunnable: Runnable
val result: Result? )
fun setFinished()
@get:StringRes
val calibrationDialogTitleTextId: Int
@get:StringRes
val calibrationDialogMessageTextId: Int
@get:StringRes
val calibrationDialogDismissButtonTextId: Int
} }