Fix 2579224: Add a separate timeout for lockscreen vs display

This change adds a second timeout to the SecuritySettings page
separate from the standard display timeout.

Change-Id: I033a3578d876148bd723dee5d1a2531be5d6b51d
This commit is contained in:
Jim Miller
2010-08-30 22:07:58 -07:00
parent 5cd60eb8aa
commit 86624a2154
6 changed files with 147 additions and 5 deletions

View File

@@ -72,7 +72,7 @@
<item>11</item>
</string-array>
<!-- Display settings. The delay in inactivity before the screen is turned off. These are shown ain a list dialog. -->
<!-- Display settings. The delay in inactivity before the screen is turned off. These are shown in a list dialog. -->
<string-array name="screen_timeout_entries">
<item>15 seconds</item>
<item>30 seconds</item>
@@ -98,6 +98,39 @@
<item>1800000</item>
</string-array>
<!-- Security settings. The delay after screen is turned off until device locks.
These are shown in a list dialog. -->
<string-array name="lock_after_timeout_entries">
<item>immediately</item>
<item>5 seconds</item>
<item>15 seconds</item>
<item>30 seconds</item>
<item>1 minute</item>
<item>2 minutes</item>
<item>10 minutes</item>
<item>30 minutes</item>
</string-array>
<!-- Do not translate. -->
<string-array name="lock_after_timeout_values" translatable="false">
<!-- Do not translate. -->
<item>0</item>
<!-- Do not translate. -->
<item>5000</item>
<!-- Do not translate. -->
<item>15000</item>
<!-- Do not translate. -->
<item>30000</item>
<!-- Do not translate. -->
<item>60000</item>
<!-- Do not translate. -->
<item>120000</item>
<!-- Do not translate. -->
<item>600000</item>
<!-- Do not translate. -->
<item>1800000</item>
</string-array>
<!-- TTS settings -->
<!-- Default speech rate choices -->

View File

@@ -520,6 +520,11 @@
<!-- Security Settings --><skip />
<!-- Security settings screen, setting option name to change screen timeout -->
<string name="lock_after_timeout">Lock device after timeout</string>
<!-- Security settings screen, setting option summary to change screen timeout -->
<string name="lock_after_timeout_summary">Adjust the delay before the device automatically locks</string>
<!-- Main Settings screen setting option title for the item to take you the security and location screen -->
<string name="security_settings_title">Location &amp; security</string>
<!-- Location & security settings screen title -->

View File

@@ -20,6 +20,14 @@
android:key="security_category"
android:title="@string/lock_settings_title">
<ListPreference
android:key="lock_after_timeout"
android:title="@string/lock_after_timeout"
android:summary="@string/lock_after_timeout_summary"
android:entries="@array/lock_after_timeout_entries"
android:entryValues="@array/lock_after_timeout_values"
android:persistent="false"/>
<PreferenceScreen
android:key="unlock_set_or_change"
android:title="@string/unlock_set_unlock_launch_picker_change_title"

View File

@@ -20,6 +20,14 @@
android:key="security_category"
android:title="@string/lock_settings_title">
<ListPreference
android:key="lock_after_timeout"
android:title="@string/lock_after_timeout"
android:summary="@string/lock_after_timeout_summary"
android:entries="@array/lock_after_timeout_entries"
android:entryValues="@array/lock_after_timeout_values"
android:persistent="false"/>
<PreferenceScreen
android:key="unlock_set_or_change"
android:title="@string/unlock_set_unlock_launch_picker_change_title"

View File

@@ -20,6 +20,14 @@
android:key="security_category"
android:title="@string/lock_settings_title">
<ListPreference
android:key="lock_after_timeout"
android:title="@string/lock_after_timeout"
android:summary="@string/lock_after_timeout_summary"
android:entries="@array/lock_after_timeout_entries"
android:entryValues="@array/lock_after_timeout_values"
android:persistent="false"/>
<PreferenceScreen
android:key="unlock_set_or_change"
android:title="@string/unlock_set_unlock_launch_picker_change_title"

View File

@@ -17,6 +17,8 @@
package com.android.settings;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
import com.android.internal.widget.LockPatternUtils;
import android.app.AlertDialog;
@@ -32,25 +34,30 @@ import android.location.LocationManager;
import android.os.Bundle;
import android.os.SystemProperties;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener;
import android.provider.Settings;
import android.security.Credentials;
import android.security.KeyStore;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
/**
* Gesture lock pattern settings.
*/
public class SecuritySettings extends SettingsPreferenceFragment {
public class SecuritySettings extends SettingsPreferenceFragment
implements OnPreferenceChangeListener {
private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change";
// Lock Settings
@@ -74,7 +81,9 @@ public class SecuritySettings extends SettingsPreferenceFragment {
private static final String LOCATION_NETWORK = "location_network";
private static final String LOCATION_GPS = "location_gps";
private static final String ASSISTED_GPS = "assisted_gps";
private static final String LOCK_AFTER_TIMEOUT_KEY = "lock_after_timeout";
private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
private static final int FALLBACK_LOCK_AFTER_TIMEOUT_VALUE = 5000; // compatible with pre-Froyo
// Credential storage
private CredentialStorage mCredentialStorage = new CredentialStorage();
@@ -92,8 +101,11 @@ public class SecuritySettings extends SettingsPreferenceFragment {
// This is necessary because the Network Location Provider can change settings
// if the user does not confirm enabling the provider.
private ContentQueryMap mContentQueryMap;
private ChooseLockSettingsHelper mChooseLockSettingsHelper;
private LockPatternUtils mLockPatternUtils;
private ListPreference mLockAfter;
private final class SettingsObserver implements Observer {
public void update(Observable o, Object arg) {
updateToggles();
@@ -156,8 +168,8 @@ public class SecuritySettings extends SettingsPreferenceFragment {
}
}
// set or change current. Should be common to all unlock preference screens
// mSetOrChange = (PreferenceScreen) pm.findPreference(KEY_UNLOCK_SET_OR_CHANGE);
// lock after preference
mLockAfter = setupLockAfterPreference(pm);
// visible pattern
mVisiblePattern = (CheckBoxPreference) pm.findPreference(KEY_VISIBLE_PATTERN);
@@ -220,10 +232,65 @@ public class SecuritySettings extends SettingsPreferenceFragment {
return root;
}
private ListPreference setupLockAfterPreference(PreferenceManager pm) {
ListPreference result = (ListPreference) pm.findPreference(LOCK_AFTER_TIMEOUT_KEY);
if (result != null) {
int lockAfterValue = Settings.Secure.getInt(getContentResolver(),
Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT,
FALLBACK_LOCK_AFTER_TIMEOUT_VALUE);
result.setValue(String.valueOf(lockAfterValue));
result.setOnPreferenceChangeListener(this);
final long adminTimeout = mDPM != null ? mDPM.getMaximumTimeToLock(null) : 0;
final ContentResolver cr = getContentResolver();
final long displayTimeout = Math.max(0,
Settings.System.getInt(cr, SCREEN_OFF_TIMEOUT, 0));
if (adminTimeout > 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<CharSequence> revisedEntries = new ArrayList<CharSequence>();
ArrayList<CharSequence> revisedValues = new ArrayList<CharSequence>();
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());
@@ -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;
}
}