Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3aaf1147 authored by Vitor Carvalho's avatar Vitor Carvalho Committed by Android (Google) Code Review
Browse files

Merge "Update ParentalControlsUtils to call the new internal API that is aware...

Merge "Update ParentalControlsUtils to call the new internal API that is aware of SupervisionManager, introduced in ag/31120568." into main
parents 3db5f484 387268db
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -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;
        }
    }
}
+68 −10
Original line number Diff line number Diff line
@@ -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);
    }
}