diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 1a8e17bb53d..0b44edd22f4 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -72,7 +72,7 @@ 11 - + 15 seconds 30 seconds @@ -97,7 +97,40 @@ 1800000 + + + + immediately + 5 seconds + 15 seconds + 30 seconds + 1 minute + 2 minutes + 10 minutes + 30 minutes + + + + + 0 + + 5000 + + 15000 + + 30000 + + 60000 + + 120000 + + 600000 + + 1800000 + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 6e8082d4f44..495608e4f75 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -520,6 +520,11 @@ + + Lock device after timeout + + Adjust the delay before the device automatically locks + Location & security diff --git a/res/xml/security_settings_password.xml b/res/xml/security_settings_password.xml index ac067117b59..641109176a9 100644 --- a/res/xml/security_settings_password.xml +++ b/res/xml/security_settings_password.xml @@ -20,6 +20,14 @@ android:key="security_category" android:title="@string/lock_settings_title"> + + + + + + 0) { + // This setting is a slave to display timeout when a device policy is enforced. + // As such, maxLockTimeout = adminTimeout - displayTimeout. + // If there isn't enough time, shows "immediately" setting. + disableUnusableTimeouts(result, Math.max(0, adminTimeout - displayTimeout)); + } + } + return result; + } + + private static void disableUnusableTimeouts(ListPreference pref, long maxTimeout) { + final CharSequence[] entries = pref.getEntries(); + final CharSequence[] values = pref.getEntryValues(); + ArrayList revisedEntries = new ArrayList(); + ArrayList revisedValues = new ArrayList(); + for (int i = 0; i < values.length; i++) { + long timeout = Long.valueOf(values[i].toString()); + if (timeout <= maxTimeout) { + revisedEntries.add(entries[i]); + revisedValues.add(values[i]); + } + } + if (revisedEntries.size() != entries.length || revisedValues.size() != values.length) { + pref.setEntries( + revisedEntries.toArray(new CharSequence[revisedEntries.size()])); + pref.setEntryValues( + revisedValues.toArray(new CharSequence[revisedValues.size()])); + final int userPreference = Integer.valueOf(pref.getValue()); + if (userPreference <= maxTimeout) { + pref.setValue(String.valueOf(userPreference)); + } else { + // There will be no highlighted selection since nothing in the list matches + // maxTimeout. The user can still select anything less than maxTimeout. + // TODO: maybe append maxTimeout to the list and mark selected. + } + } + pref.setEnabled(revisedEntries.size() > 0); + } + @Override public void onResume() { super.onResume(); + // Make sure we reload the preference hierarchy since some of these settings + // depend on others... + createPreferenceHierarchy(); + final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); if (mVisiblePattern != null) { mVisiblePattern.setChecked(lockPatternUtils.isVisiblePatternEnabled()); @@ -393,7 +460,7 @@ public class SecuritySettings extends SettingsPreferenceFragment { Boolean bval = (Boolean)value; mWillEnableEncryptedFS = bval.booleanValue(); showSwitchEncryptedFSDialog(); - } + } return true; } @@ -659,4 +726,17 @@ public class SecuritySettings extends SettingsPreferenceFragment { } } } + + public boolean onPreferenceChange(Preference preference, Object value) { + if (preference == mLockAfter) { + int lockAfter = Integer.parseInt((String) value); + try { + Settings.Secure.putInt(getContentResolver(), + Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT, lockAfter); + } catch (NumberFormatException e) { + Log.e("SecuritySettings", "could not persist lockAfter timeout setting", e); + } + } + return true; + } }