10f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang/*
20f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * Copyright (C) 2008 The Android Open Source Project
30f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang *
40f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * Licensed under the Apache License, Version 2.0 (the "License");
50f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * you may not use this file except in compliance with the License.
60f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * You may obtain a copy of the License at
70f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang *
80f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang *      http://www.apache.org/licenses/LICENSE-2.0
90f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang *
100f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * Unless required by applicable law or agreed to in writing, software
110f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * distributed under the License is distributed on an "AS IS" BASIS,
120f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * See the License for the specific language governing permissions and
140f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * limitations under the License.
150f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang */
160f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard_obsolete;
180f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
190f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.app.Dialog;
200f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.app.ProgressDialog;
210f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.content.Context;
220f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.content.res.Configuration;
230f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.os.RemoteException;
240f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.os.ServiceManager;
250f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
260f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport com.android.internal.telephony.ITelephony;
270f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport com.android.internal.widget.LockPatternUtils;
280f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
290f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.text.Editable;
307f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wangimport android.util.Log;
310f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.view.KeyEvent;
320f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.view.LayoutInflater;
330f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.view.View;
340f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.view.WindowManager;
350f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.widget.Button;
360f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.widget.LinearLayout;
370f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport android.widget.TextView;
380f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangimport com.android.internal.R;
390f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
400f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang/**
410f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang * Displays a dialer like interface to unlock the SIM PUK.
420f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang */
430f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wangpublic class SimPukUnlockScreen extends LinearLayout implements KeyguardScreen,
447f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        View.OnClickListener, View.OnFocusChangeListener {
450f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
460f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private static final int DIGIT_PRESS_WAKE_MILLIS = 5000;
470f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
480f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private final KeyguardUpdateMonitor mUpdateMonitor;
490f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private final KeyguardScreenCallback mCallback;
507f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang    private KeyguardStatusViewManager mKeyguardStatusViewManager;
510f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
520f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private TextView mHeaderText;
530f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private TextView mPukText;
540f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private TextView mPinText;
550f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private TextView mFocusedEntry;
560f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
577f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang    private View mOkButton;
580f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private View mDelPukButton;
590f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private View mDelPinButton;
600f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
610f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private ProgressDialog mSimUnlockProgressDialog = null;
620f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
630f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private LockPatternUtils mLockPatternUtils;
640f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
650f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private int mCreationOrientation;
660f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
670f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private int mKeyboardHidden;
680f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
690f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private static final char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
700f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
710f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    public SimPukUnlockScreen(Context context, Configuration configuration,
720f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            KeyguardUpdateMonitor updateMonitor, KeyguardScreenCallback callback,
730f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            LockPatternUtils lockpatternutils) {
740f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        super(context);
750f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mUpdateMonitor = updateMonitor;
760f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mCallback = callback;;
770f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
780f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mCreationOrientation = configuration.orientation;
790f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mKeyboardHidden = configuration.hardKeyboardHidden;
800f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mLockPatternUtils = lockpatternutils;
810f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
820f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        LayoutInflater inflater = LayoutInflater.from(context);
830f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (mKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
840f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            inflater.inflate(
850f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    R.layout.keyguard_screen_sim_puk_landscape, this, true);
860f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        } else {
870f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            inflater.inflate(
880f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    R.layout.keyguard_screen_sim_puk_portrait, this, true);
890f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            new TouchInput();
900f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
910f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
920f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mHeaderText = (TextView) findViewById(R.id.headerText);
937f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang
940f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mPukText = (TextView) findViewById(R.id.pukDisplay);
950f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mPinText = (TextView) findViewById(R.id.pinDisplay);
960f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mDelPukButton = findViewById(R.id.pukDel);
970f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mDelPinButton = findViewById(R.id.pinDel);
987f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mOkButton = findViewById(R.id.ok);
990f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1007f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mDelPinButton.setOnClickListener(this);
1017f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mDelPukButton.setOnClickListener(this);
1020f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mOkButton.setOnClickListener(this);
1030f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1047f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mHeaderText.setText(R.string.keyguard_password_enter_puk_code);
1057f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        // To make marquee work
1067f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mHeaderText.setSelected(true);
1070f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1086b05d58018c2806459c121e507c005639b74aee9Jim Miller        mKeyguardStatusViewManager = new KeyguardStatusViewManager(this, updateMonitor,
109928d34704b96db9133e28dc77b716518d335b356Jim Miller                lockpatternutils, callback, true);
1100f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1117f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mPinText.setFocusableInTouchMode(true);
1127f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mPinText.setOnFocusChangeListener(this);
1137f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mPukText.setFocusableInTouchMode(true);
1147f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mPukText.setOnFocusChangeListener(this);
1150f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
1160f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1170f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    /** {@inheritDoc} */
1180f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    public boolean needsInput() {
1197f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        return false;
1200f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
1210f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1220f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    /** {@inheritDoc} */
1230f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    public void onPause() {
1246b05d58018c2806459c121e507c005639b74aee9Jim Miller        mKeyguardStatusViewManager.onPause();
1250f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
1260f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1270f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    /** {@inheritDoc} */
1280f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    public void onResume() {
1290f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        // start fresh
1300f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mHeaderText.setText(R.string.keyguard_password_enter_puk_code);
1316b05d58018c2806459c121e507c005639b74aee9Jim Miller        mKeyguardStatusViewManager.onResume();
1320f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
1330f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1340f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    /** {@inheritDoc} */
1350f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    public void cleanUp() {
1360f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        // dismiss the dialog.
1370f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (mSimUnlockProgressDialog != null) {
1380f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSimUnlockProgressDialog.dismiss();
1390f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSimUnlockProgressDialog = null;
1400f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
1410f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mUpdateMonitor.removeCallback(this);
1420f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
1430f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1440f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1450f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    /**
1460f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang     * Since the IPC can block, we want to run the request in a separate thread
1470f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang     * with a callback.
1480f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang     */
1490f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private abstract class CheckSimPuk extends Thread {
1500f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1510f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private final String mPin, mPuk;
1520f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1530f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        protected CheckSimPuk(String puk, String pin) {
1540f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mPuk = puk;
1550f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mPin = pin;
1560f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
1570f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1580f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        abstract void onSimLockChangedResponse(boolean success);
1590f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1600f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        @Override
1610f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        public void run() {
1620f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            try {
1630f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                final boolean result = ITelephony.Stub.asInterface(ServiceManager
1640f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                        .checkService("phone")).supplyPuk(mPuk, mPin);
1650f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1660f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                post(new Runnable() {
1670f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    public void run() {
1680f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                        onSimLockChangedResponse(result);
1690f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    }
1700f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                });
1710f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } catch (RemoteException e) {
1720f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                post(new Runnable() {
1730f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    public void run() {
1740f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                        onSimLockChangedResponse(false);
1750f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    }
1760f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                });
1770f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            }
1780f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
1790f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
1800f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
1810f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    public void onClick(View v) {
1820f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (v == mDelPukButton) {
1837f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang            if (mFocusedEntry != mPukText)
1847f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang                mPukText.requestFocus();
1850f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            final Editable digits = mPukText.getEditableText();
1860f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            final int len = digits.length();
1870f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            if (len > 0) {
1880f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digits.delete(len-1, len);
1890f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            }
1900f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        } else if (v == mDelPinButton) {
1917f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang            if (mFocusedEntry != mPinText)
1927f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang                mPinText.requestFocus();
1930f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            final Editable digits = mPinText.getEditableText();
1940f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            final int len = digits.length();
1950f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            if (len > 0) {
1960f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digits.delete(len-1, len);
1970f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            }
1980f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        } else if (v == mOkButton) {
1990f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            checkPuk();
2000f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
2017f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        mCallback.pokeWakelock(DIGIT_PRESS_WAKE_MILLIS);
2027f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang
2037f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang    }
2047f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang
2057f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang    @Override
2067f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang    public void onFocusChange(View v, boolean hasFocus) {
2077f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang        if (hasFocus)
2087f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang            mFocusedEntry = (TextView)v;
2090f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
2100f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2110f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private Dialog getSimUnlockProgressDialog() {
2120f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (mSimUnlockProgressDialog == null) {
2130f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSimUnlockProgressDialog = new ProgressDialog(mContext);
2140f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSimUnlockProgressDialog.setMessage(
2150f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    mContext.getString(R.string.lockscreen_sim_unlock_progress_dialog_message));
2160f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSimUnlockProgressDialog.setIndeterminate(true);
2170f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSimUnlockProgressDialog.setCancelable(false);
2180f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSimUnlockProgressDialog.getWindow().setType(
2190f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
2200f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
2210f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        return mSimUnlockProgressDialog;
2220f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
2230f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2240f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private void checkPuk() {
2250f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        // make sure that the puk is at least 8 digits long.
2260f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (mPukText.getText().length() < 8) {
2270f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            // otherwise, display a message to the user, and don't submit.
2280f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mHeaderText.setText(R.string.invalidPuk);
2290f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mPukText.setText("");
2300f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            return;
2310f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
2320f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2330f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (mPinText.getText().length() < 4
2340f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                || mPinText.getText().length() > 8) {
2350f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            // otherwise, display a message to the user, and don't submit.
2360f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mHeaderText.setText(R.string.invalidPin);
2370f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mPinText.setText("");
2380f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            return;
2390f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
2400f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2410f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        getSimUnlockProgressDialog().show();
2420f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2430f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        new CheckSimPuk(mPukText.getText().toString(),
2440f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                mPinText.getText().toString()) {
24590d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller            void onSimLockChangedResponse(final boolean success) {
24690d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                mPinText.post(new Runnable() {
24790d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                    public void run() {
24890d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        if (mSimUnlockProgressDialog != null) {
24990d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mSimUnlockProgressDialog.hide();
25090d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        }
25190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        if (success) {
25290d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            // before closing the keyguard, report back that
25390d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            // the sim is unlocked so it knows right away
25490d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mUpdateMonitor.reportSimUnlocked();
25590d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mCallback.goToUnlockScreen();
25690d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        } else {
25790d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mHeaderText.setText(R.string.badPuk);
25890d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mPukText.setText("");
25990d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                            mPinText.setText("");
26090d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                        }
26190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                    }
26290d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller                });
2630f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            }
2640f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }.start();
2650f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
2660f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2670f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2680f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    public boolean onKeyDown(int keyCode, KeyEvent event) {
2690f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (keyCode == KeyEvent.KEYCODE_BACK) {
2700f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mCallback.goToLockScreen();
2710f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            return true;
2720f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
2730f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        final char match = event.getMatch(DIGITS);
2740f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (match != 0) {
2750f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            reportDigit(match - '0');
2760f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            return true;
2770f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
2780f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (keyCode == KeyEvent.KEYCODE_DEL) {
2790f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mFocusedEntry.onKeyDown(keyCode, event);
2800f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            final Editable digits = mFocusedEntry.getEditableText();
2810f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            final int len = digits.length();
2820f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            if (len > 0) {
2830f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digits.delete(len-1, len);
2840f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            }
2857f3eb49ad5dc7e4e4e9d354304ec1d43e9330b46John Wang            mCallback.pokeWakelock(DIGIT_PRESS_WAKE_MILLIS);
2860f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            return true;
2870f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
2880f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2890f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (keyCode == KeyEvent.KEYCODE_ENTER) {
2900f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            checkPuk();
2910f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            return true;
2920f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
2930f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2940f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        return false;
2950f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
2960f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
2970f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private void reportDigit(int digit) {
2980f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        mFocusedEntry.append(Integer.toString(digit));
2990f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
3000f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3010f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    void updateConfiguration() {
3020f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        Configuration newConfig = getResources().getConfiguration();
3030f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        if (newConfig.orientation != mCreationOrientation) {
3040f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mCallback.recreateMe(newConfig);
3050f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        } else if (newConfig.hardKeyboardHidden != mKeyboardHidden) {
3060f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mKeyboardHidden = newConfig.hardKeyboardHidden;
3070f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
3080f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3090f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
3100f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3110f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    @Override
3120f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    protected void onAttachedToWindow() {
3130f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        super.onAttachedToWindow();
3140f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        updateConfiguration();
3150f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
3160f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3170f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    /** {@inheritDoc} */
3180f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    @Override
3190f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    protected void onConfigurationChanged(Configuration newConfig) {
3200f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        super.onConfigurationChanged(newConfig);
3210f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        updateConfiguration();
3220f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
3230f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3240f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    /**
3250f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang     * Helper class to handle input from touch dialer.  Only relevant when
3260f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang     * the keyboard is shut.
3270f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang     */
3280f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    private class TouchInput implements View.OnClickListener {
3290f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mZero;
3300f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mOne;
3310f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mTwo;
3320f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mThree;
3330f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mFour;
3340f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mFive;
3350f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mSix;
3360f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mSeven;
3370f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mEight;
3380f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mNine;
3390f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TextView mCancelButton;
3400f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3410f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private TouchInput() {
3420f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mZero = (TextView) findViewById(R.id.zero);
3430f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mOne = (TextView) findViewById(R.id.one);
3440f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mTwo = (TextView) findViewById(R.id.two);
3450f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mThree = (TextView) findViewById(R.id.three);
3460f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mFour = (TextView) findViewById(R.id.four);
3470f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mFive = (TextView) findViewById(R.id.five);
3480f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSix = (TextView) findViewById(R.id.six);
3490f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSeven = (TextView) findViewById(R.id.seven);
3500f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mEight = (TextView) findViewById(R.id.eight);
3510f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mNine = (TextView) findViewById(R.id.nine);
3520f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mCancelButton = (TextView) findViewById(R.id.cancel);
3530f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3540f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mZero.setText("0");
3550f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mOne.setText("1");
3560f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mTwo.setText("2");
3570f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mThree.setText("3");
3580f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mFour.setText("4");
3590f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mFive.setText("5");
3600f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSix.setText("6");
3610f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSeven.setText("7");
3620f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mEight.setText("8");
3630f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mNine.setText("9");
3640f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3650f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mZero.setOnClickListener(this);
3660f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mOne.setOnClickListener(this);
3670f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mTwo.setOnClickListener(this);
3680f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mThree.setOnClickListener(this);
3690f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mFour.setOnClickListener(this);
3700f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mFive.setOnClickListener(this);
3710f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSix.setOnClickListener(this);
3720f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mSeven.setOnClickListener(this);
3730f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mEight.setOnClickListener(this);
3740f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mNine.setOnClickListener(this);
3750f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            mCancelButton.setOnClickListener(this);
3760f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
3770f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3780f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3790f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        public void onClick(View v) {
3800f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            if (v == mCancelButton) {
3819a3caf39e4c628c6dfcac92f7e2b7e4538a73009Jim Miller                // clear the PIN/PUK entry fields if the user cancels
3829a3caf39e4c628c6dfcac92f7e2b7e4538a73009Jim Miller                mPinText.setText("");
3839a3caf39e4c628c6dfcac92f7e2b7e4538a73009Jim Miller                mPukText.setText("");
3840f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                mCallback.goToLockScreen();
3850f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                return;
3860f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            }
3870f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3880f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            final int digit = checkDigit(v);
3890f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            if (digit >= 0) {
3900f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                mCallback.pokeWakelock(DIGIT_PRESS_WAKE_MILLIS);
3910f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                reportDigit(digit);
3920f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            }
3930f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
3940f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
3950f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        private int checkDigit(View v) {
3960f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            int digit = -1;
3970f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            if (v == mZero) {
3980f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 0;
3990f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mOne) {
4000f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 1;
4010f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mTwo) {
4020f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 2;
4030f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mThree) {
4040f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 3;
4050f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mFour) {
4060f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 4;
4070f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mFive) {
4080f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 5;
4090f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mSix) {
4100f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 6;
4110f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mSeven) {
4120f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 7;
4130f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mEight) {
4140f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 8;
4150f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            } else if (v == mNine) {
4160f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang                digit = 9;
4170f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            }
4180f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang            return digit;
4190f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang        }
4200f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang    }
4210f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang
4220f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang}
423