From c92bd9789d705597f1ff93fb0d52b87c2cb5e383 Mon Sep 17 00:00:00 2001 From: danielwbhuang Date: Tue, 9 May 2023 20:03:17 +0800 Subject: [PATCH] [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 --- ...wKeyboardLayoutEnabledLocalesFragment.java | 21 +++------ .../NewKeyboardLayoutPickerContent.java | 43 ++++++++++++++----- .../inputmethod/NewKeyboardSettingsUtils.java | 12 +++++- .../inputmethod/PhysicalKeyboardFragment.java | 32 +++++++++----- 4 files changed, 70 insertions(+), 38 deletions(-) diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java index 054ce610944..08b8fd09f25 100644 --- a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java +++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java @@ -169,9 +169,11 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment 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 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment preference -> { showKeyboardLayoutPicker( keyboardInfo.getSubtypeLabel(), - keyboardInfo.getLayout(), mInputDeviceIdentifier, mUserId, keyboardInfo.getInputMethodInfo(), @@ -267,7 +268,6 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment private void showKeyboardLayoutPicker( CharSequence subtypeLabel, - String layout, InputDeviceIdentifier inputDeviceIdentifier, int userId, InputMethodInfo inputMethodInfo, @@ -281,7 +281,6 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment 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 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment .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 110147a4a68..1af001bda31 100644 --- a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java +++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerContent.java @@ -20,6 +20,7 @@ import android.app.settings.SettingsEnums; 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 @@ public class NewKeyboardLayoutPickerContent extends DashboardFragment { 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 fe0c9d4f977..697c0f09f62 100644 --- a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java +++ b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java @@ -19,6 +19,7 @@ package com.android.settings.inputmethod; 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 @@ public class NewKeyboardSettingsUtils { "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 @@ public class NewKeyboardSettingsUtils { 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 22f5b65306e..936de38ecac 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -67,12 +67,14 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment 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 mLastHardKeyboards = new ArrayList<>(); private InputManager mIm; private InputMethodManager mImm; + private InputDeviceIdentifier mAutoInputDeviceIdentifier; @NonNull private PreferenceCategory mKeyboardAssistanceCategory; @NonNull @@ -84,6 +86,12 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment static final String EXTRA_BT_ADDRESS = "extra_bt_address"; 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()); @@ -107,15 +115,19 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment 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 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment pref.setOnPreferenceClickListener( preference -> { showEnabledLocalesKeyboardLayoutList( - hardKeyboardDeviceInfo.mDeviceName, hardKeyboardDeviceInfo.mDeviceIdentifier); return true; }); @@ -246,8 +257,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment 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);