Merge "InputSettings: Define order of items in Physical keyboards screen." into nyc-dev

This commit is contained in:
Abodunrinwa Toki
2016-05-05 16:40:57 +00:00
committed by Android (Google) Code Review
3 changed files with 102 additions and 29 deletions

View File

@@ -3669,7 +3669,7 @@
<!-- <!--
Format string for a physical device in the form: InputMethodSubtype - InputMethodEditor. Format string for a physical device in the form: InputMethodSubtype - InputMethodEditor.
e.g. English (US) - X Keyboard --> e.g. English (US) - X Keyboard -->
<string name="physical_device_title"><xliff:g id="input_method_subtype" example="English (US)">%1$s</xliff:g> - <xliff:g id="input_method_editor" example="X Keyboard">%2$s</xliff:g></string> <string name="physical_device_title" translatable="false"><xliff:g id="input_method_editor" example="X Keyboard">%1$s</xliff:g> - <xliff:g id="input_method_subtype" example="English (US)">%2$s</xliff:g></string>
<!-- Summary text for keyboards when no layout has been selected. [CHAR LIMIT=35] --> <!-- Summary text for keyboards when no layout has been selected. [CHAR LIMIT=35] -->
<string name="default_keyboard_layout">Default</string> <string name="default_keyboard_layout">Default</string>

View File

@@ -34,6 +34,7 @@ import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.inputmethod.PhysicalKeyboardFragment.KeyboardInfoPreference;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@@ -153,7 +154,7 @@ public final class KeyboardLayoutPickerFragment2 extends SettingsPreferenceFragm
mPreferenceMap.put(pref, layout); mPreferenceMap.put(pref, layout);
} }
root.setTitle(PhysicalKeyboardFragment.getDisplayName(getContext(), mImi, mSubtype)); root.setTitle(KeyboardInfoPreference.getDisplayName(getContext(), mImi, mSubtype));
return root; return root;
} }
} }

View File

@@ -49,12 +49,13 @@ import com.android.settings.R;
import com.android.settings.Settings; import com.android.settings.Settings;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import libcore.util.Objects; import java.text.Collator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Objects;
public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
implements InputManager.InputDeviceListener { implements InputManager.InputDeviceListener {
@@ -67,6 +68,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
@NonNull @NonNull
private final List<HardKeyboardDeviceInfo> mLastHardKeyboards = new ArrayList<>(); private final List<HardKeyboardDeviceInfo> mLastHardKeyboards = new ArrayList<>();
@NonNull
private final List<KeyboardInfoPreference> mTempKeyboardInfoList = new ArrayList<>();
@NonNull @NonNull
private final HashSet<Integer> mLoaderIDs = new HashSet<>(); private final HashSet<Integer> mLoaderIDs = new HashSet<>();
@@ -136,6 +139,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
return; return;
} }
Collections.sort(keyboardsList);
final PreferenceScreen preferenceScreen = getPreferenceScreen(); final PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removeAll(); preferenceScreen.removeAll();
for (Keyboards keyboards : keyboardsList) { for (Keyboards keyboards : keyboardsList) {
@@ -144,27 +148,26 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
category.setOrder(0); category.setOrder(0);
preferenceScreen.addPreference(category); preferenceScreen.addPreference(category);
for (Keyboards.KeyboardInfo info : keyboards.mKeyboardInfoList) { for (Keyboards.KeyboardInfo info : keyboards.mKeyboardInfoList) {
Preference pref = new Preference(getPrefContext(), null); mTempKeyboardInfoList.clear();
final InputMethodInfo imi = info.mImi; final InputMethodInfo imi = info.mImi;
final InputMethodSubtype imSubtype = info.mImSubtype; final InputMethodSubtype imSubtype = info.mImSubtype;
if (imi != null) { if (imi != null) {
pref.setTitle(getDisplayName(getContext(), imi, imSubtype)); KeyboardInfoPreference pref =
KeyboardLayout layout = info.mLayout; new KeyboardInfoPreference(getPrefContext(), info);
if (layout != null) {
pref.setSummary(layout.getLabel());
} else {
pref.setSummary(
getPrefContext().getString(R.string.default_keyboard_layout));
}
pref.setOnPreferenceClickListener(preference -> { pref.setOnPreferenceClickListener(preference -> {
showKeyboardLayoutScreen( showKeyboardLayoutScreen(
keyboards.mDeviceInfo.mDeviceIdentifier, imi, imSubtype); keyboards.mDeviceInfo.mDeviceIdentifier, imi, imSubtype);
return true; return true;
}); });
mTempKeyboardInfoList.add(pref);
Collections.sort(mTempKeyboardInfoList);
}
for (KeyboardInfoPreference pref : mTempKeyboardInfoList) {
category.addPreference(pref); category.addPreference(pref);
} }
} }
} }
mTempKeyboardInfoList.clear();
mKeyboardAssistanceCategory.setOrder(1); mKeyboardAssistanceCategory.setOrder(1);
preferenceScreen.addPreference(mKeyboardAssistanceCategory); preferenceScreen.addPreference(mKeyboardAssistanceCategory);
updateShowVirtualKeyboardSwitch(); updateShowVirtualKeyboardSwitch();
@@ -205,7 +208,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
private void updateHardKeyboards() { private void updateHardKeyboards() {
final ArrayList<HardKeyboardDeviceInfo> newHardKeyboards = getHardKeyboards(); final ArrayList<HardKeyboardDeviceInfo> newHardKeyboards = getHardKeyboards();
if (!Objects.equal(newHardKeyboards, mLastHardKeyboards)) { if (!Objects.equals(newHardKeyboards, mLastHardKeyboards)) {
clearLoader(); clearLoader();
mLastHardKeyboards.clear(); mLastHardKeyboards.clear();
mLastHardKeyboards.addAll(newHardKeyboards); 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<List<Keyboards>> { private static final class Callbacks implements LoaderManager.LoaderCallbacks<List<Keyboards>> {
@NonNull @NonNull
final Context mContext; 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<Keyboards> {
@NonNull @NonNull
public final HardKeyboardDeviceInfo mDeviceInfo; public final HardKeyboardDeviceInfo mDeviceInfo;
@NonNull @NonNull
public final ArrayList<KeyboardInfo> mKeyboardInfoList; public final ArrayList<KeyboardInfo> mKeyboardInfoList;
@NonNull
public final Collator mCollator = Collator.getInstance();
public Keyboards( public Keyboards(
@NonNull final HardKeyboardDeviceInfo deviceInfo, @NonNull final HardKeyboardDeviceInfo deviceInfo,
@@ -437,6 +428,11 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
mKeyboardInfoList = keyboardInfoList; mKeyboardInfoList = keyboardInfoList;
} }
@Override
public int compareTo(@NonNull Keyboards another) {
return mCollator.compare(mDeviceInfo.mDeviceName, another.mDeviceInfo.mDeviceName);
}
public static final class KeyboardInfo { public static final class KeyboardInfo {
@NonNull @NonNull
public final InputMethodInfo mImi; 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;
}
}
}
} }