diff --git a/res/values/strings.xml b/res/values/strings.xml index 9e1ab8a37d8..1e76855dc09 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4478,8 +4478,14 @@ Choose a new key for %1$s: + + %s layout Default + + Automatic: %s + + User selected: %s Speech diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java index 05dc5bea33a..2bbb5676038 100644 --- a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java +++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java @@ -21,6 +21,7 @@ import android.content.Context; import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputManager; import android.hardware.input.KeyboardLayout; +import android.hardware.input.KeyboardLayoutSelectionResult; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; @@ -180,7 +181,7 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment mapLanguageWithLayout(info, subtype); } } - updatePreferenceLayout(preferenceScreen, info); + updatePreferenceLayout(preferenceScreen, info, infoList.size() > 1); } } @@ -189,14 +190,15 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment KeyboardLayout[] keyboardLayouts = NewKeyboardSettingsUtils.getKeyboardLayouts( mIm, mUserId, mInputDeviceIdentifier, info, subtype); - String layout = NewKeyboardSettingsUtils.getKeyboardLayout( + KeyboardLayoutSelectionResult result = NewKeyboardSettingsUtils.getKeyboardLayout( mIm, mUserId, mInputDeviceIdentifier, info, subtype); - if (layout != null) { + if (result.getLayoutDescriptor() != null) { for (int i = 0; i < keyboardLayouts.length; i++) { - if (keyboardLayouts[i].getDescriptor().equals(layout)) { + if (keyboardLayouts[i].getDescriptor().equals(result.getLayoutDescriptor())) { KeyboardInfo keyboardInfo = new KeyboardInfo( subtypeLabel, keyboardLayouts[i].getLabel(), + result.getSelectionCriteria(), info, subtype); mKeyboardInfoList.add(keyboardInfo); @@ -208,18 +210,22 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment KeyboardInfo keyboardInfo = new KeyboardInfo( subtypeLabel, mContext.getString(R.string.keyboard_default_layout), + KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_UNSPECIFIED, info, subtype); mKeyboardInfoList.add(keyboardInfo); } } - private void updatePreferenceLayout(PreferenceScreen preferenceScreen, InputMethodInfo info) { + private void updatePreferenceLayout(PreferenceScreen preferenceScreen, InputMethodInfo info, + boolean hasMultipleImes) { if (mKeyboardInfoList.isEmpty()) { return; } PreferenceCategory preferenceCategory = new PreferenceCategory(mContext); - preferenceCategory.setTitle(info.loadLabel(mContext.getPackageManager())); + preferenceCategory.setTitle(hasMultipleImes ? mContext.getString(R.string.ime_label_title, + info.loadLabel(mContext.getPackageManager())) + : mContext.getString(R.string.enabled_locales_keyboard_layout)); preferenceCategory.setKey(info.getPackageName()); preferenceScreen.addPreference(preferenceCategory); Collections.sort(mKeyboardInfoList, new Comparator() { @@ -234,7 +240,7 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment final Preference pref = new Preference(mContext); pref.setKey(keyboardInfo.getPrefId()); pref.setTitle(keyboardInfo.getSubtypeLabel()); - pref.setSummary(keyboardInfo.getLayout()); + pref.setSummary(keyboardInfo.getLayoutSummaryText(mContext)); pref.setOnPreferenceClickListener( preference -> { showKeyboardLayoutPicker( diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java index ac8037f74c4..ec727e8a55b 100644 --- a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java +++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java @@ -21,6 +21,7 @@ import android.content.Context; import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputManager; import android.hardware.input.KeyboardLayout; +import android.hardware.input.KeyboardLayoutSelectionResult; import android.os.Bundle; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodSubtype; @@ -201,13 +202,13 @@ public class NewKeyboardLayoutPickerController extends BasePreferenceController private String getSelectedLayoutLabel() { String label = mContext.getString(R.string.keyboard_default_layout); - String layout = NewKeyboardSettingsUtils.getKeyboardLayout( + KeyboardLayoutSelectionResult result = NewKeyboardSettingsUtils.getKeyboardLayout( mIm, mUserId, mInputDeviceIdentifier, mInputMethodInfo, mInputMethodSubtype); KeyboardLayout[] keyboardLayouts = NewKeyboardSettingsUtils.getKeyboardLayouts( mIm, mUserId, mInputDeviceIdentifier, mInputMethodInfo, mInputMethodSubtype); - if (layout != null) { + if (result.getLayoutDescriptor() != null) { for (KeyboardLayout keyboardLayout : keyboardLayouts) { - if (keyboardLayout.getDescriptor().equals(layout)) { + if (keyboardLayout.getDescriptor().equals(result.getLayoutDescriptor())) { label = keyboardLayout.getLabel(); break; } diff --git a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java index a927165cb88..8f1e5c88a5b 100644 --- a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java +++ b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java @@ -16,20 +16,30 @@ package com.android.settings.inputmethod; +import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_USER; +import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_DEVICE; +import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.annotation.UserIdInt; import android.content.Context; import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputManager; import android.hardware.input.KeyboardLayout; +import android.hardware.input.KeyboardLayoutSelectionResult; +import android.hardware.input.KeyboardLayoutSelectionResult.LayoutSelectionCriteria; import android.os.UserHandle; import android.view.InputDevice; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; -import java.util.ArrayList; +import com.android.settings.R; + import java.util.Arrays; import java.util.Comparator; -import java.util.List; /** * Utilities of keyboard settings @@ -56,36 +66,47 @@ public class NewKeyboardSettingsUtils { return false; } - static List getSuitableImeLabels(Context context, InputMethodManager imm, int userId) { - List suitableInputMethodInfoLabels = new ArrayList<>(); - List infoList = imm.getEnabledInputMethodListAsUser(UserHandle.of(userId)); - for (InputMethodInfo info : infoList) { - List subtypes = - imm.getEnabledInputMethodSubtypeList(info, true); - for (InputMethodSubtype subtype : subtypes) { - if (subtype.isSuitableForPhysicalKeyboardLayoutMapping()) { - suitableInputMethodInfoLabels.add( - info.loadLabel(context.getPackageManager()).toString()); - break; + @SuppressLint("MissingPermission") + @Nullable + static String getSelectedKeyboardLayoutLabelForUser(Context context, @UserIdInt int userId, + InputDeviceIdentifier inputDeviceIdentifier) { + InputMethodManager imm = context.getSystemService(InputMethodManager.class); + InputManager im = context.getSystemService(InputManager.class); + if (imm == null || im == null) { + return null; + } + InputMethodInfo imeInfo = imm.getCurrentInputMethodInfoAsUser(UserHandle.of(userId)); + InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype(); + KeyboardLayout[] keyboardLayouts = getKeyboardLayouts(im, userId, inputDeviceIdentifier, + imeInfo, subtype); + KeyboardLayoutSelectionResult result = getKeyboardLayout(im, userId, inputDeviceIdentifier, + imeInfo, subtype); + if (result != null) { + for (KeyboardLayout keyboardLayout : keyboardLayouts) { + if (keyboardLayout.getDescriptor().equals(result.getLayoutDescriptor())) { + return keyboardLayout.getLabel(); } } } - return suitableInputMethodInfoLabels; + return null; } static class KeyboardInfo { CharSequence mSubtypeLabel; String mLayout; + @LayoutSelectionCriteria int mSelectionCriteria; InputMethodInfo mInputMethodInfo; InputMethodSubtype mInputMethodSubtype; KeyboardInfo( CharSequence subtypeLabel, String layout, + @LayoutSelectionCriteria int selectionCriteria, InputMethodInfo inputMethodInfo, InputMethodSubtype inputMethodSubtype) { mSubtypeLabel = subtypeLabel; mLayout = layout; + mSelectionCriteria = selectionCriteria; mInputMethodInfo = inputMethodInfo; mInputMethodSubtype = inputMethodSubtype; } @@ -102,6 +123,17 @@ public class NewKeyboardSettingsUtils { return mLayout; } + String getLayoutSummaryText(Context context) { + if (isAutomaticSelection(mSelectionCriteria)) { + return context.getResources().getString(R.string.automatic_keyboard_layout_label, + mLayout); + } else if (isUserSelection(mSelectionCriteria)) { + return context.getResources().getString( + R.string.user_selected_keyboard_layout_label, mLayout); + } + return mLayout; + } + InputMethodInfo getInputMethodInfo() { return mInputMethodInfo; } @@ -121,11 +153,21 @@ public class NewKeyboardSettingsUtils { return inputManager.getKeyboardLayoutListForInputDevice(identifier, userId, info, subtype); } - static String getKeyboardLayout(InputManager inputManager, int userId, + @NonNull + static KeyboardLayoutSelectionResult getKeyboardLayout(InputManager inputManager, int userId, InputDeviceIdentifier identifier, InputMethodInfo info, InputMethodSubtype subtype) { return inputManager.getKeyboardLayoutForInputDevice(identifier, userId, info, subtype); } + static boolean isAutomaticSelection(@LayoutSelectionCriteria int criteria) { + return criteria == LAYOUT_SELECTION_CRITERIA_DEVICE + || criteria == LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD; + } + + static boolean isUserSelection(@LayoutSelectionCriteria int criteria) { + return criteria == LAYOUT_SELECTION_CRITERIA_USER; + } + static void sortKeyboardLayoutsByLabel(KeyboardLayout[] keyboardLayouts) { Arrays.sort( keyboardLayouts, diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index f2ac5508d80..e102241f63a 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -288,19 +288,11 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment final Preference pref = new Preference(getPrefContext()); pref.setTitle(hardKeyboardDeviceInfo.mDeviceName); if (mIsNewKeyboardSettings) { - List suitableImes = new ArrayList<>(); - suitableImes.addAll( - NewKeyboardSettingsUtils.getSuitableImeLabels( - getContext(), mImm, UserHandle.myUserId())); - if (!suitableImes.isEmpty()) { - String summary = suitableImes.get(0); - StringBuilder result = new StringBuilder(summary); - for (int i = 1; i < suitableImes.size(); i++) { - result.append(", ").append(suitableImes.get(i)); - } - pref.setSummary(result.toString()); - } else { - pref.setSummary(hardKeyboardDeviceInfo.mLayoutLabel); + String currentLayout = + NewKeyboardSettingsUtils.getSelectedKeyboardLayoutLabelForUser(getContext(), + UserHandle.myUserId(), hardKeyboardDeviceInfo.mDeviceIdentifier); + if (currentLayout != null) { + pref.setSummary(currentLayout); } pref.setOnPreferenceClickListener( preference -> {