diff options
11 files changed, 110 insertions, 0 deletions
diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java index fdbd3197fb79..89fa5fb47a07 100644 --- a/core/java/android/hardware/input/InputSettings.java +++ b/core/java/android/hardware/input/InputSettings.java @@ -19,6 +19,7 @@ package android.hardware.input; import static com.android.hardware.input.Flags.keyboardA11yBounceKeysFlag; import static com.android.hardware.input.Flags.keyboardA11ySlowKeysFlag; import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag; +import static com.android.hardware.input.Flags.touchpadTapDragging; import static com.android.input.flags.Flags.enableInputFilterRustImpl; import android.Manifest; @@ -303,6 +304,53 @@ public class InputSettings { } /** + * Returns true if the feature flag for touchpad tap dragging is enabled. + * + * @hide + */ + public static boolean isTouchpadTapDraggingFeatureFlagEnabled() { + return touchpadTapDragging(); + } + + /** + * Returns true if the touchpad should allow tap dragging. + * + * The returned value only applies to gesture-compatible touchpads. + * + * @param context The application context. + * @return Whether the touchpad should allow tap dragging. + * + * @hide + */ + public static boolean useTouchpadTapDragging(@NonNull Context context) { + if (!isTouchpadTapDraggingFeatureFlagEnabled()) { + return false; + } + return Settings.System.getIntForUser(context.getContentResolver(), + Settings.System.TOUCHPAD_TAP_DRAGGING, 0, UserHandle.USER_CURRENT) == 1; + } + + /** + * Sets the tap dragging behavior for the touchpad. + * + * The new behavior is only applied to gesture-compatible touchpads. + * + * @param context The application context. + * @param enabled Will enable tap dragging if true, disable it if false + * + * @hide + */ + @RequiresPermission(Manifest.permission.WRITE_SETTINGS) + public static void setTouchpadTapDragging(@NonNull Context context, boolean enabled) { + if (!isTouchpadTapDraggingFeatureFlagEnabled()) { + return; + } + Settings.System.putIntForUser(context.getContentResolver(), + Settings.System.TOUCHPAD_TAP_DRAGGING, enabled ? 1 : 0, + UserHandle.USER_CURRENT); + } + + /** * Returns true if the touchpad should use the right click zone. * * The returned value only applies to gesture-compatible touchpads. diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig index 0ed6569afd2a..17992aad68e8 100644 --- a/core/java/android/hardware/input/input_framework.aconfig +++ b/core/java/android/hardware/input/input_framework.aconfig @@ -36,4 +36,11 @@ flag { name: "keyboard_a11y_slow_keys_flag" description: "Controls if the slow keys accessibility feature for physical keyboard is available to the user" bug: "294546335" +} + +flag { + namespace: "input_native" + name: "touchpad_tap_dragging" + description: "Offers a setting to enable touchpad tap dragging" + bug: "321978150" }
\ No newline at end of file diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 11edcafecdee..c7692d58ca54 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6048,6 +6048,13 @@ public final class Settings { public static final String TOUCHPAD_TAP_TO_CLICK = "touchpad_tap_to_click"; /** + * Whether to enable tap dragging on touchpads. + * + * @hide + */ + public static final String TOUCHPAD_TAP_DRAGGING = "touchpad_tap_dragging"; + + /** * Whether to enable a right-click zone on touchpads. * * When set to 1, pressing to click in a section on the right-hand side of the touchpad will @@ -6269,6 +6276,7 @@ public final class Settings { PRIVATE_SETTINGS.add(TOUCHPAD_POINTER_SPEED); PRIVATE_SETTINGS.add(TOUCHPAD_NATURAL_SCROLLING); PRIVATE_SETTINGS.add(TOUCHPAD_TAP_TO_CLICK); + PRIVATE_SETTINGS.add(TOUCHPAD_TAP_DRAGGING); PRIVATE_SETTINGS.add(TOUCHPAD_RIGHT_CLICK_ZONE); PRIVATE_SETTINGS.add(CAMERA_FLASH_NOTIFICATION); PRIVATE_SETTINGS.add(SCREEN_FLASH_NOTIFICATION); diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto index 48243f216015..5fc2a59e3028 100644 --- a/core/proto/android/providers/settings/system.proto +++ b/core/proto/android/providers/settings/system.proto @@ -207,6 +207,7 @@ message SystemSettingsProto { optional SettingProto pointer_speed = 2 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto right_click_zone = 3 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto tap_to_click = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto tap_dragging = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; } optional Touchpad touchpad = 36; diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java index 38ec931612f0..4c255a556954 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java @@ -107,6 +107,7 @@ public class SystemSettings { Settings.System.TOUCHPAD_POINTER_SPEED, Settings.System.TOUCHPAD_NATURAL_SCROLLING, Settings.System.TOUCHPAD_TAP_TO_CLICK, + Settings.System.TOUCHPAD_TAP_DRAGGING, Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE, Settings.System.CAMERA_FLASH_NOTIFICATION, Settings.System.SCREEN_FLASH_NOTIFICATION, diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java index 98941c7cc116..011b42f451bc 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java @@ -209,6 +209,7 @@ public class SystemSettingsValidators { VALIDATORS.put(System.TOUCHPAD_POINTER_SPEED, new InclusiveIntegerRangeValidator(-7, 7)); VALIDATORS.put(System.TOUCHPAD_NATURAL_SCROLLING, BOOLEAN_VALIDATOR); VALIDATORS.put(System.TOUCHPAD_TAP_TO_CLICK, BOOLEAN_VALIDATOR); + VALIDATORS.put(System.TOUCHPAD_TAP_DRAGGING, BOOLEAN_VALIDATOR); VALIDATORS.put(System.TOUCHPAD_RIGHT_CLICK_ZONE, BOOLEAN_VALIDATOR); VALIDATORS.put(System.LOCK_TO_APP_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put( diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 1670a705f939..1e146a51e21e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -3002,6 +3002,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.System.TOUCHPAD_TAP_TO_CLICK, SystemSettingsProto.Touchpad.TAP_TO_CLICK); + dumpSetting(s, p, + Settings.System.TOUCHPAD_TAP_DRAGGING, + SystemSettingsProto.Touchpad.TAP_DRAGGING); p.end(touchpadToken); dumpSetting(s, p, diff --git a/services/core/java/com/android/server/input/InputSettingsObserver.java b/services/core/java/com/android/server/input/InputSettingsObserver.java index 165dfe445751..5ffc3809ec98 100644 --- a/services/core/java/com/android/server/input/InputSettingsObserver.java +++ b/services/core/java/com/android/server/input/InputSettingsObserver.java @@ -64,6 +64,8 @@ class InputSettingsObserver extends ContentObserver { (reason) -> updateTouchpadNaturalScrollingEnabled()), Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_TAP_TO_CLICK), (reason) -> updateTouchpadTapToClickEnabled()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_TAP_DRAGGING), + (reason) -> updateTouchpadTapDraggingEnabled()), Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE), (reason) -> updateTouchpadRightClickZoneEnabled()), Map.entry(Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), @@ -158,6 +160,10 @@ class InputSettingsObserver extends ContentObserver { mNative.setTouchpadTapToClickEnabled(InputSettings.useTouchpadTapToClick(mContext)); } + private void updateTouchpadTapDraggingEnabled() { + mNative.setTouchpadTapDraggingEnabled(InputSettings.useTouchpadTapDragging(mContext)); + } + private void updateTouchpadRightClickZoneEnabled() { mNative.setTouchpadRightClickZoneEnabled(InputSettings.useTouchpadRightClickZone(mContext)); } diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index bc8207835a6e..e5f3484b4825 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -129,6 +129,8 @@ interface NativeInputManagerService { void setTouchpadTapToClickEnabled(boolean enabled); + void setTouchpadTapDraggingEnabled(boolean enabled); + void setTouchpadRightClickZoneEnabled(boolean enabled); void setShowTouches(boolean enabled); @@ -377,6 +379,9 @@ interface NativeInputManagerService { public native void setTouchpadTapToClickEnabled(boolean enabled); @Override + public native void setTouchpadTapDraggingEnabled(boolean enabled); + + @Override public native void setTouchpadRightClickZoneEnabled(boolean enabled); @Override diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index cbc301b87295..4a6b31c29471 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -290,6 +290,7 @@ public: void setTouchpadPointerSpeed(int32_t speed); void setTouchpadNaturalScrollingEnabled(bool enabled); void setTouchpadTapToClickEnabled(bool enabled); + void setTouchpadTapDraggingEnabled(bool enabled); void setTouchpadRightClickZoneEnabled(bool enabled); void setInputDeviceEnabled(uint32_t deviceId, bool enabled); void setShowTouches(bool enabled); @@ -440,6 +441,9 @@ private: // True to enable tap-to-click on touchpads. bool touchpadTapToClickEnabled{true}; + // True to enable tap dragging on touchpads. + bool touchpadTapDraggingEnabled{false}; + // True to enable a zone on the right-hand side of touchpads where clicks will be turned // into context (a.k.a. "right") clicks. bool touchpadRightClickZoneEnabled{false}; @@ -697,6 +701,7 @@ void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outCon outConfig->touchpadPointerSpeed = mLocked.touchpadPointerSpeed; outConfig->touchpadNaturalScrollingEnabled = mLocked.touchpadNaturalScrollingEnabled; outConfig->touchpadTapToClickEnabled = mLocked.touchpadTapToClickEnabled; + outConfig->touchpadTapDraggingEnabled = mLocked.touchpadTapDraggingEnabled; outConfig->touchpadRightClickZoneEnabled = mLocked.touchpadRightClickZoneEnabled; outConfig->disabledDevices = mLocked.disabledInputDevices; @@ -1301,6 +1306,22 @@ void NativeInputManager::setTouchpadTapToClickEnabled(bool enabled) { InputReaderConfiguration::Change::TOUCHPAD_SETTINGS); } +void NativeInputManager::setTouchpadTapDraggingEnabled(bool enabled) { + { // acquire lock + std::scoped_lock _l(mLock); + + if (mLocked.touchpadTapDraggingEnabled == enabled) { + return; + } + + ALOGI("Setting touchpad tap dragging to %s.", toString(enabled)); + mLocked.touchpadTapDraggingEnabled = enabled; + } // release lock + + mInputManager->getReader().requestRefreshConfiguration( + InputReaderConfiguration::Change::TOUCHPAD_SETTINGS); +} + void NativeInputManager::setTouchpadRightClickZoneEnabled(bool enabled) { { // acquire lock std::scoped_lock _l(mLock); @@ -2223,6 +2244,13 @@ static void nativeSetTouchpadTapToClickEnabled(JNIEnv* env, jobject nativeImplOb im->setTouchpadTapToClickEnabled(enabled); } +static void nativeSetTouchpadTapDraggingEnabled(JNIEnv* env, jobject nativeImplObj, + jboolean enabled) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + + im->setTouchpadTapDraggingEnabled(enabled); +} + static void nativeSetTouchpadRightClickZoneEnabled(JNIEnv* env, jobject nativeImplObj, jboolean enabled) { NativeInputManager* im = getNativeInputManager(env, nativeImplObj); @@ -2844,6 +2872,7 @@ static const JNINativeMethod gInputManagerMethods[] = { {"setTouchpadNaturalScrollingEnabled", "(Z)V", (void*)nativeSetTouchpadNaturalScrollingEnabled}, {"setTouchpadTapToClickEnabled", "(Z)V", (void*)nativeSetTouchpadTapToClickEnabled}, + {"setTouchpadTapDraggingEnabled", "(Z)V", (void*)nativeSetTouchpadTapDraggingEnabled}, {"setTouchpadRightClickZoneEnabled", "(Z)V", (void*)nativeSetTouchpadRightClickZoneEnabled}, {"setShowTouches", "(Z)V", (void*)nativeSetShowTouches}, {"setInteractive", "(Z)V", (void*)nativeSetInteractive}, diff --git a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt index 566e51a9062a..cbec85efe93a 100644 --- a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt +++ b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt @@ -146,6 +146,7 @@ class InputManagerServiceTests { verify(native).setTouchpadPointerSpeed(anyInt()) verify(native).setTouchpadNaturalScrollingEnabled(anyBoolean()) verify(native).setTouchpadTapToClickEnabled(anyBoolean()) + verify(native).setTouchpadTapDraggingEnabled(anyBoolean()) verify(native).setTouchpadRightClickZoneEnabled(anyBoolean()) verify(native).setShowTouches(anyBoolean()) verify(native).setMotionClassifierEnabled(anyBoolean()) |