Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 668f06f3 authored by Jim Miller's avatar Jim Miller Committed by Android (Google) Code Review
Browse files

Merge "Fix 2402303: Split Keyboard widget from LatinIME into reusable PasswordEntryKeyboardView"

parents e5fbe9b9 a781d016
Loading
Loading
Loading
Loading
+33 −132
Original line number Diff line number Diff line
@@ -20,22 +20,29 @@ import android.content.Context;

import com.android.internal.telephony.IccCard.State;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.PasswordEntryKeyboardView;

import android.text.Editable;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

import com.android.internal.R;
import com.android.internal.widget.PasswordEntryKeyboardHelper;

/**
 * Displays a dialer-like interface or alphanumeric (latin-1) key entry for the user to enter
 * an unlock password
 */
public class PasswordUnlockScreen extends LinearLayout implements KeyguardScreen, View.OnClickListener,
        KeyguardUpdateMonitor.ConfigurationChangeCallback, KeyguardUpdateMonitor.InfoCallback {
        KeyguardUpdateMonitor.ConfigurationChangeCallback, OnEditorActionListener {

    private static final int DIGIT_PRESS_WAKE_MILLIS = 5000;

@@ -44,15 +51,11 @@ public class PasswordUnlockScreen extends LinearLayout implements KeyguardScreen

    private final boolean mCreatedWithKeyboardOpen;

    private TextView mPasswordTextView;
    private TextView mOkButton;
    private EditText mPasswordEntry;
    private TextView mEmergencyCallButton;
    private View mBackSpaceButton;
    private TextView mCarrier;
    private LockPatternUtils mLockPatternUtils;
    private Button mCancelButton;

    private static final char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    private PasswordEntryKeyboardView mKeyboardView;
    private PasswordEntryKeyboardHelper mKeyboardHelper;

    // To avoid accidental lockout due to events while the device in in the pocket, ignore
    // any passwords with length less than or equal to this length.
@@ -70,44 +73,29 @@ public class PasswordUnlockScreen extends LinearLayout implements KeyguardScreen
            layoutInflater.inflate(R.layout.keyguard_screen_password_landscape, this, true);
        } else {
            layoutInflater.inflate(R.layout.keyguard_screen_password_portrait, this, true);
            new TouchInput();
        }

        mPasswordTextView = (TextView) findViewById(R.id.pinDisplay);
        mBackSpaceButton = findViewById(R.id.backspace);
        mBackSpaceButton.setOnClickListener(this);

        // The cancel button is not used on this screen.
        mCancelButton = (Button) findViewById(R.id.cancel);
        if (mCancelButton != null) {
            mCancelButton.setText("");
        }

        boolean isAlpha = lockPatternUtils.getPasswordMode() == LockPatternUtils.MODE_PASSWORD;
        mKeyboardView = (PasswordEntryKeyboardView) findViewById(R.id.keyboard);
        mPasswordEntry = (EditText) findViewById(R.id.passwordEntry);
        mPasswordEntry.setOnEditorActionListener(this);
        mEmergencyCallButton = (TextView) findViewById(R.id.emergencyCall);
        mOkButton = (TextView) findViewById(R.id.ok);

        mPasswordTextView.setFocusable(false);

        mEmergencyCallButton.setOnClickListener(this);
        mOkButton.setOnClickListener(this);

        mUpdateMonitor.registerConfigurationChangeCallback(this);

        mLockPatternUtils = lockPatternUtils;
        mCarrier = (TextView) findViewById(R.id.carrier);
        // until we get an update...
        mCarrier.setText(LockScreen.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
                        mUpdateMonitor.getTelephonySpn()));

        updateMonitor.registerInfoCallback(this);
        updateMonitor.registerConfigurationChangeCallback(this);
        mKeyboardHelper = new PasswordEntryKeyboardHelper(context, mKeyboardView, this);
        mKeyboardHelper.setKeyboardMode(isAlpha ? PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA
                : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);

        updateMonitor.registerConfigurationChangeCallback(this);
        setFocusableInTouchMode(true);
        mPasswordEntry.requestFocus();
    }

    /** {@inheritDoc} */
    public boolean needsInput() {
        return true;
        return false;
    }

    /** {@inheritDoc} */
@@ -118,7 +106,8 @@ public class PasswordUnlockScreen extends LinearLayout implements KeyguardScreen
    /** {@inheritDoc} */
    public void onResume() {
        // start fresh
        mPasswordTextView.setText("");
        mPasswordEntry.setText("");
        mPasswordEntry.requestFocus();
    }

    /** {@inheritDoc} */
@@ -127,22 +116,14 @@ public class PasswordUnlockScreen extends LinearLayout implements KeyguardScreen
    }

    public void onClick(View v) {
        if (v == mBackSpaceButton) {
            final Editable digits = mPasswordTextView.getEditableText();
            final int len = digits.length();
            if (len > 0) {
                digits.delete(len-1, len);
            }
        } else if (v == mEmergencyCallButton) {
        if (v == mEmergencyCallButton) {
            mCallback.takeEmergencyCallAction();
        } else if (v == mOkButton) {
            verifyPasswordAndUnlock();
        }
        mCallback.pokeWakelock();
    }

    private void verifyPasswordAndUnlock() {
        String entry = mPasswordTextView.getText().toString();
        String entry = mPasswordEntry.getText().toString();
        if (mLockPatternUtils.checkPassword(entry)) {
            mCallback.keyguardDone(true);
            mCallback.reportSuccessfulUnlockAttempt();
@@ -151,37 +132,15 @@ public class PasswordUnlockScreen extends LinearLayout implements KeyguardScreen
            // real password. This may require some tweaking.
            mCallback.reportFailedUnlockAttempt();
        }
        mPasswordTextView.setText("");
        mPasswordEntry.setText("");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            return true;
        }

        final char match = event.getMatch(DIGITS);
        if (match != 0) {
            reportDigit(match - '0');
            return true;
        }
        if (keyCode == KeyEvent.KEYCODE_DEL) {
            mPasswordTextView.onKeyDown(keyCode, event);
            return true;
        }

        if (keyCode == KeyEvent.KEYCODE_ENTER) {
            verifyPasswordAndUnlock();
            return true;
        }

        mCallback.pokeWakelock();
        return false;
    }

    private void reportDigit(int digit) {
        mPasswordTextView.append(Integer.toString(digit));
    }

    public void onOrientationChange(boolean inPortrait) {

    }
@@ -192,71 +151,13 @@ public class PasswordUnlockScreen extends LinearLayout implements KeyguardScreen
        }
    }

    /**
     * Helper class to handle input from touch dialer.  Only relevant when
     * the keyboard is shut.
     */
    private class TouchInput implements View.OnClickListener {
        private int mDigitIds[] = { R.id.zero, R.id.one, R.id.two, R.id.three, R.id.four,
                R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine };
        private TextView mCancelButton;
        private TouchInput() {
            for (int i = 0; i < mDigitIds.length; i++) {
                Button button = (Button) findViewById(mDigitIds[i]);
                button.setOnClickListener(this);
                button.setText(Integer.toString(i));
            }
            mCancelButton = (TextView) findViewById(R.id.cancel);
            mCancelButton.setOnClickListener(this);
            mOkButton = (TextView) findViewById(R.id.ok);
            mOkButton.setOnClickListener(this);
        }

        public void onClick(View v) {
            if (v == mCancelButton) {
                return;
            }
            if (v == mOkButton) {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        // Check if this was the result of hitting the enter key
        if (actionId == EditorInfo.IME_NULL) {
            verifyPasswordAndUnlock();
            return true;
        }

            final int digit = checkDigit(v);
            if (digit >= 0) {
                mCallback.pokeWakelock(DIGIT_PRESS_WAKE_MILLIS);
                reportDigit(digit);
            }
        }

        private int checkDigit(View v) {
            int digit = -1;
            for (int i = 0; i < mDigitIds.length; i++) {
                if (v.getId() == mDigitIds[i]) {
                    digit = i;
                    break;
                }
            }
            return digit;
        }
    }

    /** {@inheritDoc} */
    public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
        mCarrier.setText(LockScreen.getCarrierString(plmn, spn));
    }

    public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn, int batteryLevel) {

    }

    public void onRingerModeChanged(int state) {

    }

    public void onTimeChanged() {

        return false;
    }

    public void onSimStateChanged(State simState) {

    }
}