From 6118469cae605511f3d252ea8c6ada332ad3c14a Mon Sep 17 00:00:00 2001 From: Abodunrinwa Toki Date: Mon, 11 Apr 2016 11:30:30 +0100 Subject: [PATCH] Show Physical keyboards only after everything has been loaded This patch loads all physical keyboards at once and only updates the screen after that returns. Previously, each keyboard's data was loaded individually and the screen was updated for each keyboard when the data was received. Bug: 27549590 Change-Id: I05d80d74df14fb7bfaa0ce76a1f8919889865108 --- .../inputmethod/PhysicalKeyboardFragment.java | 125 +++++++++--------- 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index 7f590a1dcbe..496edb87cb1 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -54,6 +54,7 @@ import libcore.util.Objects; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment implements InputManager.InputDeviceListener { @@ -64,7 +65,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment private static final String IM_SUBTYPE_MODE_KEYBOARD = "keyboard"; @NonNull - private final ArrayList mLastHardKeyboards = new ArrayList<>(); + private final List mLastHardKeyboards = new ArrayList<>(); @NonNull private final HashSet mLoaderIDs = new HashSet<>(); @@ -119,32 +120,42 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment unregisterShowVirtualKeyboardSettingsObserver(); } - public void onLoadFinishedInternal(final int loaderId, @NonNull final Keyboards data, - @NonNull final PreferenceCategory preferenceCategory) { + public void onLoadFinishedInternal( + final int loaderId, @NonNull final List keyboardsList) { if (!mLoaderIDs.remove(loaderId)) { // Already destroyed loader. Ignore. return; } - final InputDeviceIdentifier deviceId = data.mInputDeviceIdentifier; - preferenceCategory.removeAll(); - for (Keyboards.KeyboardInfo info : data.mKeyboardInfoList) { - Preference pref = new Preference(getPrefContext(), null); - final InputMethodInfo imi = info.mImi; - final InputMethodSubtype imSubtype = info.mImSubtype; - if (imi != null && imSubtype != null) { - pref.setTitle(getDisplayName(getContext(), imi, imSubtype)); - KeyboardLayout layout = info.mLayout; - if (layout != null) { - pref.setSummary(layout.getLabel()); + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + preferenceScreen.removeAll(); + for (Keyboards keyboards : keyboardsList) { + final PreferenceCategory category = new PreferenceCategory(getPrefContext(), null); + category.setTitle(keyboards.mDeviceInfo.mDeviceName); + category.setOrder(0); + preferenceScreen.addPreference(category); + for (Keyboards.KeyboardInfo info : keyboards.mKeyboardInfoList) { + Preference pref = new Preference(getPrefContext(), null); + final InputMethodInfo imi = info.mImi; + final InputMethodSubtype imSubtype = info.mImSubtype; + if (imi != null && imSubtype != null) { + pref.setTitle(getDisplayName(getContext(), imi, imSubtype)); + KeyboardLayout layout = info.mLayout; + if (layout != null) { + pref.setSummary(layout.getLabel()); + } + pref.setOnPreferenceClickListener(preference -> { + showKeyboardLayoutScreen( + keyboards.mDeviceInfo.mDeviceIdentifier, imi, imSubtype); + return true; + }); + category.addPreference(pref); } - pref.setOnPreferenceClickListener(preference -> { - showKeyboardLayoutScreen(deviceId, imi, imSubtype); - return true; - }); - preferenceCategory.addPreference(pref); } } + mKeyboardAssistanceCategory.setOrder(1); + preferenceScreen.addPreference(mKeyboardAssistanceCategory); + updateShowVirtualKeyboardSwitch(); } @Override @@ -184,27 +195,13 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment final ArrayList newHardKeyboards = getHardKeyboards(); if (!Objects.equal(newHardKeyboards, mLastHardKeyboards)) { clearLoader(); - final PreferenceScreen preferenceScreen = getPreferenceScreen(); - preferenceScreen.removeAll(); mLastHardKeyboards.clear(); mLastHardKeyboards.addAll(newHardKeyboards); - final int N = newHardKeyboards.size(); - for (int i = 0; i < N; ++i) { - final HardKeyboardDeviceInfo deviceInfo = newHardKeyboards.get(i); - final PreferenceCategory category = new PreferenceCategory(getPrefContext(), null); - category.setTitle(deviceInfo.mDeviceName); - category.setOrder(0); - getLoaderManager().initLoader(mNextLoaderId, null, - new Callbacks(getContext(), this, deviceInfo.mDeviceIdentifier, category)); - mLoaderIDs.add(mNextLoaderId); - ++mNextLoaderId; - preferenceScreen.addPreference(category); - } - mKeyboardAssistanceCategory.setOrder(1); - preferenceScreen.addPreference(mKeyboardAssistanceCategory); - + getLoaderManager().initLoader(mNextLoaderId, null, + new Callbacks(getContext(), this, mLastHardKeyboards)); + mLoaderIDs.add(mNextLoaderId); + ++mNextLoaderId; } - updateShowVirtualKeyboardSwitch(); } private void showKeyboardLayoutScreen( @@ -272,56 +269,49 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment context.getString(R.string.physical_device_title), imSubtypeName, imeName); } - private static final class Callbacks - implements LoaderManager.LoaderCallbacks { + private static final class Callbacks implements LoaderManager.LoaderCallbacks> { @NonNull final Context mContext; @NonNull final PhysicalKeyboardFragment mPhysicalKeyboardFragment; @NonNull - final InputDeviceIdentifier mInputDeviceIdentifier; - @NonNull - final PreferenceCategory mPreferenceCategory; + final List mHardKeyboards; public Callbacks( @NonNull Context context, @NonNull PhysicalKeyboardFragment physicalKeyboardFragment, - @NonNull InputDeviceIdentifier inputDeviceIdentifier, - @NonNull PreferenceCategory preferenceCategory) { + @NonNull List hardKeyboards) { mContext = context; mPhysicalKeyboardFragment = physicalKeyboardFragment; - mInputDeviceIdentifier = inputDeviceIdentifier; - mPreferenceCategory = preferenceCategory; + mHardKeyboards = hardKeyboards; } @Override - public Loader onCreateLoader(int id, Bundle args) { - return new KeyboardLayoutLoader(mContext, mInputDeviceIdentifier); + public Loader> onCreateLoader(int id, Bundle args) { + return new KeyboardLayoutLoader(mContext, mHardKeyboards); } @Override - public void onLoadFinished(Loader loader, Keyboards data) { - mPhysicalKeyboardFragment.onLoadFinishedInternal(loader.getId(), data, - mPreferenceCategory); + public void onLoadFinished(Loader> loader, List data) { + mPhysicalKeyboardFragment.onLoadFinishedInternal(loader.getId(), data); } @Override - public void onLoaderReset(Loader loader) { + public void onLoaderReset(Loader> loader) { } } - private static final class KeyboardLayoutLoader extends AsyncTaskLoader { + private static final class KeyboardLayoutLoader extends AsyncTaskLoader> { @NonNull - private final InputDeviceIdentifier mInputDeviceIdentifier; + private final List mHardKeyboards; public KeyboardLayoutLoader( @NonNull Context context, - @NonNull InputDeviceIdentifier inputDeviceIdentifier) { + @NonNull List hardKeyboards) { super(context); - mInputDeviceIdentifier = Preconditions.checkNotNull(inputDeviceIdentifier); + mHardKeyboards = Preconditions.checkNotNull(hardKeyboards); } - @Override - public Keyboards loadInBackground() { + private Keyboards loadInBackground(HardKeyboardDeviceInfo deviceInfo) { final ArrayList keyboardInfoList = new ArrayList<>(); final InputMethodManager imm = getContext().getSystemService(InputMethodManager.class); final InputManager im = getContext().getSystemService(InputManager.class); @@ -333,12 +323,21 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment continue; } final KeyboardLayout layout = im.getKeyboardLayoutForInputDevice( - mInputDeviceIdentifier, imi, subtype); + deviceInfo.mDeviceIdentifier, imi, subtype); keyboardInfoList.add(new Keyboards.KeyboardInfo(imi, subtype, layout)); } } } - return new Keyboards(mInputDeviceIdentifier, keyboardInfoList); + return new Keyboards(deviceInfo, keyboardInfoList); + } + + @Override + public List loadInBackground() { + List keyboardsList = new ArrayList<>(mHardKeyboards.size()); + for (HardKeyboardDeviceInfo deviceInfo : mHardKeyboards) { + keyboardsList.add(loadInBackground(deviceInfo)); + } + return keyboardsList; } @Override @@ -395,14 +394,14 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment public static final class Keyboards { @NonNull - public final InputDeviceIdentifier mInputDeviceIdentifier; + public final HardKeyboardDeviceInfo mDeviceInfo; @NonNull public final ArrayList mKeyboardInfoList; public Keyboards( - @NonNull final InputDeviceIdentifier inputDeviceIdentifier, + @NonNull final HardKeyboardDeviceInfo deviceInfo, @NonNull final ArrayList keyboardInfoList) { - mInputDeviceIdentifier = inputDeviceIdentifier; + mDeviceInfo = deviceInfo; mKeyboardInfoList = keyboardInfoList; }