summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/applications/LockPatternActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/applications/LockPatternActivity.java')
-rw-r--r--src/com/android/settings/applications/LockPatternActivity.java86
1 files changed, 76 insertions, 10 deletions
diff --git a/src/com/android/settings/applications/LockPatternActivity.java b/src/com/android/settings/applications/LockPatternActivity.java
index 9ab51b5..05d30ec 100644
--- a/src/com/android/settings/applications/LockPatternActivity.java
+++ b/src/com/android/settings/applications/LockPatternActivity.java
@@ -46,9 +46,20 @@ public class LockPatternActivity extends Activity implements OnNotifyAccountRese
public static final String PATTERN_LOCK_PROTECTED_APPS = "pattern_lock_protected_apps";
public static final String RECREATE_PATTERN = "recreate_pattern_lock";
+ private static final String STATE_IS_ACCOUNT_VIEW = "isAccountView";
+ private static final String STATE_CONTINUE_ENABLED = "continueEnabled";
+ private static final String STATE_CONFIRMING = "confirming";
+ private static final String STATE_RETRY_PATTERN = "retrypattern";
+ private static final String STATE_RETRY = "retry";
+ private static final String STATE_PATTERN_HASH = "pattern_hash";
+ private static final String STATE_CREATE = "create";
+
+ private static String TIMEOUT_PREF_KEY = "retry_timeout";
+
private static final int MIN_PATTERN_SIZE = 4;
private static final int MAX_PATTERN_RETRY = 5;
private static final int PATTERN_CLEAR_TIMEOUT_MS = 2000;
+ private static final long FAILED_ATTEMPT_RETRY = 30;
private static final int MENU_RESET = 0;
@@ -68,6 +79,7 @@ public class LockPatternActivity extends Activity implements OnNotifyAccountRese
boolean mRetryPattern = true;
boolean mConfirming = false;
boolean mFingerPrintSetUp = false;
+ boolean mRetryLocked = false;
private FingerprintManager mFingerprintManager;
private FingerprintUiHelper mFingerPrintUiHelper;
@@ -137,18 +149,49 @@ public class LockPatternActivity extends Activity implements OnNotifyAccountRese
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.clear();
- if (!mCreate) {
- menu.add(0, MENU_RESET, 0, R.string.lockpattern_reset_button)
- .setIcon(R.drawable.ic_lockscreen_ime_white)
- .setAlphabeticShortcut('r')
- .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |
- MenuItem.SHOW_AS_ACTION_WITH_TEXT);
- mItem = menu.findItem(0);
+ menu.add(0, MENU_RESET, 0, R.string.lockpattern_reset_button)
+ .setIcon(R.drawable.ic_lockscreen_ime_white)
+ .setAlphabeticShortcut('r')
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |
+ MenuItem.SHOW_AS_ACTION_WITH_TEXT);
+ mItem = menu.findItem(0);
+ if (mRetryLocked) {
+ mItem.setIcon(R.drawable.ic_settings_lockscreen_white);
}
+
return true;
}
@Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(STATE_IS_ACCOUNT_VIEW, mAccountView.getVisibility() == View.VISIBLE);
+ outState.putBoolean(STATE_CONTINUE_ENABLED, mContinue.isEnabled());
+ outState.putBoolean(STATE_CONFIRMING, mConfirming);
+ outState.putBoolean(STATE_RETRY_PATTERN, mRetryPattern);
+ outState.putInt(STATE_RETRY, mRetry);
+ outState.putByteArray(STATE_PATTERN_HASH, mPatternHash);
+ outState.putBoolean(STATE_CREATE, mCreate);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+ if (savedInstanceState.getBoolean(STATE_IS_ACCOUNT_VIEW)) {
+ switchToAccount();
+ } else {
+ switchToPattern(false);
+ mPatternHash = savedInstanceState.getByteArray(STATE_PATTERN_HASH);
+ mConfirming = savedInstanceState.getBoolean(STATE_CONFIRMING);
+ mRetryPattern = savedInstanceState.getBoolean(STATE_RETRY_PATTERN);
+ mRetry = savedInstanceState.getInt(STATE_RETRY);
+ mCreate = savedInstanceState.getBoolean(STATE_CREATE);
+ mContinue.setEnabled(savedInstanceState.getBoolean(STATE_CONTINUE_ENABLED,
+ mContinue.isEnabled()));
+ }
+ }
+
+ @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_RESET:
@@ -173,6 +216,9 @@ public class LockPatternActivity extends Activity implements OnNotifyAccountRese
}
private void switchToPattern(boolean reset) {
+ if (isRetryLocked()) {
+ return;
+ }
if (reset) {
resetPatternState(false);
}
@@ -188,7 +234,9 @@ public class LockPatternActivity extends Activity implements OnNotifyAccountRese
private void switchToAccount() {
mPatternLockHeader.setText(getResources()
.getString(R.string.lockpattern_settings_reset_summary));
- mItem.setIcon(R.drawable.ic_settings_lockscreen_white);
+ if (mItem != null) {
+ mItem.setIcon(R.drawable.ic_settings_lockscreen_white);
+ }
mAccountView.setVisibility(View.VISIBLE);
mLockPatternView.setVisibility(View.GONE);
}
@@ -213,7 +261,6 @@ public class LockPatternActivity extends Activity implements OnNotifyAccountRese
resetPatternState(false);
//Setup Pattern Lock View
- mLockPatternView.setSaveEnabled(false);
mLockPatternView.setFocusable(false);
mLockPatternView.setOnPatternListener(new UnlockPatternListener());
@@ -340,10 +387,12 @@ public class LockPatternActivity extends Activity implements OnNotifyAccountRese
mLockPatternView.postDelayed(mCancelPatternRunnable, PATTERN_CLEAR_TIMEOUT_MS);
if (mRetry >= MAX_PATTERN_RETRY) {
+ setPatternTimeout();
mLockPatternView.removeCallbacks(mCancelPatternRunnable);
Toast.makeText(getApplicationContext(),
getResources().getString(
- R.string.lockpattern_too_many_failed_confirmation_attempts),
+ R.string.lockpattern_too_many_failed_confirmation_attempts,
+ FAILED_ATTEMPT_RETRY),
Toast.LENGTH_SHORT).show();
switchToAccount();
}
@@ -396,5 +445,22 @@ public class LockPatternActivity extends Activity implements OnNotifyAccountRese
mPatternLockHeader.setText(getString(R.string.pa_pattern_or_fingerprint_header));
mFingerPrintUiHelper.startListening();
}
+ if (isRetryLocked()) {
+ invalidateOptionsMenu();
+ switchToAccount();
+ }
+ }
+
+ private boolean isRetryLocked() {
+ long time = System.currentTimeMillis();
+ SharedPreferences prefs = getSharedPreferences(getPackageName(), MODE_PRIVATE);
+ long retryTime = prefs.getLong(TIMEOUT_PREF_KEY, 0);
+ mRetryLocked = (time - retryTime) < (FAILED_ATTEMPT_RETRY * 1000);
+ return mRetryLocked;
+ }
+
+ private void setPatternTimeout() {
+ SharedPreferences prefs = getSharedPreferences(getPackageName(), MODE_PRIVATE);
+ prefs.edit().putLong(TIMEOUT_PREF_KEY, System.currentTimeMillis()).apply();
}
}