Merge "Show Physical keyboards only after everything has been loaded" into nyc-dev

This commit is contained in:
Abodunrinwa Toki
2016-04-14 10:04:16 +00:00
committed by Android (Google) Code Review

View File

@@ -54,6 +54,7 @@ import libcore.util.Objects;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
implements InputManager.InputDeviceListener { implements InputManager.InputDeviceListener {
@@ -65,7 +66,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
private static final String IM_SUBTYPE_MODE_KEYBOARD = "keyboard"; private static final String IM_SUBTYPE_MODE_KEYBOARD = "keyboard";
@NonNull @NonNull
private final ArrayList<HardKeyboardDeviceInfo> mLastHardKeyboards = new ArrayList<>(); private final List<HardKeyboardDeviceInfo> mLastHardKeyboards = new ArrayList<>();
@NonNull @NonNull
private final HashSet<Integer> mLoaderIDs = new HashSet<>(); private final HashSet<Integer> mLoaderIDs = new HashSet<>();
@@ -128,32 +129,42 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
unregisterShowVirtualKeyboardSettingsObserver(); unregisterShowVirtualKeyboardSettingsObserver();
} }
public void onLoadFinishedInternal(final int loaderId, @NonNull final Keyboards data, public void onLoadFinishedInternal(
@NonNull final PreferenceCategory preferenceCategory) { final int loaderId, @NonNull final List<Keyboards> keyboardsList) {
if (!mLoaderIDs.remove(loaderId)) { if (!mLoaderIDs.remove(loaderId)) {
// Already destroyed loader. Ignore. // Already destroyed loader. Ignore.
return; return;
} }
final InputDeviceIdentifier deviceId = data.mInputDeviceIdentifier; final PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceCategory.removeAll(); preferenceScreen.removeAll();
for (Keyboards.KeyboardInfo info : data.mKeyboardInfoList) { for (Keyboards keyboards : keyboardsList) {
Preference pref = new Preference(getPrefContext(), null); final PreferenceCategory category = new PreferenceCategory(getPrefContext(), null);
final InputMethodInfo imi = info.mImi; category.setTitle(keyboards.mDeviceInfo.mDeviceName);
final InputMethodSubtype imSubtype = info.mImSubtype; category.setOrder(0);
if (imi != null && imSubtype != null) { preferenceScreen.addPreference(category);
pref.setTitle(getDisplayName(getContext(), imi, imSubtype)); for (Keyboards.KeyboardInfo info : keyboards.mKeyboardInfoList) {
KeyboardLayout layout = info.mLayout; Preference pref = new Preference(getPrefContext(), null);
if (layout != null) { final InputMethodInfo imi = info.mImi;
pref.setSummary(layout.getLabel()); 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 @Override
@@ -193,27 +204,13 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
final ArrayList<HardKeyboardDeviceInfo> newHardKeyboards = getHardKeyboards(); final ArrayList<HardKeyboardDeviceInfo> newHardKeyboards = getHardKeyboards();
if (!Objects.equal(newHardKeyboards, mLastHardKeyboards)) { if (!Objects.equal(newHardKeyboards, mLastHardKeyboards)) {
clearLoader(); clearLoader();
final PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removeAll();
mLastHardKeyboards.clear(); mLastHardKeyboards.clear();
mLastHardKeyboards.addAll(newHardKeyboards); mLastHardKeyboards.addAll(newHardKeyboards);
final int N = newHardKeyboards.size(); getLoaderManager().initLoader(mNextLoaderId, null,
for (int i = 0; i < N; ++i) { new Callbacks(getContext(), this, mLastHardKeyboards));
final HardKeyboardDeviceInfo deviceInfo = newHardKeyboards.get(i); mLoaderIDs.add(mNextLoaderId);
final PreferenceCategory category = new PreferenceCategory(getPrefContext(), null); ++mNextLoaderId;
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);
} }
updateShowVirtualKeyboardSwitch();
} }
private void showKeyboardLayoutScreen( private void showKeyboardLayoutScreen(
@@ -285,56 +282,49 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
context.getString(R.string.physical_device_title), imSubtypeName, imeName); context.getString(R.string.physical_device_title), imSubtypeName, imeName);
} }
private static final class Callbacks private static final class Callbacks implements LoaderManager.LoaderCallbacks<List<Keyboards>> {
implements LoaderManager.LoaderCallbacks<PhysicalKeyboardFragment.Keyboards> {
@NonNull @NonNull
final Context mContext; final Context mContext;
@NonNull @NonNull
final PhysicalKeyboardFragment mPhysicalKeyboardFragment; final PhysicalKeyboardFragment mPhysicalKeyboardFragment;
@NonNull @NonNull
final InputDeviceIdentifier mInputDeviceIdentifier; final List<HardKeyboardDeviceInfo> mHardKeyboards;
@NonNull
final PreferenceCategory mPreferenceCategory;
public Callbacks( public Callbacks(
@NonNull Context context, @NonNull Context context,
@NonNull PhysicalKeyboardFragment physicalKeyboardFragment, @NonNull PhysicalKeyboardFragment physicalKeyboardFragment,
@NonNull InputDeviceIdentifier inputDeviceIdentifier, @NonNull List<HardKeyboardDeviceInfo> hardKeyboards) {
@NonNull PreferenceCategory preferenceCategory) {
mContext = context; mContext = context;
mPhysicalKeyboardFragment = physicalKeyboardFragment; mPhysicalKeyboardFragment = physicalKeyboardFragment;
mInputDeviceIdentifier = inputDeviceIdentifier; mHardKeyboards = hardKeyboards;
mPreferenceCategory = preferenceCategory;
} }
@Override @Override
public Loader<Keyboards> onCreateLoader(int id, Bundle args) { public Loader<List<Keyboards>> onCreateLoader(int id, Bundle args) {
return new KeyboardLayoutLoader(mContext, mInputDeviceIdentifier); return new KeyboardLayoutLoader(mContext, mHardKeyboards);
} }
@Override @Override
public void onLoadFinished(Loader<Keyboards> loader, Keyboards data) { public void onLoadFinished(Loader<List<Keyboards>> loader, List<Keyboards> data) {
mPhysicalKeyboardFragment.onLoadFinishedInternal(loader.getId(), data, mPhysicalKeyboardFragment.onLoadFinishedInternal(loader.getId(), data);
mPreferenceCategory);
} }
@Override @Override
public void onLoaderReset(Loader<Keyboards> loader) { public void onLoaderReset(Loader<List<Keyboards>> loader) {
} }
} }
private static final class KeyboardLayoutLoader extends AsyncTaskLoader<Keyboards> { private static final class KeyboardLayoutLoader extends AsyncTaskLoader<List<Keyboards>> {
@NonNull @NonNull
private final InputDeviceIdentifier mInputDeviceIdentifier; private final List<HardKeyboardDeviceInfo> mHardKeyboards;
public KeyboardLayoutLoader( public KeyboardLayoutLoader(
@NonNull Context context, @NonNull Context context,
@NonNull InputDeviceIdentifier inputDeviceIdentifier) { @NonNull List<HardKeyboardDeviceInfo> hardKeyboards) {
super(context); super(context);
mInputDeviceIdentifier = Preconditions.checkNotNull(inputDeviceIdentifier); mHardKeyboards = Preconditions.checkNotNull(hardKeyboards);
} }
@Override private Keyboards loadInBackground(HardKeyboardDeviceInfo deviceInfo) {
public Keyboards loadInBackground() {
final ArrayList<Keyboards.KeyboardInfo> keyboardInfoList = new ArrayList<>(); final ArrayList<Keyboards.KeyboardInfo> keyboardInfoList = new ArrayList<>();
final InputMethodManager imm = getContext().getSystemService(InputMethodManager.class); final InputMethodManager imm = getContext().getSystemService(InputMethodManager.class);
final InputManager im = getContext().getSystemService(InputManager.class); final InputManager im = getContext().getSystemService(InputManager.class);
@@ -346,12 +336,21 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
continue; continue;
} }
final KeyboardLayout layout = im.getKeyboardLayoutForInputDevice( final KeyboardLayout layout = im.getKeyboardLayoutForInputDevice(
mInputDeviceIdentifier, imi, subtype); deviceInfo.mDeviceIdentifier, imi, subtype);
keyboardInfoList.add(new Keyboards.KeyboardInfo(imi, subtype, layout)); keyboardInfoList.add(new Keyboards.KeyboardInfo(imi, subtype, layout));
} }
} }
} }
return new Keyboards(mInputDeviceIdentifier, keyboardInfoList); return new Keyboards(deviceInfo, keyboardInfoList);
}
@Override
public List<Keyboards> loadInBackground() {
List<Keyboards> keyboardsList = new ArrayList<>(mHardKeyboards.size());
for (HardKeyboardDeviceInfo deviceInfo : mHardKeyboards) {
keyboardsList.add(loadInBackground(deviceInfo));
}
return keyboardsList;
} }
@Override @Override
@@ -408,14 +407,14 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
public static final class Keyboards { public static final class Keyboards {
@NonNull @NonNull
public final InputDeviceIdentifier mInputDeviceIdentifier; public final HardKeyboardDeviceInfo mDeviceInfo;
@NonNull @NonNull
public final ArrayList<KeyboardInfo> mKeyboardInfoList; public final ArrayList<KeyboardInfo> mKeyboardInfoList;
public Keyboards( public Keyboards(
@NonNull final InputDeviceIdentifier inputDeviceIdentifier, @NonNull final HardKeyboardDeviceInfo deviceInfo,
@NonNull final ArrayList<KeyboardInfo> keyboardInfoList) { @NonNull final ArrayList<KeyboardInfo> keyboardInfoList) {
mInputDeviceIdentifier = inputDeviceIdentifier; mDeviceInfo = deviceInfo;
mKeyboardInfoList = keyboardInfoList; mKeyboardInfoList = keyboardInfoList;
} }