11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/*
21f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
31f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
41f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
51f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * you may not use this file except in compliance with the License.
61f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * You may obtain a copy of the License at
71f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
81f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
91f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * See the License for the specific language governing permissions and
141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * limitations under the License.
151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpackage com.android.internal.policy.impl;
181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.Dialog;
201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.ProgressDialog;
211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context;
225475906f53e2d79807548932dfabbf9945143740Jim Millerimport android.content.res.Configuration;
231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.RemoteException;
241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.ServiceManager;
255475906f53e2d79807548932dfabbf9945143740Jim Miller
261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.telephony.ITelephony;
27c23024d32779b170dde32a50fbdd945ce521b874Jim Millerimport com.android.internal.widget.LockPatternUtils;
28c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.text.Editable;
301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.KeyEvent;
311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.LayoutInflater;
321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View;
331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManager;
34c23024d32779b170dde32a50fbdd945ce521b874Jim Millerimport android.widget.Button;
351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.LinearLayout;
361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.TextView;
371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.R;
381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/**
401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Displays a dialer like interface to unlock the SIM PIN.
411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
426b05d58018c2806459c121e507c005639b74aee9Jim Millerpublic class SimUnlockScreen extends LinearLayout implements KeyguardScreen, View.OnClickListener {
431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private static final int DIGIT_PRESS_WAKE_MILLIS = 5000;
451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final KeyguardUpdateMonitor mUpdateMonitor;
471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final KeyguardScreenCallback mCallback;
481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private TextView mHeaderText;
50d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project    private TextView mPinText;
511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private TextView mOkButton;
531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private View mBackSpaceButton;
551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final int[] mEnteredPin = {0, 0, 0, 0, 0, 0, 0, 0};
571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private int mEnteredDigits = 0;
581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private ProgressDialog mSimUnlockProgressDialog = null;
601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
61c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    private LockPatternUtils mLockPatternUtils;
62c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
635475906f53e2d79807548932dfabbf9945143740Jim Miller    private int mCreationOrientation;
645475906f53e2d79807548932dfabbf9945143740Jim Miller
655475906f53e2d79807548932dfabbf9945143740Jim Miller    private int mKeyboardHidden;
665475906f53e2d79807548932dfabbf9945143740Jim Miller
676b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardStatusViewManager mKeyguardStatusViewManager;
686b05d58018c2806459c121e507c005639b74aee9Jim Miller
691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private static final char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
715475906f53e2d79807548932dfabbf9945143740Jim Miller    public SimUnlockScreen(Context context, Configuration configuration,
725475906f53e2d79807548932dfabbf9945143740Jim Miller            KeyguardUpdateMonitor updateMonitor, KeyguardScreenCallback callback,
735475906f53e2d79807548932dfabbf9945143740Jim Miller            LockPatternUtils lockpatternutils) {
741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        super(context);
751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mUpdateMonitor = updateMonitor;
761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mCallback = callback;
775475906f53e2d79807548932dfabbf9945143740Jim Miller
785475906f53e2d79807548932dfabbf9945143740Jim Miller        mCreationOrientation = configuration.orientation;
795475906f53e2d79807548932dfabbf9945143740Jim Miller        mKeyboardHidden = configuration.hardKeyboardHidden;
80c23024d32779b170dde32a50fbdd945ce521b874Jim Miller        mLockPatternUtils = lockpatternutils;
811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
825475906f53e2d79807548932dfabbf9945143740Jim Miller        LayoutInflater inflater = LayoutInflater.from(context);
835475906f53e2d79807548932dfabbf9945143740Jim Miller        if (mKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
845475906f53e2d79807548932dfabbf9945143740Jim Miller            inflater.inflate(R.layout.keyguard_screen_sim_pin_landscape, this, true);
851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        } else {
865475906f53e2d79807548932dfabbf9945143740Jim Miller            inflater.inflate(R.layout.keyguard_screen_sim_pin_portrait, this, true);
871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            new TouchInput();
881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mHeaderText = (TextView) findViewById(R.id.headerText);
91d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project        mPinText = (TextView) findViewById(R.id.pinDisplay);
921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mBackSpaceButton = findViewById(R.id.backspace);
931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mBackSpaceButton.setOnClickListener(this);
941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mOkButton = (TextView) findViewById(R.id.ok);
961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mHeaderText.setText(R.string.keyguard_password_enter_pin_code);
981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mPinText.setFocusable(false);
991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mOkButton.setOnClickListener(this);
1011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1026b05d58018c2806459c121e507c005639b74aee9Jim Miller        mKeyguardStatusViewManager = new KeyguardStatusViewManager(this, updateMonitor,
1031f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                lockpatternutils, callback, false);
1040f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        setFocusableInTouchMode(true);
1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean needsInput() {
1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return true;
1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
112c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
1131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onPause() {
1156b05d58018c2806459c121e507c005639b74aee9Jim Miller        mKeyguardStatusViewManager.onPause();
1161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onResume() {
1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // start fresh
1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mHeaderText.setText(R.string.keyguard_password_enter_pin_code);
1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // make sure that the number of entered digits is consistent when we
1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // erase the SIM unlock code, including orientation changes.
1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mPinText.setText("");
1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mEnteredDigits = 0;
127c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
1286b05d58018c2806459c121e507c005639b74aee9Jim Miller        mKeyguardStatusViewManager.onResume();
1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void cleanUp() {
1337dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu        // dismiss the dialog.
1341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mSimUnlockProgressDialog != null) {
1357dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu            mSimUnlockProgressDialog.dismiss();
1367dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu            mSimUnlockProgressDialog = null;
1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mUpdateMonitor.removeCallback(this);
1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Since the IPC can block, we want to run the request in a separate thread
1441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * with a callback.
1451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private abstract class CheckSimPin extends Thread {
1471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private final String mPin;
1491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        protected CheckSimPin(String pin) {
1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mPin = pin;
1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        abstract void onSimLockChangedResponse(boolean success);
1551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        @Override
1571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        public void run() {
1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            try {
1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                final boolean result = ITelephony.Stub.asInterface(ServiceManager
1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                        .checkService("phone")).supplyPin(mPin);
1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                post(new Runnable() {
1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    public void run() {
1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                        onSimLockChangedResponse(result);
1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    }
1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                });
1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } catch (RemoteException e) {
1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                post(new Runnable() {
1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    public void run() {
1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                        onSimLockChangedResponse(false);
1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    }
1711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                });
1721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
1731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onClick(View v) {
1771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (v == mBackSpaceButton) {
178d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project            final Editable digits = mPinText.getEditableText();
1791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            final int len = digits.length();
1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (len > 0) {
1811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digits.delete(len-1, len);
1821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mEnteredDigits--;
1831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
1841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.pokeWakelock();
1851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        } else if (v == mOkButton) {
1861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            checkPin();
1871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private Dialog getSimUnlockProgressDialog() {
1911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mSimUnlockProgressDialog == null) {
1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog = new ProgressDialog(mContext);
1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog.setMessage(
1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    mContext.getString(R.string.lockscreen_sim_unlock_progress_dialog_message));
1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog.setIndeterminate(true);
1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog.setCancelable(false);
1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog.getWindow().setType(
1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
1991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return mSimUnlockProgressDialog;
2011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private void checkPin() {
2041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // make sure that the pin is at least 4 digits long.
2061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mEnteredDigits < 4) {
2071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            // otherwise, display a message to the user, and don't submit.
2081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mHeaderText.setText(R.string.invalidPin);
2091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mPinText.setText("");
2101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mEnteredDigits = 0;
2111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.pokeWakelock();
2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return;
2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        getSimUnlockProgressDialog().show();
2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        new CheckSimPin(mPinText.getText().toString()) {
21790d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller            void onSimLockChangedResponse(final boolean success) {
21890d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                mPinText.post(new Runnable() {
21990d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                    public void run() {
22090d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        if (mSimUnlockProgressDialog != null) {
22190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mSimUnlockProgressDialog.hide();
22290d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        }
22390d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        if (success) {
22490d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            // before closing the keyguard, report back that
22590d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            // the sim is unlocked so it knows right away
22690d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mUpdateMonitor.reportSimUnlocked();
22790d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mCallback.goToUnlockScreen();
22890d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        } else {
22990d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mHeaderText.setText(R.string.keyguard_password_wrong_pin_code);
23090d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mPinText.setText("");
23190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mEnteredDigits = 0;
23290d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        }
23390d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        mCallback.pokeWakelock();
23490d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                    }
23590d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                });
2361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }.start();
2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (keyCode == KeyEvent.KEYCODE_BACK) {
2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.goToLockScreen();
2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        final char match = event.getMatch(DIGITS);
2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (match != 0) {
2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            reportDigit(match - '0');
2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (keyCode == KeyEvent.KEYCODE_DEL) {
2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (mEnteredDigits > 0) {
2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mPinText.onKeyDown(keyCode, event);
2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mEnteredDigits--;
2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
2571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (keyCode == KeyEvent.KEYCODE_ENTER) {
2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            checkPin();
2621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return false;
2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private void reportDigit(int digit) {
2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mEnteredDigits == 0) {
2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mPinText.setText("");
2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mEnteredDigits == 8) {
2731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return;
2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mPinText.append(Integer.toString(digit));
2761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mEnteredPin[mEnteredDigits++] = digit;
2771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
27975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    void updateConfiguration() {
28075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        Configuration newConfig = getResources().getConfiguration();
2815475906f53e2d79807548932dfabbf9945143740Jim Miller        if (newConfig.orientation != mCreationOrientation) {
2825475906f53e2d79807548932dfabbf9945143740Jim Miller            mCallback.recreateMe(newConfig);
2835475906f53e2d79807548932dfabbf9945143740Jim Miller        } else if (newConfig.hardKeyboardHidden != mKeyboardHidden) {
2845475906f53e2d79807548932dfabbf9945143740Jim Miller            mKeyboardHidden = newConfig.hardKeyboardHidden;
2851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
28675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    }
2870f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
28875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    @Override
28975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    protected void onAttachedToWindow() {
29075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        super.onAttachedToWindow();
29175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        updateConfiguration();
29275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    }
29375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn
29475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    /** {@inheritDoc} */
29575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    @Override
29675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    protected void onConfigurationChanged(Configuration newConfig) {
29775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        super.onConfigurationChanged(newConfig);
29875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        updateConfiguration();
2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
3021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Helper class to handle input from touch dialer.  Only relevant when
3031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * the keyboard is shut.
3041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private class TouchInput implements View.OnClickListener {
3061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mZero;
3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mOne;
3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mTwo;
3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mThree;
3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mFour;
3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mFive;
3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mSix;
3131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mSeven;
3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mEight;
3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mNine;
3161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mCancelButton;
3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TouchInput() {
3191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mZero = (TextView) findViewById(R.id.zero);
3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mOne = (TextView) findViewById(R.id.one);
3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mTwo = (TextView) findViewById(R.id.two);
3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mThree = (TextView) findViewById(R.id.three);
3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFour = (TextView) findViewById(R.id.four);
3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFive = (TextView) findViewById(R.id.five);
3251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSix = (TextView) findViewById(R.id.six);
3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSeven = (TextView) findViewById(R.id.seven);
3271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mEight = (TextView) findViewById(R.id.eight);
3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mNine = (TextView) findViewById(R.id.nine);
3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCancelButton = (TextView) findViewById(R.id.cancel);
3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mZero.setText("0");
3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mOne.setText("1");
3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mTwo.setText("2");
3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mThree.setText("3");
3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFour.setText("4");
3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFive.setText("5");
3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSix.setText("6");
3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSeven.setText("7");
3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mEight.setText("8");
3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mNine.setText("9");
3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mZero.setOnClickListener(this);
3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mOne.setOnClickListener(this);
3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mTwo.setOnClickListener(this);
3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mThree.setOnClickListener(this);
3461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFour.setOnClickListener(this);
3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFive.setOnClickListener(this);
3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSix.setOnClickListener(this);
3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSeven.setOnClickListener(this);
3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mEight.setOnClickListener(this);
3511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mNine.setOnClickListener(this);
3521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCancelButton.setOnClickListener(this);
3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
3541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        public void onClick(View v) {
3571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (v == mCancelButton) {
3589a3caf39e4c628c6dfcac92f7e2b7e4538a73009Jim Miller                mPinText.setText(""); // clear the PIN entry field if the user cancels
3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mCallback.goToLockScreen();
3601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                return;
3611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
3621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            final int digit = checkDigit(v);
3641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (digit >= 0) {
3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mCallback.pokeWakelock(DIGIT_PRESS_WAKE_MILLIS);
3661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                reportDigit(digit);
3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private int checkDigit(View v) {
3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            int digit = -1;
3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (v == mZero) {
3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 0;
3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mOne) {
3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 1;
3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mTwo) {
3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 2;
3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mThree) {
3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 3;
3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mFour) {
3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 4;
3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mFive) {
3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 5;
3841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mSix) {
3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 6;
3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mSeven) {
3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 7;
3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mEight) {
3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 8;
3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mNine) {
3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 9;
3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return digit;
3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project}
397