SimUnlockScreen.java revision 0f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdeb
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 */
421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpublic class SimUnlockScreen extends LinearLayout implements KeyguardScreen, View.OnClickListener,
435475906f53e2d79807548932dfabbf9945143740Jim Miller        KeyguardUpdateMonitor.InfoCallback {
441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private static final int DIGIT_PRESS_WAKE_MILLIS = 5000;
461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final KeyguardUpdateMonitor mUpdateMonitor;
481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final KeyguardScreenCallback mCallback;
491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private TextView mHeaderText;
51d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project    private TextView mPinText;
521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private TextView mOkButton;
54c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    private Button mEmergencyCallButton;
551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private View mBackSpaceButton;
571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final int[] mEnteredPin = {0, 0, 0, 0, 0, 0, 0, 0};
591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private int mEnteredDigits = 0;
601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private ProgressDialog mSimUnlockProgressDialog = null;
621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
63c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    private LockPatternUtils mLockPatternUtils;
64c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
655475906f53e2d79807548932dfabbf9945143740Jim Miller    private int mCreationOrientation;
665475906f53e2d79807548932dfabbf9945143740Jim Miller
675475906f53e2d79807548932dfabbf9945143740Jim Miller    private int mKeyboardHidden;
685475906f53e2d79807548932dfabbf9945143740Jim 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
1020f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mEmergencyCallButton = (Button) findViewById(R.id.emergencyCall);
1030f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mEmergencyCallButton.setOnClickListener(this);
1040f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton);
1050f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        setFocusableInTouchMode(true);
1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean needsInput() {
1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return true;
1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
113c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onPause() {
1161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onResume() {
1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // start fresh
1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mHeaderText.setText(R.string.keyguard_password_enter_pin_code);
1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // make sure that the number of entered digits is consistent when we
1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // erase the SIM unlock code, including orientation changes.
1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mPinText.setText("");
1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mEnteredDigits = 0;
128c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
129c23024d32779b170dde32a50fbdd945ce521b874Jim Miller        mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton);
1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void cleanUp() {
1347dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu        // dismiss the dialog.
1351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mSimUnlockProgressDialog != null) {
1367dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu            mSimUnlockProgressDialog.dismiss();
1377dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu            mSimUnlockProgressDialog = null;
1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mUpdateMonitor.removeCallback(this);
1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
1441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Since the IPC can block, we want to run the request in a separate thread
1451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * with a callback.
1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
1471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private abstract class CheckSimPin extends Thread {
1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private final String mPin;
1501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        protected CheckSimPin(String pin) {
1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mPin = pin;
1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        abstract void onSimLockChangedResponse(boolean success);
1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        @Override
1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        public void run() {
1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            try {
1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                final boolean result = ITelephony.Stub.asInterface(ServiceManager
1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                        .checkService("phone")).supplyPin(mPin);
1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                post(new Runnable() {
1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    public void run() {
1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                        onSimLockChangedResponse(result);
1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    }
1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                });
1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } catch (RemoteException e) {
1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                post(new Runnable() {
1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    public void run() {
1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                        onSimLockChangedResponse(false);
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
1771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onClick(View v) {
1781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (v == mBackSpaceButton) {
179d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project            final Editable digits = mPinText.getEditableText();
1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            final int len = digits.length();
1811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (len > 0) {
1821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digits.delete(len-1, len);
1831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mEnteredDigits--;
1841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
1851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.pokeWakelock();
1861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        } else if (v == mEmergencyCallButton) {
1871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.takeEmergencyCallAction();
1881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        } else if (v == mOkButton) {
1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            checkPin();
1901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private Dialog getSimUnlockProgressDialog() {
1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mSimUnlockProgressDialog == null) {
1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog = new ProgressDialog(mContext);
1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog.setMessage(
1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    mContext.getString(R.string.lockscreen_sim_unlock_progress_dialog_message));
1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog.setIndeterminate(true);
1991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog.setCancelable(false);
2001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSimUnlockProgressDialog.getWindow().setType(
2011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
2028d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn            if (!mContext.getResources().getBoolean(
2038d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn                    com.android.internal.R.bool.config_sf_slowBlur)) {
2048d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn                mSimUnlockProgressDialog.getWindow().setFlags(
2058d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn                        WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
2068d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn                        WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
2078d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn            }
2081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return mSimUnlockProgressDialog;
2101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private void checkPin() {
2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // make sure that the pin is at least 4 digits long.
2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mEnteredDigits < 4) {
2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            // otherwise, display a message to the user, and don't submit.
2171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mHeaderText.setText(R.string.invalidPin);
2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mPinText.setText("");
2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mEnteredDigits = 0;
2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.pokeWakelock();
2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return;
2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        getSimUnlockProgressDialog().show();
2241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        new CheckSimPin(mPinText.getText().toString()) {
2261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            void onSimLockChangedResponse(boolean success) {
2271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                if (mSimUnlockProgressDialog != null) {
2281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    mSimUnlockProgressDialog.hide();
2291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                }
2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                if (success) {
2311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    // before closing the keyguard, report back that
2321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    // the sim is unlocked so it knows right away
2330f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    mUpdateMonitor.reportSimUnlocked();
2341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    mCallback.goToUnlockScreen();
2351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                } else {
2361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    mHeaderText.setText(R.string.keyguard_password_wrong_pin_code);
2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    mPinText.setText("");
2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    mEnteredDigits = 0;
2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                }
2405e0f7ba8fa8045aab98664b5103d8620e9ac7f06Jim Miller                mCallback.pokeWakelock();
2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }.start();
2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (keyCode == KeyEvent.KEYCODE_BACK) {
2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.goToLockScreen();
2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        final char match = event.getMatch(DIGITS);
2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (match != 0) {
2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            reportDigit(match - '0');
2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (keyCode == KeyEvent.KEYCODE_DEL) {
2581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (mEnteredDigits > 0) {
2591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mPinText.onKeyDown(keyCode, event);
2601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mEnteredDigits--;
2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
2621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (keyCode == KeyEvent.KEYCODE_ENTER) {
2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            checkPin();
2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return false;
2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private void reportDigit(int digit) {
2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mEnteredDigits == 0) {
2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mPinText.setText("");
2761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (mEnteredDigits == 8) {
2781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return;
2791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mPinText.append(Integer.toString(digit));
2811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mEnteredPin[mEnteredDigits++] = digit;
2821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
28475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    void updateConfiguration() {
28575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        Configuration newConfig = getResources().getConfiguration();
2865475906f53e2d79807548932dfabbf9945143740Jim Miller        if (newConfig.orientation != mCreationOrientation) {
2875475906f53e2d79807548932dfabbf9945143740Jim Miller            mCallback.recreateMe(newConfig);
2885475906f53e2d79807548932dfabbf9945143740Jim Miller        } else if (newConfig.hardKeyboardHidden != mKeyboardHidden) {
2895475906f53e2d79807548932dfabbf9945143740Jim Miller            mKeyboardHidden = newConfig.hardKeyboardHidden;
2905475906f53e2d79807548932dfabbf9945143740Jim Miller            final boolean isKeyboardOpen = mKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO;
2915475906f53e2d79807548932dfabbf9945143740Jim Miller            if (mUpdateMonitor.isKeyguardBypassEnabled() && isKeyboardOpen) {
2925475906f53e2d79807548932dfabbf9945143740Jim Miller                mCallback.goToUnlockScreen();
2935475906f53e2d79807548932dfabbf9945143740Jim Miller            }
2941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
29575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    }
2960f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
29775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    @Override
29875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    protected void onAttachedToWindow() {
29975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        super.onAttachedToWindow();
30075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        updateConfiguration();
30175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    }
30275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn
30375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    /** {@inheritDoc} */
30475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    @Override
30575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn    protected void onConfigurationChanged(Configuration newConfig) {
30675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        super.onConfigurationChanged(newConfig);
30775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn        updateConfiguration();
3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Helper class to handle input from touch dialer.  Only relevant when
3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * the keyboard is shut.
3131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private class TouchInput implements View.OnClickListener {
3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mZero;
3161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mOne;
3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mTwo;
3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mThree;
3191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mFour;
3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mFive;
3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mSix;
3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mSeven;
3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mEight;
3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mNine;
3251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TextView mCancelButton;
3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private TouchInput() {
3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mZero = (TextView) findViewById(R.id.zero);
3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mOne = (TextView) findViewById(R.id.one);
3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mTwo = (TextView) findViewById(R.id.two);
3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mThree = (TextView) findViewById(R.id.three);
3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFour = (TextView) findViewById(R.id.four);
3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFive = (TextView) findViewById(R.id.five);
3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSix = (TextView) findViewById(R.id.six);
3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSeven = (TextView) findViewById(R.id.seven);
3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mEight = (TextView) findViewById(R.id.eight);
3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mNine = (TextView) findViewById(R.id.nine);
3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCancelButton = (TextView) findViewById(R.id.cancel);
3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mZero.setText("0");
3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mOne.setText("1");
3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mTwo.setText("2");
3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mThree.setText("3");
3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFour.setText("4");
3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFive.setText("5");
3461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSix.setText("6");
3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSeven.setText("7");
3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mEight.setText("8");
3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mNine.setText("9");
3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mZero.setOnClickListener(this);
3521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mOne.setOnClickListener(this);
3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mTwo.setOnClickListener(this);
3541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mThree.setOnClickListener(this);
3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFour.setOnClickListener(this);
3561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mFive.setOnClickListener(this);
3571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSix.setOnClickListener(this);
3581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mSeven.setOnClickListener(this);
3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mEight.setOnClickListener(this);
3601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mNine.setOnClickListener(this);
3611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCancelButton.setOnClickListener(this);
3621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        public void onClick(View v) {
3661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (v == mCancelButton) {
3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mCallback.goToLockScreen();
3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                return;
3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            final int digit = checkDigit(v);
3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (digit >= 0) {
3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                mCallback.pokeWakelock(DIGIT_PRESS_WAKE_MILLIS);
3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                reportDigit(digit);
3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        private int checkDigit(View v) {
3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            int digit = -1;
3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (v == mZero) {
3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 0;
3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mOne) {
3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 1;
3841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mTwo) {
3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 2;
3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mThree) {
3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 3;
3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mFour) {
3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 4;
3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mFive) {
3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 5;
3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mSix) {
3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 6;
3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mSeven) {
3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 7;
3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mEight) {
3971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 8;
3981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (v == mNine) {
3991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                digit = 9;
4001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
4011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return digit;
4021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
4031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
404c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
405c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onPhoneStateChanged(String newState) {
4060f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton);
407c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
408c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
409c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn, int batteryLevel) {
410c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
411c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
412c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
413c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
414c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
415c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
416c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
417c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onRingerModeChanged(int state) {
418c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
419c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
420c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
421c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onTimeChanged() {
422c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
423c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
4241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project}
425