Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e776821a authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Move IME related seach landing pages to its fragments

This CL moves the code building index of IMEs from
InputMethodAndLanguageSettings to VirtualKeyboardFragment and
AvailableVirtualKeyboardFragment, so that a search landing page of IME
becomes one of the fragment correctly depending on the IME state.

Bug: 32643633
Test: Manually installing/uninstalling AOSP LatinIME.apk while
      Settings app is/isn't running, then search AOSP and verify the
      landing page is correctly determined by the IME's enable state.
Test: Update robolectric DynamicIndexableContentMonitorTest
Change-Id: Ie44f358c2d3919fc864f4f88e6229293113823dd
parent 7bbc632b
Loading
Loading
Loading
Loading
+54 −1
Original line number Diff line number Diff line
@@ -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);
        }
    };
}
+0 −36
Original line number Diff line number Diff line
@@ -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);
+18 −1
Original line number Diff line number Diff line
@@ -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);
        }
    };
}
+10 −4
Original line number Diff line number Diff line
@@ -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
+5 −0
Original line number Diff line number Diff line
@@ -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);
Loading