Fix a race to detemine IME switcher visibilityde am: 982a94c5e3
am: 28c87d5d3b
Change-Id: I2dd8354b3addeb9f989e8df73ab5edfefe91fbac
This commit is contained in:
@@ -42,16 +42,21 @@ import java.util.List;
|
|||||||
* Displays an alphanumeric (latin-1) key entry for the user to enter
|
* Displays an alphanumeric (latin-1) key entry for the user to enter
|
||||||
* an unlock password
|
* an unlock password
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class KeyguardPasswordView extends KeyguardAbsKeyInputView
|
public class KeyguardPasswordView extends KeyguardAbsKeyInputView
|
||||||
implements KeyguardSecurityView, OnEditorActionListener, TextWatcher {
|
implements KeyguardSecurityView, OnEditorActionListener, TextWatcher {
|
||||||
|
|
||||||
private final boolean mShowImeAtScreenOn;
|
private final boolean mShowImeAtScreenOn;
|
||||||
private final int mDisappearYTranslation;
|
private final int mDisappearYTranslation;
|
||||||
|
|
||||||
|
// A delay constant to be used in a workaround for the situation where InputMethodManagerService
|
||||||
|
// is not switched to the new user yet.
|
||||||
|
// TODO: Remove this by ensuring such a race condition never happens.
|
||||||
|
private static final int DELAY_MILLIS_TO_REEVALUATE_IME_SWITCH_ICON = 500; // 500ms
|
||||||
|
|
||||||
InputMethodManager mImm;
|
InputMethodManager mImm;
|
||||||
private TextView mPasswordEntry;
|
private TextView mPasswordEntry;
|
||||||
private TextViewInputDisabler mPasswordEntryDisabler;
|
private TextViewInputDisabler mPasswordEntryDisabler;
|
||||||
|
private View mSwitchImeButton;
|
||||||
|
|
||||||
private Interpolator mLinearOutSlowInInterpolator;
|
private Interpolator mLinearOutSlowInInterpolator;
|
||||||
private Interpolator mFastOutLinearInInterpolator;
|
private Interpolator mFastOutLinearInInterpolator;
|
||||||
@@ -141,12 +146,31 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView
|
|||||||
mPasswordEntry.requestFocus();
|
mPasswordEntry.requestFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateSwitchImeButton() {
|
||||||
|
// If there's more than one IME, enable the IME switcher button
|
||||||
|
final boolean wasVisible = mSwitchImeButton.getVisibility() == View.VISIBLE;
|
||||||
|
final boolean shouldBeVisible = hasMultipleEnabledIMEsOrSubtypes(mImm, false);
|
||||||
|
if (wasVisible != shouldBeVisible) {
|
||||||
|
mSwitchImeButton.setVisibility(shouldBeVisible ? View.VISIBLE : View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Check if we still need this hack.
|
||||||
|
// If no icon is visible, reset the start margin on the password field so the text is
|
||||||
|
// still centered.
|
||||||
|
if (mSwitchImeButton.getVisibility() != View.VISIBLE) {
|
||||||
|
android.view.ViewGroup.LayoutParams params = mPasswordEntry.getLayoutParams();
|
||||||
|
if (params instanceof MarginLayoutParams) {
|
||||||
|
final MarginLayoutParams mlp = (MarginLayoutParams) params;
|
||||||
|
mlp.setMarginStart(0);
|
||||||
|
mPasswordEntry.setLayoutParams(params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onFinishInflate() {
|
protected void onFinishInflate() {
|
||||||
super.onFinishInflate();
|
super.onFinishInflate();
|
||||||
|
|
||||||
boolean imeOrDeleteButtonVisible = false;
|
|
||||||
|
|
||||||
mImm = (InputMethodManager) getContext().getSystemService(
|
mImm = (InputMethodManager) getContext().getSystemService(
|
||||||
Context.INPUT_METHOD_SERVICE);
|
Context.INPUT_METHOD_SERVICE);
|
||||||
|
|
||||||
@@ -171,31 +195,29 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView
|
|||||||
|
|
||||||
mPasswordEntry.requestFocus();
|
mPasswordEntry.requestFocus();
|
||||||
|
|
||||||
// If there's more than one IME, enable the IME switcher button
|
mSwitchImeButton = findViewById(R.id.switch_ime_button);
|
||||||
View switchImeButton = findViewById(R.id.switch_ime_button);
|
mSwitchImeButton.setOnClickListener(new OnClickListener() {
|
||||||
if (switchImeButton != null && hasMultipleEnabledIMEsOrSubtypes(mImm, false)) {
|
@Override
|
||||||
switchImeButton.setVisibility(View.VISIBLE);
|
public void onClick(View v) {
|
||||||
imeOrDeleteButtonVisible = true;
|
mCallback.userActivity(); // Leave the screen on a bit longer
|
||||||
switchImeButton.setOnClickListener(new OnClickListener() {
|
// Do not show auxiliary subtypes in password lock screen.
|
||||||
@Override
|
mImm.showInputMethodPicker(false /* showAuxiliarySubtypes */);
|
||||||
public void onClick(View v) {
|
|
||||||
mCallback.userActivity(); // Leave the screen on a bit longer
|
|
||||||
// Do not show auxiliary subtypes in password lock screen.
|
|
||||||
mImm.showInputMethodPicker(false /* showAuxiliarySubtypes */);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no icon is visible, reset the start margin on the password field so the text is
|
|
||||||
// still centered.
|
|
||||||
if (!imeOrDeleteButtonVisible) {
|
|
||||||
android.view.ViewGroup.LayoutParams params = mPasswordEntry.getLayoutParams();
|
|
||||||
if (params instanceof MarginLayoutParams) {
|
|
||||||
final MarginLayoutParams mlp = (MarginLayoutParams) params;
|
|
||||||
mlp.setMarginStart(0);
|
|
||||||
mPasswordEntry.setLayoutParams(params);
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
|
// If there's more than one IME, enable the IME switcher button
|
||||||
|
updateSwitchImeButton();
|
||||||
|
|
||||||
|
// When we the current user is switching, InputMethodManagerService sometimes has not
|
||||||
|
// switched internal state yet here. As a quick workaround, we check the keyboard state
|
||||||
|
// again.
|
||||||
|
// TODO: Remove this workaround by ensuring such a race condition never happens.
|
||||||
|
postDelayed(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
updateSwitchImeButton();
|
||||||
|
}
|
||||||
|
}, DELAY_MILLIS_TO_REEVALUATE_IME_SWITCH_ICON);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user