From 6a4a0e7396fb3cd87f24cf2153b27a4baed2d118 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 12 Jun 2019 11:55:22 -0700 Subject: [PATCH 1/2] Move lockscreen bypass setting to Settings > Security > Face unlock Fixes: 134700640 Test: atest FaceSettingsLockscreenBypassPreferenceControllerTest Test: enabling/disabling setting through Settings > Security > Face unlock works as expected Test: preference controller no longer seen in Settings > Display > Lock screen display Change-Id: I54807ad92fac62398a2b9dab93dd638775a09c8d --- res/xml/privacy_dashboard_settings.xml | 8 -------- res/xml/security_lockscreen_settings.xml | 7 ------- res/xml/security_settings_face.xml | 7 +++++++ ...FaceSettingsLockscreenBypassPreferenceController.java} | 8 ++++---- ...SettingsLockscreenBypassPreferenceControllerTest.java} | 8 ++++---- 5 files changed, 15 insertions(+), 23 deletions(-) rename src/com/android/settings/{security/LockscreenBypassPreferenceController.java => biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java} (87%) rename tests/robotests/src/com/android/settings/{security/LockscreenBypassPreferenceControllerTest.java => biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java} (89%) diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 7057ec570b9..aa789b90424 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -62,14 +62,6 @@ android:summary="@string/summary_placeholder" settings:searchable="false"/> - - - - - @@ -39,6 +40,12 @@ android:title="@string/security_settings_face_settings_use_face_for_apps" app:keywords="@string/keywords_face_unlock" app:controller="com.android.settings.biometrics.face.FaceSettingsAppPreferenceController"/> + Date: Wed, 12 Jun 2019 12:13:06 -0700 Subject: [PATCH 2/2] 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 --- .../biometrics/face/FaceSettings.java | 6 +++- ...eSettingsKeyguardPreferenceController.java | 12 -------- ...sLockscreenBypassPreferenceController.java | 28 +++++++++++++++++-- .../FaceSettingsPreferenceController.java | 11 ++++++++ ...kscreenBypassPreferenceControllerTest.java | 2 +- 5 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java index 9766f34cdad..39d69b0c84c 100644 --- a/src/com/android/settings/biometrics/face/FaceSettings.java +++ b/src/com/android/settings/biometrics/face/FaceSettings.java @@ -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 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)); diff --git a/src/com/android/settings/biometrics/face/FaceSettingsKeyguardPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsKeyguardPreferenceController.java index c64455af30b..9ec1ad1eb74 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsKeyguardPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsKeyguardPreferenceController.java @@ -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; - } } diff --git a/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java index 5b155c41a7d..8d1b5438693 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java @@ -21,14 +21,22 @@ import android.content.pm.PackageManager; import android.hardware.face.FaceManager; import android.provider.Settings; -import com.android.internal.annotations.VisibleForTesting; -import com.android.settings.core.TogglePreferenceController; +import androidx.preference.Preference; -public class FaceSettingsLockscreenBypassPreferenceController extends TogglePreferenceController { +import com.android.internal.annotations.VisibleForTesting; + +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()) { diff --git a/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java index b8ac118551e..55e093ba79a 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java @@ -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; + } } diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java index ae4a13b4aee..cbcebfc751b 100644 --- a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java @@ -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); }