Respond with null data when no biometrics.

Safety Center expects a response to the broadcast in this case.
The Settings app should respond with explicitely no data to Safety
Center rather than not respond.

Bug: 295143688
Test: atest BiometricsSafetySourceTest
Change-Id: Iea7f7c53919d90bf3d7fd989fb2f320a5c9ee9c6
This commit is contained in:
Elliot Sisteron
2023-08-09 12:43:54 +00:00
parent 76707864e5
commit cbc619c870
2 changed files with 124 additions and 82 deletions

View File

@@ -164,7 +164,12 @@ public final class BiometricsSafetySource {
disablingAdmin == null /* enabled */,
fingerprintStatusUtils.hasEnrolled(),
safetyEvent);
return;
}
SafetyCenterManagerWrapper.get()
.setSafetySourceData(
context, SAFETY_SOURCE_ID, /* safetySourceData= */ null, safetyEvent);
}
/** Notifies Safety Center of a change in biometrics settings. */

View File

@@ -67,24 +67,18 @@ import java.util.List;
@RunWith(AndroidJUnit4.class)
public class BiometricsSafetySourceTest {
private static final ComponentName COMPONENT_NAME =
new ComponentName("package", "class");
private static final ComponentName COMPONENT_NAME = new ComponentName("package", "class");
private static final UserHandle USER_HANDLE = new UserHandle(UserHandle.myUserId());
private static final SafetyEvent EVENT_SOURCE_STATE_CHANGED =
new SafetyEvent.Builder(SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
private Context mApplicationContext;
@Mock
private PackageManager mPackageManager;
@Mock
private DevicePolicyManager mDevicePolicyManager;
@Mock
private FingerprintManager mFingerprintManager;
@Mock
private FaceManager mFaceManager;
@Mock
private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
@Mock private PackageManager mPackageManager;
@Mock private DevicePolicyManager mDevicePolicyManager;
@Mock private FingerprintManager mFingerprintManager;
@Mock private FaceManager mFaceManager;
@Mock private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
@Before
public void setUp() {
@@ -119,15 +113,16 @@ public class BiometricsSafetySourceTest {
}
@Test
public void setSafetySourceData_whenSafetyCenterIsEnabled_withoutBiometrics_doesNotSetData() {
public void setSafetySourceData_whenSafetyCenterIsEnabled_withoutBiometrics_setsNullData() {
when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(false);
when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
when(mFaceManager.isHardwareDetected()).thenReturn(false);
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
verify(mSafetyCenterManagerWrapper, never())
.setSafetySourceData(any(), any(), any(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), eq(null), any());
}
@Test
@@ -140,8 +135,9 @@ public class BiometricsSafetySourceTest {
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), any(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), any(), any());
}
@Test
@@ -225,7 +221,8 @@ public class BiometricsSafetySourceTest {
assertSafetySourceEnabledDataSetWithPluralSummary(
"security_settings_fingerprint_preference_title",
"security_settings_fingerprint_preference_summary", enrolledFingerprintsCount,
"security_settings_fingerprint_preference_summary",
enrolledFingerprintsCount,
FingerprintSettings.class.getName());
}
@@ -346,8 +343,9 @@ public class BiometricsSafetySourceTest {
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.isHardwareDetected()).thenReturn(true);
when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
.thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FACE
| DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
.thenReturn(
DevicePolicyManager.KEYGUARD_DISABLE_FACE
| DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
@@ -363,8 +361,8 @@ public class BiometricsSafetySourceTest {
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
createFingerprintList(enrolledFingerprintsCount));
when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
.thenReturn(createFingerprintList(enrolledFingerprintsCount));
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
@@ -381,8 +379,8 @@ public class BiometricsSafetySourceTest {
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
createFingerprintList(enrolledFingerprintsCount));
when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
.thenReturn(createFingerprintList(enrolledFingerprintsCount));
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
@@ -398,8 +396,8 @@ public class BiometricsSafetySourceTest {
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
Collections.emptyList());
when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
.thenReturn(Collections.emptyList());
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
@@ -415,8 +413,8 @@ public class BiometricsSafetySourceTest {
when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.isHardwareDetected()).thenReturn(false);
when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
createFingerprintList(enrolledFingerprintsCount));
when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
.thenReturn(createFingerprintList(enrolledFingerprintsCount));
ActiveUnlockTestUtils.enable(mApplicationContext);
@@ -452,8 +450,8 @@ public class BiometricsSafetySourceTest {
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
createFingerprintList(enrolledFingerprintsCount));
when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
.thenReturn(createFingerprintList(enrolledFingerprintsCount));
ActiveUnlockTestUtils.enable(mApplicationContext);
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
@@ -462,7 +460,6 @@ public class BiometricsSafetySourceTest {
"security_settings_biometric_preference_title",
"security_settings_biometric_preference_summary_both_fp_single",
Settings.CombinedBiometricSettingsActivity.class.getName());
}
@Test
@@ -472,14 +469,15 @@ public class BiometricsSafetySourceTest {
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.isHardwareDetected()).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
createFingerprintList(enrolledFingerprintsCount));
when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
.thenReturn(createFingerprintList(enrolledFingerprintsCount));
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
assertSafetySourceEnabledDataSetWithPluralSummary(
"security_settings_biometric_preference_title",
"security_settings_fingerprint_preference_summary", enrolledFingerprintsCount,
"security_settings_fingerprint_preference_summary",
enrolledFingerprintsCount,
Settings.CombinedBiometricSettingsActivity.class.getName());
}
@@ -494,8 +492,12 @@ public class BiometricsSafetySourceTest {
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
assertThat(safetySourceStatus.getSeverityLevel())
.isEqualTo(SafetySourceData.SEVERITY_LEVEL_INFORMATION);
@@ -512,8 +514,12 @@ public class BiometricsSafetySourceTest {
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
assertThat(safetySourceStatus.getSeverityLevel())
.isEqualTo(SafetySourceData.SEVERITY_LEVEL_INFORMATION);
@@ -530,8 +536,12 @@ public class BiometricsSafetySourceTest {
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
assertThat(safetySourceStatus.getSeverityLevel())
.isEqualTo(SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED);
@@ -547,8 +557,12 @@ public class BiometricsSafetySourceTest {
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
assertThat(safetySourceStatus.getSeverityLevel())
.isEqualTo(SafetySourceData.SEVERITY_LEVEL_INFORMATION);
@@ -564,8 +578,12 @@ public class BiometricsSafetySourceTest {
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
assertThat(safetySourceStatus.getSeverityLevel())
.isEqualTo(SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED);
@@ -581,8 +599,12 @@ public class BiometricsSafetySourceTest {
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
assertThat(safetySourceStatus.getSeverityLevel())
.isEqualTo(SafetySourceData.SEVERITY_LEVEL_INFORMATION);
@@ -598,61 +620,74 @@ public class BiometricsSafetySourceTest {
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
assertThat(safetySourceStatus.getSeverityLevel())
.isEqualTo(SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED);
}
private void assertSafetySourceDisabledDataSetWithSingularSummary(String expectedTitleResName,
String expectedSummaryResName) {
private void assertSafetySourceDisabledDataSetWithSingularSummary(
String expectedTitleResName, String expectedSummaryResName) {
assertSafetySourceDisabledDataSet(
ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
ResourcesUtils.getResourcesString(mApplicationContext, expectedSummaryResName)
);
ResourcesUtils.getResourcesString(mApplicationContext, expectedSummaryResName));
}
private void assertSafetySourceEnabledDataSetWithSingularSummary(String expectedTitleResName,
private void assertSafetySourceEnabledDataSetWithSingularSummary(
String expectedTitleResName,
String expectedSummaryResName,
String expectedSettingsClassName) {
assertSafetySourceEnabledDataSet(
ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
ResourcesUtils.getResourcesString(mApplicationContext, expectedSummaryResName),
expectedSettingsClassName
);
expectedSettingsClassName);
}
private void assertSafetySourceDisabledDataSetWithPluralSummary(String expectedTitleResName,
String expectedSummaryResName, int expectedSummaryQuantity) {
final int stringResId = ResourcesUtils.getResourcesId(
ApplicationProvider.getApplicationContext(), "string",
expectedSummaryResName);
private void assertSafetySourceDisabledDataSetWithPluralSummary(
String expectedTitleResName,
String expectedSummaryResName,
int expectedSummaryQuantity) {
final int stringResId =
ResourcesUtils.getResourcesId(
ApplicationProvider.getApplicationContext(),
"string",
expectedSummaryResName);
assertSafetySourceDisabledDataSet(
ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
StringUtil.getIcuPluralsString(mApplicationContext,
expectedSummaryQuantity, stringResId)
);
StringUtil.getIcuPluralsString(
mApplicationContext, expectedSummaryQuantity, stringResId));
}
private void assertSafetySourceEnabledDataSetWithPluralSummary(String expectedTitleResName,
String expectedSummaryResName, int expectedSummaryQuantity,
private void assertSafetySourceEnabledDataSetWithPluralSummary(
String expectedTitleResName,
String expectedSummaryResName,
int expectedSummaryQuantity,
String expectedSettingsClassName) {
final int stringResId = ResourcesUtils.getResourcesId(
ApplicationProvider.getApplicationContext(), "string",
expectedSummaryResName);
final int stringResId =
ResourcesUtils.getResourcesId(
ApplicationProvider.getApplicationContext(),
"string",
expectedSummaryResName);
assertSafetySourceEnabledDataSet(
ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
StringUtil.getIcuPluralsString(mApplicationContext,
expectedSummaryQuantity, stringResId),
expectedSettingsClassName
);
StringUtil.getIcuPluralsString(
mApplicationContext, expectedSummaryQuantity, stringResId),
expectedSettingsClassName);
}
private void assertSafetySourceDisabledDataSet(String expectedTitle, String expectedSummary) {
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceData safetySourceData = captor.getValue();
SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
@@ -667,11 +702,15 @@ public class BiometricsSafetySourceTest {
assertThat(clickIntent.getAction()).isEqualTo(ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
}
private void assertSafetySourceEnabledDataSet(String expectedTitle, String expectedSummary,
String expectedSettingsClassName) {
private void assertSafetySourceEnabledDataSet(
String expectedTitle, String expectedSummary, String expectedSettingsClassName) {
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
verify(mSafetyCenterManagerWrapper)
.setSafetySourceData(
any(),
eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
captor.capture(),
any());
SafetySourceData safetySourceData = captor.getValue();
SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
@@ -680,10 +719,8 @@ public class BiometricsSafetySourceTest {
assertThat(safetySourceStatus.isEnabled()).isTrue();
final Intent clickIntent = safetySourceStatus.getPendingIntent().getIntent();
assertThat(clickIntent).isNotNull();
assertThat(clickIntent.getComponent().getPackageName())
.isEqualTo("com.android.settings");
assertThat(clickIntent.getComponent().getClassName())
.isEqualTo(expectedSettingsClassName);
assertThat(clickIntent.getComponent().getPackageName()).isEqualTo("com.android.settings");
assertThat(clickIntent.getComponent().getClassName()).isEqualTo(expectedSettingsClassName);
}
private List<Fingerprint> createFingerprintList(int size) {