diff --git a/res/values/strings.xml b/res/values/strings.xml index 0fcb0d68502..a1e86f43af3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4615,6 +4615,11 @@ Choose a new key for %1$s: + + Physical keyboard accessibility + + Sticky keys, Bounce keys, Mouse keys + %s layout diff --git a/res/xml/physical_keyboard_a11y_settings.xml b/res/xml/physical_keyboard_a11y_settings.xml new file mode 100644 index 00000000000..eb787d0353f --- /dev/null +++ b/res/xml/physical_keyboard_a11y_settings.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/xml/physical_keyboard_settings.xml b/res/xml/physical_keyboard_settings.xml index 20636186bd4..1527ff52866 100644 --- a/res/xml/physical_keyboard_settings.xml +++ b/res/xml/physical_keyboard_settings.xml @@ -31,6 +31,11 @@ android:title="@string/modifier_keys_settings" android:summary="@string/modifier_keys_settings_summary" android:fragment="com.android.settings.inputmethod.ModifierKeysSettings" /> + { + final List newHardKeyboards = + getHardKeyboards(context); + if (newHardKeyboards.isEmpty()) { + getActivity().finish(); + } + }); + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.physical_keyboard_a11y_settings; + } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.physical_keyboard_a11y_settings) { + @Override + protected boolean isPageSearchEnabled(Context context) { + return Flags.keyboardAndTouchpadA11yNewPageEnabled() + && !getHardKeyboards(context).isEmpty(); + } + }; + + @Override + public void onInputDeviceAdded(int deviceId) { + finishEarlyIfNeeded(); + } + + @Override + public void onInputDeviceRemoved(int deviceId) { + finishEarlyIfNeeded(); + } + + @Override + public void onInputDeviceChanged(int deviceId) { + finishEarlyIfNeeded(); + } +} diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index bafec326e5a..a000f9ede5d 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -50,6 +50,7 @@ import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.core.SubSettingLauncher; +import com.android.settings.keyboard.Flags; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; @@ -74,6 +75,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment private static final String ACCESSIBILITY_SLOW_KEYS = "accessibility_slow_keys"; private static final String ACCESSIBILITY_STICKY_KEYS = "accessibility_sticky_keys"; private static final String ACCESSIBILITY_MOUSE_KEYS = "accessibility_mouse_keys"; + private static final String ACCESSIBILITY_PHYSICAL_KEYBOARD_A11Y = "physical_keyboard_a11y"; private static final String KEYBOARD_SHORTCUTS_HELPER = "keyboard_shortcuts_helper"; private static final String MODIFIER_KEYS_SETTINGS = "modifier_keys_settings"; private static final String EXTRA_AUTO_SELECTION = "auto_selection"; @@ -154,21 +156,34 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } boolean isModifierKeySettingsEnabled = FeatureFlagUtils .isEnabled(getContext(), FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_MODIFIER_KEY); + boolean isKeyboardAndTouchpadA11yNewPageEnabled = + Flags.keyboardAndTouchpadA11yNewPageEnabled(); if (!isModifierKeySettingsEnabled) { mKeyboardAssistanceCategory.removePreference(findPreference(MODIFIER_KEYS_SETTINGS)); } - if (!InputSettings.isAccessibilityBounceKeysFeatureEnabled()) { + if (!isKeyboardAndTouchpadA11yNewPageEnabled) { + mKeyboardAssistanceCategory.removePreference( + findPreference(ACCESSIBILITY_PHYSICAL_KEYBOARD_A11Y)); + } + if (!InputSettings.isAccessibilityBounceKeysFeatureEnabled() + || isKeyboardAndTouchpadA11yNewPageEnabled) { mKeyboardA11yCategory.removePreference(mAccessibilityBounceKeys); } - if (!InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) { + if (!InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled() + || isKeyboardAndTouchpadA11yNewPageEnabled) { mKeyboardA11yCategory.removePreference(mAccessibilitySlowKeys); } - if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) { + if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled() + || isKeyboardAndTouchpadA11yNewPageEnabled) { mKeyboardA11yCategory.removePreference(mAccessibilityStickyKeys); } - if (!InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) { + if (!InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled() + || isKeyboardAndTouchpadA11yNewPageEnabled) { mKeyboardA11yCategory.removePreference(mAccessibilityMouseKeys); } + if (isKeyboardAndTouchpadA11yNewPageEnabled) { + mKeyboardA11yCategory.setVisible(false); + } InputDeviceIdentifier inputDeviceIdentifier = activity.getIntent().getParcelableExtra( KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER, InputDeviceIdentifier.class); diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysControllerTest.java new file mode 100644 index 00000000000..8ac5a5dee65 --- /dev/null +++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityBounceKeysControllerTest.java @@ -0,0 +1,85 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.inputmethod; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.hardware.input.InputSettings; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.keyboard.Flags; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +@Config(shadows = { + com.android.settings.testutils.shadow.ShadowFragment.class, +}) +public class KeyboardAccessibilityBounceKeysControllerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private Context mContext; + private KeyboardAccessibilityBounceKeysController mKeyboardAccessibilityBounceKeysController; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mKeyboardAccessibilityBounceKeysController = new KeyboardAccessibilityBounceKeysController( + mContext, + "accessibility_bounce_keys"); + } + + @Test + @EnableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED) + public void getAvailabilityStatus_flagIsEnabled_isAvailable() { + assertThat(mKeyboardAccessibilityBounceKeysController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + @DisableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED) + public void getAvailabilityStatus_flagIsDisabled_notSupport() { + assertThat(mKeyboardAccessibilityBounceKeysController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void setChecked_true_updateBounceKeyValue() { + mKeyboardAccessibilityBounceKeysController.setChecked(true); + boolean isEnabled = InputSettings.isAccessibilityBounceKeysEnabled(mContext); + + assertThat(isEnabled).isTrue(); + } + + @Test + public void setChecked_false_updateBounceKeyValue() { + mKeyboardAccessibilityBounceKeysController.setChecked(false); + boolean isEnabled = InputSettings.isAccessibilityBounceKeysEnabled(mContext); + + assertThat(isEnabled).isFalse(); + } +} diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityMouseKeysControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityMouseKeysControllerTest.java new file mode 100644 index 00000000000..59224970b56 --- /dev/null +++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityMouseKeysControllerTest.java @@ -0,0 +1,85 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.inputmethod; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.hardware.input.InputSettings; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.keyboard.Flags; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +@Config(shadows = { + com.android.settings.testutils.shadow.ShadowFragment.class, +}) +public class KeyboardAccessibilityMouseKeysControllerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private Context mContext; + private KeyboardAccessibilityMouseKeysController mKeyboardAccessibilityMouseKeysController; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mKeyboardAccessibilityMouseKeysController = new KeyboardAccessibilityMouseKeysController( + mContext, + "accessibility_mouse_keys"); + } + + @Test + @EnableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED) + public void getAvailabilityStatus_flagIsEnabled_isAvailable() { + assertThat(mKeyboardAccessibilityMouseKeysController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + @DisableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED) + public void getAvailabilityStatus_flagIsDisabled_notSupport() { + assertThat(mKeyboardAccessibilityMouseKeysController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void setChecked_true_updateMouseKeyValue() { + mKeyboardAccessibilityMouseKeysController.setChecked(true); + boolean isEnabled = InputSettings.isAccessibilityMouseKeysEnabled(mContext); + + assertThat(isEnabled).isTrue(); + } + + @Test + public void setChecked_false_updateMouseKeyValue() { + mKeyboardAccessibilityMouseKeysController.setChecked(false); + boolean isEnabled = InputSettings.isAccessibilityMouseKeysEnabled(mContext); + + assertThat(isEnabled).isFalse(); + } +} diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysControllerTest.java new file mode 100644 index 00000000000..5f6908aae25 --- /dev/null +++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilitySlowKeysControllerTest.java @@ -0,0 +1,85 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.inputmethod; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.hardware.input.InputSettings; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.keyboard.Flags; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +@Config(shadows = { + com.android.settings.testutils.shadow.ShadowFragment.class, +}) +public class KeyboardAccessibilitySlowKeysControllerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private Context mContext; + private KeyboardAccessibilitySlowKeysController mKeyboardAccessibilitySlowKeysController; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mKeyboardAccessibilitySlowKeysController = new KeyboardAccessibilitySlowKeysController( + mContext, + "accessibility_slow_keys"); + } + + @Test + @EnableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED) + public void getAvailabilityStatus_flagIsEnabled_isAvailable() { + assertThat(mKeyboardAccessibilitySlowKeysController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + @DisableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED) + public void getAvailabilityStatus_flagIsDisabled_notSupport() { + assertThat(mKeyboardAccessibilitySlowKeysController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void setChecked_true_updateSlowKeyValue() { + mKeyboardAccessibilitySlowKeysController.setChecked(true); + boolean isEnabled = InputSettings.isAccessibilitySlowKeysEnabled(mContext); + + assertThat(isEnabled).isTrue(); + } + + @Test + public void setChecked_false_updateSlowKeyValue() { + mKeyboardAccessibilitySlowKeysController.setChecked(false); + boolean isEnabled = InputSettings.isAccessibilitySlowKeysEnabled(mContext); + + assertThat(isEnabled).isFalse(); + } +} diff --git a/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityStickyKeysControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityStickyKeysControllerTest.java new file mode 100644 index 00000000000..06cb5585456 --- /dev/null +++ b/tests/robotests/src/com/android/settings/inputmethod/KeyboardAccessibilityStickyKeysControllerTest.java @@ -0,0 +1,85 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.inputmethod; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.hardware.input.InputSettings; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.keyboard.Flags; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +@Config(shadows = { + com.android.settings.testutils.shadow.ShadowFragment.class, +}) +public class KeyboardAccessibilityStickyKeysControllerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private Context mContext; + private KeyboardAccessibilityStickyKeysController mKeyboardAccessibilityStickyKeysController; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mKeyboardAccessibilityStickyKeysController = new KeyboardAccessibilityStickyKeysController( + mContext, + "accessibility_sticky_keys"); + } + + @Test + @EnableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED) + public void getAvailabilityStatus_flagIsEnabled_isAvailable() { + assertThat(mKeyboardAccessibilityStickyKeysController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + @DisableFlags(Flags.FLAG_KEYBOARD_AND_TOUCHPAD_A11Y_NEW_PAGE_ENABLED) + public void getAvailabilityStatus_flagIsDisabled_notSupport() { + assertThat(mKeyboardAccessibilityStickyKeysController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void setChecked_true_updateStickyKeyValue() { + mKeyboardAccessibilityStickyKeysController.setChecked(true); + boolean isEnabled = InputSettings.isAccessibilityStickyKeysEnabled(mContext); + + assertThat(isEnabled).isTrue(); + } + + @Test + public void setChecked_false_updateStickyKeyValue() { + mKeyboardAccessibilityStickyKeysController.setChecked(false); + boolean isEnabled = InputSettings.isAccessibilityStickyKeysEnabled(mContext); + + assertThat(isEnabled).isFalse(); + } +}