diff --git a/res/values/strings.xml b/res/values/strings.xml index 933f2cfbf7c..3b9e71269ae 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3155,15 +3155,19 @@ Work profile screen lock - Use same screen lock + Use the same lock - Change primary profile to match work profile + Change device screen lock to match work profile? Use the same screen lock? You can use this lock for your device but it will include all screen lock related policies set by your IT admin on the work profile.\nDo you want to use the same screen lock for your device? + + Your work screen lock doesn\'t meet your organization\'s security requirements.\nYou can set a new screen lock for both your device and your work profile, but any work screen lock policies will apply to your device screen lock as well. + + Change lock - Same as your device lock + Same as device screen lock diff --git a/res/xml/security_settings_unification.xml b/res/xml/security_settings_unification.xml index ac8d5b241da..79b8b7d7f42 100644 --- a/res/xml/security_settings_unification.xml +++ b/res/xml/security_settings_unification.xml @@ -18,11 +18,10 @@ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings" android:title="@string/security_settings_title"> - + settings:keywords="@string/keywords_unification"/> diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index 6ad7df1b37d..84644623fc8 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -117,7 +117,7 @@ public class SecuritySettings extends SettingsPreferenceFragment // These switch preferences need special handling since they're not all stored in Settings. private static final String SWITCH_PREFERENCE_KEYS[] = { - KEY_SHOW_PASSWORD, KEY_TOGGLE_INSTALL_APPLICATIONS }; + KEY_SHOW_PASSWORD, KEY_TOGGLE_INSTALL_APPLICATIONS, KEY_UNIFICATION }; // Only allow one trust agent on the platform. private static final boolean ONLY_ONE_TRUST_AGENT = true; @@ -132,6 +132,7 @@ public class SecuritySettings extends SettingsPreferenceFragment private LockPatternUtils mLockPatternUtils; private SwitchPreference mVisiblePatternProfile; + private SwitchPreference mUnifyProfile; private SwitchPreference mShowPassword; @@ -235,13 +236,13 @@ public class SecuritySettings extends SettingsPreferenceFragment getActivity(), mLockPatternUtils, mProfileChallengeUserId); addPreferencesFromResource(profileResid); maybeAddFingerprintPreference(root, mProfileChallengeUserId); - if (mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)) { - maybeAddUnificationPreference(); - } else { + addPreferencesFromResource(R.xml.security_settings_unification); + if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileChallengeUserId)) { Preference lockPreference = root.findPreference(KEY_UNLOCK_SET_OR_CHANGE_PROFILE); String summary = getContext().getString( R.string.lock_settings_profile_unified_summary); lockPreference.setSummary(summary); + lockPreference.setEnabled(false); } } @@ -273,6 +274,7 @@ public class SecuritySettings extends SettingsPreferenceFragment mVisiblePatternProfile = (SwitchPreference) root.findPreference(KEY_VISIBLE_PATTERN_PROFILE); + mUnifyProfile = (SwitchPreference) root.findPreference(KEY_UNIFICATION); // Append the rest of the settings addPreferencesFromResource(R.xml.security_settings_misc); @@ -386,15 +388,6 @@ public class SecuritySettings extends SettingsPreferenceFragment } } - private void maybeAddUnificationPreference() { - if (mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileChallengeUserId) - >= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING - && mLockPatternUtils.isSeparateProfileChallengeAllowedToUnify( - mProfileChallengeUserId)) { - addPreferencesFromResource(R.xml.security_settings_unification); - } - } - private void addTrustAgentSettings(PreferenceGroup securityCategory) { final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID); ArrayList agents = @@ -560,12 +553,13 @@ public class SecuritySettings extends SettingsPreferenceFragment // depend on others... createPreferenceHierarchy(); - final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); if (mVisiblePatternProfile != null) { - mVisiblePatternProfile.setChecked(lockPatternUtils.isVisiblePatternEnabled( + mVisiblePatternProfile.setChecked(mLockPatternUtils.isVisiblePatternEnabled( mProfileChallengeUserId)); } + updateUnificationPreference(); + if (mShowPassword != null) { mShowPassword.setChecked(Settings.System.getInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD, 1) != 0); @@ -576,6 +570,13 @@ public class SecuritySettings extends SettingsPreferenceFragment } } + private void updateUnificationPreference() { + if (mUnifyProfile != null) { + mUnifyProfile.setChecked(!mLockPatternUtils.isSeparateProfileChallengeEnabled( + mProfileChallengeUserId)); + } + } + @Override public boolean onPreferenceTreeClick(Preference preference) { final String key = preference.getKey(); @@ -599,11 +600,6 @@ public class SecuritySettings extends SettingsPreferenceFragment startActivity(mTrustAgentClickIntent); mTrustAgentClickIntent = null; } - } else if (KEY_UNIFICATION.equals(key)) { - UnificationConfirmationDialog dialog = - UnificationConfirmationDialog.newIntance(mProfileChallengeUserId); - dialog.show(getChildFragmentManager(), TAG_UNIFICATION_DIALOG); - return true; } else { // If we didn't handle it, let preferences handle it. return super.onPreferenceTreeClick(preference); @@ -680,6 +676,13 @@ public class SecuritySettings extends SettingsPreferenceFragment mCurrentProfilePassword = null; } + private void unifyUncompliantLocks() { + mLockPatternUtils.clearLock(mProfileChallengeUserId); + mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileChallengeUserId, false); + startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment", + R.string.lock_settings_picker_title, SET_OR_CHANGE_LOCK_METHOD_REQUEST, null); + } + @Override public boolean onPreferenceChange(Preference preference, Object value) { boolean result = true; @@ -687,6 +690,20 @@ public class SecuritySettings extends SettingsPreferenceFragment final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); if (KEY_VISIBLE_PATTERN_PROFILE.equals(key)) { lockPatternUtils.setVisiblePatternEnabled((Boolean) value, mProfileChallengeUserId); + } else if (KEY_UNIFICATION.equals(key)) { + if ((Boolean) value) { + final boolean compliantForDevice = + (mLockPatternUtils.getKeyguardStoredPasswordQuality(mProfileChallengeUserId) + >= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING + && mLockPatternUtils.isSeparateProfileChallengeAllowedToUnify( + mProfileChallengeUserId)); + UnificationConfirmationDialog dialog = + UnificationConfirmationDialog.newIntance(compliantForDevice); + dialog.show(getChildFragmentManager(), TAG_UNIFICATION_DIALOG); + } else { + mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileChallengeUserId, true); + createPreferenceHierarchy(); + } } else if (KEY_SHOW_PASSWORD.equals(key)) { Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD, ((Boolean) value) ? 1 : 0); @@ -946,13 +963,12 @@ public class SecuritySettings extends SettingsPreferenceFragment createPreferenceHierarchy(); - final LockPatternUtils lockPatternUtils = mLockPatternUtils; if (mVisiblePattern != null) { - mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled( + mVisiblePattern.setChecked(mLockPatternUtils.isVisiblePatternEnabled( MY_USER_ID)); } if (mPowerButtonInstantlyLocks != null) { - mPowerButtonInstantlyLocks.setChecked(lockPatternUtils.getPowerButtonInstantlyLocks( + mPowerButtonInstantlyLocks.setChecked(mLockPatternUtils.getPowerButtonInstantlyLocks( MY_USER_ID)); } @@ -1205,9 +1221,13 @@ public class SecuritySettings extends SettingsPreferenceFragment } public static class UnificationConfirmationDialog extends DialogFragment { + private static final String EXTRA_COMPLIANT = "compliant"; - public static UnificationConfirmationDialog newIntance(int userId) { + public static UnificationConfirmationDialog newIntance(boolean compliant) { UnificationConfirmationDialog dialog = new UnificationConfirmationDialog(); + Bundle args = new Bundle(); + args.putBoolean(EXTRA_COMPLIANT, compliant); + dialog.setArguments(args); return dialog; } @@ -1222,14 +1242,21 @@ public class SecuritySettings extends SettingsPreferenceFragment @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final SecuritySettings parentFragment = ((SecuritySettings) getParentFragment()); + final boolean compliant = getArguments().getBoolean(EXTRA_COMPLIANT); return new AlertDialog.Builder(getActivity()) .setTitle(R.string.lock_settings_profile_unification_dialog_title) - .setMessage(R.string.lock_settings_profile_unification_dialog_body) - .setPositiveButton(R.string.okay, + .setMessage(compliant ? R.string.lock_settings_profile_unification_dialog_body + : R.string.lock_settings_profile_unification_dialog_uncompliant_body) + .setPositiveButton(compliant ? R.string.okay + : R.string.lock_settings_profile_unification_dialog_uncompliant_confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichButton) { - parentFragment.launchConfirmDeviceLockForUnification(); + if (compliant) { + parentFragment.launchConfirmDeviceLockForUnification(); + } else { + parentFragment.unifyUncompliantLocks(); + } } } ) @@ -1237,6 +1264,7 @@ public class SecuritySettings extends SettingsPreferenceFragment new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichButton) { + parentFragment.updateUnificationPreference(); dismiss(); } }