• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

packages/apps/Settings


Commit MetaInfo

Revision756b788b476af6995ffcf82d184af19405dac014 (tree)
Time2014-05-14 17:16:53
AuthorAdrian Roos <roosa@goog...>
CommiterChih-Wei Huang

Log Message

Add lockout after trying to enter PIN / Password too often

Enforce the same lockout that is already enforced when entering the pattern.

Bug: 13647935

Change-Id: Ia60a2235ad526c293b7a8d5600f406f187004df7

Change Summary

Incremental Difference

--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -26,8 +26,10 @@ import android.app.Fragment;
2626 import android.app.admin.DevicePolicyManager;
2727 import android.content.Intent;
2828 import android.os.Bundle;
29+import android.os.CountDownTimer;
2930 import android.os.Handler;
3031 import android.preference.PreferenceActivity;
32+import android.os.SystemClock;
3133 import android.text.Editable;
3234 import android.text.InputType;
3335 import android.text.TextWatcher;
@@ -78,7 +80,9 @@ public class ConfirmLockPassword extends PreferenceActivity {
7880 private PasswordEntryKeyboardHelper mKeyboardHelper;
7981 private PasswordEntryKeyboardView mKeyboardView;
8082 private Button mContinueButton;
81-
83+ private int mNumWrongConfirmAttempts;
84+ private CountDownTimer mCountdownTimer;
85+ private boolean mIsAlpha;
8286
8387 // required constructor for fragments
8488 public ConfirmLockPasswordFragment() {
@@ -109,29 +113,27 @@ public class ConfirmLockPassword extends PreferenceActivity {
109113
110114 mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard);
111115 mHeaderText = (TextView) view.findViewById(R.id.headerText);
112- final boolean isAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == storedQuality
116+ mIsAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == storedQuality
113117 || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == storedQuality
114118 || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality;
115- mHeaderText.setText(isAlpha ? R.string.lockpassword_confirm_your_password_header
116- : R.string.lockpassword_confirm_your_pin_header);
119+ mHeaderText.setText(getDefaultHeader());
117120
118121 final Activity activity = getActivity();
119122 mKeyboardHelper = new PasswordEntryKeyboardHelper(activity,
120123 mKeyboardView, mPasswordEntry);
121- mKeyboardHelper.setKeyboardMode(isAlpha ?
124+ mKeyboardHelper.setKeyboardMode(mIsAlpha ?
122125 PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA
123126 : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);
124127 mKeyboardView.requestFocus();
125128
126129 int currentType = mPasswordEntry.getInputType();
127- mPasswordEntry.setInputType(isAlpha ? currentType
130+ mPasswordEntry.setInputType(mIsAlpha ? currentType
128131 : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
129132
130133 // Update the breadcrumb (title) if this is embedded in a PreferenceActivity
131134 if (activity instanceof PreferenceActivity) {
132135 final PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
133- int id = isAlpha ? R.string.lockpassword_confirm_your_password_header
134- : R.string.lockpassword_confirm_your_pin_header;
136+ int id = getDefaultHeader();
135137 CharSequence title = getText(id);
136138 preferenceActivity.showBreadCrumbs(title, title);
137139 }
@@ -139,10 +141,19 @@ public class ConfirmLockPassword extends PreferenceActivity {
139141 return view;
140142 }
141143
144+ private int getDefaultHeader() {
145+ return mIsAlpha ? R.string.lockpassword_confirm_your_password_header
146+ : R.string.lockpassword_confirm_your_pin_header;
147+ }
148+
142149 @Override
143150 public void onPause() {
144151 super.onPause();
145152 mKeyboardView.requestFocus();
153+ if (mCountdownTimer != null) {
154+ mCountdownTimer.cancel();
155+ mCountdownTimer = null;
156+ }
146157 }
147158
148159 @Override
@@ -150,6 +161,10 @@ public class ConfirmLockPassword extends PreferenceActivity {
150161 // TODO Auto-generated method stub
151162 super.onResume();
152163 mKeyboardView.requestFocus();
164+ long deadline = mLockPatternUtils.getLockoutAttemptDeadline();
165+ if (deadline != 0) {
166+ handleAttemptLockout(deadline);
167+ }
153168 }
154169
155170 private void handleNext() {
@@ -162,10 +177,40 @@ public class ConfirmLockPassword extends PreferenceActivity {
162177 getActivity().setResult(RESULT_OK, intent);
163178 getActivity().finish();
164179 } else {
165- showError(R.string.lockpattern_need_to_unlock_wrong);
180+ if (++mNumWrongConfirmAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) {
181+ long deadline = mLockPatternUtils.setLockoutAttemptDeadline();
182+ handleAttemptLockout(deadline);
183+ } else {
184+ showError(R.string.lockpattern_need_to_unlock_wrong);
185+ }
166186 }
167187 }
168188
189+ private void handleAttemptLockout(long elapsedRealtimeDeadline) {
190+ long elapsedRealtime = SystemClock.elapsedRealtime();
191+ showError(R.string.lockpattern_too_many_failed_confirmation_attempts_header, 0);
192+ mPasswordEntry.setEnabled(false);
193+ mCountdownTimer = new CountDownTimer(
194+ elapsedRealtimeDeadline - elapsedRealtime,
195+ LockPatternUtils.FAILED_ATTEMPT_COUNTDOWN_INTERVAL_MS) {
196+
197+ @Override
198+ public void onTick(long millisUntilFinished) {
199+ final int secondsCountdown = (int) (millisUntilFinished / 1000);
200+ mHeaderText.setText(getString(
201+ R.string.lockpattern_too_many_failed_confirmation_attempts_footer,
202+ secondsCountdown));
203+ }
204+
205+ @Override
206+ public void onFinish() {
207+ mPasswordEntry.setEnabled(true);
208+ mHeaderText.setText(getDefaultHeader());
209+ mNumWrongConfirmAttempts = 0;
210+ }
211+ }.start();
212+ }
213+
169214 public void onClick(View v) {
170215 switch (v.getId()) {
171216 case R.id.next_button:
@@ -180,14 +225,23 @@ public class ConfirmLockPassword extends PreferenceActivity {
180225 }
181226
182227 private void showError(int msg) {
228+ showError(msg, ERROR_MESSAGE_TIMEOUT);
229+ }
230+
231+ private final Runnable mResetErrorRunnable = new Runnable() {
232+ public void run() {
233+ mHeaderText.setText(getDefaultHeader());
234+ }
235+ };
236+
237+ private void showError(int msg, long timeout) {
183238 mHeaderText.setText(msg);
184239 mHeaderText.announceForAccessibility(mHeaderText.getText());
185240 mPasswordEntry.setText(null);
186- mHandler.postDelayed(new Runnable() {
187- public void run() {
188- mHeaderText.setText(R.string.lockpassword_confirm_your_password_header);
189- }
190- }, ERROR_MESSAGE_TIMEOUT);
241+ mHandler.removeCallbacks(mResetErrorRunnable);
242+ if (timeout != 0) {
243+ mHandler.postDelayed(mResetErrorRunnable, timeout);
244+ }
191245 }
192246
193247 // {@link OnEditorActionListener} methods.