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

This commit is contained in:
Jim Miller
2010-02-08 21:05:43 -08:00
committed by Android (Google) Code Review

View File

@@ -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);
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) {
verifyPasswordAndUnlock();
}
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;
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;
}
return false;
}
/** {@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() {
}
public void onSimStateChanged(State simState) {
}
}