Provide a way to customize biometric SafetySourceIssue

Add a new FeatureProvider for biometrics in FeatureFactory to provide a way to customize biometric SafetySourceIssue

Bug: 370940762
Test: m Settings
Test: m SettingsGoogle
Test: m SettingsSpaUnitTests
Test: m SettingsRoboTests
Flag: com.android.settings.flags.biometrics_onboarding_education
Change-Id: I4d11f3d3522ce5ac2f975cca7c041339f3ea6031
This commit is contained in:
Shawn Lin
2025-02-02 08:15:59 +00:00
parent e06acaab1d
commit 7c3559d37f
10 changed files with 136 additions and 4 deletions

View File

@@ -0,0 +1,32 @@
/*
* 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;
import android.safetycenter.SafetySourceIssue;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public interface BiometricsFeatureProvider {
/** Returns a SafetySourceIssue for biometrics. */
@Nullable
SafetySourceIssue getSafetySourceIssue(@NonNull String sourceId);
/** Notifies that the action of an issue is launched */
void notifySafetyIssueActionLaunched();
}

View File

@@ -0,0 +1,33 @@
/*
* 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;
import android.safetycenter.SafetySourceIssue;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class BiometricsFeatureProviderImpl implements BiometricsFeatureProvider {
@Nullable
@Override
public SafetySourceIssue getSafetySourceIssue(@NonNull String sourceId) {
return null;
}
@Override
public void notifySafetyIssueActionLaunched() {}
}

View File

@@ -20,6 +20,7 @@ import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider import com.android.settings.accessibility.AccessibilitySearchFeatureProvider
import com.android.settings.accounts.AccountFeatureProvider import com.android.settings.accounts.AccountFeatureProvider
import com.android.settings.applications.ApplicationFeatureProvider import com.android.settings.applications.ApplicationFeatureProvider
import com.android.settings.biometrics.BiometricsFeatureProvider
import com.android.settings.biometrics.face.FaceFeatureProvider import com.android.settings.biometrics.face.FaceFeatureProvider
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
import com.android.settings.bluetooth.BluetoothFeatureProvider import com.android.settings.bluetooth.BluetoothFeatureProvider
@@ -107,6 +108,11 @@ abstract class FeatureFactory {
*/ */
abstract val bluetoothFeatureProvider: BluetoothFeatureProvider abstract val bluetoothFeatureProvider: BluetoothFeatureProvider
/**
* Retrieves implementation for Biometrics feature.
*/
abstract val biometricsFeatureProvider: BiometricsFeatureProvider
/** /**
* Retrieves implementation for Face feature. * Retrieves implementation for Face feature.
*/ */

View File

@@ -27,6 +27,8 @@ import com.android.settings.accessibility.AccessibilitySearchFeatureProviderImpl
import com.android.settings.accounts.AccountFeatureProvider import com.android.settings.accounts.AccountFeatureProvider
import com.android.settings.accounts.AccountFeatureProviderImpl import com.android.settings.accounts.AccountFeatureProviderImpl
import com.android.settings.applications.ApplicationFeatureProviderImpl import com.android.settings.applications.ApplicationFeatureProviderImpl
import com.android.settings.biometrics.BiometricsFeatureProvider
import com.android.settings.biometrics.BiometricsFeatureProviderImpl
import com.android.settings.biometrics.face.FaceFeatureProvider import com.android.settings.biometrics.face.FaceFeatureProvider
import com.android.settings.biometrics.face.FaceFeatureProviderImpl import com.android.settings.biometrics.face.FaceFeatureProviderImpl
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
@@ -145,6 +147,10 @@ open class FeatureFactoryImpl : FeatureFactory() {
BluetoothFeatureProviderImpl() BluetoothFeatureProviderImpl()
} }
override val biometricsFeatureProvider: BiometricsFeatureProvider by lazy {
BiometricsFeatureProviderImpl()
}
override val faceFeatureProvider: FaceFeatureProvider by lazy { FaceFeatureProviderImpl() } override val faceFeatureProvider: FaceFeatureProvider by lazy { FaceFeatureProviderImpl() }
override val fingerprintFeatureProvider: FingerprintFeatureProvider by lazy { override val fingerprintFeatureProvider: FingerprintFeatureProvider by lazy {

View File

@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.safetycenter.SafetyEvent; import android.safetycenter.SafetyEvent;
import android.safetycenter.SafetySourceData; import android.safetycenter.SafetySourceData;
import android.safetycenter.SafetySourceIssue;
import android.safetycenter.SafetySourceStatus; import android.safetycenter.SafetySourceStatus;
/** Static helpers for setting SafetyCenter data for biometric safety sources. */ /** Static helpers for setting SafetyCenter data for biometric safety sources. */
@@ -42,6 +43,30 @@ public final class BiometricSourcesUtils {
boolean enabled, boolean enabled,
boolean hasEnrolled, boolean hasEnrolled,
SafetyEvent safetyEvent) { SafetyEvent safetyEvent) {
setBiometricSafetySourceData(
safetySourceId,
context,
title,
summary,
pendingIntent,
enabled,
hasEnrolled,
safetyEvent,
null
);
}
/** Sets data for one of the biometrics sources */
public static void setBiometricSafetySourceData(
String safetySourceId,
Context context,
String title,
String summary,
PendingIntent pendingIntent,
boolean enabled,
boolean hasEnrolled,
SafetyEvent safetyEvent,
SafetySourceIssue safetySourceIssue) {
int severityLevel = int severityLevel =
enabled && hasEnrolled enabled && hasEnrolled
? SafetySourceData.SEVERITY_LEVEL_INFORMATION ? SafetySourceData.SEVERITY_LEVEL_INFORMATION
@@ -52,8 +77,13 @@ public final class BiometricSourcesUtils {
.setPendingIntent(pendingIntent) .setPendingIntent(pendingIntent)
.setEnabled(enabled) .setEnabled(enabled)
.build(); .build();
SafetySourceData safetySourceData =
new SafetySourceData.Builder().setStatus(status).build(); SafetySourceData.Builder builder = new SafetySourceData.Builder().setStatus(status);
if (safetySourceIssue != null) {
builder.addIssue(safetySourceIssue);
}
SafetySourceData safetySourceData = builder.build();
SafetyCenterManagerWrapper.get() SafetyCenterManagerWrapper.get()
.setSafetySourceData(context, safetySourceId, safetySourceData, safetyEvent); .setSafetySourceData(context, safetySourceId, safetySourceData, safetyEvent);

View File

@@ -29,6 +29,7 @@ import android.safetycenter.SafetyEvent;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricNavigationUtils; import com.android.settings.biometrics.BiometricNavigationUtils;
import com.android.settings.biometrics.face.FaceStatusUtils; import com.android.settings.biometrics.face.FaceStatusUtils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
/** Face biometrics Safety Source for Safety Center. */ /** Face biometrics Safety Source for Safety Center. */
@@ -87,7 +88,9 @@ public final class FaceSafetySource {
REQUEST_CODE_FACE_SETTING), REQUEST_CODE_FACE_SETTING),
disablingAdmin == null /* enabled */, disablingAdmin == null /* enabled */,
faceStatusUtils.hasEnrolled(), faceStatusUtils.hasEnrolled(),
safetyEvent); safetyEvent,
FeatureFactory.getFeatureFactory().getBiometricsFeatureProvider()
.getSafetySourceIssue(SAFETY_SOURCE_ID));
return; return;
} }

View File

@@ -29,6 +29,7 @@ import android.safetycenter.SafetyEvent;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricNavigationUtils; import com.android.settings.biometrics.BiometricNavigationUtils;
import com.android.settings.biometrics.fingerprint.FingerprintStatusUtils; import com.android.settings.biometrics.fingerprint.FingerprintStatusUtils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
/** Fingerprint biometrics Safety Source for Safety Center. */ /** Fingerprint biometrics Safety Source for Safety Center. */
@@ -89,7 +90,9 @@ public final class FingerprintSafetySource {
REQUEST_CODE_FINGERPRINT_SETTING), REQUEST_CODE_FINGERPRINT_SETTING),
disablingAdmin == null /* enabled */, disablingAdmin == null /* enabled */,
fingerprintStatusUtils.hasEnrolled(), fingerprintStatusUtils.hasEnrolled(),
safetyEvent); safetyEvent,
FeatureFactory.getFeatureFactory().getBiometricsFeatureProvider()
.getSafetySourceIssue(SAFETY_SOURCE_ID));
return; return;
} }

View File

@@ -23,6 +23,7 @@ import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider; import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
import com.android.settings.accounts.AccountFeatureProvider; import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider; import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.biometrics.BiometricsFeatureProvider;
import com.android.settings.biometrics.face.FaceFeatureProvider; import com.android.settings.biometrics.face.FaceFeatureProvider;
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider; import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProvider; import com.android.settings.bluetooth.BluetoothFeatureProvider;
@@ -80,6 +81,7 @@ public class FakeFeatureFactory extends FeatureFactory {
public final UserFeatureProvider userFeatureProvider; public final UserFeatureProvider userFeatureProvider;
public final AccountFeatureProvider mAccountFeatureProvider; public final AccountFeatureProvider mAccountFeatureProvider;
public final BluetoothFeatureProvider mBluetoothFeatureProvider; public final BluetoothFeatureProvider mBluetoothFeatureProvider;
public final BiometricsFeatureProvider mBiometricsFeatureProvider;
public final FaceFeatureProvider mFaceFeatureProvider; public final FaceFeatureProvider mFaceFeatureProvider;
public final FingerprintFeatureProvider mFingerprintFeatureProvider; public final FingerprintFeatureProvider mFingerprintFeatureProvider;
@@ -135,6 +137,7 @@ public class FakeFeatureFactory extends FeatureFactory {
mContextualCardFeatureProvider = mock(ContextualCardFeatureProvider.class); mContextualCardFeatureProvider = mock(ContextualCardFeatureProvider.class);
panelFeatureProvider = mock(PanelFeatureProvider.class); panelFeatureProvider = mock(PanelFeatureProvider.class);
mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class); mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
mBiometricsFeatureProvider = mock(BiometricsFeatureProvider.class);
mFaceFeatureProvider = mock(FaceFeatureProvider.class); mFaceFeatureProvider = mock(FaceFeatureProvider.class);
mFingerprintFeatureProvider = mock(FingerprintFeatureProvider.class); mFingerprintFeatureProvider = mock(FingerprintFeatureProvider.class);
wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class); wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
@@ -258,6 +261,11 @@ public class FakeFeatureFactory extends FeatureFactory {
return mBluetoothFeatureProvider; return mBluetoothFeatureProvider;
} }
@Override
public BiometricsFeatureProvider getBiometricsFeatureProvider() {
return mBiometricsFeatureProvider;
}
@Override @Override
public FaceFeatureProvider getFaceFeatureProvider() { public FaceFeatureProvider getFaceFeatureProvider() {
return mFaceFeatureProvider; return mFaceFeatureProvider;

View File

@@ -21,6 +21,7 @@ import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider import com.android.settings.accessibility.AccessibilitySearchFeatureProvider
import com.android.settings.accounts.AccountFeatureProvider import com.android.settings.accounts.AccountFeatureProvider
import com.android.settings.applications.ApplicationFeatureProvider import com.android.settings.applications.ApplicationFeatureProvider
import com.android.settings.biometrics.BiometricsFeatureProvider
import com.android.settings.biometrics.face.FaceFeatureProvider import com.android.settings.biometrics.face.FaceFeatureProvider
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
import com.android.settings.bluetooth.BluetoothFeatureProvider import com.android.settings.bluetooth.BluetoothFeatureProvider
@@ -114,6 +115,8 @@ class FakeFeatureFactory : FeatureFactory() {
override val bluetoothFeatureProvider: BluetoothFeatureProvider override val bluetoothFeatureProvider: BluetoothFeatureProvider
get() = TODO("Not yet implemented") get() = TODO("Not yet implemented")
override val biometricsFeatureProvider: BiometricsFeatureProvider
get() = TODO("Not yet implemented")
override val faceFeatureProvider: FaceFeatureProvider override val faceFeatureProvider: FaceFeatureProvider
get() = TODO("Not yet implemented") get() = TODO("Not yet implemented")
override val fingerprintFeatureProvider: FingerprintFeatureProvider override val fingerprintFeatureProvider: FingerprintFeatureProvider

View File

@@ -23,6 +23,7 @@ import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider; import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
import com.android.settings.accounts.AccountFeatureProvider; import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider; import com.android.settings.applications.ApplicationFeatureProvider;
import com.android.settings.biometrics.BiometricsFeatureProvider;
import com.android.settings.biometrics.face.FaceFeatureProvider; import com.android.settings.biometrics.face.FaceFeatureProvider;
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider; import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProvider; import com.android.settings.bluetooth.BluetoothFeatureProvider;
@@ -79,6 +80,7 @@ public class FakeFeatureFactory extends FeatureFactory {
public final UserFeatureProvider userFeatureProvider; public final UserFeatureProvider userFeatureProvider;
public final AccountFeatureProvider mAccountFeatureProvider; public final AccountFeatureProvider mAccountFeatureProvider;
public final BluetoothFeatureProvider mBluetoothFeatureProvider; public final BluetoothFeatureProvider mBluetoothFeatureProvider;
public final BiometricsFeatureProvider mBiometricsFeatureProvider;
public final FaceFeatureProvider mFaceFeatureProvider; public final FaceFeatureProvider mFaceFeatureProvider;
public final FingerprintFeatureProvider mFingerprintFeatureProvider; public final FingerprintFeatureProvider mFingerprintFeatureProvider;
@@ -136,6 +138,7 @@ public class FakeFeatureFactory extends FeatureFactory {
mContextualCardFeatureProvider = mock(ContextualCardFeatureProvider.class); mContextualCardFeatureProvider = mock(ContextualCardFeatureProvider.class);
panelFeatureProvider = mock(PanelFeatureProvider.class); panelFeatureProvider = mock(PanelFeatureProvider.class);
mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class); mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
mBiometricsFeatureProvider = mock(BiometricsFeatureProvider.class);
mFaceFeatureProvider = mock(FaceFeatureProvider.class); mFaceFeatureProvider = mock(FaceFeatureProvider.class);
mFingerprintFeatureProvider = mock(FingerprintFeatureProvider.class); mFingerprintFeatureProvider = mock(FingerprintFeatureProvider.class);
wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class); wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
@@ -259,6 +262,11 @@ public class FakeFeatureFactory extends FeatureFactory {
return mBluetoothFeatureProvider; return mBluetoothFeatureProvider;
} }
@Override
public BiometricsFeatureProvider getBiometricsFeatureProvider() {
return mBiometricsFeatureProvider;
}
@Override @Override
public FaceFeatureProvider getFaceFeatureProvider() { public FaceFeatureProvider getFaceFeatureProvider() {
return mFaceFeatureProvider; return mFaceFeatureProvider;