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;
+ }
}