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
1433122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek    @Override
1443122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek    protected int getPromtReasonStringRes(int reason) {
1453122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek        // No message on SIM Puk
1463122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek        return 0;
1473122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek    }
1483122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek
149b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private String getPukPasswordErrorMessage(int attemptsRemaining) {
150b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        String displayMessage;
151b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
152b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (attemptsRemaining == 0) {
153b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead);
154b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else if (attemptsRemaining > 0) {
155b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getResources()
156b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining,
157b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                            attemptsRemaining);
158b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else {
159b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getString(R.string.kg_password_puk_failed);
160b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        }
161b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:"
162b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
163b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        return displayMessage;
164b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    }
165b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
16623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    public void resetState() {
1674e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        super.resetState();
16823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        mStateMachine.reset();
169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
1727d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    protected boolean shouldLockout(long deadline) {
1737d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller        // SIM PUK doesn't have a timed lockout
1747d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller        return false;
1757d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    }
1767d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller
1777d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    @Override
17823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    protected int getPasswordTextViewId() {
179fa9189fd7425e7a097e46d54e545fbec631f9cacJorim Jaggi        return R.id.pukEntry;
180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
18323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    protected void onFinishInflate() {
18423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        super.onFinishInflate();
185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
18623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default
18740a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi        if (mEcaView instanceof EmergencyCarrierArea) {
18840a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi            ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true);
18940a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi        }
190d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi        mSimImageView = (ImageView) findViewById(R.id.keyguard_sim);
191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1936fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    @Override
19452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    protected void onAttachedToWindow() {
19552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super.onAttachedToWindow();
19652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
19752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
19852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
19952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    @Override
20052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    protected void onDetachedFromWindow() {
20152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super.onDetachedFromWindow();
20252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
20352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
20452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
20552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    @Override
2066fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void showUsabilityHint() {
2076fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
2086fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
20923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    @Override
21023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    public void onPause() {
211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // dismiss the dialog.
212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mSimUnlockProgressDialog != null) {
213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.dismiss();
214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog = null;
215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    /**
219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Since the IPC can block, we want to run the request in a separate thread
220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * with a callback.
221dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     */
222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private abstract class CheckSimPuk extends Thread {
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        private final String mPin, mPuk;
22552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        private final int mSubId;
226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
22752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        protected CheckSimPuk(String puk, String pin, int subId) {
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mPuk = puk;
229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mPin = pin;
23052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mSubId = subId;
231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
233b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        abstract void onSimLockChangedResponse(final int result, final int attemptsRemaining);
234dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void run() {
237dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            try {
23852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (DEBUG) Log.v(TAG, "call supplyPukReportResult()");
239b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                final int[] result = ITelephony.Stub.asInterface(ServiceManager
24052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    .checkService("phone")).supplyPukReportResultForSubscriber(mSubId, mPuk, mPin);
24152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (DEBUG) {
24252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    Log.v(TAG, "supplyPukReportResult returned: " + result[0] + " " + result[1]);
24352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                }
244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                post(new Runnable() {
245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
246b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                        onSimLockChangedResponse(result[0], result[1]);
247dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
248dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                });
249dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            } catch (RemoteException e) {
2504fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller                Log.e(TAG, "RemoteException for supplyPukReportResult:", e);
251dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                post(new Runnable() {
252dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
253b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                        onSimLockChangedResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
254dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
255dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                });
256dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
257dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
258dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
259dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
260dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private Dialog getSimUnlockProgressDialog() {
261dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mSimUnlockProgressDialog == null) {
262dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog = new ProgressDialog(mContext);
26323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler            mSimUnlockProgressDialog.setMessage(
26423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler                    mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setIndeterminate(true);
266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setCancelable(false);
267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            if (!(mContext instanceof Activity)) {
268dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                mSimUnlockProgressDialog.getWindow().setType(
269dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
270dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
271dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mSimUnlockProgressDialog;
273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
275b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private Dialog getPukRemainingAttemptsDialog(int remaining) {
276b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        String msg = getPukPasswordErrorMessage(remaining);
277b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (mRemainingAttemptsDialog == null) {
278b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
279b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setMessage(msg);
280b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setCancelable(false);
281b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setNeutralButton(R.string.ok, null);
282b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog = builder.create();
283b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog.getWindow().setType(
284b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
285b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else {
286b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog.setMessage(msg);
287b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        }
288b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        return mRemainingAttemptsDialog;
289b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    }
290b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
2913efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private boolean checkPuk() {
292dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // make sure the puk is at least 8 digits long.
293b8b7bd3185d5cf6c266ee40e74b515f526e18761Rakesh Pallerla        if (mPasswordEntry.getText().length() == 8) {
2944e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek            mPukText = mPasswordEntry.getText();
2953efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            return true;
296dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
2973efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        return false;
2983efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
299dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3003efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private boolean checkPin() {
301dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // make sure the PIN is between 4 and 8 digits
30223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        int length = mPasswordEntry.getText().length();
3033efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        if (length >= 4 && length <= 8) {
3044e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek            mPinText = mPasswordEntry.getText();
3053efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            return true;
306dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
3073efe106264262924a9218268d3c7d19d272fb7a2Jim Miller        return false;
3083efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
309dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3103efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    public boolean confirmPin() {
3114e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        return mPinText.equals(mPasswordEntry.getText());
3123efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    }
3133efe106264262924a9218268d3c7d19d272fb7a2Jim Miller
3143efe106264262924a9218268d3c7d19d272fb7a2Jim Miller    private void updateSim() {
315dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        getSimUnlockProgressDialog().show();
316dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3174fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller        if (mCheckSimPukThread == null) {
31852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mCheckSimPukThread = new CheckSimPuk(mPukText, mPinText, mSubId) {
319b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                void onSimLockChangedResponse(final int result, final int attemptsRemaining) {
3203efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                    post(new Runnable() {
3214b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                        public void run() {
3224b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            if (mSimUnlockProgressDialog != null) {
3234b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                                mSimUnlockProgressDialog.hide();
3244b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            }
32552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                            resetPasswordText(true /* animate */);
326b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                            if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
32752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                                KeyguardUpdateMonitor.getInstance(getContext())
32852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                                        .reportSimUnlocked(mSubId);
3294b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                                mCallback.dismiss(true);
3304b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            } else {
331b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
332b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    if (attemptsRemaining <= 2) {
333b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        // this is getting critical - show dialog
334b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        getPukRemainingAttemptsDialog(attemptsRemaining).show();
335b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    } else {
336b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        // show message
337b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        mSecurityMessageDisplay.setMessage(
338b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                                getPukPasswordErrorMessage(attemptsRemaining), true);
339b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    }
340b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                } else {
341b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    mSecurityMessageDisplay.setMessage(getContext().getString(
342b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                            R.string.kg_password_puk_failed), true);
343b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                }
344b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
345b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        + " UpdateSim.onSimCheckResponse: "
346b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        + " attemptsRemaining=" + attemptsRemaining);
3473efe106264262924a9218268d3c7d19d272fb7a2Jim Miller                                mStateMachine.reset();
3484b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            }
3494fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller                            mCheckSimPukThread = null;
350dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        }
3514b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    });
3524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                }
3534fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller            };
3544fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller            mCheckSimPukThread.start();
3554b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller        }
356dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
357dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
358dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
35923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler    protected void verifyPasswordAndUnlock() {
36023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler        mStateMachine.next();
3619cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller    }
362c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi
363c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    @Override
364c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    public void startAppearAnimation() {
365c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi        // noop.
366c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    }
36776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
36876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    @Override
36976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    public boolean startDisappearAnimation(Runnable finishRunnable) {
37076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        return false;
37176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
37223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler}
3739cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller
3749cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller
375