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

Commit 059980d2 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Make bypass controller consistent with rest of face unlock settings

1) Should only be shown for owner profile
2) Should be disabled if A) not enrolled, B) DevicePolicyManager, C) HAL issue

Fixes: 134700640
Test: Manual test of conditions above
Change-Id: Id72db59c662df6c529c98aafd610de8c86c77ebd
parent 6a4a0e73
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -123,8 +123,10 @@ public class FaceSettings extends DashboardFragment {
        Preference appPref = findPreference(FaceSettingsAppPreferenceController.KEY);
        Preference attentionPref = findPreference(FaceSettingsAttentionPreferenceController.KEY);
        Preference confirmPref = findPreference(FaceSettingsConfirmPreferenceController.KEY);
        Preference bypassPref =
                findPreference(FaceSettingsLockscreenBypassPreferenceController.KEY);
        mTogglePreferences = new ArrayList<>(
                Arrays.asList(keyguardPref, appPref, attentionPref, confirmPref));
                Arrays.asList(keyguardPref, appPref, attentionPref, confirmPref, bypassPref));

        mRemoveButton = findPreference(FaceSettingsRemoveButtonPreferenceController.KEY);
        mEnrollButton = findPreference(FaceSettingsEnrollButtonPreferenceController.KEY);
@@ -142,6 +144,7 @@ public class FaceSettings extends DashboardFragment {
        // Don't show keyguard controller for work profile settings.
        if (mUserManager.isManagedProfile(mUserId)) {
            removePreference(FaceSettingsKeyguardPreferenceController.KEY);
            removePreference(FaceSettingsLockscreenBypassPreferenceController.KEY);
        }

        if (savedInstanceState != null) {
@@ -248,6 +251,7 @@ public class FaceSettings extends DashboardFragment {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();
        controllers.add(new FaceSettingsVideoPreferenceController(context));
        controllers.add(new FaceSettingsKeyguardPreferenceController(context));
        controllers.add(new FaceSettingsLockscreenBypassPreferenceController(context));
        controllers.add(new FaceSettingsAppPreferenceController(context));
        controllers.add(new FaceSettingsAttentionPreferenceController(context));
        controllers.add(new FaceSettingsRemoveButtonPreferenceController(context));
+0 −12
Original line number Diff line number Diff line
@@ -18,16 +18,13 @@ package com.android.settings.biometrics.face;

import static android.provider.Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED;

import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.hardware.face.FaceManager;
import android.os.UserHandle;
import android.provider.Settings;

import androidx.preference.Preference;

import com.android.settings.Utils;
import com.android.settings.core.TogglePreferenceController;

/**
 * Preference controller for Face settings page controlling the ability to unlock the phone
@@ -87,13 +84,4 @@ public class FaceSettingsKeyguardPreferenceController extends FaceSettingsPrefer
            preference.setEnabled(true);
        }
    }

    private boolean adminDisabled() {
        DevicePolicyManager dpm =
                (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
        return dpm != null &&
                (dpm.getKeyguardDisabledFeatures(null, UserHandle.myUserId())
                        & DevicePolicyManager.KEYGUARD_DISABLE_FACE)
                        != 0;
    }
}
+24 −2
Original line number Diff line number Diff line
@@ -21,14 +21,22 @@ import android.content.pm.PackageManager;
import android.hardware.face.FaceManager;
import android.provider.Settings;

import androidx.preference.Preference;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.core.TogglePreferenceController;

public class FaceSettingsLockscreenBypassPreferenceController extends TogglePreferenceController {
public class FaceSettingsLockscreenBypassPreferenceController
        extends FaceSettingsPreferenceController {

    static final String KEY = "security_lockscreen_bypass";

    @VisibleForTesting
    protected FaceManager mFaceManager;

    public FaceSettingsLockscreenBypassPreferenceController(Context context) {
        this(context, KEY);
    }

    public FaceSettingsLockscreenBypassPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
@@ -51,6 +59,20 @@ public class FaceSettingsLockscreenBypassPreferenceController extends TogglePref
        return true;
    }

    @Override
    public void updateState(Preference preference) {
        super.updateState(preference);
        if (!FaceSettings.isAvailable(mContext)) {
            preference.setEnabled(false);
        } else if (adminDisabled()) {
            preference.setEnabled(false);
        } else if (!mFaceManager.hasEnrolledTemplates(getUserId())) {
            preference.setEnabled(false);
        } else {
            preference.setEnabled(true);
        }
    }

    @Override
    public int getAvailabilityStatus() {
        if (mFaceManager != null && mFaceManager.isHardwareDetected()) {
+11 −0
Original line number Diff line number Diff line
@@ -16,7 +16,9 @@

package com.android.settings.biometrics.face;

import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.os.UserHandle;

import com.android.settings.core.TogglePreferenceController;

@@ -38,4 +40,13 @@ public abstract class FaceSettingsPreferenceController extends TogglePreferenceC
    protected int getUserId() {
        return mUserId;
    }

    protected boolean adminDisabled() {
        DevicePolicyManager dpm =
                (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
        return dpm != null &&
                (dpm.getKeyguardDisabledFeatures(null, UserHandle.myUserId())
                        & DevicePolicyManager.KEYGUARD_DISABLE_FACE)
                        != 0;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ public class FaceSettingsLockscreenBypassPreferenceControllerTest {
        mContext = RuntimeEnvironment.application;
        mPreference = new SwitchPreference(mContext);

        mController = new FaceSettingsLockscreenBypassPreferenceController(mContext, "TestKey");
        mController = new FaceSettingsLockscreenBypassPreferenceController(mContext);
        ReflectionHelpers.setField(mController, "mFaceManager", mFaceManager);
    }