diff options
author | Wink Saville <wink@google.com> | 2013-10-23 15:44:26 -0700 |
---|---|---|
committer | Wink Saville <wink@google.com> | 2013-10-23 15:44:26 -0700 |
commit | b896b9f74225d61af67c2661f44eceadb9e22013 (patch) | |
tree | 59c47d7ebd3f4d5d030aa5c5d1c283a4514c2e05 /packages/Keyguard/src/com/android | |
parent | 82f31701141f5c3057b162cba1d57f78cbad5091 (diff) | |
download | frameworks_base-b896b9f74225d61af67c2661f44eceadb9e22013.zip frameworks_base-b896b9f74225d61af67c2661f44eceadb9e22013.tar.gz frameworks_base-b896b9f74225d61af67c2661f44eceadb9e22013.tar.bz2 |
Enhance pin/puk support
Add supplyPinReportResult & supplyPukReportResult that
returns the result code and attempts remaining.
Display "Attempts remaining" in Keyguard
Bug: 9928717
Change-Id: Ibad0635dd1375fabce11ba2b7b9f95f8868489e6
Diffstat (limited to 'packages/Keyguard/src/com/android')
-rw-r--r-- | packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java | 87 | ||||
-rw-r--r-- | packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java | 77 |
2 files changed, 139 insertions, 25 deletions
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java index 5059407..e39622a 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java @@ -17,11 +17,16 @@ package com.android.keyguard; import com.android.internal.telephony.ITelephony; +import com.android.internal.telephony.PhoneConstants; import android.content.Context; +import android.content.DialogInterface; import android.app.Activity; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; import android.app.Dialog; import android.app.ProgressDialog; +import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.text.Editable; @@ -30,6 +35,7 @@ import android.text.TextWatcher; import android.text.method.DigitsKeyListener; import android.util.AttributeSet; import android.view.View; +import android.util.Log; import android.view.WindowManager; import android.widget.TextView.OnEditorActionListener; @@ -38,10 +44,14 @@ import android.widget.TextView.OnEditorActionListener; */ public class KeyguardSimPinView extends KeyguardAbsKeyInputView implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { + private static final String LOG_TAG = "KeyguardSimPinView"; + private static final boolean DEBUG = KeyguardViewMediator.DEBUG; private ProgressDialog mSimUnlockProgressDialog = null; private volatile boolean mSimCheckInProgress; + private AlertDialog mRemainingAttemptsDialog; + public KeyguardSimPinView(Context context) { this(context, null); } @@ -55,6 +65,23 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView mPasswordEntry.setEnabled(true); } + private String getPinPasswordErrorMessage(int attemptsRemaining) { + String displayMessage; + + if (attemptsRemaining == 0) { + displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); + } else if (attemptsRemaining > 0) { + displayMessage = getContext().getResources() + .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining, + attemptsRemaining); + } else { + displayMessage = getContext().getString(R.string.kg_password_pin_failed); + } + if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:" + + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); + return displayMessage; + } + @Override protected boolean shouldLockout(long deadline) { // SIM PIN doesn't have a timed lockout @@ -109,6 +136,8 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView | InputType.TYPE_NUMBER_VARIATION_PASSWORD); mPasswordEntry.requestFocus(); + + mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default } @Override @@ -135,22 +164,22 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView mPin = pin; } - abstract void onSimCheckResponse(boolean success); + abstract void onSimCheckResponse(final int result, final int attemptsRemaining); @Override public void run() { try { - final boolean result = ITelephony.Stub.asInterface(ServiceManager - .checkService("phone")).supplyPin(mPin); + final int[] result = ITelephony.Stub.asInterface(ServiceManager + .checkService("phone")).supplyPinReportResult(mPin); post(new Runnable() { public void run() { - onSimCheckResponse(result); + onSimCheckResponse(result[0], result[1]); } }); } catch (RemoteException e) { post(new Runnable() { public void run() { - onSimCheckResponse(false); + onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); } }); } @@ -164,14 +193,28 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); mSimUnlockProgressDialog.setIndeterminate(true); mSimUnlockProgressDialog.setCancelable(false); - if (!(mContext instanceof Activity)) { - mSimUnlockProgressDialog.getWindow().setType( - WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); - } + mSimUnlockProgressDialog.getWindow().setType( + WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); } return mSimUnlockProgressDialog; } + private Dialog getSimRemainingAttemptsDialog(int remaining) { + String msg = getPinPasswordErrorMessage(remaining); + if (mRemainingAttemptsDialog == null) { + Builder builder = new AlertDialog.Builder(mContext); + builder.setMessage(msg); + builder.setCancelable(false); + builder.setNeutralButton(R.string.ok, null); + mRemainingAttemptsDialog = builder.create(); + mRemainingAttemptsDialog.getWindow().setType( + WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); + } else { + mRemainingAttemptsDialog.setMessage(msg); + } + return mRemainingAttemptsDialog; + } + @Override protected void verifyPasswordAndUnlock() { String entry = mPasswordEntry.getText().toString(); @@ -189,20 +232,34 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView if (!mSimCheckInProgress) { mSimCheckInProgress = true; // there should be only one new CheckSimPin(mPasswordEntry.getText().toString()) { - void onSimCheckResponse(final boolean success) { + void onSimCheckResponse(final int result, final int attemptsRemaining) { post(new Runnable() { public void run() { if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); } - if (success) { - // before closing the keyguard, report back that the sim is unlocked - // so it knows right away. + if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(); mCallback.dismiss(true); } else { - mSecurityMessageDisplay.setMessage - (R.string.kg_password_wrong_pin_code, true); + if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { + if (attemptsRemaining <= 2) { + // this is getting critical - show dialog + getSimRemainingAttemptsDialog(attemptsRemaining).show(); + } else { + // show message + mSecurityMessageDisplay.setMessage( + getPinPasswordErrorMessage(attemptsRemaining), true); + } + } else { + // "PIN operation failed!" - no idea what this was and no way to + // find out. :/ + mSecurityMessageDisplay.setMessage(getContext().getString( + R.string.kg_password_pin_failed), true); + } + if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock " + + " CheckSimPin.onSimCheckResponse: " + result + + " attemptsRemaining=" + attemptsRemaining); mPasswordEntry.setText(""); } mCallback.userActivity(0); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java index 2ae4cc7..31518a1 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java @@ -16,10 +16,10 @@ package com.android.keyguard; -import com.android.internal.telephony.ITelephony; - import android.content.Context; +import android.animation.AnimatorSet.Builder; import android.app.Activity; +import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.os.RemoteException; @@ -29,21 +29,29 @@ import android.text.InputType; import android.text.TextWatcher; import android.text.method.DigitsKeyListener; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.view.WindowManager; import android.widget.TextView.OnEditorActionListener; +import com.android.internal.telephony.ITelephony; +import com.android.internal.telephony.PhoneConstants; + + /** * Displays a PIN pad for entering a PUK (Pin Unlock Kode) provided by a carrier. */ public class KeyguardSimPukView extends KeyguardAbsKeyInputView implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { + private static final String LOG_TAG = "KeyguardSimPukView"; + private static final boolean DEBUG = KeyguardViewMediator.DEBUG; private ProgressDialog mSimUnlockProgressDialog = null; private volatile boolean mCheckInProgress; private String mPukText; private String mPinText; private StateMachine mStateMachine = new StateMachine(); + private AlertDialog mRemainingAttemptsDialog; private class StateMachine { final int ENTER_PUK = 0; @@ -93,6 +101,23 @@ public class KeyguardSimPukView extends KeyguardAbsKeyInputView } } + private String getPukPasswordErrorMessage(int attemptsRemaining) { + String displayMessage; + + if (attemptsRemaining == 0) { + displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); + } else if (attemptsRemaining > 0) { + displayMessage = getContext().getResources() + .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining, + attemptsRemaining); + } else { + displayMessage = getContext().getString(R.string.kg_password_puk_failed); + } + if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:" + + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); + return displayMessage; + } + public KeyguardSimPukView(Context context) { this(context, null); } @@ -190,23 +215,23 @@ public class KeyguardSimPukView extends KeyguardAbsKeyInputView mPin = pin; } - abstract void onSimLockChangedResponse(boolean success); + abstract void onSimLockChangedResponse(final int result, final int attemptsRemaining); @Override public void run() { try { - final boolean result = ITelephony.Stub.asInterface(ServiceManager - .checkService("phone")).supplyPuk(mPuk, mPin); + final int[] result = ITelephony.Stub.asInterface(ServiceManager + .checkService("phone")).supplyPukReportResult(mPuk, mPin); post(new Runnable() { public void run() { - onSimLockChangedResponse(result); + onSimLockChangedResponse(result[0], result[1]); } }); } catch (RemoteException e) { post(new Runnable() { public void run() { - onSimLockChangedResponse(false); + onSimLockChangedResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); } }); } @@ -228,6 +253,22 @@ public class KeyguardSimPukView extends KeyguardAbsKeyInputView return mSimUnlockProgressDialog; } + private Dialog getPukRemainingAttemptsDialog(int remaining) { + String msg = getPukPasswordErrorMessage(remaining); + if (mRemainingAttemptsDialog == null) { + AlertDialog.Builder builder = new AlertDialog.Builder(mContext); + builder.setMessage(msg); + builder.setCancelable(false); + builder.setNeutralButton(R.string.ok, null); + mRemainingAttemptsDialog = builder.create(); + mRemainingAttemptsDialog.getWindow().setType( + WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); + } else { + mRemainingAttemptsDialog.setMessage(msg); + } + return mRemainingAttemptsDialog; + } + private boolean checkPuk() { // make sure the puk is at least 8 digits long. if (mPasswordEntry.getText().length() >= 8) { @@ -257,17 +298,33 @@ public class KeyguardSimPukView extends KeyguardAbsKeyInputView if (!mCheckInProgress) { mCheckInProgress = true; new CheckSimPuk(mPukText, mPinText) { - void onSimLockChangedResponse(final boolean success) { + void onSimLockChangedResponse(final int result, final int attemptsRemaining) { post(new Runnable() { public void run() { if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); } - if (success) { + if (result == PhoneConstants.PIN_RESULT_SUCCESS) { + KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(); mCallback.dismiss(true); } else { + if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { + if (attemptsRemaining <= 2) { + // this is getting critical - show dialog + getPukRemainingAttemptsDialog(attemptsRemaining).show(); + } else { + // show message + mSecurityMessageDisplay.setMessage( + getPukPasswordErrorMessage(attemptsRemaining), true); + } + } else { + mSecurityMessageDisplay.setMessage(getContext().getString( + R.string.kg_password_puk_failed), true); + } + if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock " + + " UpdateSim.onSimCheckResponse: " + + " attemptsRemaining=" + attemptsRemaining); mStateMachine.reset(); - mSecurityMessageDisplay.setMessage(R.string.kg_invalid_puk, true); } mCheckInProgress = false; } |