Merge "Update ParentalControlsUtils to call the new internal API that is aware of SupervisionManager, introduced in ag/31120568." into main

This commit is contained in:
Vitor Carvalho
2025-01-27 04:03:47 -08:00
committed by Android (Google) Code Review
2 changed files with 87 additions and 16 deletions

View File

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

View File

@@ -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);
}
}