From 4594c51be00944489abd9e80f7fde7d6fc4e0c12 Mon Sep 17 00:00:00 2001 From: Kevin Yao Date: Fri, 31 May 2019 21:08:37 +0800 Subject: [PATCH 1/6] Fix typo for Accessibility permission dialog Bug: 133362697 Test: Visual Change-Id: I9dfe9218c1b41cf02257bbfdbe3128f952a9a97c --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 2258744c2c2..5d44d511de5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5090,7 +5090,7 @@ Allow - %1$s to have full contol of your + %1$s to have full control of your device? %1$s @@ -5147,7 +5147,7 @@ - View and platform actions + View and perform actions It can track your interactions From 2123e3543c1670a91b3488fc9805ff92f029c17e Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Tue, 4 Jun 2019 17:32:59 -0700 Subject: [PATCH 2/6] Remove developer option to disable device ID access restrictions Bug: 123937881 Test: Manually verified developer option is no longer available. Change-Id: I00e8db23d88a5c84e273dfa4b8f797fa2a995de0 --- res/values/strings.xml | 4 - res/xml/development_settings.xml | 5 - .../DevelopmentSettingsDashboardFragment.java | 1 - ...ccessRestrictionsPreferenceController.java | 97 ------------------- 4 files changed, 107 deletions(-) delete mode 100644 src/com/android/settings/development/DeviceIdentifierAccessRestrictionsPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 8d53e414fd5..90e830c1370 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6079,10 +6079,6 @@ Restrict SMS & call log access Only default phone and messaging apps have SMS & call log permissions - - Disable device identifier restrictions - - Disable the new access restrictions for device identifiers diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 5a7d19405cd..d1eff34ba3e 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -561,11 +561,6 @@ android:title="@string/sms_access_restriction_enabled" android:summary="@string/sms_access_restriction_enabled_summary" /> - - Date: Fri, 7 Jun 2019 17:23:44 -0700 Subject: [PATCH 3/6] Increased toggling area Test: Tapping the whole area will now toggle the switch. Note that it is no longer possible to individually select the title and subtitle during talkback, but you can select them as a group. Test: Verified that without talkback the user must actually press switch. Fixes: 130398575 Change-Id: I369637f23e41ac6dc4333293b95a5ccae259ee1f --- .../android/settings/biometrics/face/FaceEnrollEducation.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java index 429d93bd5ce..16917c7beca 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java @@ -161,6 +161,10 @@ public class FaceEnrollEducation extends BiometricEnrollBase { if (accessibilityEnabled) { accessibilityButton.callOnClick(); + mSwitchDiversity.setClickable(true); + mSwitchDiversity.setOnClickListener(v -> { + mSwitchDiversity.getSwitch().toggle(); + }); } } From e9d50cd91bd48330064bef2f0f6c825bf79f2466 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Tue, 11 Jun 2019 20:40:30 -0700 Subject: [PATCH 4/6] Call finish() when enrollment loses focus Bug: 134971919 Test: Entering keyguard on any enrollment screen finishes enrollment now Test: Going back/forward works Change-Id: I2c80a5586c10fa3feb780a5eadfe203abed52dea --- .../biometrics/BiometricEnrollIntroduction.java | 7 +++++++ .../biometrics/face/FaceEnrollEducation.java | 14 ++++++++++++++ .../biometrics/face/FaceEnrollIntroduction.java | 10 ++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index d5414c9664d..d94686e3f27 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -47,6 +47,8 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase private boolean mHasPassword; private boolean mBiometricUnlockDisabledByAdmin; private TextView mErrorText; + protected boolean mConfirmingCredentials; + protected boolean mNextClicked; /** * @return true if the biometric is disabled by a device administrator @@ -149,10 +151,12 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase if (!mHasPassword) { // No password registered, launch into enrollment wizard. + mConfirmingCredentials = true; launchChooseLock(); } else if (mToken == null) { // It's possible to have a token but mLaunchedConfirmLock == false, since // ChooseLockGeneric can pass us a token. + mConfirmingCredentials = true; launchConfirmLock(getConfirmLockTitleResId(), getChallenge()); } } @@ -182,6 +186,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase @Override protected void onNextButtonClick(View view) { + mNextClicked = true; if (checkMaxEnrolled() == 0) { // Lock thingy is already set up, launch directly to the next page launchNextEnrollingActivity(mToken); @@ -249,12 +254,14 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase mToken = data.getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out); + mConfirmingCredentials = false; return; } else { setResult(resultCode, data); finish(); } } else if (requestCode == CONFIRM_REQUEST) { + mConfirmingCredentials = false; if (resultCode == RESULT_OK && data != null) { mToken = data.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out); diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java index 16b0fcbc2c3..4bf5a1d4b27 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java @@ -61,6 +61,7 @@ public class FaceEnrollEducation extends BiometricEnrollBase { private Handler mHandler; private Intent mResultIntent; private TextView mDescriptionText; + private boolean mNextClicked; private CompoundButton.OnCheckedChangeListener mSwitchDiversityListener = new CompoundButton.OnCheckedChangeListener() { @@ -184,6 +185,17 @@ public class FaceEnrollEducation extends BiometricEnrollBase { } } + @Override + protected void onStop() { + super.onStop(); + + if (!isChangingConfigurations() && !WizardManagerHelper.isAnySetupWizard(getIntent()) + && !mNextClicked) { + setResult(RESULT_SKIP); + finish(); + } + } + @Override protected void onNextButtonClick(View view) { final Intent intent = new Intent(); @@ -193,6 +205,7 @@ public class FaceEnrollEducation extends BiometricEnrollBase { if (mUserId != UserHandle.USER_NULL) { intent.putExtra(Intent.EXTRA_USER_ID, mUserId); } + intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, mFromSettingsSummary); final String flattenedString = getString(R.string.config_face_enroll); if (!TextUtils.isEmpty(flattenedString)) { ComponentName componentName = ComponentName.unflattenFromString(flattenedString); @@ -204,6 +217,7 @@ public class FaceEnrollEducation extends BiometricEnrollBase { if (mResultIntent != null) { intent.putExtras(mResultIntent); } + mNextClicked = true; WizardManagerHelper.copyWizardManagerExtras(getIntent(), intent); startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST); } diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index 525c1a3ee42..6686c96f928 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -77,6 +77,16 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { ); } + @Override + protected void onStop() { + super.onStop(); + + if (!isChangingConfigurations() && !mConfirmingCredentials && !mNextClicked + && !WizardManagerHelper.isAnySetupWizard(getIntent())) { + finish(); + } + } + @Override protected boolean isDisabledByAdmin() { return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled( From 6a4a0e7396fb3cd87f24cf2153b27a4baed2d118 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 12 Jun 2019 11:55:22 -0700 Subject: [PATCH 5/6] 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 6/6] 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); }