1dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/*
2dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Copyright (C) 2012 The Android Open Source Project
3dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
4dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Licensed under the Apache License, Version 2.0 (the "License");
5dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * you may not use this file except in compliance with the License.
6dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * You may obtain a copy of the License at
7dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
8dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *      http://www.apache.org/licenses/LICENSE-2.0
9dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
10dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Unless required by applicable law or agreed to in writing, software
11dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * distributed under the License is distributed on an "AS IS" BASIS,
12dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * See the License for the specific language governing permissions and
14dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * limitations under the License.
15dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */
16dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard;
18dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport com.android.internal.telephony.ITelephony;
2052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.internal.telephony.IccCardConstants;
2152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.internal.telephony.IccCardConstants.State;
22b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport com.android.internal.telephony.PhoneConstants;
2353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler
2453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport android.content.Context;
25d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.content.res.ColorStateList;
2652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.content.res.Resources;
27b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog;
28b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog.Builder;
29dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Dialog;
30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ProgressDialog;
31d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.graphics.Color;
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException;
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.ServiceManager;
3452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionInfo;
3552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionManager;
3652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.TelephonyManager;
37dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet;
38b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.util.Log;
39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.WindowManager;
40d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.widget.ImageView;
41dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/**
4353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler * Displays a PIN pad for unlocking.
44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */
454e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinekpublic class KeyguardSimPinView extends KeyguardPinBasedInputView {
46b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private static final String LOG_TAG = "KeyguardSimPinView";
4752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    private static final boolean DEBUG = KeyguardConstants.DEBUG_SIM_STATES;
484fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller    public static final String TAG = "KeyguardSimPinView";
494b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller
50d6c48847ba6a68594ac602350a5994904b9a67baJim Miller    private ProgressDialog mSimUnlockProgressDialog = null;
514fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller    private CheckSimPin mCheckSimPinThread;
52d6c48847ba6a68594ac602350a5994904b9a67baJim Miller
53b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private AlertDialog mRemainingAttemptsDialog;
5452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    private int mSubId;
55d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi    private ImageView mSimImageView;
5652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
5752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() {
5852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        @Override
5952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        public void onSimStateChanged(int subId, int slotId, State simState) {
6052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller           if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")");
6152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller           resetState();
6252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller       };
6352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    };
64b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
65d6c48847ba6a68594ac602350a5994904b9a67baJim Miller    public KeyguardSimPinView(Context context) {
66dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        this(context, null);
67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
69dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSimPinView(Context context, AttributeSet attrs) {
70dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super(context, attrs);
71dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
72dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
7353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    public void resetState() {
744e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        super.resetState();
7552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        if (DEBUG) Log.v(TAG, "Resetting state");
7652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
7752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED);
78a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
7952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            int count = TelephonyManager.getDefault().getSimCount();
8052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            Resources rez = getResources();
8152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            final String msg;
82d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi            int color = Color.WHITE;
8352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            if (count < 2) {
8452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                msg = rez.getString(R.string.kg_sim_pin_instructions);
8552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            } else {
8652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId);
8752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash
8852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName);
89d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                if (info != null) {
90d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                    color = info.getIconTint();
91d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                }
9252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            }
9352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mSecurityMessageDisplay.setMessage(msg, true);
94d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi            mSimImageView.setImageTintList(ColorStateList.valueOf(color));
9552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        }
9653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    }
9753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler
98b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private String getPinPasswordErrorMessage(int attemptsRemaining) {
99b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        String displayMessage;
100b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
101b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (attemptsRemaining == 0) {
102b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked);
103b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else if (attemptsRemaining > 0) {
104b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getResources()
105b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining,
106b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                            attemptsRemaining);
107b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else {
108b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getString(R.string.kg_password_pin_failed);
109b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        }
110b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:"
111b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
112b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        return displayMessage;
113b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    }
114b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
11553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    @Override
1167d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    protected boolean shouldLockout(long deadline) {
1177d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller        // SIM PIN doesn't have a timed lockout
1187d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller        return false;
1197d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    }
1207d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller
1217d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    @Override
12253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    protected int getPasswordTextViewId() {
123fa9189fd7425e7a097e46d54e545fbec631f9cacJorim Jaggi        return R.id.simPinEntry;
124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
127dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    protected void onFinishInflate() {
128dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super.onFinishInflate();
129dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
130b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default
13140a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi        if (mEcaView instanceof EmergencyCarrierArea) {
13240a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi            ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true);
13340a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi        }
134d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi        mSimImageView = (ImageView) findViewById(R.id.keyguard_sim);
135dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
136dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1376fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    @Override
13852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    protected void onAttachedToWindow() {
13952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super.onAttachedToWindow();
14052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
14152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
14252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
14352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    @Override
14452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    protected void onDetachedFromWindow() {
14552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super.onDetachedFromWindow();
14652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
14752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
14852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
14952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    @Override
1506fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void showUsabilityHint() {
1516fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
1526fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
15353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    @Override
15453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    public void onPause() {
155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // dismiss the dialog.
156dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mSimUnlockProgressDialog != null) {
157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.dismiss();
158dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog = null;
159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    /**
163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Since the IPC can block, we want to run the request in a separate thread
164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * with a callback.
165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     */
166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private abstract class CheckSimPin extends Thread {
167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        private final String mPin;
16852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        private int mSubId;
169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
17052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        protected CheckSimPin(String pin, int subId) {
171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mPin = pin;
17252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mSubId = subId;
173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
175b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        abstract void onSimCheckResponse(final int result, final int attemptsRemaining);
176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
178dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void run() {
179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            try {
18052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (DEBUG) {
18152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    Log.v(TAG, "call supplyPinReportResultForSubscriber(subid=" + mSubId + ")");
18252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                }
183b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                final int[] result = ITelephony.Stub.asInterface(ServiceManager
18452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                        .checkService("phone")).supplyPinReportResultForSubscriber(mSubId, mPin);
18552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (DEBUG) {
18652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    Log.v(TAG, "supplyPinReportResult returned: " + result[0] + " " + result[1]);
18752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                }
188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                post(new Runnable() {
189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
190b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                        onSimCheckResponse(result[0], result[1]);
191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                });
193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            } catch (RemoteException e) {
1944fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller                Log.e(TAG, "RemoteException for supplyPinReportResult:", e);
195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                post(new Runnable() {
196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
197b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                        onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                });
200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
203dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private Dialog getSimUnlockProgressDialog() {
205dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mSimUnlockProgressDialog == null) {
206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog = new ProgressDialog(mContext);
207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setMessage(
208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setIndeterminate(true);
210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setCancelable(false);
211b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mSimUnlockProgressDialog.getWindow().setType(
212b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mSimUnlockProgressDialog;
215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
217b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private Dialog getSimRemainingAttemptsDialog(int remaining) {
218b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        String msg = getPinPasswordErrorMessage(remaining);
219b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (mRemainingAttemptsDialog == null) {
220b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            Builder builder = new AlertDialog.Builder(mContext);
221b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setMessage(msg);
222b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setCancelable(false);
223b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setNeutralButton(R.string.ok, null);
224b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog = builder.create();
225b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog.getWindow().setType(
226b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
227b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else {
228b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog.setMessage(msg);
229b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        }
230b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        return mRemainingAttemptsDialog;
231b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    }
232b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
23353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    @Override
23453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    protected void verifyPasswordAndUnlock() {
2354e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        String entry = mPasswordEntry.getText();
2367d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller
23753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler        if (entry.length() < 4) {
238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            // otherwise, display a message to the user, and don't submit.
2390a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen            mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint, true);
2404e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek            resetPasswordText(true);
241b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi            mCallback.userActivity();
242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            return;
243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        getSimUnlockProgressDialog().show();
246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
2474fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller        if (mCheckSimPinThread == null) {
24852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mCheckSimPinThread = new CheckSimPin(mPasswordEntry.getText(), mSubId) {
249b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                void onSimCheckResponse(final int result, final int attemptsRemaining) {
2504b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    post(new Runnable() {
2514b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                        public void run() {
2524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            if (mSimUnlockProgressDialog != null) {
2534b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                                mSimUnlockProgressDialog.hide();
2544b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            }
25552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                            resetPasswordText(true /* animate */);
256b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                            if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
25752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                                KeyguardUpdateMonitor.getInstance(getContext())
25852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                                        .reportSimUnlocked(mSubId);
2594b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                                mCallback.dismiss(true);
2604b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            } else {
261b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
262b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    if (attemptsRemaining <= 2) {
263b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        // this is getting critical - show dialog
264b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        getSimRemainingAttemptsDialog(attemptsRemaining).show();
265b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    } else {
266b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        // show message
267b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        mSecurityMessageDisplay.setMessage(
268b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                                getPinPasswordErrorMessage(attemptsRemaining), true);
269b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    }
270b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                } else {
271b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    // "PIN operation failed!" - no idea what this was and no way to
272b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    // find out. :/
273b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    mSecurityMessageDisplay.setMessage(getContext().getString(
274b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                            R.string.kg_password_pin_failed), true);
275b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                }
276b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
277b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        + " CheckSimPin.onSimCheckResponse: " + result
278b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        + " attemptsRemaining=" + attemptsRemaining);
2794b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            }
280b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                            mCallback.userActivity();
2814fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller                            mCheckSimPinThread = null;
282dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        }
2834b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    });
2844b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                }
2854fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller            };
2864fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller            mCheckSimPinThread.start();
2874b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller        }
288dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
289c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi
290c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    @Override
291c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    public void startAppearAnimation() {
292c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi        // noop.
293c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    }
29476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
29576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    @Override
29676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    public boolean startDisappearAnimation(Runnable finishRunnable) {
29776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        return false;
29876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
299dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
30053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler
301