Support invoker in FingerprintSettings
Support running invoker after ChallengeGenerated in FingerprintSettings. Bug: 384399941 Flag: EXEMPT support interface, flag only used in impl part Test: atest FingerprintSettingsFragmentTest Change-Id: I0c01ae163a492a31c07e00c0a93829c9bfc12b91
This commit is contained in:
@@ -23,10 +23,14 @@ import android.os.Bundle;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.android.settings.biometrics.fingerprint.feature.ChallengeGeneratedInvoker;
|
||||||
import com.android.settings.biometrics.fingerprint.feature.FingerprintExtPreferencesProvider;
|
import com.android.settings.biometrics.fingerprint.feature.FingerprintExtPreferencesProvider;
|
||||||
import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature;
|
import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature;
|
||||||
import com.android.settings.biometrics.fingerprint.feature.SfpsRestToUnlockFeature;
|
import com.android.settings.biometrics.fingerprint.feature.SfpsRestToUnlockFeature;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface FingerprintFeatureProvider {
|
public interface FingerprintFeatureProvider {
|
||||||
/**
|
/**
|
||||||
* Gets the feature implementation of SFPS enrollment.
|
* Gets the feature implementation of SFPS enrollment.
|
||||||
@@ -80,4 +84,9 @@ public interface FingerprintFeatureProvider {
|
|||||||
default FingerprintSettingsFeatureProvider getFingerprintSettingsFeatureProvider() {
|
default FingerprintSettingsFeatureProvider getFingerprintSettingsFeatureProvider() {
|
||||||
return FingerprintSettingsFeatureProvider.getInstance();
|
return FingerprintSettingsFeatureProvider.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
default List<ChallengeGeneratedInvoker> getChallengeGeneratedInvokers() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -86,6 +86,7 @@ import com.android.settings.biometrics.BiometricEnrollBase;
|
|||||||
import com.android.settings.biometrics.BiometricUtils;
|
import com.android.settings.biometrics.BiometricUtils;
|
||||||
import com.android.settings.biometrics.GatekeeperPasswordProvider;
|
import com.android.settings.biometrics.GatekeeperPasswordProvider;
|
||||||
import com.android.settings.biometrics.IdentityCheckBiometricErrorDialog;
|
import com.android.settings.biometrics.IdentityCheckBiometricErrorDialog;
|
||||||
|
import com.android.settings.biometrics.fingerprint.feature.ChallengeGeneratedInvoker;
|
||||||
import com.android.settings.biometrics.fingerprint.feature.FingerprintExtPreferencesProvider;
|
import com.android.settings.biometrics.fingerprint.feature.FingerprintExtPreferencesProvider;
|
||||||
import com.android.settings.biometrics.fingerprint.feature.PrimarySwitchIntentPreference;
|
import com.android.settings.biometrics.fingerprint.feature.PrimarySwitchIntentPreference;
|
||||||
import com.android.settings.core.SettingsBaseActivity;
|
import com.android.settings.core.SettingsBaseActivity;
|
||||||
@@ -267,6 +268,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
private static final String KEY_HAS_FIRST_ENROLLED = "has_first_enrolled";
|
private static final String KEY_HAS_FIRST_ENROLLED = "has_first_enrolled";
|
||||||
private static final String KEY_IS_ENROLLING = "is_enrolled";
|
private static final String KEY_IS_ENROLLING = "is_enrolled";
|
||||||
private static final String KEY_IS_LAUNCHING_EXT_PREF = "is_launching_ext_pref";
|
private static final String KEY_IS_LAUNCHING_EXT_PREF = "is_launching_ext_pref";
|
||||||
|
private static final String KEY_HAS_RUN_CHALLENGE_INVOKER = "has_run_challenge_invoker";
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final String KEY_REQUIRE_SCREEN_ON_TO_AUTH =
|
static final String KEY_REQUIRE_SCREEN_ON_TO_AUTH =
|
||||||
"security_settings_require_screen_on_to_auth";
|
"security_settings_require_screen_on_to_auth";
|
||||||
@@ -334,6 +336,8 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
@NonNull private String mLaunchedExtPrefKey = "";
|
@NonNull private String mLaunchedExtPrefKey = "";
|
||||||
/** key list for changing visibility */
|
/** key list for changing visibility */
|
||||||
@NonNull private final ArrayList<String> mExtPrefKeys = new ArrayList<>();
|
@NonNull private final ArrayList<String> mExtPrefKeys = new ArrayList<>();
|
||||||
|
/** Use to make sure ChallengeGeneratedInvokers have been run */
|
||||||
|
private boolean mHasRunChallengeInvoker = false;
|
||||||
|
|
||||||
private long mChallenge;
|
private long mChallenge;
|
||||||
|
|
||||||
@@ -595,6 +599,8 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
mIsEnrolling = savedInstanceState.getBoolean(KEY_IS_ENROLLING, mIsEnrolling);
|
mIsEnrolling = savedInstanceState.getBoolean(KEY_IS_ENROLLING, mIsEnrolling);
|
||||||
mLaunchedExtPrefKey = savedInstanceState.getString(
|
mLaunchedExtPrefKey = savedInstanceState.getString(
|
||||||
KEY_IS_LAUNCHING_EXT_PREF, mLaunchedExtPrefKey);
|
KEY_IS_LAUNCHING_EXT_PREF, mLaunchedExtPrefKey);
|
||||||
|
mHasRunChallengeInvoker = savedInstanceState.getBoolean(
|
||||||
|
KEY_HAS_RUN_CHALLENGE_INVOKER, /* defaultValue= */ false);
|
||||||
mHasFirstEnrolled = savedInstanceState.getBoolean(KEY_HAS_FIRST_ENROLLED,
|
mHasFirstEnrolled = savedInstanceState.getBoolean(KEY_HAS_FIRST_ENROLLED,
|
||||||
mHasFirstEnrolled);
|
mHasFirstEnrolled);
|
||||||
mBiometricsAuthenticationRequested = savedInstanceState.getBoolean(
|
mBiometricsAuthenticationRequested = savedInstanceState.getBoolean(
|
||||||
@@ -1113,6 +1119,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
outState.putBoolean(KEY_IS_ENROLLING, mIsEnrolling);
|
outState.putBoolean(KEY_IS_ENROLLING, mIsEnrolling);
|
||||||
outState.putString(KEY_IS_LAUNCHING_EXT_PREF, mLaunchedExtPrefKey);
|
outState.putString(KEY_IS_LAUNCHING_EXT_PREF, mLaunchedExtPrefKey);
|
||||||
outState.putBoolean(KEY_HAS_FIRST_ENROLLED, mHasFirstEnrolled);
|
outState.putBoolean(KEY_HAS_FIRST_ENROLLED, mHasFirstEnrolled);
|
||||||
|
outState.putBoolean(KEY_HAS_RUN_CHALLENGE_INVOKER, mHasRunChallengeInvoker);
|
||||||
outState.putBoolean(KEY_BIOMETRICS_AUTHENTICATION_REQUESTED,
|
outState.putBoolean(KEY_BIOMETRICS_AUTHENTICATION_REQUESTED,
|
||||||
mBiometricsAuthenticationRequested);
|
mBiometricsAuthenticationRequested);
|
||||||
}
|
}
|
||||||
@@ -1265,6 +1272,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
if (requestCode == CONFIRM_REQUEST || requestCode == CHOOSE_LOCK_GENERIC_REQUEST) {
|
if (requestCode == CONFIRM_REQUEST || requestCode == CHOOSE_LOCK_GENERIC_REQUEST) {
|
||||||
mLaunchedConfirm = false;
|
mLaunchedConfirm = false;
|
||||||
if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) {
|
if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) {
|
||||||
|
runChallengeGeneratedInvokers();
|
||||||
if (BiometricUtils.containsGatekeeperPasswordHandle(data)) {
|
if (BiometricUtils.containsGatekeeperPasswordHandle(data)) {
|
||||||
if (!mHasFirstEnrolled && !mIsEnrolling) {
|
if (!mHasFirstEnrolled && !mIsEnrolling) {
|
||||||
final Activity activity = getActivity();
|
final Activity activity = getActivity();
|
||||||
@@ -1399,6 +1407,31 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void runChallengeGeneratedInvokers() {
|
||||||
|
if (mHasRunChallengeInvoker) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mHasRunChallengeInvoker = true;
|
||||||
|
|
||||||
|
List<ChallengeGeneratedInvoker> invokers = FeatureFactory.getFeatureFactory()
|
||||||
|
.getFingerprintFeatureProvider().getChallengeGeneratedInvokers();
|
||||||
|
Log.d(TAG, "Num of ChallengeGeneratedInvoker: " + invokers.size());
|
||||||
|
for (ChallengeGeneratedInvoker invoker: invokers) {
|
||||||
|
Bundle bundle = getIntent().getBundleExtra(invoker.getIntentKeyForBundle());
|
||||||
|
if (bundle == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
boolean result = invoker.invoke(this, bundle);
|
||||||
|
Log.d(TAG, "Invoker for " + invoker.getIntentKeyForBundle() + " run "
|
||||||
|
+ (System.currentTimeMillis() - startTime) + "ms, result: " + result);
|
||||||
|
|
||||||
|
// We shall only have at most one invoker for each launching
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
|
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2025 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.feature
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
|
||||||
|
interface ChallengeGeneratedInvoker {
|
||||||
|
|
||||||
|
val intentKeyForBundle: String
|
||||||
|
|
||||||
|
fun invoke(fragment: PreferenceFragmentCompat, bundle: Bundle): Boolean
|
||||||
|
}
|
Reference in New Issue
Block a user