Merge "Move physical keyboard search landing page to its Fragment"
This commit is contained in:
committed by
Android (Google) Code Review
commit
73038da358
@@ -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";
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@@ -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 */);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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 */);
|
||||||
|
Reference in New Issue
Block a user