From 696bf679dd2a8eb8c2dccef5fc970783a634cf41 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Wed, 20 Apr 2016 17:20:26 -0700 Subject: [PATCH] Support IMEs that have no subtype in PhysicalKeyboardFragment. With a Framework-side change [1], InputManager#{get, set}KeyboardLayoutForInputDevice() are now able to deal with null InputMethodSubtype as a valid input. With this CL, we no longer filter out IMEs that do not support subtypes in PhysicalKeyboardFragment. [1]: Ia013784a594ad3beaf30976d047f5ac0fa8185be Bug: 28182650 Change-Id: I46b9c5b018f08e3eaa4614a0893db0be91652f3c --- .../KeyboardLayoutPickerFragment2.java | 4 +- .../inputmethod/PhysicalKeyboardFragment.java | 38 +++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java index 6916242d08c..c0d67bbe504 100644 --- a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java +++ b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java @@ -16,6 +16,7 @@ package com.android.settings.inputmethod; +import android.annotation.Nullable; import android.app.Activity; import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputManager; @@ -45,6 +46,7 @@ public final class KeyboardLayoutPickerFragment2 extends SettingsPreferenceFragm private int mInputDeviceId = -1; private InputManager mIm; private InputMethodInfo mImi; + @Nullable private InputMethodSubtype mSubtype; private KeyboardLayout[] mKeyboardLayouts; private Map mPreferenceMap = new HashMap<>(); @@ -82,7 +84,7 @@ public final class KeyboardLayoutPickerFragment2 extends SettingsPreferenceFragm mImi = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_INFO); mSubtype = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_SUBTYPE); - if (mInputDeviceIdentifier == null || mImi == null || mSubtype == null) { + if (mInputDeviceIdentifier == null || mImi == null) { activity.finish(); } diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index cf8db7a8243..07bcf6ab437 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -147,7 +147,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment Preference pref = new Preference(getPrefContext(), null); final InputMethodInfo imi = info.mImi; final InputMethodSubtype imSubtype = info.mImSubtype; - if (imi != null && imSubtype != null) { + if (imi != null) { pref.setTitle(getDisplayName(getContext(), imi, imSubtype)); KeyboardLayout layout = info.mLayout; if (layout != null) { @@ -214,9 +214,9 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } private void showKeyboardLayoutScreen( - InputDeviceIdentifier inputDeviceIdentifier, - InputMethodInfo imi, - InputMethodSubtype imSubtype) { + @NonNull InputDeviceIdentifier inputDeviceIdentifier, + @NonNull InputMethodInfo imi, + @Nullable InputMethodSubtype imSubtype) { final Intent intent = new Intent(Intent.ACTION_MAIN); intent.setClass(getActivity(), Settings.KeyboardLayoutPickerActivity.class); intent.putExtra(KeyboardLayoutPickerFragment2.EXTRA_INPUT_DEVICE_IDENTIFIER, @@ -272,12 +272,15 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment }; @NonNull - static String getDisplayName( + static CharSequence getDisplayName( @NonNull Context context, @NonNull InputMethodInfo imi, - @NonNull InputMethodSubtype imSubtype) { + @Nullable InputMethodSubtype imSubtype) { + final CharSequence imeName = imi.loadLabel(context.getPackageManager()); + if (imSubtype == null) { + return imeName; + } final CharSequence imSubtypeName = imSubtype.getDisplayName( context, imi.getPackageName(), imi.getServiceInfo().applicationInfo); - final CharSequence imeName = imi.loadLabel(context.getPackageManager()); return String.format( context.getString(R.string.physical_device_title), imSubtypeName, imeName); } @@ -330,8 +333,21 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment final InputManager im = getContext().getSystemService(InputManager.class); if (imm != null && im != null) { for (InputMethodInfo imi : imm.getEnabledInputMethodList()) { - for (InputMethodSubtype subtype : imm.getEnabledInputMethodSubtypeList( - imi, true /* allowsImplicitlySelectedSubtypes */)) { + final List subtypes = imm.getEnabledInputMethodSubtypeList( + imi, true /* allowsImplicitlySelectedSubtypes */); + if (subtypes.isEmpty()) { + // Here we use null to indicate that this IME has no subtype. + final InputMethodSubtype nullSubtype = null; + final KeyboardLayout layout = im.getKeyboardLayoutForInputDevice( + deviceInfo.mDeviceIdentifier, imi, nullSubtype); + keyboardInfoList.add(new Keyboards.KeyboardInfo(imi, nullSubtype, layout)); + continue; + } + + // If the IME supports subtypes, we pick up "keyboard" subtypes only. + final int N = subtypes.size(); + for (int i = 0; i < N; ++i) { + final InputMethodSubtype subtype = subtypes.get(i); if (!IM_SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())) { continue; } @@ -421,14 +437,14 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment public static final class KeyboardInfo { @NonNull public final InputMethodInfo mImi; - @NonNull + @Nullable public final InputMethodSubtype mImSubtype; @NonNull public final KeyboardLayout mLayout; public KeyboardInfo( @NonNull final InputMethodInfo imi, - @NonNull final InputMethodSubtype imSubtype, + @Nullable final InputMethodSubtype imSubtype, @NonNull final KeyboardLayout layout) { mImi = imi; mImSubtype = imSubtype;