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
diff --git a/res/xml/security_settings_fingerprint_limbo.xml b/res/xml/security_settings_fingerprint_limbo.xml
index 02a3dfb..8b97c83 100644
--- a/res/xml/security_settings_fingerprint_limbo.xml
+++ b/res/xml/security_settings_fingerprint_limbo.xml
@@ -18,7 +18,8 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:title="@string/security_settings_fingerprint_preference_title">
+ android:title="@string/security_settings_fingerprint_preference_title"
+ settings:searchable="false">
<PreferenceCategory
android:key="security_settings_fingerprints_enrolled"
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index 9cda327..65d9366 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -159,11 +159,27 @@
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.security_settings_fingerprint) {
+
+ @Override
+ protected boolean isPageSearchEnabled(Context context) {
+ return super.isPageSearchEnabled(context) &&
+ hasEnrolledFingerprints(context);
+ }
+
@Override
public List<AbstractPreferenceController>
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<AbstractPreferenceController> createThePreferenceControllers(Context
diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java
index 6d987f3..797d3ec 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 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 @@
.hasAlternativeSecuritySettingsFragment()
&& !SafetyCenterManagerWrapper.get().isEnabled(context);
}
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ final List<String> 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 29b2961..b3e1c5d 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 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 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 @@
@Mock
private FragmentTransaction mFragmentTransaction;
@Mock
+ private PackageManager mPackageManager;
+ @Mock
private BiometricManager mBiometricManager;
@Captor
@@ -283,6 +287,16 @@
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 dee90b4..61ca6e5 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 @@
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<String> allXmlKeys = TestUtils.getAllXmlKeys(mContext, indexProvider);
+ final List<String> 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<String> allXmlKeys = TestUtils.getAllXmlKeys(mContext, indexProvider);
+ final List<String> nonIndexableKeys = indexProvider.getNonIndexableKeys(mContext);
+ allXmlKeys.removeAll(nonIndexableKeys);
+
+ assertThat(allXmlKeys).doesNotContain(SecuritySettings.KEY_FINGERPRINT_SETTINGS);
+ }
+
boolean isFacePrefAvailable(List<AbstractPreferenceController> controllers) {
return controllers.stream().filter(
controller -> controller instanceof FaceStatusPreferenceController