From 841288144c8617eed7b0e76c7c9c33a46138110a Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Wed, 2 Aug 2017 20:11:28 -0700 Subject: [PATCH 01/11] Update strings for screen lock setup Manual cherry pick of 3eb4c8333e3821a85d19e8b281f315d3608d5b2b Test: Manual, existing tests pass Bug: 64084524 Change-Id: Iff4b004aaf504ae3d574428e41bf91fd46a66f30 --- res/layout/choose_lock_password.xml | 4 +- ...choose_lock_generic_fingerprint_header.xml | 2 +- res/values/strings.xml | 20 +++---- .../settings/password/ChooseLockPassword.java | 54 +++++++++++++++---- 4 files changed, 58 insertions(+), 22 deletions(-) diff --git a/res/layout/choose_lock_password.xml b/res/layout/choose_lock_password.xml index 7ce30344d58..fb938c96dca 100644 --- a/res/layout/choose_lock_password.xml +++ b/res/layout/choose_lock_password.xml @@ -33,11 +33,11 @@ android:orientation="vertical"> + android:minLines="2"/> + android:text="@string/lock_settings_picker_fingerprint_added_security_message" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index 7a350eb216a..3f887913cb2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1109,8 +1109,8 @@ Protect your phone - - For added security, set up a backup screen lock. + + For added security, set up a backup screen lock. Prevent others from using this tablet without your permission by activating device protection features. Choose the screen lock you want to use. @@ -3432,23 +3432,25 @@ - Choose your password + Set a screen lock + + For security, set a password To use fingerprint, set password Choose your pattern To use fingerprint, set pattern - - Choose your PIN + + For security, set a PIN To use fingerprint, set PIN - - Confirm your password + + Re-enter your password Confirm your pattern - - Confirm your PIN + + Re-enter your PIN Passwords don\u2019t match diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index e013b8ba88e..972ebdd51a8 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -213,6 +213,7 @@ public class ChooseLockPassword extends SettingsActivity { protected Button mCancelButton; private Button mClearButton; private Button mNextButton; + private TextView mMessage; private TextChangedHandler mTextChangedHandler; @@ -247,10 +248,14 @@ public class ChooseLockPassword extends SettingsActivity { protected enum Stage { Introduction( - R.string.lockpassword_choose_your_password_header, + R.string.lockpassword_choose_your_screen_lock_header, R.string.lockpassword_choose_your_password_header_for_fingerprint, - R.string.lockpassword_choose_your_pin_header, + R.string.lockpassword_choose_your_screen_lock_header, R.string.lockpassword_choose_your_pin_header_for_fingerprint, + R.string.lockpassword_choose_your_password_message, + R.string.lock_settings_picker_fingerprint_added_security_message, + R.string.lockpassword_choose_your_pin_message, + R.string.lock_settings_picker_fingerprint_added_security_message, R.string.next_label), NeedToConfirm( @@ -258,6 +263,10 @@ public class ChooseLockPassword extends SettingsActivity { R.string.lockpassword_confirm_your_password_header, R.string.lockpassword_confirm_your_pin_header, R.string.lockpassword_confirm_your_pin_header, + 0, + 0, + 0, + 0, R.string.lockpassword_ok_label), ConfirmWrong( @@ -265,14 +274,25 @@ public class ChooseLockPassword extends SettingsActivity { R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_pins_dont_match, R.string.lockpassword_confirm_pins_dont_match, + 0, + 0, + 0, + 0, R.string.next_label); Stage(int hintInAlpha, int hintInAlphaForFingerprint, - int hintInNumeric, int hintInNumericForFingerprint, int nextButtonText) { + int hintInNumeric, int hintInNumericForFingerprint, + int messageInAlpha, int messageInAlphaForFingerprint, + int messageInNumeric, int messageInNumericForFingerprint, + int nextButtonText) { this.alphaHint = hintInAlpha; this.alphaHintForFingerprint = hintInAlphaForFingerprint; this.numericHint = hintInNumeric; this.numericHintForFingerprint = hintInNumericForFingerprint; + this.alphaMessage = messageInAlpha; + this.alphaMessageForFingerprint = messageInAlphaForFingerprint; + this.numericMessage = messageInNumeric; + this.numericMessageForFingerprint = messageInNumericForFingerprint; this.buttonText = nextButtonText; } @@ -280,6 +300,10 @@ public class ChooseLockPassword extends SettingsActivity { public final int alphaHintForFingerprint; public final int numericHint; public final int numericHintForFingerprint; + public final int alphaMessage; + public final int alphaMessageForFingerprint; + public final int numericMessage; + public final int numericMessageForFingerprint; public final int buttonText; public @StringRes int getHint(boolean isAlpha, boolean isFingerprint) { @@ -289,6 +313,14 @@ public class ChooseLockPassword extends SettingsActivity { return isFingerprint ? numericHintForFingerprint : numericHint; } } + + public @StringRes int getMessage(boolean isAlpha, boolean isFingerprint) { + if (isAlpha) { + return isFingerprint ? alphaMessageForFingerprint : alphaMessage; + } else { + return isFingerprint ? numericMessageForFingerprint : numericMessage; + } + } } // required constructor for fragments @@ -351,14 +383,9 @@ public class ChooseLockPassword extends SettingsActivity { mClearButton = view.findViewById(R.id.clear_button); mClearButton.setOnClickListener(this); + + mMessage = view.findViewById(R.id.message); if (mForFingerprint) { - TextView fingerprintBackupMessage = - view.findViewById(R.id.fingerprint_backup_message); - if (fingerprintBackupMessage != null) { - fingerprintBackupMessage.setVisibility(View.VISIBLE); - fingerprintBackupMessage - .setText(R.string.setup_lock_settings_picker_fingerprint_message); - } mLayout.setIcon(getActivity().getDrawable(R.drawable.ic_fingerprint_header)); } @@ -848,6 +875,13 @@ public class ChooseLockPassword extends SettingsActivity { setNextEnabled(canInput && length > 0); mClearButton.setEnabled(canInput && length > 0); } + int message = mUiStage.getMessage(mIsAlphaMode, mForFingerprint); + if (message != 0) { + mMessage.setVisibility(View.VISIBLE); + mMessage.setText(message); + } else { + mMessage.setVisibility(View.INVISIBLE); + } mClearButton.setVisibility(toVisibility(mUiStage != Stage.Introduction)); mCancelButton.setVisibility(toVisibility(mUiStage == Stage.Introduction)); From af5d8b9b035bf019c59adc5f66f3cefcbea00585 Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Tue, 15 Aug 2017 02:34:05 +0000 Subject: [PATCH 02/11] Disabling the activate button when paused This revises the previous attempt to drop taps when another window is obscuring the device admin details. Any system alert windows or toasts are disabled when the activity is in focus, otherwise the button is disabled so no floating activities can obscure it and delegate taps back to the security sensitive "Activate" button. Test: CtsVerifier -> Device Administration -> Device Admin Tapjacking Test Bug: 35056974 Change-Id: I292a44e713ea4a4b0305ca3b3b21f1c82fd73c2b Merged-In: I292a44e713ea4a4b0305ca3b3b21f1c82fd73c2b --- src/com/android/settings/DeviceAdminAdd.java | 21 +++++--------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java index bcd247e0ca0..60bab2a23a9 100644 --- a/src/com/android/settings/DeviceAdminAdd.java +++ b/src/com/android/settings/DeviceAdminAdd.java @@ -16,6 +16,8 @@ package com.android.settings; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; + import android.app.AppOpsManager; import org.xmlpull.v1.XmlPullParserException; @@ -72,7 +74,6 @@ public class DeviceAdminAdd extends Activity { Handler mHandler; DevicePolicyManager mDPM; - AppOpsManager mAppOps; DeviceAdminInfo mDeviceAdmin; CharSequence mAddMsgText; String mProfileOwnerName; @@ -94,17 +95,15 @@ public class DeviceAdminAdd extends Activity { boolean mWaitingForRemoveMsg; boolean mAddingProfileOwner; boolean mAdminPoliciesInitialized; - int mCurSysAppOpMode; - int mCurToastAppOpMode; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); + getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); mHandler = new Handler(getMainLooper()); mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); - mAppOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE); PackageManager packageManager = getPackageManager(); if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { @@ -377,24 +376,14 @@ public class DeviceAdminAdd extends Activity { @Override protected void onResume() { super.onResume(); + mActionButton.setEnabled(true); updateInterface(); - // As long as we are running, don't let this admin overlay stuff on top of the screen. - final int uid = mDeviceAdmin.getActivityInfo().applicationInfo.uid; - final String pkg = mDeviceAdmin.getActivityInfo().applicationInfo.packageName; - mCurSysAppOpMode = mAppOps.checkOp(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg); - mCurToastAppOpMode = mAppOps.checkOp(AppOpsManager.OP_TOAST_WINDOW, uid, pkg); - mAppOps.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg, AppOpsManager.MODE_IGNORED); - mAppOps.setMode(AppOpsManager.OP_TOAST_WINDOW, uid, pkg, AppOpsManager.MODE_IGNORED); } @Override protected void onPause() { super.onPause(); - // As long as we are running, don't let this admin overlay stuff on top of the screen. - final int uid = mDeviceAdmin.getActivityInfo().applicationInfo.uid; - final String pkg = mDeviceAdmin.getActivityInfo().applicationInfo.packageName; - mAppOps.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg, mCurSysAppOpMode); - mAppOps.setMode(AppOpsManager.OP_TOAST_WINDOW, uid, pkg, mCurToastAppOpMode); + mActionButton.setEnabled(false); try { ActivityManagerNative.getDefault().resumeAppSwitches(); } catch (RemoteException e) { From 8e08a9bb715ff6a6b6bfa9556c3666a10f87053a Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Tue, 15 Aug 2017 03:33:12 +0000 Subject: [PATCH 03/11] Disabling the activate button when paused This revises the previous attempt to drop taps when another window is obscuring the device admin details. Any system alert windows or toasts are disabled when the activity is in focus, otherwise the button is disabled so no floating activities can obscure it and delegate taps back to the security sensitive "Activate" button. Test: CtsVerifier -> Device Administration -> Device Admin Tapjacking Test Bug: 35056974 Change-Id: I292a44e713ea4a4b0305ca3b3b21f1c82fd73c2b Merged-In: I292a44e713ea4a4b0305ca3b3b21f1c82fd73c2b --- src/com/android/settings/DeviceAdminAdd.java | 21 +++++--------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java index 9d4d8953307..2f6afd790f7 100644 --- a/src/com/android/settings/DeviceAdminAdd.java +++ b/src/com/android/settings/DeviceAdminAdd.java @@ -16,6 +16,8 @@ package com.android.settings; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; + import android.app.Activity; import android.app.ActivityManagerNative; import android.app.AlertDialog; @@ -88,7 +90,6 @@ public class DeviceAdminAdd extends Activity { Handler mHandler; DevicePolicyManager mDPM; - AppOpsManager mAppOps; DeviceAdminInfo mDeviceAdmin; CharSequence mAddMsgText; String mProfileOwnerName; @@ -113,19 +114,17 @@ public class DeviceAdminAdd extends Activity { boolean mWaitingForRemoveMsg; boolean mAddingProfileOwner; boolean mAdminPoliciesInitialized; - int mCurSysAppOpMode; - int mCurToastAppOpMode; boolean mIsCalledFromSupportDialog = false; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); + getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); mHandler = new Handler(getMainLooper()); mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); - mAppOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE); PackageManager packageManager = getPackageManager(); if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { @@ -447,24 +446,14 @@ public class DeviceAdminAdd extends Activity { @Override protected void onResume() { super.onResume(); + mActionButton.setEnabled(true); updateInterface(); - // As long as we are running, don't let this admin overlay stuff on top of the screen. - final int uid = mDeviceAdmin.getActivityInfo().applicationInfo.uid; - final String pkg = mDeviceAdmin.getActivityInfo().applicationInfo.packageName; - mCurSysAppOpMode = mAppOps.checkOp(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg); - mCurToastAppOpMode = mAppOps.checkOp(AppOpsManager.OP_TOAST_WINDOW, uid, pkg); - mAppOps.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg, AppOpsManager.MODE_IGNORED); - mAppOps.setMode(AppOpsManager.OP_TOAST_WINDOW, uid, pkg, AppOpsManager.MODE_IGNORED); } @Override protected void onPause() { super.onPause(); - // As long as we are running, don't let this admin overlay stuff on top of the screen. - final int uid = mDeviceAdmin.getActivityInfo().applicationInfo.uid; - final String pkg = mDeviceAdmin.getActivityInfo().applicationInfo.packageName; - mAppOps.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg, mCurSysAppOpMode); - mAppOps.setMode(AppOpsManager.OP_TOAST_WINDOW, uid, pkg, mCurToastAppOpMode); + mActionButton.setEnabled(false); try { ActivityManagerNative.getDefault().resumeAppSwitches(); } catch (RemoteException e) { From de5df8b0902070c949dd9fdab8bbedfff61f43ab Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Tue, 15 Aug 2017 02:11:26 +0000 Subject: [PATCH 04/11] Disabling the activate button when paused This revises the previous attempt to drop taps when another window is obscuring the device admin details. Any system alert windows or toasts are disabled when the activity is in focus, otherwise the button is disabled so no floating activities can obscure it and delegate taps back to the security sensitive "Activate" button. Bug: 35056974 Change-Id: I292a44e713ea4a4b0305ca3b3b21f1c82fd73c2b Merged-In: I292a44e713ea4a4b0305ca3b3b21f1c82fd73c2b --- src/com/android/settings/DeviceAdminAdd.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java index 62340380051..5e05a22ff7e 100644 --- a/src/com/android/settings/DeviceAdminAdd.java +++ b/src/com/android/settings/DeviceAdminAdd.java @@ -16,6 +16,8 @@ package com.android.settings; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; + import org.xmlpull.v1.XmlPullParserException; import android.app.Activity; @@ -88,7 +90,7 @@ public class DeviceAdminAdd extends Activity { @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); - + getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); mHandler = new Handler(getMainLooper()); mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); @@ -264,13 +266,20 @@ public class DeviceAdminAdd extends Activity { } }); } - + @Override protected void onResume() { super.onResume(); + mActionButton.setEnabled(true); updateInterface(); } - + + @Override + protected void onPause() { + super.onPause(); + mActionButton.setEnabled(false); + } + @Override protected Dialog onCreateDialog(int id, Bundle args) { switch (id) { From 9ffee0d53441d1a42aa0a1f5429f1a1fe7fe1291 Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Tue, 15 Aug 2017 02:22:17 +0000 Subject: [PATCH 05/11] Disabling the activate button when paused This revises the previous attempt to drop taps when another window is obscuring the device admin details. Any system alert windows or toasts are disabled when the activity is in focus, otherwise the button is disabled so no floating activities can obscure it and delegate taps back to the security sensitive "Activate" button. Bug: 35056974 Change-Id: I292a44e713ea4a4b0305ca3b3b21f1c82fd73c2b Merged-In: I292a44e713ea4a4b0305ca3b3b21f1c82fd73c2b --- src/com/android/settings/DeviceAdminAdd.java | 21 +++++--------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java index ed95500e51b..0f85c46483b 100644 --- a/src/com/android/settings/DeviceAdminAdd.java +++ b/src/com/android/settings/DeviceAdminAdd.java @@ -16,6 +16,8 @@ package com.android.settings; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; + import android.app.AppOpsManager; import org.xmlpull.v1.XmlPullParserException; @@ -71,7 +73,6 @@ public class DeviceAdminAdd extends Activity { Handler mHandler; DevicePolicyManager mDPM; - AppOpsManager mAppOps; DeviceAdminInfo mDeviceAdmin; CharSequence mAddMsgText; String mProfileOwnerName; @@ -95,17 +96,15 @@ public class DeviceAdminAdd extends Activity { boolean mRefreshing; boolean mWaitingForRemoveMsg; boolean mAddingProfileOwner; - int mCurSysAppOpMode; - int mCurToastAppOpMode; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); + getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); mHandler = new Handler(getMainLooper()); mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); - mAppOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE); PackageManager packageManager = getPackageManager(); if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { @@ -355,24 +354,14 @@ public class DeviceAdminAdd extends Activity { @Override protected void onResume() { super.onResume(); + mActionButton.setEnabled(true); updateInterface(); - // As long as we are running, don't let this admin overlay stuff on top of the screen. - final int uid = mDeviceAdmin.getActivityInfo().applicationInfo.uid; - final String pkg = mDeviceAdmin.getActivityInfo().applicationInfo.packageName; - mCurSysAppOpMode = mAppOps.checkOp(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg); - mCurToastAppOpMode = mAppOps.checkOp(AppOpsManager.OP_TOAST_WINDOW, uid, pkg); - mAppOps.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg, AppOpsManager.MODE_IGNORED); - mAppOps.setMode(AppOpsManager.OP_TOAST_WINDOW, uid, pkg, AppOpsManager.MODE_IGNORED); } @Override protected void onPause() { super.onPause(); - // As long as we are running, don't let this admin overlay stuff on top of the screen. - final int uid = mDeviceAdmin.getActivityInfo().applicationInfo.uid; - final String pkg = mDeviceAdmin.getActivityInfo().applicationInfo.packageName; - mAppOps.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg, mCurSysAppOpMode); - mAppOps.setMode(AppOpsManager.OP_TOAST_WINDOW, uid, pkg, mCurToastAppOpMode); + mActionButton.setEnabled(false); try { ActivityManagerNative.getDefault().resumeAppSwitches(); } catch (RemoteException e) { From 2bb62380449da124cd36fac80d6072ad6c4d0592 Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Tue, 15 Aug 2017 16:26:05 -0700 Subject: [PATCH 06/11] Don't launch Choose Lock again if recreating When ChooseLockGeneric is recreated, don't automatically launch ChooseLock[Password/Pattern] even if the corresponding intent extras are specified, because one would have been launched in the previous onCreate. Test: Manual Bug: 64605627 Change-Id: I227a14abb2f4dd6c4577186a3d8164df0bec7791 --- .../android/settings/password/ChooseLockGeneric.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 4d20bcfd246..5126727bbe9 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -219,7 +219,7 @@ public class ChooseLockGeneric extends SettingsActivity { mManagedPasswordProvider = ManagedLockPasswordProvider.get(getActivity(), mUserId); if (mPasswordConfirmed) { - updatePreferencesOrFinish(); + updatePreferencesOrFinish(savedInstanceState != null); if (mForChangeCredRequiredForBoot) { maybeEnableEncryption(mLockPatternUtils.getKeyguardStoredPasswordQuality( mUserId), false); @@ -234,7 +234,7 @@ public class ChooseLockGeneric extends SettingsActivity { || !helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, getString(R.string.unlock_set_unlock_launch_picker_title), true, mUserId)) { mPasswordConfirmed = true; // no password set, so no need to confirm - updatePreferencesOrFinish(); + updatePreferencesOrFinish(savedInstanceState != null); } else { mWaitingForConfirmation = true; } @@ -332,7 +332,7 @@ public class ChooseLockGeneric extends SettingsActivity { if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) { mPasswordConfirmed = true; mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); - updatePreferencesOrFinish(); + updatePreferencesOrFinish(false /* isRecreatingActivity */); if (mForChangeCredRequiredForBoot) { if (!TextUtils.isEmpty(mUserPassword)) { maybeEnableEncryption( @@ -395,7 +395,7 @@ public class ChooseLockGeneric extends SettingsActivity { outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled); } - private void updatePreferencesOrFinish() { + private void updatePreferencesOrFinish(boolean isRecreatingActivity) { Intent intent = getActivity().getIntent(); int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1); if (quality == -1) { @@ -413,7 +413,8 @@ public class ChooseLockGeneric extends SettingsActivity { updatePreferenceText(); updateCurrentPreference(); updatePreferenceSummaryIfNeeded(); - } else { + } else if (!isRecreatingActivity) { + // Don't start the activity again if we are recreated for configuration change updateUnlockMethodAndFinish(quality, false, true /* chooseLockSkipped */); } } From 75cd1d2010901e835cf8774fec811dd52cc509bf Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 15 Aug 2017 17:18:10 -0700 Subject: [PATCH 07/11] Stub out feature flag UI Bug: 36222960 Test: make -j40 RunSettingsRoboTests Change-Id: Id2483d39018b2d93868f4ef7032124795ea91a53 --- res/values/strings.xml | 2 + res/xml/development_prefs.xml | 5 ++ .../featureflags/FeatureFlagsDashboard.java | 56 ++++++++++++++++++ ...randfather_not_implementing_index_provider | 1 + .../FeatureFlagsDashboardTest.java | 58 +++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java create mode 100644 tests/robotests/src/com/android/settings/development/featureflags/FeatureFlagsDashboardTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index aacb8a1c9a4..ee87fa6768d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4274,6 +4274,8 @@ Downloaded services Experimental + + Feature flags Talkback diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml index 89924467221..92205e44a7b 100644 --- a/res/xml/development_prefs.xml +++ b/res/xml/development_prefs.xml @@ -167,6 +167,11 @@ android:key="camera_hal_hdrplus_switch" android:title="@string/camera_hal_hdrplus_switch" /> + + getPreferenceControllers(Context context) { + return null; + } +} diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider index 462388941c8..cd8a07e64fe 100644 --- a/tests/robotests/assets/grandfather_not_implementing_index_provider +++ b/tests/robotests/assets/grandfather_not_implementing_index_provider @@ -4,6 +4,7 @@ com.android.settings.bluetooth.BluetoothPairingDetail com.android.settings.accounts.AccountDetailDashboardFragment com.android.settings.fuelgauge.PowerUsageAnomalyDetails com.android.settings.fuelgauge.AdvancedPowerUsageDetail +com.android.settings.development.featureflags.FeatureFlagsDashboard com.android.settings.deviceinfo.StorageProfileFragment com.android.settings.wifi.details.WifiNetworkDetailsFragment com.android.settings.wifi.p2p.WifiP2pSettings diff --git a/tests/robotests/src/com/android/settings/development/featureflags/FeatureFlagsDashboardTest.java b/tests/robotests/src/com/android/settings/development/featureflags/FeatureFlagsDashboardTest.java new file mode 100644 index 00000000000..92e92fc218d --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/featureflags/FeatureFlagsDashboardTest.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2017 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.featureflags; + +import static com.google.common.truth.Truth.assertThat; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class FeatureFlagsDashboardTest { + + private FeatureFlagsDashboard mDashboard; + + @Before + public void setUp() { + mDashboard = new FeatureFlagsDashboard(); + } + + @Test + public void shouldNotHaveHelpResource() { + assertThat(mDashboard.getHelpResource()).isEqualTo(0); + } + + @Test + public void shouldLogAsFeatureFlagPage() { + assertThat(mDashboard.getMetricsCategory()) + .isEqualTo(MetricsProto.MetricsEvent.SETTINGS_FEATURE_FLAGS_DASHBOARD); + } + + @Test + public void shouldUsePlaceholderPreferenceLayout() { + assertThat(mDashboard.getPreferenceScreenResId()) + .isEqualTo(R.xml.placeholder_prefs); + } +} From e9a6e8f1e5319aa20b5b56140a774a0be2a3a000 Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Tue, 15 Aug 2017 19:30:14 -0700 Subject: [PATCH 08/11] Use default primary color for choose lock screens Make the settings screens that inherit from SuwThemeGlif use the default blue primary color. Test: Manual Bug: 63143321 Change-Id: I07026139a5e0562c192ec1ca9304d5cd3647d5b0 --- res/values/themes.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/res/values/themes.xml b/res/values/themes.xml index 1a8f3de4198..2610e088253 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -25,7 +25,6 @@