Merge "Move IME related seach landing pages to its fragments"

This commit is contained in:
Tadashi G. Takaoka
2017-01-12 03:51:56 +00:00
committed by Android (Google) Code Review
6 changed files with 103 additions and 49 deletions

View File

@@ -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<InputMethodPreference> mInputMethodPreferenceList = new ArrayList<>();
private InputMethodSettingValuesWrapper mInputMethodSettingValues;
@@ -169,4 +175,51 @@ public final class AvailableVirtualKeyboardFragment extends SettingsPreferenceFr
pref.updatePreferenceViews();
}
}
private static List<InputMethodSubtype> getAllSubtypesOf(final InputMethodInfo imi) {
final int subtypeCount = imi.getSubtypeCount();
final List<InputMethodSubtype> allSubtypes = new ArrayList<>(subtypeCount);
for (int index = 0; index < subtypeCount; index++) {
allSubtypes.add(imi.getSubtypeAt(index));
}
return allSubtypes;
}
static List<SearchIndexableRaw> buildSearchIndexOfInputMethods(final Context context,
final List<InputMethodInfo> inputMethods, final String screenTitle) {
final List<SearchIndexableRaw> 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<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
final InputMethodManager imm = context.getSystemService(InputMethodManager.class);
final List<InputMethodInfo> enabledInputMethods = imm.getEnabledInputMethodList();
final List<InputMethodInfo> 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);
}
};
}

View File

@@ -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<InputMethodInfo> inputMethods = immValues.getInputMethodList();
final int inputMethodCount = (inputMethods == null ? 0 : inputMethods.size());
for (int i = 0; i < inputMethodCount; ++i) {
InputMethodInfo inputMethod = inputMethods.get(i);
List<InputMethodSubtype> 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);

View File

@@ -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<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
final InputMethodManager imm = context.getSystemService(InputMethodManager.class);
final List<InputMethodInfo> enabledInputMethods = imm.getEnabledInputMethodList();
final String screenTitle = context.getString(R.string.virtual_keyboard_category);
return AvailableVirtualKeyboardFragment
.buildSearchIndexOfInputMethods(context, enabledInputMethods, screenTitle);
}
};
}

View File

@@ -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

View File

@@ -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);

View File

@@ -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