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:
@@ -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();
|
||||||
|
}
|
@@ -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() {}
|
||||||
|
}
|
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user