Fix showing keyboard without editor focused in some cases (2/2)

As CL[1] mentioned issue symptom, we also need to remove
STATE_ALWAYS_VISIBLE in EditTextPreference
and using new WindowInsets API to show soft-keyboard, to prevent the
keyboard may be shown without focusing editor case.

[1]: I37ae6e30d1de581ba15131c2a90396b3a522a4d6

Fix: 165910518
Test: atest CtsInputMethodTestCases
Test: manual as issue steps
1. Enter Dialer-> Menu -> Settings-> calling accounts -> Fixed Dialing Numbers
2. Tap change pin2 code, input old pin2 -> pressing ok button
3. Check if password keyboard shown

Change-Id: I763838fb7b887e09b46b1fb2360a515b77de8dd4
This commit is contained in:
Ming-Shin Lu
2020-08-14 01:23:33 +08:00
parent a806511dca
commit d5ae401390
2 changed files with 10 additions and 31 deletions

View File

@@ -36,8 +36,6 @@ import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
/**
@@ -337,9 +335,6 @@ public abstract class DialogPreference extends Preference implements
if (state != null) {
dialog.onRestoreInstanceState(state);
}
if (needInputMethod()) {
requestInputMethod(dialog);
}
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
@@ -379,24 +374,6 @@ public abstract class DialogPreference extends Preference implements
}
}
/**
* Returns whether the preference needs to display a soft input method when the dialog
* is displayed. Default is false. Subclasses should override this method if they need
* the soft input method brought up automatically.
* @hide
*/
protected boolean needInputMethod() {
return false;
}
/**
* Sets the required flags on the dialog window to enable input method window to show up.
*/
private void requestInputMethod(Dialog dialog) {
Window window = dialog.getWindow();
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
/**
* Creates the content view for the dialog (if a custom content view is
* required). By default, it inflates the dialog layout resource if it is

View File

@@ -21,6 +21,7 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -28,6 +29,7 @@ import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.WindowInsets;
import android.widget.EditText;
/**
@@ -123,7 +125,7 @@ public class EditTextPreference extends DialogPreference {
EditText editText = mEditText;
editText.setText(getText());
ViewParent oldParent = editText.getParent();
if (oldParent != view) {
if (oldParent != null) {
@@ -133,6 +135,13 @@ public class EditTextPreference extends DialogPreference {
}
}
@Override
protected void showDialog(Bundle state) {
super.showDialog(state);
mEditText.requestFocus();
mEditText.getWindowInsetsController().show(WindowInsets.Type.ime());
}
/**
* Adds the EditText widget of this preference to the dialog's view.
*
@@ -183,13 +192,6 @@ public class EditTextPreference extends DialogPreference {
return mEditText;
}
/** @hide */
@Override
protected boolean needInputMethod() {
// We want the input method to show, if possible, when dialog is displayed
return true;
}
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();