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