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

Commit 73038da3 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Move physical keyboard search landing page to its Fragment"

parents 80506ce8 7bbc632b
Loading
Loading
Loading
Loading
+1 −41
Original line number Diff line number Diff line
@@ -22,11 +22,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ServiceInfo;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import android.hardware.input.KeyboardLayout;
import android.speech.tts.TtsEngines;
import android.support.v7.preference.Preference;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
@@ -246,44 +243,7 @@ public class InputMethodAndLanguageSettings extends DashboardFragment
                indexables.add(indexable);
            }

            // TODO: Move to PhysicalKeyboardFragment.
            // Hard keyboards
            InputManager inputManager = (InputManager) context.getSystemService(
                    Context.INPUT_SERVICE);
            boolean hasHardKeyboards = false;

            final int[] devices = InputDevice.getDeviceIds();
            for (int i = 0; i < devices.length; i++) {
                InputDevice device = InputDevice.getDevice(devices[i]);
                if (device == null || device.isVirtual() || !device.isFullKeyboard()) {
                    continue;
                }

                hasHardKeyboards = true;

                InputDeviceIdentifier identifier = device.getIdentifier();
                String keyboardLayoutDescriptor =
                        inputManager.getCurrentKeyboardLayoutForInputDevice(identifier);
                KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ?
                        inputManager.getKeyboardLayout(keyboardLayoutDescriptor) : null;

                String summary;
                if (keyboardLayout != null) {
                    summary = keyboardLayout.toString();
                } else {
                    summary = context.getString(R.string.keyboard_layout_default_label);
                }

                indexable = new SearchIndexableRaw(context);
                indexable.key = device.getName();
                indexable.title = device.getName();
                indexable.summaryOn = summary;
                indexable.summaryOff = summary;
                indexable.screenTitle = screenTitle;
                indexables.add(indexable);
            }

            if (hasHardKeyboards) {
            if (!PhysicalKeyboardFragment.getPhysicalFullKeyboards().isEmpty()) {
                // Hard keyboard category.
                indexable = new SearchIndexableRaw(context);
                indexable.key = "builtin_keyboard_settings";
+43 −1
Original line number Diff line number Diff line
@@ -49,6 +49,9 @@ import com.android.internal.util.Preconditions;
import com.android.settings.R;
import com.android.settings.Settings;
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;
@@ -59,7 +62,7 @@ import java.util.List;
import java.util.Objects;

public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
        implements InputManager.InputDeviceListener {
        implements InputManager.InputDeviceListener, Indexable {

    private static final String KEYBOARD_ASSISTANCE_CATEGORY = "keyboard_assistance_category";
    private static final String SHOW_VIRTUAL_KEYBOARD_SWITCH = "show_virtual_keyboard_switch";
@@ -528,4 +531,43 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
        }
    }

    public static List<InputDevice> getPhysicalFullKeyboards() {
        List<InputDevice> keyboards = null;
        for (final int deviceId : InputDevice.getDeviceIds()) {
            final InputDevice device = InputDevice.getDevice(deviceId);
            if (device != null && !device.isVirtual() && device.isFullKeyboard()) {
                if (keyboards == null) keyboards = new ArrayList<>();
                keyboards.add(device);
            }
        }
        return (keyboards == null) ? Collections.emptyList() : keyboards;
    }

    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
            new BaseSearchIndexProvider() {
        @Override
        public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
            final InputManager inputManager = (InputManager) context.getSystemService(
                    Context.INPUT_SERVICE);
            final String screenTitle = context.getString(R.string.physical_keyboard_title);
            final List<SearchIndexableRaw> indexes = new ArrayList<>();
            for (final InputDevice device : getPhysicalFullKeyboards()) {
                final String keyboardLayoutDescriptor = inputManager
                        .getCurrentKeyboardLayoutForInputDevice(device.getIdentifier());
                final KeyboardLayout keyboardLayout = (keyboardLayoutDescriptor != null)
                        ? inputManager.getKeyboardLayout(keyboardLayoutDescriptor) : null;
                final String summary = (keyboardLayout != null)
                        ? keyboardLayout.toString()
                        : context.getString(R.string.keyboard_layout_default_label);
                final SearchIndexableRaw index = new SearchIndexableRaw(context);
                index.key = device.getName();
                index.title = device.getName();
                index.summaryOn = summary;
                index.summaryOff = summary;
                index.screenTitle = screenTitle;
                indexes.add(index);
            }
            return indexes;
        }
    };
}
+2 −2
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.view.inputmethod.InputMethodManager;
import com.android.internal.content.PackageMonitor;
import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.print.PrintSettingsFragment;

import java.util.ArrayList;
@@ -205,8 +206,7 @@ public final class DynamicIndexableContentMonitor implements
        }

        private void buildIndex(boolean rebuild) {
            // TODO: Fix landing page to PhysicalKeyboardFragment.
            mIndex.updateFromClassNameResource(InputMethodAndLanguageSettings.class.getName(),
            mIndex.updateFromClassNameResource(PhysicalKeyboardFragment.class.getName(),
                    rebuild, true /* includeInSearchResult */);
        }

+2 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import com.android.settings.gestures.GestureSettings;
import com.android.settings.gestures.PickupGestureSettings;
import com.android.settings.gestures.SwipeToNotificationSettings;
import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.location.LocationSettings;
import com.android.settings.location.ScanningSettings;
import com.android.settings.network.NetworkDashboardFragment;
@@ -141,6 +142,7 @@ public final class SearchIndexableResources {
                R.drawable.ic_settings_accounts);
        addIndex(InputMethodAndLanguageSettings.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);
        addIndex(AccessibilitySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_accessibility);
+9 −20
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
@@ -58,6 +57,7 @@ import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.testutils.shadow.ShadowActivityWithLoadManager;
import com.android.settings.testutils.shadow.ShadowContextImplWithRegisterReceiver;
@@ -69,7 +69,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.verification.VerificationMode;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@@ -210,9 +209,7 @@ public class DynamicIndexableContentMonitorTest {
        mMonitor.register(mActivity, LOADER_ID, mIndex, true /* isUserUnlocked */);

        // Rebuild indexing should happen.
        // CAVEAT: Currently InputMethodAndLanuageSettings may be indexed once for input devices and
        // once for input methods.
        verifyRebuildIndexing(InputMethodAndLanguageSettings.class, atLeastOnce());
        verifyRebuildIndexing(PhysicalKeyboardFragment.class);
        // Input monitor should be registered to InputManager.
        final InputManager.InputDeviceListener listener = extactInputDeviceListener();
        assertThat(listener).isNotNull();
@@ -224,7 +221,7 @@ public class DynamicIndexableContentMonitorTest {

        mMonitor.register(mActivity, LOADER_ID, mIndex, true /* isUserUnlocked */);

        verifyNoIndexing(InputMethodAndLanguageSettings.class);
        verifyNoIndexing(PhysicalKeyboardFragment.class);
        assertThat(extactInputDeviceListener()).isEqualTo(listener);

        /*
@@ -234,7 +231,7 @@ public class DynamicIndexableContentMonitorTest {

        listener.onInputDeviceAdded(1 /* deviceId */);

        verifyIncrementalIndexing(InputMethodAndLanguageSettings.class);
        verifyIncrementalIndexing(PhysicalKeyboardFragment.class);

        /*
         * A device is removed.
@@ -243,7 +240,7 @@ public class DynamicIndexableContentMonitorTest {

        listener.onInputDeviceRemoved(2 /* deviceId */);

        verifyRebuildIndexing(InputMethodAndLanguageSettings.class);
        verifyRebuildIndexing(PhysicalKeyboardFragment.class);

        /*
         * A device is changed.
@@ -252,7 +249,7 @@ public class DynamicIndexableContentMonitorTest {

        listener.onInputDeviceChanged(3 /* deviceId */);

        verifyRebuildIndexing(InputMethodAndLanguageSettings.class);
        verifyRebuildIndexing(PhysicalKeyboardFragment.class);
    }

    @Test
@@ -338,9 +335,7 @@ public class DynamicIndexableContentMonitorTest {
        final PackageMonitor packageMonitor = extractPackageMonitor();
        assertThat(packageMonitor).isNotNull();

        // CAVEAT: Currently InputMethodAndLanuageSettings may be indexed once for input devices and
        // once for input methods.
        verifyRebuildIndexing(InputMethodAndLanguageSettings.class, atLeastOnce());
        verifyRebuildIndexing(InputMethodAndLanguageSettings.class);

        /*
         * When an input method service package is installed, incremental indexing happen.
@@ -417,9 +412,7 @@ public class DynamicIndexableContentMonitorTest {
        final ContentObserver observer = extractContentObserver(UserDictionary.Words.CONTENT_URI);
        assertThat(observer).isNotNull();

        // CAVEAT: Currently InputMethodAndLanuageSettings may be indexed once for input devices and
        // once for input methods.
        verifyRebuildIndexing(InputMethodAndLanguageSettings.class, atLeastOnce());
        verifyRebuildIndexing(InputMethodAndLanguageSettings.class);

        /*
         * When user dictionary content is changed, rebuild indexing happens.
@@ -441,11 +434,7 @@ public class DynamicIndexableContentMonitorTest {
    }

    private void verifyRebuildIndexing(Class<?> indexingClass) {
        verifyRebuildIndexing(indexingClass, times(1));
    }

    private void verifyRebuildIndexing(Class<?> indexingClass, VerificationMode verificationMode) {
        verify(mIndex, verificationMode).updateFromClassNameResource(indexingClass.getName(),
        verify(mIndex, times(1)).updateFromClassNameResource(indexingClass.getName(),
                true /* rebuild */, true /* includeInSearchResults */);
        verify(mIndex, never()).updateFromClassNameResource(indexingClass.getName(),
                false /* rebuild */, true /* includeInSearchResults */);