From 226e452c15c0edcee1217e9a0fedd8155dfa5a6b Mon Sep 17 00:00:00 2001 From: Abodunrinwa Toki Date: Fri, 22 Apr 2016 17:45:03 +0100 Subject: [PATCH] InputSettings: Define order of items in Physical keyboards screen. Bug: 28158120 Change-Id: Ia7cec64edb9da53a2048865e317b2b9d4b2059b0 --- res/values/strings.xml | 2 +- .../inputmethod/KeyboardLayoutPickerFragment2.java | 3 +- .../inputmethod/PhysicalKeyboardFragment.java | 126 ++++++++++++++++----- 3 files changed, 102 insertions(+), 29 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 64d4834758..ea4da30658 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3669,7 +3669,7 @@ - %1$s - %2$s + %1$s - %2$s Default diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java index c0d67bbe50..0d4e173f73 100644 --- a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java +++ b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java @@ -34,6 +34,7 @@ import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.internal.util.Preconditions; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.inputmethod.PhysicalKeyboardFragment.KeyboardInfoPreference; import java.util.Arrays; import java.util.HashMap; @@ -153,7 +154,7 @@ public final class KeyboardLayoutPickerFragment2 extends SettingsPreferenceFragm mPreferenceMap.put(pref, layout); } - root.setTitle(PhysicalKeyboardFragment.getDisplayName(getContext(), mImi, mSubtype)); + root.setTitle(KeyboardInfoPreference.getDisplayName(getContext(), mImi, mSubtype)); return root; } } diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index 4c5a731782..de6c6998df 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -49,12 +49,13 @@ import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.SettingsPreferenceFragment; -import libcore.util.Objects; - +import java.text.Collator; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Objects; public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment implements InputManager.InputDeviceListener { @@ -67,6 +68,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment @NonNull private final List mLastHardKeyboards = new ArrayList<>(); + @NonNull + private final List mTempKeyboardInfoList = new ArrayList<>(); @NonNull private final HashSet mLoaderIDs = new HashSet<>(); @@ -136,6 +139,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment return; } + Collections.sort(keyboardsList); final PreferenceScreen preferenceScreen = getPreferenceScreen(); preferenceScreen.removeAll(); for (Keyboards keyboards : keyboardsList) { @@ -144,27 +148,26 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment category.setOrder(0); preferenceScreen.addPreference(category); for (Keyboards.KeyboardInfo info : keyboards.mKeyboardInfoList) { - Preference pref = new Preference(getPrefContext(), null); + mTempKeyboardInfoList.clear(); final InputMethodInfo imi = info.mImi; final InputMethodSubtype imSubtype = info.mImSubtype; if (imi != null) { - pref.setTitle(getDisplayName(getContext(), imi, imSubtype)); - KeyboardLayout layout = info.mLayout; - if (layout != null) { - pref.setSummary(layout.getLabel()); - } else { - pref.setSummary( - getPrefContext().getString(R.string.default_keyboard_layout)); - } + KeyboardInfoPreference pref = + new KeyboardInfoPreference(getPrefContext(), info); pref.setOnPreferenceClickListener(preference -> { showKeyboardLayoutScreen( keyboards.mDeviceInfo.mDeviceIdentifier, imi, imSubtype); return true; }); + mTempKeyboardInfoList.add(pref); + Collections.sort(mTempKeyboardInfoList); + } + for (KeyboardInfoPreference pref : mTempKeyboardInfoList) { category.addPreference(pref); } } } + mTempKeyboardInfoList.clear(); mKeyboardAssistanceCategory.setOrder(1); preferenceScreen.addPreference(mKeyboardAssistanceCategory); updateShowVirtualKeyboardSwitch(); @@ -205,7 +208,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment private void updateHardKeyboards() { final ArrayList newHardKeyboards = getHardKeyboards(); - if (!Objects.equal(newHardKeyboards, mLastHardKeyboards)) { + if (!Objects.equals(newHardKeyboards, mLastHardKeyboards)) { clearLoader(); mLastHardKeyboards.clear(); mLastHardKeyboards.addAll(newHardKeyboards); @@ -274,20 +277,6 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } }; - @NonNull - static CharSequence getDisplayName( - @NonNull Context context, @NonNull InputMethodInfo imi, - @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); - return String.format( - context.getString(R.string.physical_device_title), imSubtypeName, imeName); - } - private static final class Callbacks implements LoaderManager.LoaderCallbacks> { @NonNull final Context mContext; @@ -424,11 +413,13 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } } - public static final class Keyboards { + public static final class Keyboards implements Comparable { @NonNull public final HardKeyboardDeviceInfo mDeviceInfo; @NonNull public final ArrayList mKeyboardInfoList; + @NonNull + public final Collator mCollator = Collator.getInstance(); public Keyboards( @NonNull final HardKeyboardDeviceInfo deviceInfo, @@ -437,6 +428,11 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment mKeyboardInfoList = keyboardInfoList; } + @Override + public int compareTo(@NonNull Keyboards another) { + return mCollator.compare(mDeviceInfo.mDeviceName, another.mDeviceInfo.mDeviceName); + } + public static final class KeyboardInfo { @NonNull public final InputMethodInfo mImi; @@ -456,4 +452,80 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } } + static final class KeyboardInfoPreference extends Preference { + + @NonNull + private final CharSequence mImeName; + @Nullable + private final CharSequence mImSubtypeName; + @NonNull + private final Collator collator = Collator.getInstance(); + + private KeyboardInfoPreference( + @NonNull Context context, @NonNull Keyboards.KeyboardInfo info) { + super(context); + mImeName = info.mImi.loadLabel(context.getPackageManager()); + mImSubtypeName = getImSubtypeName(context, info.mImi, info.mImSubtype); + setTitle(formatDisplayName(context, mImeName, mImSubtypeName)); + if (info.mLayout != null) { + setSummary(info.mLayout.getLabel()); + } + } + + @NonNull + static CharSequence getDisplayName( + @NonNull Context context, @NonNull InputMethodInfo imi, + @Nullable InputMethodSubtype imSubtype) { + final CharSequence imeName = imi.loadLabel(context.getPackageManager()); + final CharSequence imSubtypeName = getImSubtypeName(context, imi, imSubtype); + return formatDisplayName(context, imeName, imSubtypeName); + } + + private static CharSequence formatDisplayName( + @NonNull Context context, + @NonNull CharSequence imeName, @Nullable CharSequence imSubtypeName) { + if (imSubtypeName == null) { + return imeName; + } + return String.format( + context.getString(R.string.physical_device_title), imeName, imSubtypeName); + } + + @Nullable + private static CharSequence getImSubtypeName( + @NonNull Context context, @NonNull InputMethodInfo imi, + @Nullable InputMethodSubtype imSubtype) { + if (imSubtype != null) { + return imSubtype.getDisplayName( + context, imi.getPackageName(), imi.getServiceInfo().applicationInfo); + } + return null; + } + + @Override + public int compareTo(@NonNull Preference object) { + if (!(object instanceof KeyboardInfoPreference)) { + return super.compareTo(object); + } + KeyboardInfoPreference another = (KeyboardInfoPreference) object; + int result = compare(mImeName, another.mImeName); + if (result == 0) { + result = compare(mImSubtypeName, another.mImSubtypeName); + } + return result; + } + + private int compare(@Nullable CharSequence lhs, @Nullable CharSequence rhs) { + if (!TextUtils.isEmpty(lhs) && !TextUtils.isEmpty(rhs)) { + return collator.compare(lhs.toString(), rhs.toString()); + } else if (TextUtils.isEmpty(lhs) && TextUtils.isEmpty(rhs)) { + return 0; + } else if (!TextUtils.isEmpty(lhs)) { + return -1; + } else { + return 1; + } + } + } + } -- 2.11.0