diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java index 7df1fe18e78..c9c8cff034c 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollBase.java +++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java @@ -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_FINGERPRINT = "finished_enrolling_fingerprint"; 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 diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index 063d55d3100..6e908850e89 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -70,6 +70,7 @@ import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.BiometricsEnrollEnrolling; import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.flags.Flags; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.display.DisplayDensityUtils; @@ -197,6 +198,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { @NonNull private SfpsEnrollmentFeature mSfpsEnrollmentFeature = new EmptySfpsEnrollmentFeature(); + @Nullable + private UdfpsEnrollCalibrator mCalibrator; @VisibleForTesting protected boolean shouldShowLottie() { @@ -245,6 +248,12 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { setContentView(layout); setDescriptionText(R.string.security_settings_udfps_enroll_start_message); + + if (Flags.udfpsEnrollCalibration()) { + mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() + .getUdfpsEnrollCalibrator(getApplicationContext(), savedInstanceState, + getIntent()); + } } else if (mCanAssumeSfps) { mSfpsEnrollmentFeature = FeatureFactory.getFeatureFactory() .getFingerprintFeatureProvider().getSfpsEnrollmentFeature(); @@ -364,6 +373,11 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { super.onSaveInstanceState(outState); outState.putBoolean(KEY_STATE_CANCELED, mIsCanceled); outState.putInt(KEY_STATE_PREVIOUS_ROTATION, mPreviousRotation); + if (Flags.udfpsEnrollCalibration()) { + if (mCalibrator != null) { + mCalibrator.onSaveInstanceState(outState); + } + } } private void restoreSavedState(Bundle savedInstanceState) { diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java index 276845cf1eb..b71330a5b58 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java @@ -25,8 +25,6 @@ import android.content.res.Resources; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.util.Log; import android.view.OrientationEventListener; import android.view.Surface; @@ -35,15 +33,12 @@ import android.view.accessibility.AccessibilityManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricEnrollSidecar; 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.overlay.FeatureFactory; 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 java.util.List; -import java.util.UUID; /** * Activity explaining the fingerprint sensor location for fingerprint enrollment. @@ -85,8 +79,6 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements private boolean mIsReverseDefaultRotation; @Nullable private UdfpsEnrollCalibrator mCalibrator; - @Nullable - private Observer mCalibratorStatusObserver; @Override protected void onCreate(Bundle savedInstanceState) { @@ -172,13 +164,15 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements if (mCanAssumeUdfps) { if (Flags.udfpsEnrollCalibration()) { mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() - .getUdfpsEnrollCalibrator( - (savedInstanceState != null) - ? savedInstanceState.getParcelable(KEY_CALIBRATOR_UUID, UUID.class) - : getIntent().getSerializableExtra(KEY_CALIBRATOR_UUID, UUID.class) - ); - if (mCalibrator == null - || mCalibrator.getStatusLiveData().getValue() == Status.FINISHED) { + .getUdfpsEnrollCalibrator(getApplicationContext(), savedInstanceState, + getIntent()); + if (mCalibrator != null) { + mCalibrator.onFindSensorPage( + getLifecycle(), + getSupportFragmentManager(), + this::enableUdfpsLottieAndNextButton + ); + } else { enableUdfpsLottieAndNextButton(); } } else { @@ -193,14 +187,19 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements } private void enableUdfpsLottieAndNextButton() { - mFooterBarMixin.setPrimaryButton( - new FooterButton.Builder(this) - .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 (isFinishing()) { + return; + } + + if (mFooterBarMixin.getPrimaryButton() == null) { + mFooterBarMixin.setPrimaryButton(new FooterButton.Builder(this) + .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) { mIllustrationLottie.setOnClickListener(this::onStartButtonClick); } @@ -285,7 +284,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements outState.putBoolean(SAVED_STATE_IS_NEXT_CLICKED, mNextClicked); if (Flags.udfpsEnrollCalibration()) { 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) { 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() { @@ -407,12 +373,6 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements if (mAnimation != null) { mAnimation.pauseAnimation(); } - if (Flags.udfpsEnrollCalibration()) { - if (mCalibrator != null && mCalibratorStatusObserver != null) { - mCalibrator.getStatusLiveData().removeObserver(mCalibratorStatusObserver); - mCalibratorStatusObserver = null; - } - } } @Override diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java index dc3c65ed674..bd52b64e6cb 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java @@ -57,7 +57,6 @@ import com.google.android.setupdesign.span.LinkSpan; import com.google.android.setupdesign.util.DeviceHelper; import java.util.List; -import java.util.UUID; public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { @@ -92,12 +91,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { if (Flags.udfpsEnrollCalibration()) { mCalibrator = FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() - .getUdfpsEnrollCalibrator( - (savedInstanceState != null) - ? savedInstanceState.getParcelable( - KEY_CALIBRATOR_UUID, UUID.class) - : null - ); + .getUdfpsEnrollCalibrator(getApplicationContext(), savedInstanceState, null); } final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint); @@ -175,7 +169,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { super.onSaveInstanceState(outState); if (Flags.udfpsEnrollCalibration()) { 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 (mCalibrator != null) { - intent.putExtra(KEY_CALIBRATOR_UUID, mCalibrator.getUuid()); + intent.putExtras(mCalibrator.getExtrasForNextIntent()); } } return intent; diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java b/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java index 5a2bf8bad59..e7702207ad1 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java @@ -16,12 +16,15 @@ 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 com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature; -import java.util.UUID; - public interface FingerprintFeatureProvider { /** * Gets the feature implementation of SFPS enrollment. @@ -29,11 +32,16 @@ public interface FingerprintFeatureProvider { */ SfpsEnrollmentFeature getSfpsEnrollmentFeature(); + /** - * Gets calibrator to calibrate the FPS before enrolling udfps - * @param uuid unique id for passed between different activities - * @return udfps calibrator + * Gets calibrator for udfps pre-enroll + * @param appContext application context + * @param activitySavedInstanceState activity savedInstanceState + * @param activityIntent activity intent */ @Nullable - UdfpsEnrollCalibrator getUdfpsEnrollCalibrator(@Nullable UUID uuid); + default UdfpsEnrollCalibrator getUdfpsEnrollCalibrator(@NonNull Context appContext, + @Nullable Bundle activitySavedInstanceState, @Nullable Intent activityIntent) { + return null; + } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProviderImpl.java b/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProviderImpl.java index 1baabc66ecc..9745ca3fd7e 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProviderImpl.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProviderImpl.java @@ -21,8 +21,6 @@ import androidx.annotation.Nullable; import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature; import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeatureImpl; -import java.util.UUID; - public class FingerprintFeatureProviderImpl implements FingerprintFeatureProvider { @Nullable @@ -35,10 +33,4 @@ public class FingerprintFeatureProviderImpl implements FingerprintFeatureProvide } return mSfpsEnrollmentFeatureImpl; } - - @Nullable - @Override - public UdfpsEnrollCalibrator getUdfpsEnrollCalibrator(@Nullable UUID uuid) { - return null; - } } diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollCalibrationDialog.kt b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollCalibrationDialog.kt deleted file mode 100644 index 892996a8d43..00000000000 --- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollCalibrationDialog.kt +++ /dev/null @@ -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) - } - } - } -} diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollCalibrator.kt b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollCalibrator.kt index c0626d3e694..9809bcc0cfa 100644 --- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollCalibrator.kt +++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollCalibrator.kt @@ -1,36 +1,18 @@ package com.android.settings.biometrics.fingerprint -import androidx.annotation.StringRes -import androidx.lifecycle.LiveData -import java.util.UUID +import android.os.Bundle +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.Lifecycle interface UdfpsEnrollCalibrator { - enum class Status { - PROCESSING, - GOT_RESULT, - FINISHED, - } + val extrasForNextIntent: Bundle - enum class Result { - NEED_CALIBRATION, - NO_NEED_CALIBRATION, - } + fun onSaveInstanceState(outState: Bundle) - val uuid: UUID - - val statusLiveData: LiveData - - val result: Result? - - fun setFinished() - - @get:StringRes - val calibrationDialogTitleTextId: Int - - @get:StringRes - val calibrationDialogMessageTextId: Int - - @get:StringRes - val calibrationDialogDismissButtonTextId: Int + fun onFindSensorPage( + lifecycle: Lifecycle, + fragmentManager: FragmentManager, + enableEnrollingRunnable: Runnable + ) } \ No newline at end of file