[Fixed] UI issues after rotation
1. Use onSaveInstanceState to store the data.
2. Do not repeat to automatically select the keyboard layout.
Bug: 281481973
Bug: 281461013
Test: manual
Change-Id: Ieaa8fa3d2e6c22c39b34313d255e4f7869777a8b
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
index 054ce61..08b8fd0 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
@@ -169,9 +169,11 @@
private void mapLanguageWithLayout(InputMethodInfo info, InputMethodSubtype subtype) {
CharSequence subtypeLabel = getSubtypeLabel(mContext, info, subtype);
- KeyboardLayout[] keyboardLayouts = getKeyboardLayouts(info, subtype);
- String layout = getKeyboardLayout(info, subtype);
-
+ KeyboardLayout[] keyboardLayouts =
+ NewKeyboardSettingsUtils.getKeyboardLayouts(
+ mIm, mUserId, mInputDeviceIdentifier, info, subtype);
+ String layout = NewKeyboardSettingsUtils.getKeyboardLayout(
+ mIm, mUserId, mInputDeviceIdentifier, info, subtype);
if (layout != null) {
for (int i = 0; i < keyboardLayouts.length; i++) {
if (keyboardLayouts[i].getDescriptor().equals(layout)) {
@@ -220,7 +222,6 @@
preference -> {
showKeyboardLayoutPicker(
keyboardInfo.getSubtypeLabel(),
- keyboardInfo.getLayout(),
mInputDeviceIdentifier,
mUserId,
keyboardInfo.getInputMethodInfo(),
@@ -267,7 +268,6 @@
private void showKeyboardLayoutPicker(
CharSequence subtypeLabel,
- String layout,
InputDeviceIdentifier inputDeviceIdentifier,
int userId,
InputMethodInfo inputMethodInfo,
@@ -281,7 +281,6 @@
NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_SUBTYPE, inputMethodSubtype);
arguments.putInt(NewKeyboardSettingsUtils.EXTRA_USER_ID, userId);
arguments.putCharSequence(NewKeyboardSettingsUtils.EXTRA_TITLE, subtypeLabel);
- arguments.putString(NewKeyboardSettingsUtils.EXTRA_KEYBOARD_LAYOUT, layout);
new SubSettingLauncher(mContext)
.setSourceMetricsCategory(getMetricsCategory())
.setDestination(NewKeyboardLayoutPickerFragment.class.getName())
@@ -289,16 +288,6 @@
.launch();
}
- private KeyboardLayout[] getKeyboardLayouts(InputMethodInfo info, InputMethodSubtype subtype) {
- return mIm.getKeyboardLayoutListForInputDevice(
- mInputDeviceIdentifier, mUserId, info, subtype);
- }
-
- private String getKeyboardLayout(InputMethodInfo info, InputMethodSubtype subtype) {
- return mIm.getKeyboardLayoutForInputDevice(
- mInputDeviceIdentifier, mUserId, info, subtype);
- }
-
private CharSequence getSubtypeLabel(
Context context, InputMethodInfo info, InputMethodSubtype subtype) {
return subtype.getDisplayName(
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java
index 110147a..1af001b 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
+import android.hardware.input.KeyboardLayout;
import android.os.Bundle;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
@@ -31,28 +32,50 @@
private static final String TAG = "KeyboardLayoutPicker";
+ private InputManager mIm;
+ private int mUserId;
+ private InputDeviceIdentifier mIdentifier;
+ private InputMethodInfo mInputMethodInfo;
+ private InputMethodSubtype mInputMethodSubtype;
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
- InputManager inputManager = getContext().getSystemService(InputManager.class);
+ mIm = getContext().getSystemService(InputManager.class);
Bundle arguments = getArguments();
final CharSequence title = arguments.getCharSequence(NewKeyboardSettingsUtils.EXTRA_TITLE);
- final String layout = arguments.getString(NewKeyboardSettingsUtils.EXTRA_KEYBOARD_LAYOUT);
- final int userId = arguments.getInt(NewKeyboardSettingsUtils.EXTRA_USER_ID);
- final InputDeviceIdentifier identifier =
+ mUserId = arguments.getInt(NewKeyboardSettingsUtils.EXTRA_USER_ID);
+ mIdentifier =
arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_DEVICE_IDENTIFIER);
- final InputMethodInfo inputMethodInfo =
+ mInputMethodInfo =
arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_INFO);
- final InputMethodSubtype inputMethodSubtype =
+ mInputMethodSubtype =
arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_SUBTYPE);
- if (identifier == null
- || NewKeyboardSettingsUtils.getInputDevice(inputManager, identifier) == null) {
+ if (mIdentifier == null
+ || NewKeyboardSettingsUtils.getInputDevice(mIm, mIdentifier) == null) {
getActivity().finish();
return;
}
getActivity().setTitle(title);
- use(NewKeyboardLayoutPickerController.class).initialize(this /*parent*/, userId,
- identifier, inputMethodInfo, inputMethodSubtype, layout);
+ use(NewKeyboardLayoutPickerController.class).initialize(this /*parent*/, mUserId,
+ mIdentifier, mInputMethodInfo, mInputMethodSubtype, getSelectedLayoutLabel());
+ }
+
+ private String getSelectedLayoutLabel() {
+ String label = getContext().getString(R.string.keyboard_default_layout);
+ String layout = NewKeyboardSettingsUtils.getKeyboardLayout(
+ mIm, mUserId, mIdentifier, mInputMethodInfo, mInputMethodSubtype);
+ KeyboardLayout[] keyboardLayouts = NewKeyboardSettingsUtils.getKeyboardLayouts(
+ mIm, mUserId, mIdentifier, mInputMethodInfo, mInputMethodSubtype);
+ if (layout != null) {
+ for (int i = 0; i < keyboardLayouts.length; i++) {
+ if (keyboardLayouts[i].getDescriptor().equals(layout)) {
+ label = keyboardLayouts[i].getLabel();
+ break;
+ }
+ }
+ }
+ return label;
}
@Override
diff --git a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
index fe0c9d4..697c0f0 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
+import android.hardware.input.KeyboardLayout;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
@@ -39,7 +40,6 @@
"com.android.settings.inputmethod.EXTRA_INTENT_FROM";
static final String EXTRA_TITLE = "keyboard_layout_picker_title";
- static final String EXTRA_KEYBOARD_LAYOUT = "keyboard_layout";
static final String EXTRA_USER_ID = "user_id";
static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
static final String EXTRA_INPUT_METHOD_INFO = "input_method_info";
@@ -117,4 +117,14 @@
static InputDevice getInputDevice(InputManager im, InputDeviceIdentifier identifier) {
return im.getInputDeviceByDescriptor(identifier.getDescriptor());
}
+
+ static KeyboardLayout[] getKeyboardLayouts(InputManager inputManager, int userId,
+ InputDeviceIdentifier identifier, InputMethodInfo info, InputMethodSubtype subtype) {
+ return inputManager.getKeyboardLayoutListForInputDevice(identifier, userId, info, subtype);
+ }
+
+ static String getKeyboardLayout(InputManager inputManager, int userId,
+ InputDeviceIdentifier identifier, InputMethodInfo info, InputMethodSubtype subtype) {
+ return inputManager.getKeyboardLayoutForInputDevice(identifier, userId, info, subtype);
+ }
}
diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
index 22f5b65..936de38 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -67,12 +67,14 @@
private static final String SHOW_VIRTUAL_KEYBOARD_SWITCH = "show_virtual_keyboard_switch";
private static final String KEYBOARD_SHORTCUTS_HELPER = "keyboard_shortcuts_helper";
private static final String MODIFIER_KEYS_SETTINGS = "modifier_keys_settings";
+ private static final String EXTRA_AUTO_SELECTION = "auto_selection";
@NonNull
private final ArrayList<HardKeyboardDeviceInfo> mLastHardKeyboards = new ArrayList<>();
private InputManager mIm;
private InputMethodManager mImm;
+ private InputDeviceIdentifier mAutoInputDeviceIdentifier;
@NonNull
private PreferenceCategory mKeyboardAssistanceCategory;
@NonNull
@@ -85,6 +87,12 @@
private String mBluetoothAddress;
@Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putParcelable(EXTRA_AUTO_SELECTION, mAutoInputDeviceIdentifier);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
public void onCreatePreferences(Bundle bundle, String s) {
Activity activity = Preconditions.checkNotNull(getActivity());
addPreferencesFromResource(R.xml.physical_keyboard_settings);
@@ -107,15 +115,19 @@
KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER);
// TODO (b/271391879): The EXTRA_INTENT_FROM is used for the future metrics.
if (inputDeviceIdentifier != null) {
- Bundle arguments = new Bundle();
- arguments.putParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_DEVICE_IDENTIFIER,
- inputDeviceIdentifier);
- new SubSettingLauncher(getContext())
- .setSourceMetricsCategory(getMetricsCategory())
- .setDestination(NewKeyboardLayoutEnabledLocalesFragment.class.getName())
- .setArguments(arguments)
- .launch();
+ mAutoInputDeviceIdentifier = inputDeviceIdentifier;
}
+ // Don't repeat the autoselection.
+ if (isAutoSelection(bundle, inputDeviceIdentifier)) {
+ showEnabledLocalesKeyboardLayoutList(inputDeviceIdentifier);
+ }
+ }
+
+ private static boolean isAutoSelection(Bundle bundle, InputDeviceIdentifier identifier) {
+ if (bundle != null && bundle.getParcelable(EXTRA_AUTO_SELECTION) != null) {
+ return false;
+ }
+ return identifier != null;
}
@Override
@@ -220,7 +232,6 @@
pref.setOnPreferenceClickListener(
preference -> {
showEnabledLocalesKeyboardLayoutList(
- hardKeyboardDeviceInfo.mDeviceName,
hardKeyboardDeviceInfo.mDeviceIdentifier);
return true;
});
@@ -246,8 +257,7 @@
fragment.show(getActivity().getSupportFragmentManager(), "keyboardLayout");
}
- private void showEnabledLocalesKeyboardLayoutList(String keyboardName,
- InputDeviceIdentifier inputDeviceIdentifier) {
+ private void showEnabledLocalesKeyboardLayoutList(InputDeviceIdentifier inputDeviceIdentifier) {
Bundle arguments = new Bundle();
arguments.putParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_DEVICE_IDENTIFIER,
inputDeviceIdentifier);