KeyguardSimPinView.java revision 5cf17879a31b7b78c09ec50b727f921840dcf783
1dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/* 2dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Copyright (C) 2012 The Android Open Source Project 3dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 4dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 5dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * you may not use this file except in compliance with the License. 6dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * You may obtain a copy of the License at 7dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 8dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * http://www.apache.org/licenses/LICENSE-2.0 9dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 10dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Unless required by applicable law or agreed to in writing, software 11dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * distributed under the License is distributed on an "AS IS" BASIS, 12dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * See the License for the specific language governing permissions and 14dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * limitations under the License. 15dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 16dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard; 18dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport com.android.internal.telephony.ITelephony; 20b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport com.android.internal.telephony.PhoneConstants; 2153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 2253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport android.content.Context; 23b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog; 24b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog.Builder; 25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Dialog; 26dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ProgressDialog; 27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException; 28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.ServiceManager; 2953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport android.text.InputType; 309cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Millerimport android.text.TextWatcher; 3153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport android.text.method.DigitsKeyListener; 32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View; 34b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.util.Log; 35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.WindowManager; 36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.TextView.OnEditorActionListener; 37dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 38dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/** 3953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler * Displays a PIN pad for unlocking. 40dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 4153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerpublic class KeyguardSimPinView extends KeyguardAbsKeyInputView 42d6c48847ba6a68594ac602350a5994904b9a67baJim Miller implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { 43b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private static final String LOG_TAG = "KeyguardSimPinView"; 445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private static final boolean DEBUG = KeyguardConstants.DEBUG; 454fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller public static final String TAG = "KeyguardSimPinView"; 464b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 47d6c48847ba6a68594ac602350a5994904b9a67baJim Miller private ProgressDialog mSimUnlockProgressDialog = null; 484fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller private CheckSimPin mCheckSimPinThread; 49d6c48847ba6a68594ac602350a5994904b9a67baJim Miller 50b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private AlertDialog mRemainingAttemptsDialog; 51b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 52d6c48847ba6a68594ac602350a5994904b9a67baJim Miller public KeyguardSimPinView(Context context) { 53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSimPinView(Context context, AttributeSet attrs) { 57dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 58dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 59dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 6053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void resetState() { 6153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mSecurityMessageDisplay.setMessage(R.string.kg_sim_pin_instructions, true); 6253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setEnabled(true); 6353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 6453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 65b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private String getPinPasswordErrorMessage(int attemptsRemaining) { 66b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String displayMessage; 67b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 68b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining == 0) { 69b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); 70b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else if (attemptsRemaining > 0) { 71b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getResources() 72b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining, 73b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville attemptsRemaining); 74b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 75b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_pin_failed); 76b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 77b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:" 78b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); 79b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return displayMessage; 80b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 81b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 8253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 837d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller protected boolean shouldLockout(long deadline) { 847d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller // SIM PIN doesn't have a timed lockout 857d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller return false; 867d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller } 877d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller 887d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller @Override 8953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected int getPasswordTextViewId() { 9053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler return R.id.pinEntry; 91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 92dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 93dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 94dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 95dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onFinishInflate(); 96dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 9753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler final View ok = findViewById(R.id.key_enter); 9853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (ok != null) { 9953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler ok.setOnClickListener(new View.OnClickListener() { 10053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 101dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onClick(View v) { 10253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 10353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler verifyPasswordAndUnlock(); 104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1070b728244dc87b4a453f2191c2cb37a86e91aee0aJim Miller 10853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler // The delete button is of the PIN keyboard itself in some (e.g. tablet) layouts, 10953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler // not a separate view 11053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler View pinDelete = findViewById(R.id.delete_button); 11153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (pinDelete != null) { 11253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setVisibility(View.VISIBLE); 11353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setOnClickListener(new OnClickListener() { 11453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void onClick(View v) { 11553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler CharSequence str = mPasswordEntry.getText(); 11653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (str.length() > 0) { 11753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(str.subSequence(0, str.length()-1)); 11853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 11953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 12053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 12153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler }); 12253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setOnLongClickListener(new View.OnLongClickListener() { 12353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public boolean onLongClick(View v) { 12453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 12553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 12653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler return true; 12753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 12853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler }); 12953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 130dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 13153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setKeyListener(DigitsKeyListener.getInstance()); 13253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setInputType(InputType.TYPE_CLASS_NUMBER 13353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler | InputType.TYPE_NUMBER_VARIATION_PASSWORD); 134dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 13553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.requestFocus(); 136b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 137b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default 138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 139dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1406fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1416fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 1426fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1436fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 14453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 14553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void onPause() { 146dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // dismiss the dialog. 147dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog != null) { 148dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.dismiss(); 149dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = null; 150dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 151dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 152dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Since the IPC can block, we want to run the request in a separate thread 155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * with a callback. 156dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private abstract class CheckSimPin extends Thread { 158dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private final String mPin; 159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected CheckSimPin(String pin) { 161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPin = pin; 162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 164b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville abstract void onSimCheckResponse(final int result, final int attemptsRemaining); 165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 1694fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller Log.v(TAG, "call supplyPinReportResult()"); 170b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville final int[] result = ITelephony.Stub.asInterface(ServiceManager 171b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville .checkService("phone")).supplyPinReportResult(mPin); 1724fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller Log.v(TAG, "supplyPinReportResult returned: " + result[0] + " " + result[1]); 173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 175b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimCheckResponse(result[0], result[1]); 176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 178dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (RemoteException e) { 1794fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller Log.e(TAG, "RemoteException for supplyPinReportResult:", e); 180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 182b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); 183dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 184dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 187dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Dialog getSimUnlockProgressDialog() { 190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog == null) { 191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = new ProgressDialog(mContext); 192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setMessage( 193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); 194dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setIndeterminate(true); 195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setCancelable(false); 196b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSimUnlockProgressDialog.getWindow().setType( 197b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mSimUnlockProgressDialog; 200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 202b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private Dialog getSimRemainingAttemptsDialog(int remaining) { 203b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String msg = getPinPasswordErrorMessage(remaining); 204b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (mRemainingAttemptsDialog == null) { 205b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville Builder builder = new AlertDialog.Builder(mContext); 206b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setMessage(msg); 207b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setCancelable(false); 208b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setNeutralButton(R.string.ok, null); 209b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog = builder.create(); 210b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.getWindow().setType( 211b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 212b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 213b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.setMessage(msg); 214b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 215b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return mRemainingAttemptsDialog; 216b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 217b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 21853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 21953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected void verifyPasswordAndUnlock() { 22053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler String entry = mPasswordEntry.getText().toString(); 2217d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller 22253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (entry.length() < 4) { 223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, display a message to the user, and don't submit. 2240a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint, true); 22553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback.userActivity(0); 227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return; 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller getSimUnlockProgressDialog().show(); 231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 2324fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller if (mCheckSimPinThread == null) { 2334fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPinThread = new CheckSimPin(mPasswordEntry.getText().toString()) { 234b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville void onSimCheckResponse(final int result, final int attemptsRemaining) { 2354b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller post(new Runnable() { 2364b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller public void run() { 2374b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (mSimUnlockProgressDialog != null) { 2384b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimUnlockProgressDialog.hide(); 2394b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 240b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_RESULT_SUCCESS) { 2414b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(); 2424b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.dismiss(true); 2434b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 244b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { 245b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining <= 2) { 246b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // this is getting critical - show dialog 247b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getSimRemainingAttemptsDialog(attemptsRemaining).show(); 248b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 249b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // show message 250b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage( 251b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getPinPasswordErrorMessage(attemptsRemaining), true); 252b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 253b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 254b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // "PIN operation failed!" - no idea what this was and no way to 255b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // find out. :/ 256b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage(getContext().getString( 257b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville R.string.kg_password_pin_failed), true); 258b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 259b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock " 260b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " CheckSimPin.onSimCheckResponse: " + result 261b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining); 26253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 2634b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 2644b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.userActivity(0); 2654fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPinThread = null; 266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 2674b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }); 2684b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 2694fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller }; 2704fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPinThread.start(); 2714b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 27453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 275