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 42d6c48847ba6a68594ac602350a5994904b9a67baJim Miller implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { 434b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 44d6c48847ba6a68594ac602350a5994904b9a67baJim Miller private ProgressDialog mSimUnlockProgressDialog = null; 45d6c48847ba6a68594ac602350a5994904b9a67baJim Miller private volatile boolean mSimCheckInProgress; 46d6c48847ba6a68594ac602350a5994904b9a67baJim Miller 47d6c48847ba6a68594ac602350a5994904b9a67baJim Miller public KeyguardSimPinView(Context context) { 48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSimPinView(Context context, AttributeSet attrs) { 52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 5553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void resetState() { 5653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mSecurityMessageDisplay.setMessage(R.string.kg_sim_pin_instructions, true); 5753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setEnabled(true); 5853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 5953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 6053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 6153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected int getPasswordTextViewId() { 6253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler return R.id.pinEntry; 63dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 64dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 65dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 66dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onFinishInflate(); 68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 6953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler final View ok = findViewById(R.id.key_enter); 7053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (ok != null) { 7153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler ok.setOnClickListener(new View.OnClickListener() { 7253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 73dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onClick(View v) { 7453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 7553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler verifyPasswordAndUnlock(); 76dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 790b728244dc87b4a453f2191c2cb37a86e91aee0aJim Miller 8053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler // The delete button is of the PIN keyboard itself in some (e.g. tablet) layouts, 8153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler // not a separate view 8253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler View pinDelete = findViewById(R.id.delete_button); 8353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (pinDelete != null) { 8453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setVisibility(View.VISIBLE); 8553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setOnClickListener(new OnClickListener() { 8653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void onClick(View v) { 8753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler CharSequence str = mPasswordEntry.getText(); 8853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (str.length() > 0) { 8953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(str.subSequence(0, str.length()-1)); 9053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 9153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 9253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 9353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler }); 9453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler pinDelete.setOnLongClickListener(new View.OnLongClickListener() { 9553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public boolean onLongClick(View v) { 9653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 9753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler doHapticKeyClick(); 9853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler return true; 9953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 10053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler }); 10153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 10353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setKeyListener(DigitsKeyListener.getInstance()); 10453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setInputType(InputType.TYPE_CLASS_NUMBER 10553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler | InputType.TYPE_NUMBER_VARIATION_PASSWORD); 106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 10753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.requestFocus(); 108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1106fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 1116fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 1126fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1136fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 11453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 11553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void onPause() { 116dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // dismiss the dialog. 117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog != null) { 118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.dismiss(); 119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = null; 120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 121dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 123dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Since the IPC can block, we want to run the request in a separate thread 125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * with a callback. 126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 127dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private abstract class CheckSimPin extends Thread { 128dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private final String mPin; 129dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 130dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected CheckSimPin(String pin) { 131dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPin = pin; 132dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 133dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1344b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller abstract void onSimCheckResponse(boolean success); 135dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 136dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 137dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 139dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final boolean result = ITelephony.Stub.asInterface(ServiceManager 140dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller .checkService("phone")).supplyPin(mPin); 141dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 142dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 1434b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller onSimCheckResponse(result); 144dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 145dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 146dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (RemoteException e) { 147dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 148dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 1494b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller onSimCheckResponse(false); 150dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 151dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 152dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 153dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 154dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 156dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Dialog getSimUnlockProgressDialog() { 157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog == null) { 158dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = new ProgressDialog(mContext); 159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setMessage( 160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); 161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setIndeterminate(true); 162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setCancelable(false); 163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (!(mContext instanceof Activity)) { 164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.getWindow().setType( 165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 168dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mSimUnlockProgressDialog; 169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 17153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 17253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected void verifyPasswordAndUnlock() { 17353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler String entry = mPasswordEntry.getText().toString(); 17453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 17553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (entry.length() < 4) { 176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, display a message to the user, and don't submit. 1770a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint, true); 17853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback.userActivity(0); 180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return; 181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 183dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller getSimUnlockProgressDialog().show(); 184dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1854b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (!mSimCheckInProgress) { 1864b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimCheckInProgress = true; // there should be only one 18753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler new CheckSimPin(mPasswordEntry.getText().toString()) { 1884b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller void onSimCheckResponse(final boolean success) { 1894b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller post(new Runnable() { 1904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller public void run() { 1914b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (mSimUnlockProgressDialog != null) { 1924b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimUnlockProgressDialog.hide(); 1934b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 1944b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (success) { 1954b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller // before closing the keyguard, report back that the sim is unlocked 1964b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller // so it knows right away. 1974b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(); 1984b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.dismiss(true); 1994b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 2000a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen mSecurityMessageDisplay.setMessage 2010a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen (R.string.kg_password_wrong_pin_code, true); 20253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler mPasswordEntry.setText(""); 2034b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 2044b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.userActivity(0); 2054b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimCheckInProgress = false; 206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 2074b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }); 2084b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 2094b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }.start(); 2104b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 21353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 214