Merge "Add A11Y settings for Bounce keys and Sticky keys" into main

This commit is contained in:
Vaibhav Devmurari
2024-01-02 13:05:59 +00:00
committed by Android (Google) Code Review
3 changed files with 139 additions and 16 deletions

View File

@@ -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] -->

View File

@@ -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>

View File

@@ -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();
}
} }
}; };