From cbc619c8706ca723647eb92c8be0491091a8eb12 Mon Sep 17 00:00:00 2001 From: Elliot Sisteron Date: Wed, 9 Aug 2023 12:43:54 +0000 Subject: [PATCH] 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 --- .../safetycenter/BiometricsSafetySource.java | 5 + .../BiometricsSafetySourceTest.java | 201 +++++++++++------- 2 files changed, 124 insertions(+), 82 deletions(-) diff --git a/src/com/android/settings/safetycenter/BiometricsSafetySource.java b/src/com/android/settings/safetycenter/BiometricsSafetySource.java index 9dc5b4e765e..94db71f143e 100644 --- a/src/com/android/settings/safetycenter/BiometricsSafetySource.java +++ b/src/com/android/settings/safetycenter/BiometricsSafetySource.java @@ -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. */ diff --git a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java index 01c2143740b..f6356bca114 100644 --- a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java +++ b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java @@ -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 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 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 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 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 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 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 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 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 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 createFingerprintList(int size) {