diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java index e122244625e..49d2ee3e9c4 100644 --- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java +++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java @@ -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"; diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index 5dd5ca13e03..1ecb2502533 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -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 getPhysicalFullKeyboards() { + List 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 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 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; + } + }; } diff --git a/src/com/android/settings/search/DynamicIndexableContentMonitor.java b/src/com/android/settings/search/DynamicIndexableContentMonitor.java index 34cdeba9e46..0a8e0894262 100644 --- a/src/com/android/settings/search/DynamicIndexableContentMonitor.java +++ b/src/com/android/settings/search/DynamicIndexableContentMonitor.java @@ -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 */); } diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index 4ecbcf11a94..e1b7fd717cd 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -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); diff --git a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java index 28fe8b00b16..5a2622244b6 100644 --- a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java +++ b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java @@ -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 */);