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
This commit is contained in:
Joshua McCloskey
2024-07-24 16:19:33 +00:00
committed by Joshua Mccloskey
parent 441a202444
commit ed59922ca8
5 changed files with 77 additions and 1 deletions

View File

@@ -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"

View File

@@ -159,11 +159,27 @@ public class FingerprintSettings extends SubSettings {
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

View File

@@ -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<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

View File

@@ -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() {

View File

@@ -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<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