From ed59922ca8714c9b644c40d732058ffb94c1c932 Mon Sep 17 00:00:00 2001 From: Joshua McCloskey Date: Wed, 24 Jul 2024 16:19:33 +0000 Subject: [PATCH] Remove face/fignerprint search if not present Test: Verified manually with a device that if face/fingerprint are not present they do not show up. Fixes: 350599580 Flag: EXEMPT bugfix Change-Id: I6a691d2985e4839336e9c08dfa6c97abe23f43f2 --- .../security_settings_fingerprint_limbo.xml | 3 ++- .../fingerprint/FingerprintSettings.java | 16 +++++++++++++ .../settings/security/SecuritySettings.java | 21 ++++++++++++++++ .../FingerprintSettingsFragmentTest.java | 14 +++++++++++ .../security/SecuritySettingsTest.java | 24 +++++++++++++++++++ 5 files changed, 77 insertions(+), 1 deletion(-) diff --git a/res/xml/security_settings_fingerprint_limbo.xml b/res/xml/security_settings_fingerprint_limbo.xml index 02a3dfb8df8..8b97c833e8d 100644 --- a/res/xml/security_settings_fingerprint_limbo.xml +++ b/res/xml/security_settings_fingerprint_limbo.xml @@ -18,7 +18,8 @@ + android:title="@string/security_settings_fingerprint_preference_title" + settings:searchable="false"> createPreferenceControllers(Context context) { return createThePreferenceControllers(context); } + + private boolean hasEnrolledFingerprints(Context context) { + final FingerprintManager fingerprintManager = + Utils.getFingerprintManagerOrNull(context); + if (fingerprintManager != null) { + return fingerprintManager.hasEnrolledTemplates(UserHandle.myUserId()); + } + return false; + } }; private static List createThePreferenceControllers(Context diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java index 6d987f34c1f..797d3ec621e 100644 --- a/src/com/android/settings/security/SecuritySettings.java +++ b/src/com/android/settings/security/SecuritySettings.java @@ -15,10 +15,15 @@ */ package com.android.settings.security; +import static com.android.settings.biometrics.face.FaceSettings.isFaceHardwareDetected; +import static com.android.settings.biometrics.fingerprint.FingerprintSettings.isFingerprintHardwareDetected; + import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; +import androidx.annotation.VisibleForTesting; + import com.android.settings.R; import com.android.settings.biometrics.combination.CombinedBiometricStatusPreferenceController; import com.android.settings.biometrics.face.FaceStatusPreferenceController; @@ -45,6 +50,10 @@ public class SecuritySettings extends DashboardFragment { public static final int CHANGE_TRUST_AGENT_SETTINGS = 126; public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129; public static final int UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 130; + @VisibleForTesting + static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings"; + @VisibleForTesting + static final String KEY_FACE_SETTINGS = "face_settings"; @Override public int getMetricsCategory() { @@ -131,6 +140,18 @@ public class SecuritySettings extends DashboardFragment { .hasAlternativeSecuritySettingsFragment() && !SafetyCenterManagerWrapper.get().isEnabled(context); } + + @Override + public List getNonIndexableKeys(Context context) { + final List keys = super.getNonIndexableKeys(context); + if (!isFingerprintHardwareDetected(context)) { + keys.add(KEY_FINGERPRINT_SETTINGS); + } + if (!isFaceHardwareDetected(context)) { + keys.add(KEY_FACE_SETTINGS); + } + return keys; + } }; @Override diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java index 29b29614133..b3e1c5dd08b 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java @@ -40,6 +40,7 @@ import static org.robolectric.Shadows.shadowOf; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.ComponentInfoInternal; @@ -67,6 +68,7 @@ import androidx.test.core.app.ApplicationProvider; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmDeviceCredentialActivity; +import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settings.testutils.shadow.ShadowLockPatternUtils; @@ -114,6 +116,8 @@ public class FingerprintSettingsFragmentTest { @Mock private FragmentTransaction mFragmentTransaction; @Mock + private PackageManager mPackageManager; + @Mock private BiometricManager mBiometricManager; @Captor @@ -283,6 +287,16 @@ public class FingerprintSettingsFragmentTest { assertThat(mFragment.isVisible()).isTrue(); } + @Test + public void testNotIndexable_whenDisabled() { + doReturn(mPackageManager).when(mContext).getPackageManager(); + doReturn(false) + .when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_FINGERPRINT); + + final BaseSearchIndexProvider provider = FingerprintSettingsFragment.SEARCH_INDEX_DATA_PROVIDER; + assertThat(provider.getDynamicRawDataToIndex(mContext, true)).isEmpty(); + } + @Ignore("b/353726774") @Test public void testAddButtonWorksAfterRemovalError() { diff --git a/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java b/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java index dee90b45f36..61ca6e555e5 100644 --- a/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java +++ b/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java @@ -339,6 +339,30 @@ public class SecuritySettingsTest { assertThat(mPreferenceCombined.isVisible()).isFalse(); } + @Test + public void noFace_isNotIndexable() throws Exception { + when(mFaceManager.isHardwareDetected()).thenReturn(false); + final BaseSearchIndexProvider indexProvider = SecuritySettings.SEARCH_INDEX_DATA_PROVIDER; + + final List allXmlKeys = TestUtils.getAllXmlKeys(mContext, indexProvider); + final List nonIndexableKeys = indexProvider.getNonIndexableKeys(mContext); + allXmlKeys.removeAll(nonIndexableKeys); + + assertThat(allXmlKeys).doesNotContain(SecuritySettings.KEY_FACE_SETTINGS); + } + + @Test + public void noFingerprint_isNotIndexable() throws Exception { + when(mFingerprintManager.isHardwareDetected()).thenReturn(false); + final BaseSearchIndexProvider indexProvider = SecuritySettings.SEARCH_INDEX_DATA_PROVIDER; + + final List allXmlKeys = TestUtils.getAllXmlKeys(mContext, indexProvider); + final List nonIndexableKeys = indexProvider.getNonIndexableKeys(mContext); + allXmlKeys.removeAll(nonIndexableKeys); + + assertThat(allXmlKeys).doesNotContain(SecuritySettings.KEY_FINGERPRINT_SETTINGS); + } + boolean isFacePrefAvailable(List controllers) { return controllers.stream().filter( controller -> controller instanceof FaceStatusPreferenceController