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