diff --git a/res/values/strings.xml b/res/values/strings.xml index 5f47c8ce66a..7c97ec83948 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5115,7 +5115,7 @@ Allow - %1$s to have full contol of your + %1$s to have full control of your device? %1$s @@ -5172,7 +5172,7 @@ - View and platform actions + View and perform actions It can track your interactions @@ -6086,10 +6086,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 b819dbb7d6c..7cf52fa669e 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" /> - - - - - - - @@ -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"/> + { + mSwitchDiversity.getSwitch().toggle(); + }); } } @@ -180,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(); @@ -189,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); @@ -200,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( 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/security/LockscreenBypassPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java similarity index 67% rename from src/com/android/settings/security/LockscreenBypassPreferenceController.java rename to src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java index dfa127b3003..8d1b5438693 100644 --- a/src/com/android/settings/security/LockscreenBypassPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceController.java @@ -11,25 +11,33 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License */ -package com.android.settings.security; +package com.android.settings.biometrics.face; import android.content.Context; 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 LockscreenBypassPreferenceController 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 LockscreenBypassPreferenceController(Context context, String preferenceKey) { + public FaceSettingsLockscreenBypassPreferenceController(Context context) { + this(context, KEY); + } + + public FaceSettingsLockscreenBypassPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { mFaceManager = context.getSystemService(FaceManager.class); @@ -51,6 +59,20 @@ public class LockscreenBypassPreferenceController extends TogglePreferenceContro 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/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index b253702af36..f384d8570ce 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -480,7 +480,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra controllers.add(new ResizableActivityPreferenceController(context)); controllers.add(new FreeformWindowsPreferenceController(context)); controllers.add(new DesktopModePreferenceController(context)); - controllers.add(new DeviceIdentifierAccessRestrictionsPreferenceController(context)); controllers.add(new ShortcutManagerThrottlingPreferenceController(context)); controllers.add(new BubbleGlobalPreferenceController(context)); controllers.add(new EnableGnssRawMeasFullTrackingPreferenceController(context)); diff --git a/src/com/android/settings/development/DeviceIdentifierAccessRestrictionsPreferenceController.java b/src/com/android/settings/development/DeviceIdentifierAccessRestrictionsPreferenceController.java deleted file mode 100644 index f4e59533494..00000000000 --- a/src/com/android/settings/development/DeviceIdentifierAccessRestrictionsPreferenceController.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.development; - -import android.content.ContentResolver; -import android.content.Context; -import android.provider.DeviceConfig; -import android.provider.Settings; - -import androidx.preference.Preference; -import androidx.preference.SwitchPreference; - -import com.android.settings.Utils; -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.development.DeveloperOptionsPreferenceController; - -public class DeviceIdentifierAccessRestrictionsPreferenceController - extends DeveloperOptionsPreferenceController - implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { - - private static final String DEVICE_IDENTIFIER_ACCESS_RESTRICTIONS_KEY = - "device_identifier_access_restrictions"; - - // The settings that should be set when the new device identifier access restrictions are - // disabled. - private static final String[] RELAX_DEVICE_IDENTIFIER_CHECK_SETTINGS = { - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_3P_CHECK_RELAXED, - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_NON_PRIV_CHECK_RELAXED, - Settings.Global.PRIVILEGED_DEVICE_IDENTIFIER_PRIV_CHECK_RELAXED - }; - - private ContentResolver mContentResolver; - - public DeviceIdentifierAccessRestrictionsPreferenceController(Context context) { - super(context); - mContentResolver = context.getContentResolver(); - } - - @Override - public boolean isAvailable() { - // If the new access restrictions have been disabled from the server side then do not - // display the option. - boolean disabledFromServerSide = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - Utils.PROPERTY_DEVICE_IDENTIFIER_ACCESS_RESTRICTIONS_DISABLED, false); - return !disabledFromServerSide; - } - - @Override - public String getPreferenceKey() { - return DEVICE_IDENTIFIER_ACCESS_RESTRICTIONS_KEY; - } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - writeSetting((boolean) newValue); - return true; - } - - private void writeSetting(boolean isEnabled) { - for (String relaxCheckSetting : RELAX_DEVICE_IDENTIFIER_CHECK_SETTINGS) { - Settings.Global.putInt(mContentResolver, relaxCheckSetting, isEnabled ? 1 : 0); - } - } - - @Override - public void updateState(Preference preference) { - boolean isEnabled = true; - for (String relaxCheckSetting : RELAX_DEVICE_IDENTIFIER_CHECK_SETTINGS) { - if (Settings.Global.getInt(mContentResolver, relaxCheckSetting, 0) == 0) { - isEnabled = false; - break; - } - } - ((SwitchPreference) mPreference).setChecked(isEnabled); - } - - @Override - protected void onDeveloperOptionsSwitchDisabled() { - super.onDeveloperOptionsSwitchDisabled(); - writeSetting(false); - ((SwitchPreference) mPreference).setChecked(false); - } -} diff --git a/tests/robotests/src/com/android/settings/security/LockscreenBypassPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java similarity index 90% rename from tests/robotests/src/com/android/settings/security/LockscreenBypassPreferenceControllerTest.java rename to tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java index 1b8817b8d67..cbcebfc751b 100644 --- a/tests/robotests/src/com/android/settings/security/LockscreenBypassPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsLockscreenBypassPreferenceControllerTest.java @@ -14,7 +14,7 @@ * limitations under the License */ -package com.android.settings.security; +package com.android.settings.biometrics.face; import static com.google.common.truth.Truth.assertThat; @@ -36,14 +36,14 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) -public class LockscreenBypassPreferenceControllerTest { +public class FaceSettingsLockscreenBypassPreferenceControllerTest { @Mock private FaceManager mFaceManager; private SwitchPreference mPreference; private Context mContext; - private LockscreenBypassPreferenceController mController; + private FaceSettingsLockscreenBypassPreferenceController mController; @Before public void setUp() { @@ -51,7 +51,7 @@ public class LockscreenBypassPreferenceControllerTest { mContext = RuntimeEnvironment.application; mPreference = new SwitchPreference(mContext); - mController = new LockscreenBypassPreferenceController(mContext, "TestKey"); + mController = new FaceSettingsLockscreenBypassPreferenceController(mContext); ReflectionHelpers.setField(mController, "mFaceManager", mFaceManager); }