KeyguardSimPinView.java revision 53149e69e9e70af0e2db4a6223bf4d6a7d01a1ac
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 17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard; 18dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport com.android.internal.telephony.ITelephony; 2053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 2153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport android.content.Context; 22dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Activity; 23dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Dialog; 24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ProgressDialog; 25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException; 26dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.ServiceManager; 279cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Millerimport android.text.Editable; 2853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport android.text.InputType; 299cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Millerimport android.text.TextWatcher; 3053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport android.text.method.DigitsKeyListener; 31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View; 33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.WindowManager; 34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.TextView.OnEditorActionListener; 35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport com.android.internal.R; 3753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 38dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/** 3953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler * Displays a PIN pad for unlocking. 40dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 4153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerpublic class KeyguardSimPinView extends KeyguardAbsKeyInputView 4253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { 4353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 4453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler private ProgressDialog mSimUnlockProgressDialog = null; 4553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler private volatile boolean mSimCheckInProgress; 4653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 4753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public KeyguardSimPinView(Context context) { 484b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSimPinView(Context context, AttributeSet attrs) { 53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void resetState() { 5753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mSecurityMessageDisplay.setMessage(R.string.kg_sim_pin_instructions, true); 5853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setEnabled(true); 5953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 6053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 6153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 6253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected int getPasswordTextViewId() { 6353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler return R.id.pinEntry; 64dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 65dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 66dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onFinishInflate(); 69dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 7053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler final View ok = findViewById(R.id.key_enter); 7153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (ok != null) { 7253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler ok.setOnClickListener(new View.OnClickListener() { 7353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onClick(View v) { 7553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 7653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler verifyPasswordAndUnlock(); 77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 79dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 800b728244dc87b4a453f2191c2cb37a86e91aee0aJim Miller 8153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler // The delete button is of the PIN keyboard itself in some (e.g. tablet) layouts, 8253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler // not a separate view 8353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler View pinDelete = findViewById(R.id.delete_button); 8453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (pinDelete != null) { 8553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setVisibility(View.VISIBLE); 8653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setOnClickListener(new OnClickListener() { 8753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void onClick(View v) { 8853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler CharSequence str = mPasswordEntry.getText(); 8953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (str.length() > 0) { 9053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(str.subSequence(0, str.length()-1)); 9153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 9253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 9353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 9453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler }); 9553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setOnLongClickListener(new View.OnLongClickListener() { 9653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public boolean onLongClick(View v) { 9753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 9853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 9953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler return true; 10053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 10153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler }); 10253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 10453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setKeyListener(DigitsKeyListener.getInstance()); 10553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setInputType(InputType.TYPE_CLASS_NUMBER 10653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler | InputType.TYPE_NUMBER_VARIATION_PASSWORD); 107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 10853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.requestFocus(); 109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 110dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1116fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1126fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 1136fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1146fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 11553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 11653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void onPause() { 117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // dismiss the dialog. 118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog != null) { 119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.dismiss(); 120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = null; 121dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Since the IPC can block, we want to run the request in a separate thread 126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * with a callback. 127dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 128dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private abstract class CheckSimPin extends Thread { 129dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private final String mPin; 130dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 131dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected CheckSimPin(String pin) { 132dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPin = pin; 133dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 134dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1354b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller abstract void onSimCheckResponse(boolean success); 136dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 137dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 139dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 140dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final boolean result = ITelephony.Stub.asInterface(ServiceManager 141dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller .checkService("phone")).supplyPin(mPin); 142dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 143dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 1444b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller onSimCheckResponse(result); 145dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 146dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 147dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (RemoteException e) { 148dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 149dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 1504b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller onSimCheckResponse(false); 151dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 152dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 156dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Dialog getSimUnlockProgressDialog() { 158dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog == null) { 159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = new ProgressDialog(mContext); 160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setMessage( 161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); 162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setIndeterminate(true); 163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setCancelable(false); 164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (!(mContext instanceof Activity)) { 165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.getWindow().setType( 166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mSimUnlockProgressDialog; 170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 17253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 17353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected void verifyPasswordAndUnlock() { 17453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler String entry = mPasswordEntry.getText().toString(); 17553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 17653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (entry.length() < 4) { 177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, display a message to the user, and don't submit. 1780a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint, true); 17953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback.userActivity(0); 181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return; 182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 183dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 184dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller getSimUnlockProgressDialog().show(); 185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1864b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (!mSimCheckInProgress) { 1874b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimCheckInProgress = true; // there should be only one 18853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler new CheckSimPin(mPasswordEntry.getText().toString()) { 1894b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller void onSimCheckResponse(final boolean success) { 1904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller post(new Runnable() { 1914b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller public void run() { 1924b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (mSimUnlockProgressDialog != null) { 1934b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimUnlockProgressDialog.hide(); 1944b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 1954b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (success) { 1964b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller // before closing the keyguard, report back that the sim is unlocked 1974b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller // so it knows right away. 1984b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(); 1994b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.dismiss(true); 2004b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 2010a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen mSecurityMessageDisplay.setMessage 2020a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen (R.string.kg_password_wrong_pin_code, true); 20353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 2044b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 2054b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.userActivity(0); 2064b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimCheckInProgress = false; 207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 2084b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }); 2094b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 2104b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }.start(); 2114b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 21453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 215