diff --git a/src/com/android/settings/biometrics/ParentalControlsUtils.java b/src/com/android/settings/biometrics/ParentalControlsUtils.java index 8dd01f0ea57..04ab1b17596 100644 --- a/src/com/android/settings/biometrics/ParentalControlsUtils.java +++ b/src/com/android/settings/biometrics/ParentalControlsUtils.java @@ -17,6 +17,7 @@ package com.android.settings.biometrics; import android.app.admin.DevicePolicyManager; +import android.app.supervision.SupervisionManager; import android.content.ComponentName; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; @@ -44,6 +45,7 @@ public class ParentalControlsUtils { * {@link android.hardware.biometrics.ParentalControlsUtilsInternal#getTestComponentName} * @return non-null EnforcedAdmin if parental consent is required */ + @Nullable public static RestrictedLockUtils.EnforcedAdmin parentConsentRequired(@NonNull Context context, @BiometricAuthenticator.Modality int modality) { @@ -58,7 +60,11 @@ public class ParentalControlsUtils { } final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class); - return parentConsentRequiredInternal(dpm, modality, userHandle); + final SupervisionManager sm = + android.app.supervision.flags.Flags.deprecateDpmSupervisionApis() + ? context.getSystemService(SupervisionManager.class) + : null; + return parentConsentRequiredInternal(dpm, sm, modality, userHandle); } /** @@ -68,16 +74,23 @@ public class ParentalControlsUtils { @Nullable @VisibleForTesting static RestrictedLockUtils.EnforcedAdmin parentConsentRequiredInternal( - @NonNull DevicePolicyManager dpm, @BiometricAuthenticator.Modality int modality, + @NonNull DevicePolicyManager dpm, + @Nullable SupervisionManager sm, + @BiometricAuthenticator.Modality int modality, @NonNull UserHandle userHandle) { - if (ParentalControlsUtilsInternal.parentConsentRequired(dpm, modality, - userHandle)) { + if (!ParentalControlsUtilsInternal.parentConsentRequired( + dpm, sm, modality, userHandle)) { + return null; + } + if (android.app.supervision.flags.Flags.deprecateDpmSupervisionApis()) { + // Supervision doesn't necessarily have have an admin component. + return new RestrictedLockUtils.EnforcedAdmin( + /* component= */ null, UserManager.DISALLOW_BIOMETRIC, userHandle); + } else { final ComponentName cn = ParentalControlsUtilsInternal.getSupervisionComponentName(dpm, userHandle); return new RestrictedLockUtils.EnforcedAdmin(cn, UserManager.DISALLOW_BIOMETRIC, userHandle); - } else { - return null; } } } diff --git a/tests/unit/src/com/android/settings/biometrics/ParentalControlsUtilsTest.java b/tests/unit/src/com/android/settings/biometrics/ParentalControlsUtilsTest.java index 5128af0d410..2b6184b9153 100644 --- a/tests/unit/src/com/android/settings/biometrics/ParentalControlsUtilsTest.java +++ b/tests/unit/src/com/android/settings/biometrics/ParentalControlsUtilsTest.java @@ -16,26 +16,32 @@ package com.android.settings.biometrics; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_IRIS; + import static junit.framework.TestCase.assertNotNull; import static junit.framework.TestCase.assertNull; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.app.admin.DevicePolicyManager; +import android.app.supervision.SupervisionManager; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_IRIS; - import android.hardware.biometrics.BiometricAuthenticator; import android.os.UserHandle; import android.os.UserManager; +import android.platform.test.annotations.RequiresFlagsDisabled; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import androidx.annotation.Nullable; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -43,6 +49,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settingslib.RestrictedLockUtils; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -50,11 +57,12 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class ParentalControlsUtilsTest { + @Rule public final CheckFlagsRule checkFlags = DeviceFlagsValueProvider.createCheckFlagsRule(); + + @Mock private Context mContext; + @Mock private DevicePolicyManager mDpm; + @Mock private SupervisionManager mSm; - @Mock - private Context mContext; - @Mock - private DevicePolicyManager mDpm; private ComponentName mSupervisionComponentName = new ComponentName("pkg", "cls"); @Before @@ -76,11 +84,28 @@ public class ParentalControlsUtilsTest { when(mDpm.getKeyguardDisabledFeatures(eq(supervisionComponentName))) .thenReturn(keyguardDisabledFlags); - return ParentalControlsUtils.parentConsentRequiredInternal(mDpm, modality, - new UserHandle(UserHandle.myUserId())); + return ParentalControlsUtils.parentConsentRequiredInternal( + mDpm, mSm, modality, new UserHandle(UserHandle.myUserId())); + } + + /** + * Helper that sets the appropriate mocks and testing behavior before returning the actual + * EnforcedAdmin from ParentalControlsUtils. + */ + @Nullable + private RestrictedLockUtils.EnforcedAdmin getEnforcedAdminForSupervision( + boolean supervisionEnabled, + @BiometricAuthenticator.Modality int modality, + int keyguardDisabledFlags) { + when(mSm.isSupervisionEnabledForUser(anyInt())).thenReturn(supervisionEnabled); + when(mDpm.getKeyguardDisabledFeatures(eq(null))).thenReturn(keyguardDisabledFlags); + + return ParentalControlsUtils.parentConsentRequiredInternal( + mDpm, mSm, modality, new UserHandle(UserHandle.myUserId())); } @Test + @RequiresFlagsDisabled(android.app.supervision.flags.Flags.FLAG_DEPRECATE_DPM_SUPERVISION_APIS) public void testEnforcedAdmin_whenDpmDisablesBiometricsAndSupervisionComponentExists() { int[][] tests = { {TYPE_FINGERPRINT, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT}, @@ -99,6 +124,28 @@ public class ParentalControlsUtilsTest { } @Test + @RequiresFlagsEnabled(android.app.supervision.flags.Flags.FLAG_DEPRECATE_DPM_SUPERVISION_APIS) + public void testEnforcedAdmin_whenDpmDisablesBiometricsAndSupervisionIsEnabled() { + int[][] tests = { + {TYPE_FINGERPRINT, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT}, + {TYPE_FACE, DevicePolicyManager.KEYGUARD_DISABLE_FACE}, + {TYPE_IRIS, DevicePolicyManager.KEYGUARD_DISABLE_IRIS}, + }; + + for (int i = 0; i < tests.length; i++) { + RestrictedLockUtils.EnforcedAdmin admin = getEnforcedAdminForSupervision( + /* supervisionEnabled= */ true, + /* modality= */ tests[i][0], + /* keyguardDisableFlags= */ tests[i][1]); + + assertNotNull(admin); + assertEquals(UserManager.DISALLOW_BIOMETRIC, admin.enforcedRestriction); + assertNull(admin.component); + } + } + + @Test + @RequiresFlagsDisabled(android.app.supervision.flags.Flags.FLAG_DEPRECATE_DPM_SUPERVISION_APIS) public void testNoEnforcedAdmin_whenNoSupervisionComponent() { // Even if DPM flag exists, returns null EnforcedAdmin when no supervision component exists RestrictedLockUtils.EnforcedAdmin admin = getEnforcedAdminForCombination( @@ -106,4 +153,15 @@ public class ParentalControlsUtilsTest { DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT); assertNull(admin); } + + @Test + @RequiresFlagsEnabled(android.app.supervision.flags.Flags.FLAG_DEPRECATE_DPM_SUPERVISION_APIS) + public void testNoEnforcedAdmin_whenSupervisionIsDisabled() { + RestrictedLockUtils.EnforcedAdmin admin = getEnforcedAdminForSupervision( + /* supervisionEnabled= */ false, + TYPE_FINGERPRINT, + DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT); + + assertNull(admin); + } }