Merge "Add A11Y settings for Bounce keys and Sticky keys" into main
This commit is contained in:
committed by
Android (Google) Code Review
commit
da30b549be
@@ -4254,12 +4254,22 @@
|
|||||||
<string name="add_virtual_keyboard">Manage on-screen keyboards</string>
|
<string name="add_virtual_keyboard">Manage on-screen keyboards</string>
|
||||||
<!-- Title for the 'keyboard options' preference category. [CHAR LIMIT=35] -->
|
<!-- Title for the 'keyboard options' preference category. [CHAR LIMIT=35] -->
|
||||||
<string name="keyboard_options_category">Options</string>
|
<string name="keyboard_options_category">Options</string>
|
||||||
|
<!-- Title for the 'keyboard accessibility options' preference category. [CHAR LIMIT=35] -->
|
||||||
|
<string name="keyboard_a11y_category">Accessibility</string>
|
||||||
<!-- Title for the 'physical keyboard' settings screen. [CHAR LIMIT=35] -->
|
<!-- Title for the 'physical keyboard' settings screen. [CHAR LIMIT=35] -->
|
||||||
<string name="physical_keyboard_title">Physical keyboard</string>
|
<string name="physical_keyboard_title">Physical keyboard</string>
|
||||||
<!-- Title for the 'show virtual keyboard' preference switch. [CHAR LIMIT=35] -->
|
<!-- Title for the 'show virtual keyboard' preference switch. [CHAR LIMIT=35] -->
|
||||||
<string name="show_ime">Use on-screen keyboard</string>
|
<string name="show_ime">Use on-screen keyboard</string>
|
||||||
<!-- Summary text for the 'add virtual keyboard' preference sub-screen. [CHAR LIMIT=100] -->
|
<!-- Summary text for the 'add virtual keyboard' preference sub-screen. [CHAR LIMIT=100] -->
|
||||||
<string name="show_ime_summary">Keep it on screen while physical keyboard is active</string>
|
<string name="show_ime_summary">Keep it on screen while physical keyboard is active</string>
|
||||||
|
<!-- Title for the 'Bounce keys' preference switch. [CHAR LIMIT=35] -->
|
||||||
|
<string name="bounce_keys">Bounce keys</string>
|
||||||
|
<!-- Summary text for the 'Bounce keys' preference sub-screen. [CHAR LIMIT=100] -->
|
||||||
|
<string name="bounce_keys_summary">Enable Bounce keys for physical keyboard accessibility</string>
|
||||||
|
<!-- Title for the 'Sticky keys' preference switch. [CHAR LIMIT=35] -->
|
||||||
|
<string name="sticky_keys">Sticky keys</string>
|
||||||
|
<!-- Summary text for the 'Sticky keys' preference sub-screen. [CHAR LIMIT=100] -->
|
||||||
|
<string name="sticky_keys_summary">Enable Sticky keys for physical keyboard accessibility</string>
|
||||||
<!-- Title for the button to trigger the 'keyboard shortcuts helper' dialog. [CHAR LIMIT=35] -->
|
<!-- Title for the button to trigger the 'keyboard shortcuts helper' dialog. [CHAR LIMIT=35] -->
|
||||||
<string name="keyboard_shortcuts_helper">Keyboard shortcuts</string>
|
<string name="keyboard_shortcuts_helper">Keyboard shortcuts</string>
|
||||||
<!-- Summary text for the 'keyboard shortcuts helper' dialog. [CHAR LIMIT=100] -->
|
<!-- Summary text for the 'keyboard shortcuts helper' dialog. [CHAR LIMIT=100] -->
|
||||||
|
@@ -38,4 +38,22 @@
|
|||||||
android:summary="@string/modifier_keys_settings_summary"
|
android:summary="@string/modifier_keys_settings_summary"
|
||||||
android:fragment="com.android.settings.inputmethod.ModifierKeysSettings" />
|
android:fragment="com.android.settings.inputmethod.ModifierKeysSettings" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="keyboard_a11y_category"
|
||||||
|
android:title="@string/keyboard_a11y_category">
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:key="accessibility_bounce_keys"
|
||||||
|
android:title="@string/bounce_keys"
|
||||||
|
android:summary="@string/bounce_keys_summary"
|
||||||
|
android:defaultValue="false" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:key="accessibility_sticky_keys"
|
||||||
|
android:title="@string/sticky_keys"
|
||||||
|
android:summary="@string/sticky_keys_summary"
|
||||||
|
android:defaultValue="false" />
|
||||||
|
|
||||||
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
@@ -24,7 +24,9 @@ import android.content.Intent;
|
|||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.hardware.input.InputDeviceIdentifier;
|
import android.hardware.input.InputDeviceIdentifier;
|
||||||
import android.hardware.input.InputManager;
|
import android.hardware.input.InputManager;
|
||||||
|
import android.hardware.input.InputSettings;
|
||||||
import android.hardware.input.KeyboardLayout;
|
import android.hardware.input.KeyboardLayout;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
@@ -65,10 +67,19 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener {
|
KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener {
|
||||||
|
|
||||||
private static final String KEYBOARD_OPTIONS_CATEGORY = "keyboard_options_category";
|
private static final String KEYBOARD_OPTIONS_CATEGORY = "keyboard_options_category";
|
||||||
|
private static final String KEYBOARD_A11Y_CATEGORY = "keyboard_a11y_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";
|
||||||
|
private static final String ACCESSIBILITY_BOUNCE_KEYS = "accessibility_bounce_keys";
|
||||||
|
private static final String ACCESSIBILITY_STICKY_KEYS = "accessibility_sticky_keys";
|
||||||
private static final String KEYBOARD_SHORTCUTS_HELPER = "keyboard_shortcuts_helper";
|
private static final String KEYBOARD_SHORTCUTS_HELPER = "keyboard_shortcuts_helper";
|
||||||
private static final String MODIFIER_KEYS_SETTINGS = "modifier_keys_settings";
|
private static final String MODIFIER_KEYS_SETTINGS = "modifier_keys_settings";
|
||||||
private static final String EXTRA_AUTO_SELECTION = "auto_selection";
|
private static final String EXTRA_AUTO_SELECTION = "auto_selection";
|
||||||
|
private static final Uri sVirtualKeyboardSettingsUri = Secure.getUriFor(
|
||||||
|
Secure.SHOW_IME_WITH_HARD_KEYBOARD);
|
||||||
|
private static final Uri sAccessibilityBounceKeysUri = Secure.getUriFor(
|
||||||
|
Secure.ACCESSIBILITY_BOUNCE_KEYS);
|
||||||
|
private static final Uri sAccessibilityStickyKeysUri = Secure.getUriFor(
|
||||||
|
Secure.ACCESSIBILITY_STICKY_KEYS);
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final ArrayList<HardKeyboardDeviceInfo> mLastHardKeyboards = new ArrayList<>();
|
private final ArrayList<HardKeyboardDeviceInfo> mLastHardKeyboards = new ArrayList<>();
|
||||||
@@ -80,7 +91,14 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
@NonNull
|
@NonNull
|
||||||
private PreferenceCategory mKeyboardAssistanceCategory;
|
private PreferenceCategory mKeyboardAssistanceCategory;
|
||||||
@Nullable
|
@Nullable
|
||||||
|
private PreferenceCategory mKeyboardA11yCategory = null;
|
||||||
|
@Nullable
|
||||||
private TwoStatePreference mShowVirtualKeyboardSwitch = null;
|
private TwoStatePreference mShowVirtualKeyboardSwitch = null;
|
||||||
|
@Nullable
|
||||||
|
private TwoStatePreference mAccessibilityBounceKeys = null;
|
||||||
|
@Nullable
|
||||||
|
private TwoStatePreference mAccessibilityStickyKeys = null;
|
||||||
|
|
||||||
|
|
||||||
private Intent mIntentWaitingForResult;
|
private Intent mIntentWaitingForResult;
|
||||||
private boolean mIsNewKeyboardSettings;
|
private boolean mIsNewKeyboardSettings;
|
||||||
@@ -102,10 +120,15 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
mIm = Preconditions.checkNotNull(activity.getSystemService(InputManager.class));
|
mIm = Preconditions.checkNotNull(activity.getSystemService(InputManager.class));
|
||||||
mImm = Preconditions.checkNotNull(activity.getSystemService(InputMethodManager.class));
|
mImm = Preconditions.checkNotNull(activity.getSystemService(InputMethodManager.class));
|
||||||
mKeyboardAssistanceCategory = Preconditions.checkNotNull(
|
mKeyboardAssistanceCategory = Preconditions.checkNotNull(
|
||||||
(PreferenceCategory) findPreference(KEYBOARD_OPTIONS_CATEGORY));
|
findPreference(KEYBOARD_OPTIONS_CATEGORY));
|
||||||
mShowVirtualKeyboardSwitch = Preconditions.checkNotNull(
|
mShowVirtualKeyboardSwitch = Objects.requireNonNull(
|
||||||
(TwoStatePreference) mKeyboardAssistanceCategory.findPreference(
|
mKeyboardAssistanceCategory.findPreference(SHOW_VIRTUAL_KEYBOARD_SWITCH));
|
||||||
SHOW_VIRTUAL_KEYBOARD_SWITCH));
|
|
||||||
|
mKeyboardA11yCategory = Objects.requireNonNull(findPreference(KEYBOARD_A11Y_CATEGORY));
|
||||||
|
mAccessibilityBounceKeys = Objects.requireNonNull(
|
||||||
|
mKeyboardA11yCategory.findPreference(ACCESSIBILITY_BOUNCE_KEYS));
|
||||||
|
mAccessibilityStickyKeys = Objects.requireNonNull(
|
||||||
|
mKeyboardA11yCategory.findPreference(ACCESSIBILITY_STICKY_KEYS));
|
||||||
|
|
||||||
FeatureFactory featureFactory = FeatureFactory.getFeatureFactory();
|
FeatureFactory featureFactory = FeatureFactory.getFeatureFactory();
|
||||||
mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
|
mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
|
||||||
@@ -121,6 +144,12 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
if (!isModifierKeySettingsEnabled) {
|
if (!isModifierKeySettingsEnabled) {
|
||||||
mKeyboardAssistanceCategory.removePreference(findPreference(MODIFIER_KEYS_SETTINGS));
|
mKeyboardAssistanceCategory.removePreference(findPreference(MODIFIER_KEYS_SETTINGS));
|
||||||
}
|
}
|
||||||
|
if (!InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
|
||||||
|
mKeyboardA11yCategory.removePreference(mAccessibilityBounceKeys);
|
||||||
|
}
|
||||||
|
if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
|
||||||
|
mKeyboardA11yCategory.removePreference(mAccessibilityStickyKeys);
|
||||||
|
}
|
||||||
InputDeviceIdentifier inputDeviceIdentifier = activity.getIntent().getParcelableExtra(
|
InputDeviceIdentifier inputDeviceIdentifier = activity.getIntent().getParcelableExtra(
|
||||||
KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER);
|
KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER);
|
||||||
int intentFromWhere =
|
int intentFromWhere =
|
||||||
@@ -161,9 +190,13 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
mLastHardKeyboards.clear();
|
mLastHardKeyboards.clear();
|
||||||
scheduleUpdateHardKeyboards();
|
scheduleUpdateHardKeyboards();
|
||||||
mIm.registerInputDeviceListener(this, null);
|
mIm.registerInputDeviceListener(this, null);
|
||||||
mShowVirtualKeyboardSwitch.setOnPreferenceChangeListener(
|
Objects.requireNonNull(mShowVirtualKeyboardSwitch).setOnPreferenceChangeListener(
|
||||||
mShowVirtualKeyboardSwitchPreferenceChangeListener);
|
mShowVirtualKeyboardSwitchPreferenceChangeListener);
|
||||||
registerShowVirtualKeyboardSettingsObserver();
|
Objects.requireNonNull(mAccessibilityBounceKeys).setOnPreferenceChangeListener(
|
||||||
|
mAccessibilityBounceKeysSwitchPreferenceChangeListener);
|
||||||
|
Objects.requireNonNull(mAccessibilityStickyKeys).setOnPreferenceChangeListener(
|
||||||
|
mAccessibilityStickyKeysSwitchPreferenceChangeListener);
|
||||||
|
registerSettingsObserver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -171,8 +204,10 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
super.onPause();
|
super.onPause();
|
||||||
mLastHardKeyboards.clear();
|
mLastHardKeyboards.clear();
|
||||||
mIm.unregisterInputDeviceListener(this);
|
mIm.unregisterInputDeviceListener(this);
|
||||||
mShowVirtualKeyboardSwitch.setOnPreferenceChangeListener(null);
|
Objects.requireNonNull(mShowVirtualKeyboardSwitch).setOnPreferenceChangeListener(null);
|
||||||
unregisterShowVirtualKeyboardSettingsObserver();
|
Objects.requireNonNull(mAccessibilityBounceKeys).setOnPreferenceChangeListener(null);
|
||||||
|
Objects.requireNonNull(mAccessibilityStickyKeys).setOnPreferenceChangeListener(null);
|
||||||
|
unregisterSettingsObserver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -276,6 +311,14 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
mFeatureProvider.addFirmwareUpdateCategory(getPrefContext(), preferenceScreen);
|
mFeatureProvider.addFirmwareUpdateCategory(getPrefContext(), preferenceScreen);
|
||||||
}
|
}
|
||||||
updateShowVirtualKeyboardSwitch();
|
updateShowVirtualKeyboardSwitch();
|
||||||
|
|
||||||
|
if (InputSettings.isAccessibilityBounceKeysFeatureEnabled()
|
||||||
|
|| InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
|
||||||
|
Objects.requireNonNull(mKeyboardA11yCategory).setOrder(2);
|
||||||
|
preferenceScreen.addPreference(mKeyboardA11yCategory);
|
||||||
|
updateAccessibilityBounceKeysSwitch();
|
||||||
|
updateAccessibilityStickyKeysSwitch();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showKeyboardLayoutDialog(InputDeviceIdentifier inputDeviceIdentifier) {
|
private void showKeyboardLayoutDialog(InputDeviceIdentifier inputDeviceIdentifier) {
|
||||||
@@ -296,25 +339,58 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
.launch();
|
.launch();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerShowVirtualKeyboardSettingsObserver() {
|
private void registerSettingsObserver() {
|
||||||
unregisterShowVirtualKeyboardSettingsObserver();
|
unregisterSettingsObserver();
|
||||||
getActivity().getContentResolver().registerContentObserver(
|
ContentResolver contentResolver = getActivity().getContentResolver();
|
||||||
Secure.getUriFor(Secure.SHOW_IME_WITH_HARD_KEYBOARD),
|
contentResolver.registerContentObserver(
|
||||||
|
sVirtualKeyboardSettingsUri,
|
||||||
false,
|
false,
|
||||||
mContentObserver,
|
mContentObserver,
|
||||||
UserHandle.myUserId());
|
UserHandle.myUserId());
|
||||||
|
if (InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
|
||||||
|
contentResolver.registerContentObserver(
|
||||||
|
sAccessibilityBounceKeysUri,
|
||||||
|
false,
|
||||||
|
mContentObserver,
|
||||||
|
UserHandle.myUserId());
|
||||||
|
}
|
||||||
|
if (InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
|
||||||
|
contentResolver.registerContentObserver(
|
||||||
|
sAccessibilityStickyKeysUri,
|
||||||
|
false,
|
||||||
|
mContentObserver,
|
||||||
|
UserHandle.myUserId());
|
||||||
|
}
|
||||||
updateShowVirtualKeyboardSwitch();
|
updateShowVirtualKeyboardSwitch();
|
||||||
|
updateAccessibilityBounceKeysSwitch();
|
||||||
|
updateAccessibilityStickyKeysSwitch();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void unregisterShowVirtualKeyboardSettingsObserver() {
|
private void unregisterSettingsObserver() {
|
||||||
getActivity().getContentResolver().unregisterContentObserver(mContentObserver);
|
getActivity().getContentResolver().unregisterContentObserver(mContentObserver);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateShowVirtualKeyboardSwitch() {
|
private void updateShowVirtualKeyboardSwitch() {
|
||||||
mShowVirtualKeyboardSwitch.setChecked(
|
Objects.requireNonNull(mShowVirtualKeyboardSwitch).setChecked(
|
||||||
Secure.getInt(getContentResolver(), Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0) != 0);
|
Secure.getInt(getContentResolver(), Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateAccessibilityBounceKeysSwitch() {
|
||||||
|
if (!InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Objects.requireNonNull(mAccessibilityBounceKeys).setChecked(
|
||||||
|
InputSettings.isAccessibilityBounceKeysEnabled(getContext()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateAccessibilityStickyKeysSwitch() {
|
||||||
|
if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Objects.requireNonNull(mAccessibilityStickyKeys).setChecked(
|
||||||
|
InputSettings.isAccessibilityStickyKeysEnabled(getContext()));
|
||||||
|
}
|
||||||
|
|
||||||
private void toggleKeyboardShortcutsMenu() {
|
private void toggleKeyboardShortcutsMenu() {
|
||||||
getActivity().requestShowKeyboardShortcuts();
|
getActivity().requestShowKeyboardShortcuts();
|
||||||
}
|
}
|
||||||
@@ -328,10 +404,29 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private final OnPreferenceChangeListener
|
||||||
|
mAccessibilityBounceKeysSwitchPreferenceChangeListener = (preference, newValue) -> {
|
||||||
|
InputSettings.setAccessibilityBounceKeysThreshold(getContext(),
|
||||||
|
((Boolean) newValue) ? 500 : 0);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
private final OnPreferenceChangeListener
|
||||||
|
mAccessibilityStickyKeysSwitchPreferenceChangeListener = (preference, newValue) -> {
|
||||||
|
InputSettings.setAccessibilityStickyKeysEnabled(getContext(), (Boolean) newValue);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
private final ContentObserver mContentObserver = new ContentObserver(new Handler(true)) {
|
private final ContentObserver mContentObserver = new ContentObserver(new Handler(true)) {
|
||||||
@Override
|
@Override
|
||||||
public void onChange(boolean selfChange) {
|
public void onChange(boolean selfChange, Uri uri) {
|
||||||
updateShowVirtualKeyboardSwitch();
|
if (sVirtualKeyboardSettingsUri.equals(uri)) {
|
||||||
|
updateShowVirtualKeyboardSwitch();
|
||||||
|
} else if (sAccessibilityBounceKeysUri.equals(uri)) {
|
||||||
|
updateAccessibilityBounceKeysSwitch();
|
||||||
|
} else if (sAccessibilityStickyKeysUri.equals(uri)) {
|
||||||
|
updateAccessibilityStickyKeysSwitch();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user