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

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

View File

@@ -22,11 +22,8 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import android.hardware.input.KeyboardLayout;
import android.speech.tts.TtsEngines; import android.speech.tts.TtsEngines;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype;
@@ -246,44 +243,7 @@ public class InputMethodAndLanguageSettings extends DashboardFragment
indexables.add(indexable); indexables.add(indexable);
} }
// TODO: Move to PhysicalKeyboardFragment. if (!PhysicalKeyboardFragment.getPhysicalFullKeyboards().isEmpty()) {
// 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) {
// Hard keyboard category. // Hard keyboard category.
indexable = new SearchIndexableRaw(context); indexable = new SearchIndexableRaw(context);
indexable.key = "builtin_keyboard_settings"; indexable.key = "builtin_keyboard_settings";

View File

@@ -49,6 +49,9 @@ import com.android.internal.util.Preconditions;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Settings; import com.android.settings.Settings;
import com.android.settings.SettingsPreferenceFragment; 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.text.Collator;
import java.util.ArrayList; import java.util.ArrayList;
@@ -59,7 +62,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment 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 KEYBOARD_ASSISTANCE_CATEGORY = "keyboard_assistance_category";
private static final String SHOW_VIRTUAL_KEYBOARD_SWITCH = "show_virtual_keyboard_switch"; 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;
}
};
} }

View File

@@ -48,6 +48,7 @@ import android.view.inputmethod.InputMethodManager;
import com.android.internal.content.PackageMonitor; import com.android.internal.content.PackageMonitor;
import com.android.settings.accessibility.AccessibilitySettings; import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.inputmethod.InputMethodAndLanguageSettings; import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.print.PrintSettingsFragment; import com.android.settings.print.PrintSettingsFragment;
import java.util.ArrayList; import java.util.ArrayList;
@@ -205,8 +206,7 @@ public final class DynamicIndexableContentMonitor implements
} }
private void buildIndex(boolean rebuild) { private void buildIndex(boolean rebuild) {
// TODO: Fix landing page to PhysicalKeyboardFragment. mIndex.updateFromClassNameResource(PhysicalKeyboardFragment.class.getName(),
mIndex.updateFromClassNameResource(InputMethodAndLanguageSettings.class.getName(),
rebuild, true /* includeInSearchResult */); rebuild, true /* includeInSearchResult */);
} }

View File

@@ -55,6 +55,7 @@ import com.android.settings.gestures.GestureSettings;
import com.android.settings.gestures.PickupGestureSettings; import com.android.settings.gestures.PickupGestureSettings;
import com.android.settings.gestures.SwipeToNotificationSettings; import com.android.settings.gestures.SwipeToNotificationSettings;
import com.android.settings.inputmethod.InputMethodAndLanguageSettings; import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.location.LocationSettings; import com.android.settings.location.LocationSettings;
import com.android.settings.location.ScanningSettings; import com.android.settings.location.ScanningSettings;
import com.android.settings.network.NetworkDashboardFragment; import com.android.settings.network.NetworkDashboardFragment;
@@ -141,6 +142,7 @@ public final class SearchIndexableResources {
R.drawable.ic_settings_accounts); R.drawable.ic_settings_accounts);
addIndex(InputMethodAndLanguageSettings.class, addIndex(InputMethodAndLanguageSettings.class,
NO_DATA_RES_ID, R.drawable.ic_settings_language); 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(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(DateTimeSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_date_time);
addIndex(AccessibilitySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_accessibility); addIndex(AccessibilitySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_accessibility);

View File

@@ -23,7 +23,6 @@ import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only; import static org.mockito.Mockito.only;
@@ -58,6 +57,7 @@ import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.accessibility.AccessibilitySettings; import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.inputmethod.InputMethodAndLanguageSettings; import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.print.PrintSettingsFragment; import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.testutils.shadow.ShadowActivityWithLoadManager; import com.android.settings.testutils.shadow.ShadowActivityWithLoadManager;
import com.android.settings.testutils.shadow.ShadowContextImplWithRegisterReceiver; import com.android.settings.testutils.shadow.ShadowContextImplWithRegisterReceiver;
@@ -69,7 +69,6 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.verification.VerificationMode;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@@ -210,9 +209,7 @@ public class DynamicIndexableContentMonitorTest {
mMonitor.register(mActivity, LOADER_ID, mIndex, true /* isUserUnlocked */); mMonitor.register(mActivity, LOADER_ID, mIndex, true /* isUserUnlocked */);
// Rebuild indexing should happen. // Rebuild indexing should happen.
// CAVEAT: Currently InputMethodAndLanuageSettings may be indexed once for input devices and verifyRebuildIndexing(PhysicalKeyboardFragment.class);
// once for input methods.
verifyRebuildIndexing(InputMethodAndLanguageSettings.class, atLeastOnce());
// Input monitor should be registered to InputManager. // Input monitor should be registered to InputManager.
final InputManager.InputDeviceListener listener = extactInputDeviceListener(); final InputManager.InputDeviceListener listener = extactInputDeviceListener();
assertThat(listener).isNotNull(); assertThat(listener).isNotNull();
@@ -224,7 +221,7 @@ public class DynamicIndexableContentMonitorTest {
mMonitor.register(mActivity, LOADER_ID, mIndex, true /* isUserUnlocked */); mMonitor.register(mActivity, LOADER_ID, mIndex, true /* isUserUnlocked */);
verifyNoIndexing(InputMethodAndLanguageSettings.class); verifyNoIndexing(PhysicalKeyboardFragment.class);
assertThat(extactInputDeviceListener()).isEqualTo(listener); assertThat(extactInputDeviceListener()).isEqualTo(listener);
/* /*
@@ -234,7 +231,7 @@ public class DynamicIndexableContentMonitorTest {
listener.onInputDeviceAdded(1 /* deviceId */); listener.onInputDeviceAdded(1 /* deviceId */);
verifyIncrementalIndexing(InputMethodAndLanguageSettings.class); verifyIncrementalIndexing(PhysicalKeyboardFragment.class);
/* /*
* A device is removed. * A device is removed.
@@ -243,7 +240,7 @@ public class DynamicIndexableContentMonitorTest {
listener.onInputDeviceRemoved(2 /* deviceId */); listener.onInputDeviceRemoved(2 /* deviceId */);
verifyRebuildIndexing(InputMethodAndLanguageSettings.class); verifyRebuildIndexing(PhysicalKeyboardFragment.class);
/* /*
* A device is changed. * A device is changed.
@@ -252,7 +249,7 @@ public class DynamicIndexableContentMonitorTest {
listener.onInputDeviceChanged(3 /* deviceId */); listener.onInputDeviceChanged(3 /* deviceId */);
verifyRebuildIndexing(InputMethodAndLanguageSettings.class); verifyRebuildIndexing(PhysicalKeyboardFragment.class);
} }
@Test @Test
@@ -338,9 +335,7 @@ public class DynamicIndexableContentMonitorTest {
final PackageMonitor packageMonitor = extractPackageMonitor(); final PackageMonitor packageMonitor = extractPackageMonitor();
assertThat(packageMonitor).isNotNull(); assertThat(packageMonitor).isNotNull();
// CAVEAT: Currently InputMethodAndLanuageSettings may be indexed once for input devices and verifyRebuildIndexing(InputMethodAndLanguageSettings.class);
// once for input methods.
verifyRebuildIndexing(InputMethodAndLanguageSettings.class, atLeastOnce());
/* /*
* When an input method service package is installed, incremental indexing happen. * 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); final ContentObserver observer = extractContentObserver(UserDictionary.Words.CONTENT_URI);
assertThat(observer).isNotNull(); assertThat(observer).isNotNull();
// CAVEAT: Currently InputMethodAndLanuageSettings may be indexed once for input devices and verifyRebuildIndexing(InputMethodAndLanguageSettings.class);
// once for input methods.
verifyRebuildIndexing(InputMethodAndLanguageSettings.class, atLeastOnce());
/* /*
* When user dictionary content is changed, rebuild indexing happens. * When user dictionary content is changed, rebuild indexing happens.
@@ -441,11 +434,7 @@ public class DynamicIndexableContentMonitorTest {
} }
private void verifyRebuildIndexing(Class<?> indexingClass) { private void verifyRebuildIndexing(Class<?> indexingClass) {
verifyRebuildIndexing(indexingClass, times(1)); verify(mIndex, times(1)).updateFromClassNameResource(indexingClass.getName(),
}
private void verifyRebuildIndexing(Class<?> indexingClass, VerificationMode verificationMode) {
verify(mIndex, verificationMode).updateFromClassNameResource(indexingClass.getName(),
true /* rebuild */, true /* includeInSearchResults */); true /* rebuild */, true /* includeInSearchResults */);
verify(mIndex, never()).updateFromClassNameResource(indexingClass.getName(), verify(mIndex, never()).updateFromClassNameResource(indexingClass.getName(),
false /* rebuild */, true /* includeInSearchResults */); false /* rebuild */, true /* includeInSearchResults */);