diff --git a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java index 0dbab44d433..b9c07962587 100644 --- a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -33,9 +34,14 @@ import android.os.Bundle; import android.support.v7.preference.PreferenceScreen; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; +import android.view.inputmethod.InputMethodSubtype; + import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; +import com.android.settings.search.SearchIndexableRaw; import java.text.Collator; import java.util.ArrayList; @@ -44,7 +50,7 @@ import java.util.Comparator; import java.util.List; public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFragment - implements InputMethodPreference.OnSavePreferenceListener { + implements InputMethodPreference.OnSavePreferenceListener, Indexable { private final ArrayList mInputMethodPreferenceList = new ArrayList<>(); private InputMethodSettingValuesWrapper mInputMethodSettingValues; @@ -169,4 +175,51 @@ public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFr pref.updatePreferenceViews(); } } + + private static List getAllSubtypesOf(final InputMethodInfo imi) { + final int subtypeCount = imi.getSubtypeCount(); + final List allSubtypes = new ArrayList<>(subtypeCount); + for (int index = 0; index < subtypeCount; index++) { + allSubtypes.add(imi.getSubtypeAt(index)); + } + return allSubtypes; + } + + static List buildSearchIndexOfInputMethods(final Context context, + final List inputMethods, final String screenTitle) { + final List indexes = new ArrayList<>(); + final InputMethodManager imm = (InputMethodManager) context.getSystemService( + Context.INPUT_METHOD_SERVICE); + for (int i = 0; i < inputMethods.size(); i++) { + final InputMethodInfo imi = inputMethods.get(i); + final ServiceInfo serviceInfo = imi.getServiceInfo(); + final SearchIndexableRaw index = new SearchIndexableRaw(context); + index.key = new ComponentName(serviceInfo.packageName, serviceInfo.name) + .flattenToString(); + index.title = imi.loadLabel(context.getPackageManager()).toString(); + index.summaryOn = index.summaryOff = InputMethodAndSubtypeUtil + .getSubtypeLocaleNameListAsSentence(getAllSubtypesOf(imi), context, imi); + index.screenTitle = screenTitle; + indexes.add(index); + } + return indexes; + } + + public static Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getRawDataToIndex(Context context, boolean enabled) { + final InputMethodManager imm = context.getSystemService(InputMethodManager.class); + final List enabledInputMethods = imm.getEnabledInputMethodList(); + final List disabledInputMethods = new ArrayList<>(); + for (final InputMethodInfo imi : imm.getInputMethodList()) { + if (!enabledInputMethods.contains(imi)) { + disabledInputMethods.add(imi); + } + } + final String screenTitle = context.getString( + R.string.available_virtual_keyboard_category); + return buildSearchIndexOfInputMethods(context, disabledInputMethods, screenTitle); + } + }; } diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java index 49d2ee3e9c4..587d0397311 100644 --- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java +++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java @@ -17,16 +17,11 @@ package com.android.settings.inputmethod; import android.app.Activity; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.ServiceInfo; import android.hardware.input.InputDeviceIdentifier; import android.speech.tts.TtsEngines; import android.support.v7.preference.Preference; -import android.view.inputmethod.InputMethodInfo; -import android.view.inputmethod.InputMethodManager; -import android.view.inputmethod.InputMethodSubtype; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; @@ -212,37 +207,6 @@ public class InputMethodAndLanguageSettings extends DashboardFragment indexable.keywords = context.getString(R.string.keywords_keyboard_and_ime); indexables.add(indexable); - InputMethodSettingValuesWrapper immValues = InputMethodSettingValuesWrapper - .getInstance(context); - immValues.refreshAllInputMethodAndSubtypes(); - - InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService( - Context.INPUT_METHOD_SERVICE); - - // TODO: Move to VirtualKeyboardFragment and AvailableVirtualKeyboardFragment. - // All other IMEs. - List inputMethods = immValues.getInputMethodList(); - final int inputMethodCount = (inputMethods == null ? 0 : inputMethods.size()); - for (int i = 0; i < inputMethodCount; ++i) { - InputMethodInfo inputMethod = inputMethods.get(i); - List subtypes = inputMethodManager - .getEnabledInputMethodSubtypeList(inputMethod, true); - String summary = InputMethodAndSubtypeUtil.getSubtypeLocaleNameListAsSentence( - subtypes, context, inputMethod); - - ServiceInfo serviceInfo = inputMethod.getServiceInfo(); - ComponentName componentName = new ComponentName(serviceInfo.packageName, - serviceInfo.name); - - indexable = new SearchIndexableRaw(context); - indexable.key = componentName.flattenToString(); - indexable.title = inputMethod.loadLabel(context.getPackageManager()).toString(); - indexable.summaryOn = summary; - indexable.summaryOff = summary; - indexable.screenTitle = screenTitle; - indexables.add(indexable); - } - if (!PhysicalKeyboardFragment.getPhysicalFullKeyboards().isEmpty()) { // Hard keyboard category. indexable = new SearchIndexableRaw(context); diff --git a/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java index 24c2ebcc7ce..da5cb04db1d 100644 --- a/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/VirtualKeyboardFragment.java @@ -26,10 +26,15 @@ import android.os.Bundle; import android.support.v7.preference.Preference; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; +import android.view.inputmethod.InputMethodSubtype; + import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.Preconditions; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; +import com.android.settings.search.SearchIndexableRaw; import java.text.Collator; import java.util.ArrayList; @@ -37,7 +42,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -public final class VirtualKeyboardFragment extends SettingsPreferenceFragment { +public final class VirtualKeyboardFragment extends SettingsPreferenceFragment implements Indexable { private static final String ADD_VIRTUAL_KEYBOARD_SCREEN = "add_virtual_keyboard_screen"; private static final Drawable NO_ICON = new ColorDrawable(Color.TRANSPARENT); @@ -117,4 +122,16 @@ public final class VirtualKeyboardFragment extends SettingsPreferenceFragment { mAddVirtualKeyboardScreen.setOrder(N); getPreferenceScreen().addPreference(mAddVirtualKeyboardScreen); } + + public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getRawDataToIndex(Context context, boolean enabled) { + final InputMethodManager imm = context.getSystemService(InputMethodManager.class); + final List enabledInputMethods = imm.getEnabledInputMethodList(); + final String screenTitle = context.getString(R.string.virtual_keyboard_category); + return AvailableVirtualKeyboardFragment + .buildSearchIndexOfInputMethods(context, enabledInputMethods, screenTitle); + } + }; } diff --git a/src/com/android/settings/search/DynamicIndexableContentMonitor.java b/src/com/android/settings/search/DynamicIndexableContentMonitor.java index 0a8e0894262..870baae750a 100644 --- a/src/com/android/settings/search/DynamicIndexableContentMonitor.java +++ b/src/com/android/settings/search/DynamicIndexableContentMonitor.java @@ -47,8 +47,10 @@ import android.view.inputmethod.InputMethodManager; import com.android.internal.content.PackageMonitor; import com.android.settings.accessibility.AccessibilitySettings; +import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment; import com.android.settings.inputmethod.InputMethodAndLanguageSettings; import com.android.settings.inputmethod.PhysicalKeyboardFragment; +import com.android.settings.inputmethod.VirtualKeyboardFragment; import com.android.settings.print.PrintSettingsFragment; import java.util.ArrayList; @@ -418,7 +420,11 @@ public final class DynamicIndexableContentMonitor implements mPackageManager = context.getPackageManager(); mContentResolver = context.getContentResolver(); mInputMethodServices.clear(); + // Build index of {@link UserDictionary}. buildIndex(InputMethodAndLanguageSettings.class, true /* rebuild */); + // Build index of IMEs. + buildIndex(VirtualKeyboardFragment.class, true /* rebuild */); + buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */); // Cache IME service packages to know when they go away. final InputMethodManager inputMethodManager = (InputMethodManager) context @@ -451,15 +457,15 @@ public final class DynamicIndexableContentMonitor implements .queryIntentServices(intent, 0 /* flags */); if (services == null || services.isEmpty()) return; mInputMethodServices.add(packageName); - // TODO: Fix landing page to VirtualKeyboardFragment. - buildIndex(InputMethodAndLanguageSettings.class, false /* rebuild */); + buildIndex(VirtualKeyboardFragment.class, false /* rebuild */); + buildIndex(AvailableVirtualKeyboardFragment.class, false /* rebuild */); } synchronized void onPackageUnavailable(String packageName) { if (mIndex == null) return; if (!mInputMethodServices.remove(packageName)) return; - // TODO: Fix landing page to AvailableVirtualKeyboardFragment. - buildIndex(InputMethodAndLanguageSettings.class, true /* rebuild */); + buildIndex(VirtualKeyboardFragment.class, true /* rebuild */); + buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */); } @Override diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index e1b7fd717cd..831244b5361 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -54,8 +54,10 @@ import com.android.settings.gestures.DoubleTwistGestureSettings; import com.android.settings.gestures.GestureSettings; import com.android.settings.gestures.PickupGestureSettings; import com.android.settings.gestures.SwipeToNotificationSettings; +import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment; import com.android.settings.inputmethod.InputMethodAndLanguageSettings; import com.android.settings.inputmethod.PhysicalKeyboardFragment; +import com.android.settings.inputmethod.VirtualKeyboardFragment; import com.android.settings.location.LocationSettings; import com.android.settings.location.ScanningSettings; import com.android.settings.network.NetworkDashboardFragment; @@ -142,6 +144,9 @@ public final class SearchIndexableResources { R.drawable.ic_settings_accounts); addIndex(InputMethodAndLanguageSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_language); + addIndex(VirtualKeyboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language); + addIndex(AvailableVirtualKeyboardFragment.class, + NO_DATA_RES_ID, R.drawable.ic_settings_language); addIndex(PhysicalKeyboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language); addIndex(PrivacySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_backup); addIndex(DateTimeSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_date_time); diff --git a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java index 5a2622244b6..57efb203787 100644 --- a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java +++ b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java @@ -56,8 +56,10 @@ import com.android.internal.content.PackageMonitor; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.accessibility.AccessibilitySettings; +import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment; import com.android.settings.inputmethod.InputMethodAndLanguageSettings; import com.android.settings.inputmethod.PhysicalKeyboardFragment; +import com.android.settings.inputmethod.VirtualKeyboardFragment; import com.android.settings.print.PrintSettingsFragment; import com.android.settings.testutils.shadow.ShadowActivityWithLoadManager; import com.android.settings.testutils.shadow.ShadowContextImplWithRegisterReceiver; @@ -335,7 +337,8 @@ public class DynamicIndexableContentMonitorTest { final PackageMonitor packageMonitor = extractPackageMonitor(); assertThat(packageMonitor).isNotNull(); - verifyRebuildIndexing(InputMethodAndLanguageSettings.class); + verifyRebuildIndexing(VirtualKeyboardFragment.class); + verifyRebuildIndexing(AvailableVirtualKeyboardFragment.class); /* * When an input method service package is installed, incremental indexing happen. @@ -346,7 +349,8 @@ public class DynamicIndexableContentMonitorTest { packageMonitor.onPackageAppeared(IME_PACKAGE_1, USER_ID); Robolectric.flushBackgroundThreadScheduler(); - verifyIncrementalIndexing(InputMethodAndLanguageSettings.class); + verifyIncrementalIndexing(VirtualKeyboardFragment.class); + verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class); /* * When another input method service package is installed, incremental indexing happens. @@ -357,7 +361,8 @@ public class DynamicIndexableContentMonitorTest { packageMonitor.onPackageAppeared(IME_PACKAGE_2, USER_ID); Robolectric.flushBackgroundThreadScheduler(); - verifyIncrementalIndexing(InputMethodAndLanguageSettings.class); + verifyIncrementalIndexing(VirtualKeyboardFragment.class); + verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class); /* * When an input method service is disabled, rebuild indexing happens. @@ -369,7 +374,8 @@ public class DynamicIndexableContentMonitorTest { packageMonitor.onPackageModified(IME_PACKAGE_1); Robolectric.flushBackgroundThreadScheduler(); - verifyRebuildIndexing(InputMethodAndLanguageSettings.class); + verifyRebuildIndexing(VirtualKeyboardFragment.class); + verifyRebuildIndexing(AvailableVirtualKeyboardFragment.class); /* * When an input method service is enabled, incremental indexing happens. @@ -381,7 +387,8 @@ public class DynamicIndexableContentMonitorTest { packageMonitor.onPackageModified(IME_PACKAGE_1); Robolectric.flushBackgroundThreadScheduler(); - verifyIncrementalIndexing(InputMethodAndLanguageSettings.class); + verifyIncrementalIndexing(VirtualKeyboardFragment.class); + verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class); /* * When an input method service package is uninstalled, rebuild indexing happens. @@ -391,7 +398,8 @@ public class DynamicIndexableContentMonitorTest { packageMonitor.onPackageDisappeared(IME_PACKAGE_1, USER_ID); - verifyRebuildIndexing(InputMethodAndLanguageSettings.class); + verifyRebuildIndexing(VirtualKeyboardFragment.class); + verifyRebuildIndexing(AvailableVirtualKeyboardFragment.class); /* * When an accessibility service package is installed, nothing happens. @@ -401,7 +409,8 @@ public class DynamicIndexableContentMonitorTest { packageMonitor.onPackageAppeared(A11Y_PACKAGE_1, USER_ID); - verifyNoIndexing(InputMethodAndLanguageSettings.class); + verifyNoIndexing(VirtualKeyboardFragment.class); + verifyNoIndexing(AvailableVirtualKeyboardFragment.class); } @Test