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

Commit 387268db authored by Vitor Carvalho's avatar Vitor Carvalho
Browse files

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

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

Bug: 382038943
Flag: android.app.supervision.flags.deprecate_dpm_supervision_apis
Test: atest ParentalControlsUtilsTest
Change-Id: I884aa5f90a298c5e3e0fe85a5944d75234846140
parent 1b1fe46c
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);
    }
}