diff --git a/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceController.java index c9ea9449c7e..a3bcdf8220e 100644 --- a/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceController.java +++ b/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceController.java @@ -15,12 +15,17 @@ */ package com.android.settings.biometrics.combination; +import android.app.admin.DevicePolicyManager; import android.content.Context; import androidx.lifecycle.Lifecycle; +import androidx.preference.Preference; import com.android.settings.Utils; import com.android.settings.biometrics.face.FaceStatusPreferenceController; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedLockUtilsInternal; +import com.android.settingslib.RestrictedPreference; /** * Preference controller for face settings within the biometrics settings page, that controls the @@ -37,6 +42,20 @@ public class BiometricFaceStatusPreferenceController extends FaceStatusPreferenc super(context, key, lifecycle); } + @Override + public void updateState(Preference preference) { + super.updateState(preference); + final boolean isFaceEnrolled = mFaceStatusUtils.hasEnrolled(); + final RestrictedLockUtils.EnforcedAdmin admin = + RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled( + mContext, DevicePolicyManager.KEYGUARD_DISABLE_FACE, getUserId()); + if (admin != null && !isFaceEnrolled) { + ((RestrictedPreference) preference).setDisabledByAdmin(admin); + } else { + preference.setEnabled(true); + } + } + @Override protected boolean isDeviceSupported() { return Utils.isMultipleBiometricsSupported(mContext) && isHardwareSupported(); diff --git a/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceController.java index 9789417acee..f2bcc15884d 100644 --- a/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceController.java +++ b/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceController.java @@ -15,12 +15,17 @@ */ package com.android.settings.biometrics.combination; +import android.app.admin.DevicePolicyManager; import android.content.Context; import androidx.lifecycle.Lifecycle; +import androidx.preference.Preference; import com.android.settings.Utils; import com.android.settings.biometrics.fingerprint.FingerprintStatusPreferenceController; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedLockUtilsInternal; +import com.android.settingslib.RestrictedPreference; /** * Preference controller for fingerprint settings within the biometrics settings page of work @@ -38,6 +43,20 @@ public class BiometricFingerprintStatusPreferenceController extends super(context, key, lifecycle); } + @Override + public void updateState(Preference preference) { + super.updateState(preference); + final boolean isFingerprintEnrolled = mFingerprintStatusUtils.hasEnrolled(); + final RestrictedLockUtils.EnforcedAdmin admin = + RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled( + mContext, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT, getUserId()); + if (admin != null && !isFingerprintEnrolled) { + ((RestrictedPreference) preference).setDisabledByAdmin(admin); + } else { + preference.setEnabled(true); + } + } + @Override protected boolean isDeviceSupported() { return Utils.isMultipleBiometricsSupported(mContext) && isHardwareSupported(); diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java index 3398c203c65..24df51f1635 100644 --- a/src/com/android/settings/biometrics/face/FaceSettings.java +++ b/src/com/android/settings/biometrics/face/FaceSettings.java @@ -36,6 +36,7 @@ import android.util.Log; import android.widget.Button; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import com.android.settings.R; import com.android.settings.SettingsActivity; @@ -46,6 +47,7 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.LayoutPreference; @@ -68,6 +70,8 @@ public class FaceSettings extends DashboardFragment { "security_settings_face_delete_faces_container"; private static final String PREF_KEY_ENROLL_FACE_UNLOCK = "security_settings_face_enroll_faces_container"; + public static final String SECURITY_SETTINGS_FACE_MANAGE_CATEGORY = + "security_settings_face_manage_category"; private UserManager mUserManager; private FaceManager mFaceManager; @@ -175,6 +179,8 @@ public class FaceSettings extends DashboardFragment { : use(FaceSettingsLockscreenBypassPreferenceController.class); mLockscreenController.setUserId(mUserId); + final PreferenceCategory managePref = + findPreference(SECURITY_SETTINGS_FACE_MANAGE_CATEGORY); Preference keyguardPref = findPreference(FaceSettingsKeyguardPreferenceController.KEY); Preference appPref = findPreference(FaceSettingsAppPreferenceController.KEY); Preference attentionPref = findPreference(FaceSettingsAttentionPreferenceController.KEY); @@ -184,6 +190,14 @@ public class FaceSettings extends DashboardFragment { mTogglePreferences = new ArrayList<>( Arrays.asList(keyguardPref, appPref, attentionPref, confirmPref, bypassPref)); + if (RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled( + getContext(), DevicePolicyManager.KEYGUARD_DISABLE_FACE, mUserId) != null) { + managePref.setTitle(getString( + com.android.settingslib.widget.restricted.R.string.disabled_by_admin)); + } else { + managePref.setTitle(R.string.security_settings_face_settings_preferences_category); + } + mRemoveButton = findPreference(FaceSettingsRemoveButtonPreferenceController.KEY); mEnrollButton = findPreference(FaceSettingsEnrollButtonPreferenceController.KEY); diff --git a/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceController.java index 1902bc4b431..77a160de403 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceController.java @@ -24,6 +24,7 @@ import android.hardware.face.FaceManager.GetFeatureCallback; import android.hardware.face.FaceManager.SetFeatureCallback; import android.provider.Settings; +import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.TwoStatePreference; @@ -66,8 +67,12 @@ public class FaceSettingsAttentionPreferenceController extends FaceSettingsPrefe requireAttentionEnabled = featureState[i]; } } - mPreference.setEnabled(success); mPreference.setChecked(requireAttentionEnabled); + if (getRestrictingAdmin() != null) { + mPreference.setEnabled(false); + } else { + mPreference.setEnabled(success); + } } }; diff --git a/src/com/android/settings/biometrics/face/FaceSettingsConfirmPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsConfirmPreferenceController.java index 60f8b21d4f4..f71e2febccd 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsConfirmPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsConfirmPreferenceController.java @@ -72,6 +72,8 @@ public class FaceSettingsConfirmPreferenceController extends FaceSettingsPrefere preference.setEnabled(false); } else if (!mFaceManager.hasEnrolledTemplates(getUserId())) { preference.setEnabled(false); + } else if (getRestrictingAdmin() != null) { + preference.setEnabled(false); } else { preference.setEnabled(true); } diff --git a/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java index e5f7c4ff60f..74133547242 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.biometrics.face; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; import android.view.View; @@ -28,6 +29,7 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.widget.LayoutPreference; import com.google.android.setupdesign.util.ButtonStyler; @@ -71,6 +73,10 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference } mButton.setOnClickListener(this); + final boolean isDeviceOwnerBlockingAuth = + RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled( + mContext, DevicePolicyManager.KEYGUARD_DISABLE_FACE, mUserId) != null; + mButton.setEnabled(!isDeviceOwnerBlockingAuth); } @Override diff --git a/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java index c0cb64ec6b1..1f82e453c30 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java @@ -27,8 +27,6 @@ import androidx.preference.Preference; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.Utils; -import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; -import com.android.settingslib.RestrictedSwitchPreference; public class FaceSettingsLockscreenBypassPreferenceController extends FaceSettingsPreferenceController { @@ -68,12 +66,11 @@ public class FaceSettingsLockscreenBypassPreferenceController @Override public void updateState(Preference preference) { - EnforcedAdmin admin; super.updateState(preference); if (!FaceSettings.isFaceHardwareDetected(mContext)) { preference.setEnabled(false); - } else if ((admin = getRestrictingAdmin()) != null) { - ((RestrictedSwitchPreference) preference).setDisabledByAdmin(admin); + } else if (getRestrictingAdmin() != null) { + preference.setEnabled(false); } else if (!mFaceManager.hasEnrolledTemplates(getUserId())) { preference.setEnabled(false); } else { diff --git a/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java b/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java index c71119cdeee..7e19bcf6985 100644 --- a/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java @@ -42,7 +42,7 @@ public class FaceStatusPreferenceController extends BiometricStatusPreferenceCon @VisibleForTesting RestrictedPreference mPreference; private PreferenceScreen mPreferenceScreen; - private final FaceStatusUtils mFaceStatusUtils; + protected final FaceStatusUtils mFaceStatusUtils; public FaceStatusPreferenceController(Context context) { this(context, KEY_FACE_SETTINGS, null /* lifecycle */); diff --git a/src/com/android/settings/biometrics/face/FaceStatusUtils.java b/src/com/android/settings/biometrics/face/FaceStatusUtils.java index 7c075cc31e0..d02e115c75a 100644 --- a/src/com/android/settings/biometrics/face/FaceStatusUtils.java +++ b/src/com/android/settings/biometrics/face/FaceStatusUtils.java @@ -16,6 +16,7 @@ package com.android.settings.biometrics.face; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.face.FaceManager; @@ -26,6 +27,7 @@ import com.android.settings.Settings; import com.android.settings.Utils; import com.android.settings.biometrics.ParentalControlsUtils; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settingslib.RestrictedLockUtilsInternal; /** * Utilities for face details shared between Security Settings and Safety Center. @@ -75,9 +77,14 @@ public class FaceStatusUtils { * Returns the summary of face settings entity. */ public String getSummary() { - return mContext.getResources().getString(hasEnrolled() + if (shouldShowDisabledByAdminStr()) { + return mContext.getString( + com.android.settingslib.widget.restricted.R.string.disabled_by_admin); + } else { + return mContext.getResources().getString(hasEnrolled() ? R.string.security_settings_face_preference_summary : R.string.security_settings_face_preference_summary_none); + } } /** @@ -94,4 +101,12 @@ public class FaceStatusUtils { public boolean hasEnrolled() { return mFaceManager.hasEnrolledTemplates(mUserId); } + + /** + * Indicates if the face feature is enabled or disabled by the Device Admin. + */ + private boolean shouldShowDisabledByAdminStr() { + return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled( + mContext, DevicePolicyManager.KEYGUARD_DISABLE_FACE, mUserId) != null; + } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 109ae4f22fb..63499a58c6c 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -686,10 +686,16 @@ public class FingerprintSettings extends SubSettings { // retryFingerprint() will be called when remove finishes // need to disable enroll or have a way to determine if enroll is in progress final boolean removalInProgress = mRemovalSidecar.inProgress(); + final boolean isDeviceOwnerBlockingAuth = + RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled( + getContext(), DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT, + mUserId) != null; + CharSequence maxSummary = tooMany ? getContext().getString(R.string.fingerprint_add_max, max) : ""; mAddFingerprintPreference.setSummary(maxSummary); - mAddFingerprintPreference.setEnabled(!tooMany && !removalInProgress && mToken != null); + mAddFingerprintPreference.setEnabled(!isDeviceOwnerBlockingAuth + && !tooMany && !removalInProgress && mToken != null); } private void createFooterPreference(PreferenceGroup root) { diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java index 61ec54b1b46..58bc7e34202 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java @@ -86,6 +86,8 @@ public class FingerprintSettingsRequireScreenOnToAuthPreferenceController preference.setEnabled(false); } else if (!mFingerprintManager.hasEnrolledTemplates(getUserId())) { preference.setEnabled(false); + } else if (getRestrictingAdmin() != null) { + preference.setEnabled(false); } else { preference.setEnabled(true); } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java index fba93e10b41..4fcf1e8369c 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java @@ -40,7 +40,7 @@ public class FingerprintStatusPreferenceController extends BiometricStatusPrefer protected final FingerprintManager mFingerprintManager; @VisibleForTesting RestrictedPreference mPreference; - private final FingerprintStatusUtils mFingerprintStatusUtils; + protected final FingerprintStatusUtils mFingerprintStatusUtils; private PreferenceScreen mPreferenceScreen; public FingerprintStatusPreferenceController(Context context) { diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java index 1005e3f6be7..d6e6498636b 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java @@ -16,6 +16,7 @@ package com.android.settings.biometrics.fingerprint; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.fingerprint.FingerprintManager; @@ -25,6 +26,7 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.biometrics.ParentalControlsUtils; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.utils.StringUtil; /** @@ -76,6 +78,10 @@ public class FingerprintStatusUtils { * Returns the summary of fingerprint settings entity. */ public String getSummary() { + if (shouldShowDisabledByAdminStr()) { + return mContext.getString( + com.android.settingslib.widget.restricted.R.string.disabled_by_admin); + } if (hasEnrolled()) { final int numEnrolled = mFingerprintManager.getEnrolledFingerprints(mUserId).size(); return StringUtil.getIcuPluralsString(mContext, numEnrolled, @@ -99,4 +105,12 @@ public class FingerprintStatusUtils { public boolean hasEnrolled() { return mFingerprintManager.hasEnrolledFingerprints(mUserId); } + + /** + * Indicates if the fingerprint feature should show the "Disabled by Admin" string. + */ + private boolean shouldShowDisabledByAdminStr() { + return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled( + mContext, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT, mUserId) != null; + } } diff --git a/tests/robotests/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceControllerTest.java index 84a9ad42acb..ca22f0e3f3e 100644 --- a/tests/robotests/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/combination/BiometricFaceStatusPreferenceControllerTest.java @@ -18,10 +18,15 @@ package com.android.settings.biometrics.combination; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.face.FaceManager; @@ -30,6 +35,7 @@ import android.os.UserManager; import com.android.settings.testutils.ActiveUnlockTestUtils; import com.android.settings.testutils.shadow.ShadowDeviceConfig; +import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal; import com.android.settingslib.RestrictedPreference; import org.junit.After; @@ -46,7 +52,7 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowDeviceConfig.class}) +@Config(shadows = {ShadowDeviceConfig.class, ShadowRestrictedLockUtilsInternal.class}) public class BiometricFaceStatusPreferenceControllerTest { @Rule public final MockitoRule mMocks = MockitoJUnit.rule(); @@ -78,6 +84,7 @@ public class BiometricFaceStatusPreferenceControllerTest { @After public void tearDown() { ActiveUnlockTestUtils.disable(mContext); + ShadowRestrictedLockUtilsInternal.reset(); } @Test @@ -110,4 +117,43 @@ public class BiometricFaceStatusPreferenceControllerTest { assertThat(mPreference.isVisible()).isTrue(); } + @Test + public void faceDisabled_whenAdminAndNoFingerprintsEnrolled() { + when(mFaceManager.isHardwareDetected()).thenReturn(true); + when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false); + + ShadowRestrictedLockUtilsInternal + .setKeyguardDisabledFeatures(DevicePolicyManager.KEYGUARD_DISABLE_FACE); + + final RestrictedPreference restrictedPreference = mock(RestrictedPreference.class); + mController.updateState(restrictedPreference); + + verify(restrictedPreference).setDisabledByAdmin(any()); + } + + @Test + public void faceNotDisabled_whenAdminAndFingerprintsEnrolled() { + when(mFaceManager.isHardwareDetected()).thenReturn(true); + when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true); + + ShadowRestrictedLockUtilsInternal + .setKeyguardDisabledFeatures(DevicePolicyManager.KEYGUARD_DISABLE_FACE); + + final RestrictedPreference restrictedPreference = mock(RestrictedPreference.class); + mController.updateState(restrictedPreference); + + verify(restrictedPreference, never()).setDisabledByAdmin(any()); + verify(restrictedPreference).setEnabled(true); + } + + @Test + public void faceNotDisabled_whenNoAdmin() { + when(mFaceManager.isHardwareDetected()).thenReturn(true); + + final RestrictedPreference restrictedPreference = mock(RestrictedPreference.class); + mController.updateState(restrictedPreference); + + verify(restrictedPreference, never()).setDisabledByAdmin(any()); + verify(restrictedPreference).setEnabled(true); + } } diff --git a/tests/robotests/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceControllerTest.java index 3eb4c21f6a2..7d1ca2abeb6 100644 --- a/tests/robotests/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/combination/BiometricFingerprintStatusPreferenceControllerTest.java @@ -18,10 +18,15 @@ package com.android.settings.biometrics.combination; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.face.FaceManager; @@ -30,6 +35,7 @@ import android.os.UserManager; import com.android.settings.testutils.ActiveUnlockTestUtils; import com.android.settings.testutils.shadow.ShadowDeviceConfig; +import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal; import com.android.settingslib.RestrictedPreference; import org.junit.After; @@ -46,7 +52,7 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowDeviceConfig.class}) +@Config(shadows = {ShadowDeviceConfig.class, ShadowRestrictedLockUtilsInternal.class}) public class BiometricFingerprintStatusPreferenceControllerTest { @Rule public final MockitoRule mMocks = MockitoJUnit.rule(); @@ -78,6 +84,7 @@ public class BiometricFingerprintStatusPreferenceControllerTest { @After public void tearDown() { ActiveUnlockTestUtils.disable(mContext); + ShadowRestrictedLockUtilsInternal.reset(); } @Test @@ -110,4 +117,45 @@ public class BiometricFingerprintStatusPreferenceControllerTest { assertThat(mPreference.isVisible()).isTrue(); } + + + @Test + public void fingerprintDisabled_whenAdminAndNoFingerprintsEnrolled() { + when(mFingerprintManager.isHardwareDetected()).thenReturn(true); + when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false); + + ShadowRestrictedLockUtilsInternal + .setKeyguardDisabledFeatures(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT); + + final RestrictedPreference restrictedPreference = mock(RestrictedPreference.class); + mController.updateState(restrictedPreference); + + verify(restrictedPreference).setDisabledByAdmin(any()); + } + + @Test + public void fingerprintNotDisabled_whenAdminAndFingerprintsEnrolled() { + when(mFingerprintManager.isHardwareDetected()).thenReturn(true); + when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(true); + + ShadowRestrictedLockUtilsInternal + .setKeyguardDisabledFeatures(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT); + + final RestrictedPreference restrictedPreference = mock(RestrictedPreference.class); + mController.updateState(restrictedPreference); + + verify(restrictedPreference, never()).setDisabledByAdmin(any()); + verify(restrictedPreference).setEnabled(true); + } + + @Test + public void fingerprintNotDisabled_whenNoAdmin() { + when(mFingerprintManager.isHardwareDetected()).thenReturn(true); + + final RestrictedPreference restrictedPreference = mock(RestrictedPreference.class); + mController.updateState(restrictedPreference); + + verify(restrictedPreference, never()).setDisabledByAdmin(any()); + verify(restrictedPreference).setEnabled(true); + } } diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java index 77a6b02d71b..2d39eae0551 100644 --- a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java @@ -127,6 +127,7 @@ public class FaceSettingsLockscreenBypassPreferenceControllerTest { EnforcedAdmin admin = new EnforcedAdmin(); doReturn(admin).when(mController).getRestrictingAdmin(); mController.updateState(mPreference); - verify(mPreference).setDisabledByAdmin(admin); + + verify(mPreference).setEnabled(false); } } diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceStatusPreferenceControllerTest.java index 34db4218f79..c426f9479ef 100644 --- a/tests/robotests/src/com/android/settings/biometrics/face/FaceStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceStatusPreferenceControllerTest.java @@ -43,6 +43,7 @@ import androidx.preference.Preference; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedPreference; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -55,11 +56,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import java.util.Collections; @RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowRestrictedLockUtilsInternal.class}) public class FaceStatusPreferenceControllerTest { private static final String TEST_PREF_KEY = "baz"; diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceControllerTest.java index a9cac87cebc..000ee933dc4 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceControllerTest.java @@ -43,6 +43,7 @@ import androidx.preference.Preference; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedPreference; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -56,11 +57,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import java.util.Collections; @RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowRestrictedLockUtilsInternal.class}) public class FingerprintStatusPreferenceControllerTest { @Mock