diff --git a/res/values/strings.xml b/res/values/strings.xml index 8185828f2b7..8a56f1f087a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4285,6 +4285,10 @@ Bounce keys Enable Bounce keys for physical keyboard accessibility + + Slow keys + + Enable Slow keys for physical keyboard accessibility Sticky keys diff --git a/res/xml/physical_keyboard_settings.xml b/res/xml/physical_keyboard_settings.xml index dc424d19875..b95f23ee763 100644 --- a/res/xml/physical_keyboard_settings.xml +++ b/res/xml/physical_keyboard_settings.xml @@ -43,17 +43,23 @@ android:key="keyboard_a11y_category" android:title="@string/keyboard_a11y_category"> - - + + + + diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index 7de505edbca..b06edb2957b 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -70,6 +70,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment 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 ACCESSIBILITY_BOUNCE_KEYS = "accessibility_bounce_keys"; + private static final String ACCESSIBILITY_SLOW_KEYS = "accessibility_slow_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 MODIFIER_KEYS_SETTINGS = "modifier_keys_settings"; @@ -78,6 +79,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment Secure.SHOW_IME_WITH_HARD_KEYBOARD); private static final Uri sAccessibilityBounceKeysUri = Secure.getUriFor( Secure.ACCESSIBILITY_BOUNCE_KEYS); + private static final Uri sAccessibilitySlowKeysUri = Secure.getUriFor( + Secure.ACCESSIBILITY_SLOW_KEYS); private static final Uri sAccessibilityStickyKeysUri = Secure.getUriFor( Secure.ACCESSIBILITY_STICKY_KEYS); @@ -97,6 +100,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment @Nullable private TwoStatePreference mAccessibilityBounceKeys = null; @Nullable + private TwoStatePreference mAccessibilitySlowKeys = null; + @Nullable private TwoStatePreference mAccessibilityStickyKeys = null; @@ -127,6 +132,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment mKeyboardA11yCategory = Objects.requireNonNull(findPreference(KEYBOARD_A11Y_CATEGORY)); mAccessibilityBounceKeys = Objects.requireNonNull( mKeyboardA11yCategory.findPreference(ACCESSIBILITY_BOUNCE_KEYS)); + mAccessibilitySlowKeys = Objects.requireNonNull( + mKeyboardA11yCategory.findPreference(ACCESSIBILITY_SLOW_KEYS)); mAccessibilityStickyKeys = Objects.requireNonNull( mKeyboardA11yCategory.findPreference(ACCESSIBILITY_STICKY_KEYS)); @@ -147,6 +154,9 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment if (!InputSettings.isAccessibilityBounceKeysFeatureEnabled()) { mKeyboardA11yCategory.removePreference(mAccessibilityBounceKeys); } + if (!InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) { + mKeyboardA11yCategory.removePreference(mAccessibilitySlowKeys); + } if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) { mKeyboardA11yCategory.removePreference(mAccessibilityStickyKeys); } @@ -196,6 +206,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment mShowVirtualKeyboardSwitchPreferenceChangeListener); Objects.requireNonNull(mAccessibilityBounceKeys).setOnPreferenceChangeListener( mAccessibilityBounceKeysSwitchPreferenceChangeListener); + Objects.requireNonNull(mAccessibilitySlowKeys).setOnPreferenceChangeListener( + mAccessibilitySlowKeysSwitchPreferenceChangeListener); Objects.requireNonNull(mAccessibilityStickyKeys).setOnPreferenceChangeListener( mAccessibilityStickyKeysSwitchPreferenceChangeListener); registerSettingsObserver(); @@ -208,6 +220,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment mIm.unregisterInputDeviceListener(this); Objects.requireNonNull(mShowVirtualKeyboardSwitch).setOnPreferenceChangeListener(null); Objects.requireNonNull(mAccessibilityBounceKeys).setOnPreferenceChangeListener(null); + Objects.requireNonNull(mAccessibilitySlowKeys).setOnPreferenceChangeListener(null); Objects.requireNonNull(mAccessibilityStickyKeys).setOnPreferenceChangeListener(null); unregisterSettingsObserver(); } @@ -315,10 +328,12 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment updateShowVirtualKeyboardSwitch(); if (InputSettings.isAccessibilityBounceKeysFeatureEnabled() - || InputSettings.isAccessibilityStickyKeysFeatureEnabled()) { + || InputSettings.isAccessibilityStickyKeysFeatureEnabled() + || InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) { Objects.requireNonNull(mKeyboardA11yCategory).setOrder(2); preferenceScreen.addPreference(mKeyboardA11yCategory); updateAccessibilityBounceKeysSwitch(); + updateAccessibilitySlowKeysSwitch(); updateAccessibilityStickyKeysSwitch(); } } @@ -356,6 +371,13 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment mContentObserver, UserHandle.myUserId()); } + if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) { + contentResolver.registerContentObserver( + sAccessibilitySlowKeysUri, + false, + mContentObserver, + UserHandle.myUserId()); + } if (InputSettings.isAccessibilityStickyKeysFeatureEnabled()) { contentResolver.registerContentObserver( sAccessibilityStickyKeysUri, @@ -365,6 +387,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } updateShowVirtualKeyboardSwitch(); updateAccessibilityBounceKeysSwitch(); + updateAccessibilitySlowKeysSwitch(); updateAccessibilityStickyKeysSwitch(); } @@ -385,6 +408,14 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment InputSettings.isAccessibilityBounceKeysEnabled(getContext())); } + private void updateAccessibilitySlowKeysSwitch() { + if (!InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) { + return; + } + Objects.requireNonNull(mAccessibilitySlowKeys).setChecked( + InputSettings.isAccessibilitySlowKeysEnabled(getContext())); + } + private void updateAccessibilityStickyKeysSwitch() { if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) { return; @@ -413,6 +444,13 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment return true; }; + private final OnPreferenceChangeListener + mAccessibilitySlowKeysSwitchPreferenceChangeListener = (preference, newValue) -> { + InputSettings.setAccessibilitySlowKeysThreshold(getContext(), + ((Boolean) newValue) ? 500 : 0); + return true; + }; + private final OnPreferenceChangeListener mAccessibilityStickyKeysSwitchPreferenceChangeListener = (preference, newValue) -> { InputSettings.setAccessibilityStickyKeysEnabled(getContext(), (Boolean) newValue); @@ -426,6 +464,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment updateShowVirtualKeyboardSwitch(); } else if (sAccessibilityBounceKeysUri.equals(uri)) { updateAccessibilityBounceKeysSwitch(); + } else if (sAccessibilitySlowKeysUri.equals(uri)) { + updateAccessibilitySlowKeysSwitch(); } else if (sAccessibilityStickyKeysUri.equals(uri)) { updateAccessibilityStickyKeysSwitch(); }