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;
185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
195ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.content.Context;
20d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.content.res.ColorStateList;
2152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.content.res.Resources;
22dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Activity;
23b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog;
24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Dialog;
25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ProgressDialog;
26d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.graphics.Color;
27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException;
28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.ServiceManager;
2952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionInfo;
3052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionManager;
3152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.TelephonyManager;
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet;
33b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.util.Log;
34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.WindowManager;
35d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.widget.ImageView;
36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
37b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport com.android.internal.telephony.ITelephony;
3852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.internal.telephony.IccCardConstants;
39b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport com.android.internal.telephony.PhoneConstants;
4052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.internal.telephony.IccCardConstants.State;
41b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
42b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
4323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler/**
4423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler * Displays a PIN pad for entering a PUK (Pin Unlock Kode) provided by a carrier.
4523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler */
464e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinekpublic class KeyguardSimPukView extends KeyguardPinBasedInputView {
47b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private static final String LOG_TAG = "KeyguardSimPukView";
485cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private static final boolean DEBUG = KeyguardConstants.DEBUG;
494fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller    public static final String TAG = "KeyguardSimPukView";
50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private ProgressDialog mSimUnlockProgressDialog = null;
524fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller    private CheckSimPuk mCheckSimPukThread;
533efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private String mPukText;
543efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private String mPinText;
553efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private StateMachine mStateMachine = new StateMachine();
56b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private AlertDialog mRemainingAttemptsDialog;
5752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    private int mSubId;
58d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi    private ImageView mSimImageView;
5952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
6052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() {
6152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        @Override
6252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        public void onSimStateChanged(int subId, int slotId, State simState) {
6352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller           if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")");
6452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller           resetState();
6552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller       };
6652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    };
6752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
6852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    public KeyguardSimPukView(Context context) {
6952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        this(context, null);
7052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
7152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
7252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    public KeyguardSimPukView(Context context, AttributeSet attrs) {
7352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super(context, attrs);
7452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
753efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
763efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private class StateMachine {
773efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        final int ENTER_PUK = 0;
783efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        final int ENTER_PIN = 1;
793efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        final int CONFIRM_PIN = 2;
803efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        final int DONE = 3;
813efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        private int state = ENTER_PUK;
823efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
833efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        public void next() {
843efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            int msg = 0;
853efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            if (state == ENTER_PUK) {
863efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                if (checkPuk()) {
873efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    state = ENTER_PIN;
883efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    msg = R.string.kg_puk_enter_pin_hint;
893efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                } else {
903efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    msg = R.string.kg_invalid_sim_puk_hint;
913efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                }
923efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            } else if (state == ENTER_PIN) {
933efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                if (checkPin()) {
943efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    state = CONFIRM_PIN;
953efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    msg = R.string.kg_enter_confirm_pin_hint;
963efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                } else {
973efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    msg = R.string.kg_invalid_sim_pin_hint;
983efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                }
993efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            } else if (state == CONFIRM_PIN) {
1003efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                if (confirmPin()) {
1013efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    state = DONE;
1025ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                    msg = R.string.keyguard_sim_unlock_progress_dialog_message;
1033efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    updateSim();
1043efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                } else {
10523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler                    state = ENTER_PIN; // try again?
1063efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    msg = R.string.kg_invalid_confirm_pin_hint;
1073efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                }
1083efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            }
1094e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek            resetPasswordText(true);
1103efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            if (msg != 0) {
1110a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen                mSecurityMessageDisplay.setMessage(msg, true);
1123efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            }
1133efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        }
1143efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
1153efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        void reset() {
1163efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            mPinText="";
1173efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            mPukText="";
1183efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            state = ENTER_PUK;
11952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
12052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED);
121a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville            if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
12252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                int count = TelephonyManager.getDefault().getSimCount();
12352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                Resources rez = getResources();
12452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                final String msg;
125d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                int color = Color.WHITE;
12652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (count < 2) {
12752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    msg = rez.getString(R.string.kg_puk_enter_puk_hint);
12852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                } else {
12952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId);
13052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    CharSequence displayName = info != null ? info.getDisplayName() : "";
13152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName);
132d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                    if (info != null) {
133d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                        color = info.getIconTint();
134d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                    }
13552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                }
13652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                mSecurityMessageDisplay.setMessage(msg, true);
137d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                mSimImageView.setImageTintList(ColorStateList.valueOf(color));
13852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            }
13923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler            mPasswordEntry.requestFocus();
1403efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        }
1413efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
1423efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
143b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private String getPukPasswordErrorMessage(int attemptsRemaining) {
144b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        String displayMessage;
145b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
146b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (attemptsRemaining == 0) {
147b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead);
148b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else if (attemptsRemaining > 0) {
149b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getResources()
150b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining,
151b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                            attemptsRemaining);
152b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else {
153b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getString(R.string.kg_password_puk_failed);
154b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        }
155b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:"
156b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
157b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        return displayMessage;
158b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    }
159b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
16023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    public void resetState() {
1614e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        super.resetState();
16223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        mStateMachine.reset();
163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
1667d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    protected boolean shouldLockout(long deadline) {
1677d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller        // SIM PUK doesn't have a timed lockout
1687d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller        return false;
1697d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    }
1707d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller
1717d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    @Override
17223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    protected int getPasswordTextViewId() {
173fa9189fd7425e7a097e46d54e545fbec631f9cacJorim Jaggi        return R.id.pukEntry;
174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
175dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
17723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    protected void onFinishInflate() {
17823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        super.onFinishInflate();
179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
18023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default
18140a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi        if (mEcaView instanceof EmergencyCarrierArea) {
18240a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi            ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true);
18340a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi        }
184d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi        mSimImageView = (ImageView) findViewById(R.id.keyguard_sim);
185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1876fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    @Override
18852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    protected void onAttachedToWindow() {
18952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super.onAttachedToWindow();
19052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
19152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
19252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
19352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    @Override
19452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    protected void onDetachedFromWindow() {
19552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super.onDetachedFromWindow();
19652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
19752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
19852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
19952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    @Override
2006fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void showUsabilityHint() {
2016fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
2026fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
20323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    @Override
20423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    public void onPause() {
205dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // dismiss the dialog.
206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mSimUnlockProgressDialog != null) {
207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.dismiss();
208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog = null;
209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    /**
213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Since the IPC can block, we want to run the request in a separate thread
214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * with a callback.
215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     */
216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private abstract class CheckSimPuk extends Thread {
217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        private final String mPin, mPuk;
21952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        private final int mSubId;
220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
22152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        protected CheckSimPuk(String puk, String pin, int subId) {
222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mPuk = puk;
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mPin = pin;
22452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mSubId = subId;
225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
227b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        abstract void onSimLockChangedResponse(final int result, final int attemptsRemaining);
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void run() {
231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            try {
23252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (DEBUG) Log.v(TAG, "call supplyPukReportResult()");
233b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                final int[] result = ITelephony.Stub.asInterface(ServiceManager
23452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    .checkService("phone")).supplyPukReportResultForSubscriber(mSubId, mPuk, mPin);
23552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (DEBUG) {
23652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    Log.v(TAG, "supplyPukReportResult returned: " + result[0] + " " + result[1]);
23752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                }
238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                post(new Runnable() {
239dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
240b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                        onSimLockChangedResponse(result[0], result[1]);
241dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                });
243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            } catch (RemoteException e) {
2444fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller                Log.e(TAG, "RemoteException for supplyPukReportResult:", e);
245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                post(new Runnable() {
246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
247b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                        onSimLockChangedResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
248dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
249dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                });
250dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
251dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
252dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
253dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
254dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private Dialog getSimUnlockProgressDialog() {
255dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mSimUnlockProgressDialog == null) {
256dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog = new ProgressDialog(mContext);
25723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler            mSimUnlockProgressDialog.setMessage(
25823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler                    mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
259dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setIndeterminate(true);
260dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setCancelable(false);
261dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (!(mContext instanceof Activity)) {
262dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mSimUnlockProgressDialog.getWindow().setType(
263dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mSimUnlockProgressDialog;
267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
268dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
269b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private Dialog getPukRemainingAttemptsDialog(int remaining) {
270b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        String msg = getPukPasswordErrorMessage(remaining);
271b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (mRemainingAttemptsDialog == null) {
272b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
273b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setMessage(msg);
274b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setCancelable(false);
275b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setNeutralButton(R.string.ok, null);
276b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog = builder.create();
277b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog.getWindow().setType(
278b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
279b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else {
280b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog.setMessage(msg);
281b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        }
282b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        return mRemainingAttemptsDialog;
283b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    }
284b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
2853efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private boolean checkPuk() {
286dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // make sure the puk is at least 8 digits long.
287b8b7bd3185d5cf6c266ee40e74b515f526e18761Rakesh Pallerla        if (mPasswordEntry.getText().length() == 8) {
2884e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek            mPukText = mPasswordEntry.getText();
2893efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            return true;
290dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
2913efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        return false;
2923efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
293dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
2943efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private boolean checkPin() {
295dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // make sure the PIN is between 4 and 8 digits
29623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        int length = mPasswordEntry.getText().length();
2973efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        if (length >= 4 && length <= 8) {
2984e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek            mPinText = mPasswordEntry.getText();
2993efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            return true;
300dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
3013efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        return false;
3023efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
303dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3043efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    public boolean confirmPin() {
3054e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        return mPinText.equals(mPasswordEntry.getText());
3063efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
3073efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
3083efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private void updateSim() {
309dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        getSimUnlockProgressDialog().show();
310dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3114fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller        if (mCheckSimPukThread == null) {
31252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mCheckSimPukThread = new CheckSimPuk(mPukText, mPinText, mSubId) {
313b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                void onSimLockChangedResponse(final int result, final int attemptsRemaining) {
3143efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    post(new Runnable() {
3154b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                        public void run() {
3164b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            if (mSimUnlockProgressDialog != null) {
3174b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                                mSimUnlockProgressDialog.hide();
3184b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            }
31952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                            resetPasswordText(true /* animate */);
320b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                            if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
32152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                                KeyguardUpdateMonitor.getInstance(getContext())
32252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                                        .reportSimUnlocked(mSubId);
3234b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                                mCallback.dismiss(true);
3244b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            } else {
325b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
326b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    if (attemptsRemaining <= 2) {
327b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        // this is getting critical - show dialog
328b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        getPukRemainingAttemptsDialog(attemptsRemaining).show();
329b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    } else {
330b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        // show message
331b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        mSecurityMessageDisplay.setMessage(
332b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                                getPukPasswordErrorMessage(attemptsRemaining), true);
333b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    }
334b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                } else {
335b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    mSecurityMessageDisplay.setMessage(getContext().getString(
336b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                            R.string.kg_password_puk_failed), true);
337b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                }
338b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
339b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        + " UpdateSim.onSimCheckResponse: "
340b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        + " attemptsRemaining=" + attemptsRemaining);
3413efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                                mStateMachine.reset();
3424b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            }
3434fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller                            mCheckSimPukThread = null;
344dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        }
3454b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    });
3464b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                }
3474fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller            };
3484fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller            mCheckSimPukThread.start();
3494b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller        }
350dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
351dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
352dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
35323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    protected void verifyPasswordAndUnlock() {
35423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        mStateMachine.next();
3559cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller    }
356c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi
357c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    @Override
358c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    public void startAppearAnimation() {
359c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi        // noop.
360c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    }
36176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
36276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    @Override
36376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    public boolean startDisappearAnimation(Runnable finishRunnable) {
36476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        return false;
36576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
36623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler}
3679cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller
3689cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller
369