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;
26ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggiimport android.content.res.Configuration;
2752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.content.res.Resources;
28b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog;
29b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog.Builder;
30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Dialog;
31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ProgressDialog;
32d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.graphics.Color;
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException;
34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.ServiceManager;
3552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionInfo;
3652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionManager;
3752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.TelephonyManager;
383d7687421f0045374f8406cdea749176dbb56043qingxiimport android.telephony.euicc.EuiccManager;
39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet;
40b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.util.Log;
4112f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxiimport android.view.View;
42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.WindowManager;
43d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.widget.ImageView;
44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
45dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/**
4653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler * Displays a PIN pad for unlocking.
47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */
484e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinekpublic class KeyguardSimPinView extends KeyguardPinBasedInputView {
49b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private static final String LOG_TAG = "KeyguardSimPinView";
5052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    private static final boolean DEBUG = KeyguardConstants.DEBUG_SIM_STATES;
514fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller    public static final String TAG = "KeyguardSimPinView";
524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller
53d6c48847ba6a68594ac602350a5994904b9a67baJim Miller    private ProgressDialog mSimUnlockProgressDialog = null;
544fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller    private CheckSimPin mCheckSimPinThread;
55d6c48847ba6a68594ac602350a5994904b9a67baJim Miller
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) {
6322ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger            if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")");
6422ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger            switch(simState) {
6522ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger                // If the SIM is removed, then we must remove the keyguard. It will be put up
6622ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger                // again when the PUK locked SIM is re-entered.
6722ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger                case ABSENT: {
6822ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger                    KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(mSubId);
693311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger                    // onSimStateChanged callback can fire when the SIM PIN lock is not currently
703311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger                    // active and mCallback is null.
713311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger                    if (mCallback != null) {
723311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger                        mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser());
733311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger                    }
7422ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger                    break;
7522ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger                }
7622ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger                default:
7722ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger                    resetState();
7822ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger            }
7922ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger        }
8052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    };
81b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
82d6c48847ba6a68594ac602350a5994904b9a67baJim Miller    public KeyguardSimPinView(Context context) {
83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        this(context, null);
84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSimPinView(Context context, AttributeSet attrs) {
87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super(context, attrs);
88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
904db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller    @Override
9153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    public void resetState() {
924e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        super.resetState();
9352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        if (DEBUG) Log.v(TAG, "Resetting state");
9452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
9552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED);
9612f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxi        boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId);
97a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
9852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            int count = TelephonyManager.getDefault().getSimCount();
9952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            Resources rez = getResources();
1003d7687421f0045374f8406cdea749176dbb56043qingxi            String msg;
101d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi            int color = Color.WHITE;
10252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            if (count < 2) {
10352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                msg = rez.getString(R.string.kg_sim_pin_instructions);
10452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            } else {
10552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId);
10652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash
10752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName);
108d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                if (info != null) {
109d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                    color = info.getIconTint();
110d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi                }
11152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            }
11212f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxi            if (isEsimLocked) {
1133d7687421f0045374f8406cdea749176dbb56043qingxi                msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim);
1143d7687421f0045374f8406cdea749176dbb56043qingxi            }
115db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos            mSecurityMessageDisplay.setMessage(msg);
116d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi            mSimImageView.setImageTintList(ColorStateList.valueOf(color));
11752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        }
11812f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxi        KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area);
11912f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxi        esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE);
12053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    }
12153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler
1223122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek    @Override
123ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi    protected void onConfigurationChanged(Configuration newConfig) {
124ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi        super.onConfigurationChanged(newConfig);
125ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi        resetState();
126ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi    }
127ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi
128ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi    @Override
1293122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek    protected int getPromtReasonStringRes(int reason) {
1303122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek        // No message on SIM Pin
1313122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek        return 0;
1323122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek    }
1333122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek
134b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private String getPinPasswordErrorMessage(int attemptsRemaining) {
135b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        String displayMessage;
136b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
137b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (attemptsRemaining == 0) {
138b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked);
139b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else if (attemptsRemaining > 0) {
140b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getResources()
141b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining,
142b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                            attemptsRemaining);
143b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else {
144b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            displayMessage = getContext().getString(R.string.kg_password_pin_failed);
145b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        }
146b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:"
147b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
148b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        return displayMessage;
149b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    }
150b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
15153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    @Override
1527d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    protected boolean shouldLockout(long deadline) {
1537d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller        // SIM PIN doesn't have a timed lockout
1547d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller        return false;
1557d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    }
1567d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller
1577d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller    @Override
15853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    protected int getPasswordTextViewId() {
159fa9189fd7425e7a097e46d54e545fbec631f9cacJorim Jaggi        return R.id.simPinEntry;
160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    protected void onFinishInflate() {
164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super.onFinishInflate();
165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
16640a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi        if (mEcaView instanceof EmergencyCarrierArea) {
16740a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi            ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true);
16840a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi        }
16951efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette        mSimImageView = findViewById(R.id.keyguard_sim);
170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
1726fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    @Override
17352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    protected void onAttachedToWindow() {
17452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super.onAttachedToWindow();
17552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
17652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
17752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
17852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    @Override
17952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    protected void onDetachedFromWindow() {
18052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        super.onDetachedFromWindow();
18152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
18252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    }
18352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller
18452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    @Override
1856fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void showUsabilityHint() {
1866fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
1876fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
18853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    @Override
18953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    public void onPause() {
190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        // dismiss the dialog.
191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mSimUnlockProgressDialog != null) {
192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.dismiss();
193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog = null;
194dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    /**
198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * Since the IPC can block, we want to run the request in a separate thread
199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     * with a callback.
200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller     */
201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private abstract class CheckSimPin extends Thread {
202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        private final String mPin;
20352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        private int mSubId;
204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
20552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        protected CheckSimPin(String pin, int subId) {
206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mPin = pin;
20752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mSubId = subId;
208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
210b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        abstract void onSimCheckResponse(final int result, final int attemptsRemaining);
211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        @Override
213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        public void run() {
214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            try {
21552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (DEBUG) {
21652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    Log.v(TAG, "call supplyPinReportResultForSubscriber(subid=" + mSubId + ")");
21752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                }
218b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                final int[] result = ITelephony.Stub.asInterface(ServiceManager
21952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                        .checkService("phone")).supplyPinReportResultForSubscriber(mSubId, mPin);
22052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                if (DEBUG) {
22152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                    Log.v(TAG, "supplyPinReportResult returned: " + result[0] + " " + result[1]);
22252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                }
223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                post(new Runnable() {
2244db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller                    @Override
225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
226b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                        onSimCheckResponse(result[0], result[1]);
227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                });
229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            } catch (RemoteException e) {
2304fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller                Log.e(TAG, "RemoteException for supplyPinReportResult:", e);
231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                post(new Runnable() {
2324db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller                    @Override
233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    public void run() {
234b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                        onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    }
236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                });
237dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            }
238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
239dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
240dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
241dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private Dialog getSimUnlockProgressDialog() {
242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        if (mSimUnlockProgressDialog == null) {
243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog = new ProgressDialog(mContext);
244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setMessage(
245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                    mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setIndeterminate(true);
247dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            mSimUnlockProgressDialog.setCancelable(false);
248b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mSimUnlockProgressDialog.getWindow().setType(
249b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
250dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
251dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mSimUnlockProgressDialog;
252dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
253dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
254b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    private Dialog getSimRemainingAttemptsDialog(int remaining) {
255b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        String msg = getPinPasswordErrorMessage(remaining);
256b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        if (mRemainingAttemptsDialog == null) {
257b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            Builder builder = new AlertDialog.Builder(mContext);
258b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setMessage(msg);
259b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setCancelable(false);
260b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            builder.setNeutralButton(R.string.ok, null);
261b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog = builder.create();
262b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog.getWindow().setType(
263b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
264b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        } else {
265b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville            mRemainingAttemptsDialog.setMessage(msg);
266b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        }
267b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville        return mRemainingAttemptsDialog;
268b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville    }
269b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville
27053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    @Override
27153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler    protected void verifyPasswordAndUnlock() {
2724e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek        String entry = mPasswordEntry.getText();
2737d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller
27453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler        if (entry.length() < 4) {
275dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            // otherwise, display a message to the user, and don't submit.
276db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos            mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint);
2774db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller            resetPasswordText(true /* animate */, true /* announce */);
278b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi            mCallback.userActivity();
279dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller            return;
280dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        }
281dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
282dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        getSimUnlockProgressDialog().show();
283dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
2844fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller        if (mCheckSimPinThread == null) {
28552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            mCheckSimPinThread = new CheckSimPin(mPasswordEntry.getText(), mSubId) {
2864db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller                @Override
287b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                void onSimCheckResponse(final int result, final int attemptsRemaining) {
2884b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    post(new Runnable() {
2894db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller                        @Override
2904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                        public void run() {
2914b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            if (mSimUnlockProgressDialog != null) {
2924b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                                mSimUnlockProgressDialog.hide();
2934b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            }
2944db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller                            resetPasswordText(true /* animate */,
2954db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller                                    result != PhoneConstants.PIN_RESULT_SUCCESS /* announce */);
296b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                            if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
29752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                                KeyguardUpdateMonitor.getInstance(getContext())
29852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller                                        .reportSimUnlocked(mSubId);
2998702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev                                mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser());
3004b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            } else {
301b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
302b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    if (attemptsRemaining <= 2) {
303b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        // this is getting critical - show dialog
304b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        getSimRemainingAttemptsDialog(attemptsRemaining).show();
305b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    } else {
306b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        // show message
307b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        mSecurityMessageDisplay.setMessage(
308db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos                                                getPinPasswordErrorMessage(attemptsRemaining));
309b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    }
310b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                } else {
311b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    // "PIN operation failed!" - no idea what this was and no way to
312b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    // find out. :/
313b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                    mSecurityMessageDisplay.setMessage(getContext().getString(
314db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos                                            R.string.kg_password_pin_failed));
315b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                }
316b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
317b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        + " CheckSimPin.onSimCheckResponse: " + result
318b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville                                        + " attemptsRemaining=" + attemptsRemaining);
3194b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                            }
320b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                            mCallback.userActivity();
3214fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller                            mCheckSimPinThread = null;
322dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller                        }
3234b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                    });
3244b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller                }
3254fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller            };
3264fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller            mCheckSimPinThread.start();
3274b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller        }
328dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
329c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi
330c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    @Override
331c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    public void startAppearAnimation() {
332c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi        // noop.
333c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi    }
33476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi
33576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    @Override
33676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    public boolean startDisappearAnimation(Runnable finishRunnable) {
33776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi        return false;
33876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi    }
339dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
34053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler
341