diff options
Diffstat (limited to 'src/com/android/settings/applications/LockPatternActivity.java')
-rw-r--r-- | src/com/android/settings/applications/LockPatternActivity.java | 86 |
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(); } } |