From b253005342ca469e8029d23b028616507f7cb545 Mon Sep 17 00:00:00 2001 From: Harry Cutts Date: Fri, 25 Oct 2024 15:11:56 +0000 Subject: [PATCH] Add a11y setting for disabling touchpad system gestures Screenshots: * The new setting: http://shortn/_9JL6nMS3cR * The disabled "Learn touchpad gestures" button and accompanying footer when the setting is off: http://shortn/_FTcNTQAGYj Test: disable the setting, check three- and four-finger swipes on the touchpad stop working; re-enable, check they work again Test: check the toggle and heading both hide correctly when flag is off or no touchpad is connected Test: check the "Learn touchpad gestures" button is disabled with an explanation when gestures are disabled Bug: 353947750 Bug: 374965372 Flag: com.android.hardware.input.touchpad_system_gesture_disable Change-Id: Ie7a6ea4e9ddd34710d07f78ab96598207aac4228 --- res/values/strings.xml | 12 +++++ .../accessibility_pointer_and_touchpad.xml | 13 +++++ res/xml/touchpad_and_mouse_settings.xml | 6 +++ .../inputmethod/PointerTouchpadFragment.java | 25 +++++++++ ...uchGesturesButtonPreferenceController.java | 10 +++- ...padSystemGesturesPreferenceController.java | 54 +++++++++++++++++++ ...resDisabledFooterPreferenceController.java | 35 ++++++++++++ 7 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/com/android/settings/inputmethod/TouchpadSystemGesturesPreferenceController.java create mode 100644 src/com/android/settings/inputmethod/TrackpadGesturesDisabledFooterPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 6ba28533355..9d620baa85b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4681,6 +4681,9 @@ None Learn touchpad gestures + + + Some settings are unavailable as touchpad gestures have been turned off. You can turn them on via Pointer & touchpad accessibility > Use touchpad gestures trackpad, track pad, mouse, cursor, scroll, swipe, right click, click, pointer @@ -4963,6 +4966,15 @@ Pointer color, pointer size & more Pointer color customization + + + Touchpad + + Use system gestures + + When turned off, 3- or 4-finger gestures are ignored + + touchpad, trackpad, swipe Color contrast diff --git a/res/xml/accessibility_pointer_and_touchpad.xml b/res/xml/accessibility_pointer_and_touchpad.xml index 8da41779d95..a46c8572bb5 100644 --- a/res/xml/accessibility_pointer_and_touchpad.xml +++ b/res/xml/accessibility_pointer_and_touchpad.xml @@ -46,4 +46,17 @@ settings:keywords="@string/keywords_auto_click" settings:controller="com.android.settings.accessibility.AutoclickPreferenceController"/> + + + + + + diff --git a/res/xml/touchpad_and_mouse_settings.xml b/res/xml/touchpad_and_mouse_settings.xml index cdfd398d151..b82b3a62ea3 100644 --- a/res/xml/touchpad_and_mouse_settings.xml +++ b/res/xml/touchpad_and_mouse_settings.xml @@ -96,4 +96,10 @@ android:key="trackpad_touch_gesture" android:title="@string/trackpad_touch_gesture" settings:controller="com.android.settings.inputmethod.TouchGesturesButtonPreferenceController"/> + + diff --git a/src/com/android/settings/inputmethod/PointerTouchpadFragment.java b/src/com/android/settings/inputmethod/PointerTouchpadFragment.java index 890d9b68479..441bddd2574 100644 --- a/src/com/android/settings/inputmethod/PointerTouchpadFragment.java +++ b/src/com/android/settings/inputmethod/PointerTouchpadFragment.java @@ -25,14 +25,33 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.widget.PreferenceCategoryController; +import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; +import java.util.List; + /** Accessibility settings for pointer and touchpad. */ @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class PointerTouchpadFragment extends DashboardFragment { private static final String TAG = "PointerTouchpadFragment"; + @Override + protected List createPreferenceControllers(Context context) { + return buildPreferenceControllers(context); + } + + private static List buildPreferenceControllers(Context context) { + TouchpadSystemGesturesPreferenceController systemGesturesController = + new TouchpadSystemGesturesPreferenceController( + context, "touchpad_system_gestures_enable"); + return List.of( + systemGesturesController, + new PreferenceCategoryController(context, "touchpad_category") + .setChildren(List.of(systemGesturesController))); + } + @Override public int getMetricsCategory() { return SettingsEnums.ACCESSIBILITY_POINTER_TOUCHPAD; @@ -54,5 +73,11 @@ public class PointerTouchpadFragment extends DashboardFragment { protected boolean isPageSearchEnabled(Context context) { return isTouchpad() || isMouse(); } + + @Override + public List createPreferenceControllers( + Context context) { + return buildPreferenceControllers(context); + } }; } diff --git a/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java b/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java index 5154623ade4..8b0ae4cbd26 100644 --- a/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java +++ b/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java @@ -21,6 +21,7 @@ import static com.android.systemui.shared.Flags.newTouchpadGesturesTutorial; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; +import android.hardware.input.InputSettings; import android.os.UserHandle; import android.util.FeatureFlagUtils; @@ -75,7 +76,14 @@ public class TouchGesturesButtonPreferenceController extends BasePreferenceContr @Override public int getAvailabilityStatus() { boolean isTouchpad = InputPeripheralsSettingsUtils.isTouchpad(); - return isTouchpad ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + if (isTouchpad) { + // If the user's disabled touchpad system gestures in the accessibility settings, the + // tutorial won't work or be relevant, so disable the button. + return InputSettings.useTouchpadSystemGestures(mContext) ? AVAILABLE + : DISABLED_DEPENDENT_SETTING; + } else { + return CONDITIONALLY_UNAVAILABLE; + } } private void showTouchpadGestureEducation() { diff --git a/src/com/android/settings/inputmethod/TouchpadSystemGesturesPreferenceController.java b/src/com/android/settings/inputmethod/TouchpadSystemGesturesPreferenceController.java new file mode 100644 index 00000000000..9f0acb15a46 --- /dev/null +++ b/src/com/android/settings/inputmethod/TouchpadSystemGesturesPreferenceController.java @@ -0,0 +1,54 @@ +/* + * 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 android.content.Context; +import android.hardware.input.InputSettings; + +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; + +public class TouchpadSystemGesturesPreferenceController extends TogglePreferenceController { + + public TouchpadSystemGesturesPreferenceController(Context context, String key) { + super(context, key); + } + + @Override + public int getAvailabilityStatus() { + return InputSettings.isTouchpadSystemGestureDisableFeatureFlagEnabled() + && InputPeripheralsSettingsUtils.isTouchpad() ? AVAILABLE + : CONDITIONALLY_UNAVAILABLE; + } + + @Override + public boolean isChecked() { + return InputSettings.useTouchpadSystemGestures(mContext); + } + + @Override + public boolean setChecked(boolean isChecked) { + InputSettings.setTouchpadSystemGesturesEnabled(mContext, isChecked); + // TODO(b/353947750): add a metric for when the setting changes. + return true; + } + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_accessibility; + } +} diff --git a/src/com/android/settings/inputmethod/TrackpadGesturesDisabledFooterPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadGesturesDisabledFooterPreferenceController.java new file mode 100644 index 00000000000..1fed57e5980 --- /dev/null +++ b/src/com/android/settings/inputmethod/TrackpadGesturesDisabledFooterPreferenceController.java @@ -0,0 +1,35 @@ +/* + * 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 android.content.Context; +import android.hardware.input.InputSettings; + +import com.android.settings.core.BasePreferenceController; + +public class TrackpadGesturesDisabledFooterPreferenceController extends BasePreferenceController { + + public TrackpadGesturesDisabledFooterPreferenceController(Context context, String key) { + super(context, key); + } + + @Override + public int getAvailabilityStatus() { + return InputSettings.useTouchpadSystemGestures(mContext) ? CONDITIONALLY_UNAVAILABLE + : AVAILABLE; + } +}