Merge "Show app level settings when app doesn't use topics."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 90d8793..c158511 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4,9 +4,6 @@
coreApp="true"
android:sharedUserId="android.uid.system">
- <uses-sdk
- android:minSdkVersion="21" />
-
<original-package android:name="com.android.settings" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
@@ -638,7 +635,7 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.inputmethod.KeyboardLayoutPickerFragment" />
+ android:value="com.android.settings.inputmethod.KeyboardLayoutPickerFragment2" />
</activity>
<!-- Keep compatibility with old shortcuts. -->
diff --git a/res/layout/preference_settings_icon_widget.xml b/res/layout/preference_settings_icon_widget.xml
new file mode 100644
index 0000000..7160ca7
--- /dev/null
+++ b/res/layout/preference_settings_icon_widget.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_settings_24dp"
+ android:tint="@color/material_grey_600"
+ android:contentDescription="@null"/>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8a1a76a..89c05ad 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3557,6 +3557,10 @@
<string name="show_ime_summary">Keep it on screen while physical keyboard is active</string>
<!-- Title for the button to trigger the 'keyboard shortcuts helper' dialog. [CHAR LIMIT=35] -->
<string name="keyboard_shortcuts_helper">Keyboard shortcuts helper</string>
+ <!--
+ Format string for a physical device in the form: InputMethodSubtype - InputMethodEditor.
+ 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>
<!-- On Language & input settings screen, heading. Inside the "Language & input settings" screen, this is the header for settings that relate to mouse and trackpad devices. [CHAR LIMIT=40] -->
<string name="pointer_settings_category">Mouse/trackpad</string>
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index a375cb1..da9f2fd 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -79,6 +79,7 @@
import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
import com.android.settings.inputmethod.KeyboardLayoutPickerFragment;
+import com.android.settings.inputmethod.KeyboardLayoutPickerFragment2;
import com.android.settings.inputmethod.SpellCheckersSettings;
import com.android.settings.inputmethod.UserDictionaryList;
import com.android.settings.localepicker.LocaleListEditor;
@@ -292,6 +293,7 @@
TrustedCredentialsSettings.class.getName(),
PaymentSettings.class.getName(),
KeyboardLayoutPickerFragment.class.getName(),
+ KeyboardLayoutPickerFragment2.class.getName(),
ZenModeSettings.class.getName(),
SoundSettings.class.getName(),
ConfigureNotificationSettings.class.getName(),
diff --git a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
index 2e4242a..a8a7086 100644
--- a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
@@ -20,6 +20,9 @@
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.res.Configuration;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.preference.PreferenceScreen;
import android.view.inputmethod.InputMethodInfo;
@@ -38,6 +41,8 @@
public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFragment
implements InputMethodPreference.OnSavePreferenceListener {
+ private static final Drawable NO_ICON = new ColorDrawable(Color.TRANSPARENT);
+
private final ArrayList<InputMethodPreference> mInputMethodPreferenceList = new ArrayList<>();
private InputMethodSettingValuesWrapper mInputMethodSettingValues;
private InputMethodManager mImm;
@@ -93,8 +98,15 @@
final InputMethodInfo imi = imis.get(i);
final boolean isAllowedByOrganization = permittedList == null
|| permittedList.contains(imi.getPackageName());
+ Drawable icon;
+ try {
+ icon = getActivity().getPackageManager().getApplicationIcon(imi.getPackageName());
+ } catch (Exception e) {
+ icon = NO_ICON;
+ }
final InputMethodPreference pref = new InputMethodPreference(
context, imi, true, isAllowedByOrganization, this);
+ pref.setIcon(icon);
mInputMethodPreferenceList.add(pref);
}
final Collator collator = Collator.getInstance();
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index e38f181..c807e8a 100755
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -54,6 +54,7 @@
OnPreferenceChangeListener {
private static final String TAG = InputMethodPreference.class.getSimpleName();
private static final String EMPTY_TEXT = "";
+ private static final int SETTINGS_ICON_LAYOUT = R.layout.preference_settings_icon_widget;
interface OnSavePreferenceListener {
/**
@@ -97,8 +98,8 @@
mIsAllowedByOrganization = isAllowedByOrganization;
mOnSaveListener = onSaveListener;
if (!isImeEnabler) {
- // Hide switch widget.
- setWidgetLayoutResource(0 /* widgetLayoutResId */);
+ // Replace switch widget with settings icon.
+ setWidgetLayoutResource(SETTINGS_ICON_LAYOUT);
}
// Disable on/off switch texts.
setSwitchTextOn(EMPTY_TEXT);
@@ -134,7 +135,7 @@
private boolean isImeEnabler() {
// If this {@link SwitchPreference} doesn't have a widget layout, we explicitly hide the
// switch widget at constructor.
- return getWidgetLayoutResource() != 0;
+ return getWidgetLayoutResource() != SETTINGS_ICON_LAYOUT;
}
@Override
diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java b/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
index 68ceeef..ad7a2b1 100644
--- a/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
+++ b/src/com/android/settings/inputmethod/KeyboardLayoutDialogFragment.java
@@ -301,7 +301,7 @@
}
}
- static final class KeyboardLayoutLoader extends AsyncTaskLoader<Keyboards> {
+ private static final class KeyboardLayoutLoader extends AsyncTaskLoader<Keyboards> {
private final InputDeviceIdentifier mInputDeviceIdentifier;
public KeyboardLayoutLoader(Context context, InputDeviceIdentifier inputDeviceIdentifier) {
diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java
new file mode 100644
index 0000000..28c82e2
--- /dev/null
+++ b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment2.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.inputmethod;
+
+import android.app.Activity;
+import android.hardware.input.InputDeviceIdentifier;
+import android.hardware.input.InputManager;
+import android.hardware.input.InputManager.InputDeviceListener;
+import android.hardware.input.KeyboardLayout;
+import android.os.Bundle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.view.InputDevice;
+
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.util.Preconditions;
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class KeyboardLayoutPickerFragment2 extends SettingsPreferenceFragment
+ implements InputDeviceListener {
+
+ private InputDeviceIdentifier mInputDeviceIdentifier;
+ private int mInputDeviceId = -1;
+ private InputManager mIm;
+ private InputMethodInfo mImi;
+ private InputMethodSubtype mSubtype;
+ private KeyboardLayout[] mKeyboardLayouts;
+ private Map<Preference, KeyboardLayout> mPreferenceMap = new HashMap<>();
+
+ // TODO: Make these constants public API for b/25752827
+
+ /**
+ * Intent extra: The input device descriptor of the keyboard whose keyboard
+ * layout is to be changed.
+ */
+ public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
+
+ /**
+ * Intent extra: The associated {@link InputMethodInfo}.
+ */
+ public static final String EXTRA_INPUT_METHOD_INFO = "input_method_info";
+
+ /**
+ * Intent extra: The associated {@link InputMethodSubtype}.
+ */
+ public static final String EXTRA_INPUT_METHOD_SUBTYPE = "input_method_subtype";
+
+ @Override
+ protected int getMetricsCategory() {
+ return MetricsLogger.INPUTMETHOD_KEYBOARD;
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ Activity activity = Preconditions.checkNotNull(getActivity());
+
+ mInputDeviceIdentifier = activity.getIntent().getParcelableExtra(
+ EXTRA_INPUT_DEVICE_IDENTIFIER);
+ mImi = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_INFO);
+ mSubtype = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_SUBTYPE);
+
+ if (mInputDeviceIdentifier == null || mImi == null || mSubtype == null) {
+ activity.finish();
+ }
+
+ mIm = activity.getSystemService(InputManager.class);
+ mKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(mInputDeviceIdentifier);
+ Arrays.sort(mKeyboardLayouts);
+ setPreferenceScreen(createPreferenceHierarchy());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ mIm.registerInputDeviceListener(this, null);
+
+ InputDevice inputDevice =
+ mIm.getInputDeviceByDescriptor(mInputDeviceIdentifier.getDescriptor());
+ if (inputDevice == null) {
+ getActivity().finish();
+ return;
+ }
+ mInputDeviceId = inputDevice.getId();
+ }
+
+ @Override
+ public void onPause() {
+ mIm.unregisterInputDeviceListener(this);
+ mInputDeviceId = -1;
+
+ super.onPause();
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ KeyboardLayout layout = mPreferenceMap.get(preference);
+ if (layout != null) {
+ mIm.setKeyboardLayoutForInputDevice(mInputDeviceIdentifier, mImi, mSubtype,
+ layout.getDescriptor());
+ getActivity().finish();
+ return true;
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ @Override
+ public void onInputDeviceAdded(int deviceId) {}
+
+ @Override
+ public void onInputDeviceChanged(int deviceId) {}
+
+ @Override
+ public void onInputDeviceRemoved(int deviceId) {
+ if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
+ getActivity().finish();
+ }
+ }
+
+ private PreferenceScreen createPreferenceHierarchy() {
+ PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());
+
+ for (KeyboardLayout layout : mKeyboardLayouts) {
+ Preference pref = new Preference(getPrefContext());
+ pref.setTitle(layout.getLabel());
+ root.addPreference(pref);
+ mPreferenceMap.put(pref, layout);
+ }
+
+ root.setTitle(PhysicalKeyboardFragment.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 8f7d99e..74d474c 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -18,6 +18,8 @@
import android.app.Activity;
import android.app.LoaderManager;
+import android.content.AsyncTaskLoader;
+import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.database.ContentObserver;
@@ -34,6 +36,8 @@
import android.util.Pair;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
import android.widget.Toast;
import com.android.internal.inputmethod.InputMethodUtils;
@@ -44,22 +48,25 @@
import com.android.settings.SettingsPreferenceFragment;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
- implements LoaderManager.LoaderCallbacks<KeyboardLayoutDialogFragment.Keyboards>,
+ implements LoaderManager.LoaderCallbacks<PhysicalKeyboardFragment.Keyboards>,
InputManager.InputDeviceListener {
private static final int USER_SYSTEM = 0;
private static final String KEYBOARD_ASSISTANCE_CATEGORY = "keyboard_assistance_category";
private static final String SHOW_VIRTUAL_KEYBOARD_SWITCH = "show_virtual_keyboard_switch";
private static final String KEYBOARD_SHORTCUTS_HELPER = "keyboard_shortcuts_helper";
+ private static final String IM_SUBTYPE_MODE_KEYBOARD = "keyboard";
- private final ArrayList<PreferenceCategory> mHardKeyboardPreferenceList = new ArrayList<>();
private final HashMap<Integer, Pair<InputDeviceIdentifier, PreferenceCategory>> mLoaderReference
= new HashMap<>();
+ private final Map<InputMethodInfo, List<InputMethodSubtype>> mImiSubtypes = new HashMap<>();
private InputManager mIm;
+ private InputMethodManager mImm;
private PreferenceCategory mKeyboardAssistanceCategory;
private SwitchPreference mShowVirtualKeyboardSwitch;
private InputMethodUtils.InputMethodSettings mSettings;
@@ -69,6 +76,7 @@
Activity activity = Preconditions.checkNotNull(getActivity());
addPreferencesFromResource(R.xml.physical_keyboard_settings);
mIm = Preconditions.checkNotNull(activity.getSystemService(InputManager.class));
+ mImm = Preconditions.checkNotNull(activity.getSystemService(InputMethodManager.class));
mSettings = new InputMethodUtils.InputMethodSettings(
activity.getResources(),
getContentResolver(),
@@ -110,29 +118,32 @@
}
@Override
- public Loader<KeyboardLayoutDialogFragment.Keyboards> onCreateLoader(int id, Bundle args) {
- InputDeviceIdentifier deviceId = mLoaderReference.get(id).first;
- return new KeyboardLayoutDialogFragment.KeyboardLayoutLoader(
- getActivity().getBaseContext(), deviceId);
+ public Loader<Keyboards> onCreateLoader(int id, Bundle args) {
+ final InputDeviceIdentifier deviceId = mLoaderReference.get(id).first;
+ return new KeyboardLayoutLoader(
+ getActivity().getBaseContext(), mIm, mImiSubtypes, deviceId);
}
@Override
- public void onLoadFinished(
- final Loader<KeyboardLayoutDialogFragment.Keyboards> loader,
- KeyboardLayoutDialogFragment.Keyboards data) {
+ public void onLoadFinished(Loader<Keyboards> loader, Keyboards data) {
// TODO: Investigate why this is being called twice.
final InputDeviceIdentifier deviceId = mLoaderReference.get(loader.getId()).first;
final PreferenceCategory category = mLoaderReference.get(loader.getId()).second;
category.removeAll();
- for (KeyboardLayout layout : data.keyboardLayouts) {
- if (layout != null) {
- Preference pref = new Preference(getPrefContext(), null);
- pref.setTitle(layout.getLabel());
- pref.setSummary(layout.getCollection());
+ for (Keyboards.KeyboardInfo info : data.mInfos) {
+ 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(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
- showKeyboardLayoutScreen(deviceId);
+ showKeyboardLayoutScreen(deviceId, imi, imSubtype);
return true;
}
});
@@ -142,7 +153,7 @@
}
@Override
- public void onLoaderReset(Loader<KeyboardLayoutDialogFragment.Keyboards> loader) {}
+ public void onLoaderReset(Loader<Keyboards> loader) {}
@Override
public void onInputDeviceAdded(int deviceId) {
@@ -166,38 +177,21 @@
private void updateHardKeyboards() {
clearHardKeyboardsData();
+ loadInputMethodInfoSubtypes();
final int[] devices = InputDevice.getDeviceIds();
for (int deviceIndex = 0; deviceIndex < devices.length; deviceIndex++) {
InputDevice device = InputDevice.getDevice(devices[deviceIndex]);
if (device != null
&& !device.isVirtual()
&& device.isFullKeyboard()) {
- final InputDeviceIdentifier deviceId = device.getIdentifier();
- final String keyboardLayoutDescriptor =
- mIm.getCurrentKeyboardLayoutForInputDevice(deviceId);
- final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ?
- mIm.getKeyboardLayout(keyboardLayoutDescriptor) : null;
-
final PreferenceCategory category = new PreferenceCategory(getPrefContext(), null);
category.setTitle(device.getName());
- if (keyboardLayout != null) {
- category.setSummary(keyboardLayout.toString());
- } else {
- category.setSummary(R.string.keyboard_layout_default_label);
- }
- mLoaderReference.put(deviceIndex, new Pair(deviceId, category));
- mHardKeyboardPreferenceList.add(category);
+ category.setOrder(0);
+ mLoaderReference.put(deviceIndex, new Pair(device.getIdentifier(), category));
+ getPreferenceScreen().addPreference(category);
}
}
-
- Collections.sort(mHardKeyboardPreferenceList);
- final int count = mHardKeyboardPreferenceList.size();
- for (int i = 0; i < count; i++) {
- final PreferenceCategory category = mHardKeyboardPreferenceList.get(i);
- category.setOrder(i);
- getPreferenceScreen().addPreference(category);
- }
- mKeyboardAssistanceCategory.setOrder(count);
+ mKeyboardAssistanceCategory.setOrder(1);
getPreferenceScreen().addPreference(mKeyboardAssistanceCategory);
for (int deviceIndex : mLoaderReference.keySet()) {
@@ -206,11 +200,16 @@
updateShowVirtualKeyboardSwitch();
}
- private void showKeyboardLayoutScreen(InputDeviceIdentifier inputDeviceIdentifier) {
+ private void showKeyboardLayoutScreen(
+ InputDeviceIdentifier inputDeviceIdentifier,
+ InputMethodInfo imi,
+ InputMethodSubtype imSubtype) {
final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClass(getActivity(), Settings.KeyboardLayoutPickerActivity.class);
- intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER,
+ intent.putExtra(KeyboardLayoutPickerFragment2.EXTRA_INPUT_DEVICE_IDENTIFIER,
inputDeviceIdentifier);
+ intent.putExtra(KeyboardLayoutPickerFragment2.EXTRA_INPUT_METHOD_INFO, imi);
+ intent.putExtra(KeyboardLayoutPickerFragment2.EXTRA_INPUT_METHOD_SUBTYPE, imSubtype);
startActivity(intent);
}
@@ -220,7 +219,21 @@
getLoaderManager().destroyLoader(index);
}
mLoaderReference.clear();
- mHardKeyboardPreferenceList.clear();
+ }
+
+ private void loadInputMethodInfoSubtypes() {
+ mImiSubtypes.clear();
+ final List<InputMethodInfo> imis = mImm.getEnabledInputMethodList();
+ for (InputMethodInfo imi : imis) {
+ final List<InputMethodSubtype> subtypes = new ArrayList<>();
+ for (InputMethodSubtype subtype : mImm.getEnabledInputMethodSubtypeList(
+ imi, true /* allowsImplicitlySelectedSubtypes */)) {
+ if (IM_SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())) {
+ subtypes.add(subtype);
+ }
+ }
+ mImiSubtypes.put(imi, subtypes);
+ }
}
private void registerShowVirtualKeyboardSettingsObserver() {
@@ -261,4 +274,77 @@
updateShowVirtualKeyboardSwitch();
}
};
+
+ static String getDisplayName(
+ Context context, InputMethodInfo imi, InputMethodSubtype imSubtype) {
+ CharSequence imSubtypeName = imSubtype.getDisplayName(
+ context, imi.getPackageName(),
+ imi.getServiceInfo().applicationInfo);
+ CharSequence imeName = imi.loadLabel(context.getPackageManager());
+ return String.format(
+ context.getString(R.string.physical_device_title), imSubtypeName, imeName);
+ }
+
+ private static final class KeyboardLayoutLoader extends AsyncTaskLoader<Keyboards> {
+
+ private final Map<InputMethodInfo, List<InputMethodSubtype>> mImiSubtypes;
+ private final InputDeviceIdentifier mInputDeviceIdentifier;
+ private final InputManager mIm;
+
+ public KeyboardLayoutLoader(
+ Context context,
+ InputManager im,
+ Map<InputMethodInfo, List<InputMethodSubtype>> imiSubtypes,
+ InputDeviceIdentifier inputDeviceIdentifier) {
+ super(context);
+ mIm = Preconditions.checkNotNull(im);
+ mInputDeviceIdentifier = Preconditions.checkNotNull(inputDeviceIdentifier);
+ mImiSubtypes = new HashMap<>(imiSubtypes);
+ }
+
+ @Override
+ public Keyboards loadInBackground() {
+ final Keyboards keyboards = new Keyboards();
+ for (InputMethodInfo imi : mImiSubtypes.keySet()) {
+ for (InputMethodSubtype subtype : mImiSubtypes.get(imi)) {
+ final KeyboardLayout layout = mIm.getKeyboardLayoutForInputDevice(
+ mInputDeviceIdentifier, imi, subtype);
+ keyboards.mInfos.add(new Keyboards.KeyboardInfo(imi, subtype, layout));
+ }
+ }
+ return keyboards;
+ }
+
+ @Override
+ protected void onStartLoading() {
+ super.onStartLoading();
+ forceLoad();
+ }
+
+ @Override
+ protected void onStopLoading() {
+ super.onStopLoading();
+ cancelLoad();
+ }
+ }
+
+ public static final class Keyboards {
+
+ public final ArrayList<KeyboardInfo> mInfos = new ArrayList<>();
+
+ public static final class KeyboardInfo {
+
+ public final InputMethodInfo mImi;
+ public final InputMethodSubtype mImSubtype;
+ public final KeyboardLayout mLayout;
+
+ public KeyboardInfo(
+ InputMethodInfo imi, InputMethodSubtype imSubtype, KeyboardLayout layout) {
+ mImi = imi;
+ mImSubtype = imSubtype;
+ mLayout = layout;
+ }
+ }
+ }
+
}
diff --git a/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java
index 541c686..b6ca9f2 100644
--- a/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java
@@ -19,6 +19,9 @@
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.view.inputmethod.InputMethodInfo;
@@ -38,6 +41,7 @@
public final class VirtualKeyboardFragment extends SettingsPreferenceFragment {
private static final String ADD_VIRTUAL_KEYBOARD_SCREEN = "add_virtual_keyboard_screen";
+ private static final Drawable NO_ICON = new ColorDrawable(Color.TRANSPARENT);
private final ArrayList<InputMethodPreference> mInputMethodPreferenceList = new ArrayList<>();
private InputMethodManager mImm;
@@ -78,12 +82,21 @@
final InputMethodInfo imi = imis.get(i);
final boolean isAllowedByOrganization = permittedList == null
|| permittedList.contains(imi.getPackageName());
+ Drawable icon;
+ try {
+ // TODO: Consider other ways to retrieve an icon to show here.
+ icon = getActivity().getPackageManager().getApplicationIcon(imi.getPackageName());
+ } catch (Exception e) {
+ // TODO: Consider handling the error differently perhaps by showing default icons.
+ icon = NO_ICON;
+ }
final InputMethodPreference pref = new InputMethodPreference(
context,
imi,
false, /* isImeEnabler */
isAllowedByOrganization,
null /* this can be null since isImeEnabler is false */);
+ pref.setIcon(icon);
mInputMethodPreferenceList.add(pref);
}
final Collator collator = Collator.getInstance();
@@ -101,6 +114,7 @@
InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref);
pref.updatePreferenceViews();
}
+ mAddVirtualKeyboardScreen.setIcon(R.drawable.ic_add);
mAddVirtualKeyboardScreen.setOrder(N);
getPreferenceScreen().addPreference(mAddVirtualKeyboardScreen);
}