diff options
8 files changed, 93 insertions, 2 deletions
diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java index b380e259577c..cd48047bccb4 100644 --- a/core/java/android/hardware/input/InputSettings.java +++ b/core/java/android/hardware/input/InputSettings.java @@ -385,6 +385,42 @@ public class InputSettings { } /** + * Whether touchpad acceleration is enabled or not. + * + * @param context The application context. + * + * @hide + */ + public static boolean isTouchpadAccelerationEnabled(@NonNull Context context) { + if (!isPointerAccelerationFeatureFlagEnabled()) { + return false; + } + + return Settings.System.getIntForUser(context.getContentResolver(), + Settings.System.TOUCHPAD_ACCELERATION_ENABLED, 1, UserHandle.USER_CURRENT) + == 1; + } + + /** + * Enables or disables touchpad acceleration. + * + * @param context The application context. + * @param enabled Will enable touchpad acceleration if true, disable it if + * false. + * @hide + */ + @RequiresPermission(Manifest.permission.WRITE_SETTINGS) + public static void setTouchpadAccelerationEnabled(@NonNull Context context, + boolean enabled) { + if (!isPointerAccelerationFeatureFlagEnabled()) { + return; + } + Settings.System.putIntForUser(context.getContentResolver(), + Settings.System.TOUCHPAD_ACCELERATION_ENABLED, enabled ? 1 : 0, + UserHandle.USER_CURRENT); + } + + /** * Returns true if the feature flag for disabling system gestures on touchpads is enabled. * * @hide @@ -835,7 +871,6 @@ public class InputSettings { UserHandle.USER_CURRENT); } - /** * Whether Accessibility bounce keys feature is enabled. * diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 962680891a72..2b18b01734d3 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6330,6 +6330,17 @@ public final class Settings { public static final String TOUCHPAD_SYSTEM_GESTURES = "touchpad_system_gestures"; /** + * Whether touchpad acceleration is enabled. + * + * When enabled, the speed of the pointer will increase as the user moves their + * finger faster on the touchpad. + * + * @hide + */ + public static final String TOUCHPAD_ACCELERATION_ENABLED = + "touchpad_acceleration_enabled"; + + /** * Whether to enable reversed vertical scrolling for connected mice. * * When enabled, scrolling down on the mouse wheel will move the screen up and vice versa. @@ -6624,6 +6635,7 @@ public final class Settings { PRIVATE_SETTINGS.add(TOUCHPAD_TAP_DRAGGING); PRIVATE_SETTINGS.add(TOUCHPAD_RIGHT_CLICK_ZONE); PRIVATE_SETTINGS.add(TOUCHPAD_SYSTEM_GESTURES); + PRIVATE_SETTINGS.add(TOUCHPAD_ACCELERATION_ENABLED); PRIVATE_SETTINGS.add(CAMERA_FLASH_NOTIFICATION); PRIVATE_SETTINGS.add(SCREEN_FLASH_NOTIFICATION); PRIVATE_SETTINGS.add(SCREEN_FLASH_NOTIFICATION_COLOR); diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto index 64c9f540a97b..325790c22fce 100644 --- a/core/proto/android/providers/settings/system.proto +++ b/core/proto/android/providers/settings/system.proto @@ -218,7 +218,8 @@ message SystemSettingsProto { optional SettingProto tap_to_click = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto tap_dragging = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto three_finger_tap_customization = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto system_gestures = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];; + optional SettingProto system_gestures = 7 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto acceleration_enabled = 8 [ (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 1f56f10cca7d..cf0447f9fb3a 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java @@ -117,6 +117,7 @@ public class SystemSettings { Settings.System.TOUCHPAD_TAP_TO_CLICK, Settings.System.TOUCHPAD_TAP_DRAGGING, Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE, + Settings.System.TOUCHPAD_ACCELERATION_ENABLED, Settings.System.CAMERA_FLASH_NOTIFICATION, Settings.System.SCREEN_FLASH_NOTIFICATION, Settings.System.SCREEN_FLASH_NOTIFICATION_COLOR, diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java index 4d98a11bdfe7..4f649ed49be3 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java @@ -234,6 +234,7 @@ public class SystemSettingsValidators { VALIDATORS.put(System.TOUCHPAD_TAP_DRAGGING, BOOLEAN_VALIDATOR); VALIDATORS.put(System.TOUCHPAD_RIGHT_CLICK_ZONE, BOOLEAN_VALIDATOR); VALIDATORS.put(System.TOUCHPAD_SYSTEM_GESTURES, BOOLEAN_VALIDATOR); + VALIDATORS.put(System.TOUCHPAD_ACCELERATION_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put(System.LOCK_TO_APP_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put( System.EGG_MODE, diff --git a/services/core/java/com/android/server/input/InputSettingsObserver.java b/services/core/java/com/android/server/input/InputSettingsObserver.java index e25ea4b43827..d1f07cb8ae23 100644 --- a/services/core/java/com/android/server/input/InputSettingsObserver.java +++ b/services/core/java/com/android/server/input/InputSettingsObserver.java @@ -90,6 +90,8 @@ class InputSettingsObserver extends ContentObserver { (reason) -> updateTouchpadRightClickZoneEnabled()), Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_SYSTEM_GESTURES), (reason) -> updateTouchpadSystemGesturesEnabled()), + Map.entry(Settings.System.getUriFor(Settings.System.TOUCHPAD_ACCELERATION_ENABLED), + (reason) -> updateTouchpadAccelerationEnabled()), Map.entry(Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), (reason) -> updateShowTouches()), Map.entry(Settings.System.getUriFor(Settings.System.POINTER_LOCATION), @@ -241,6 +243,11 @@ class InputSettingsObserver extends ContentObserver { mNative.setTouchpadSystemGesturesEnabled(InputSettings.useTouchpadSystemGestures(mContext)); } + private void updateTouchpadAccelerationEnabled() { + mNative.setTouchpadAccelerationEnabled( + InputSettings.isTouchpadAccelerationEnabled(mContext)); + } + private void updateShowTouches() { mNative.setShowTouches(getBoolean(Settings.System.SHOW_TOUCHES, false)); } diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index 4d38c8401e2d..f34338a397db 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -158,6 +158,8 @@ interface NativeInputManagerService { void setTouchpadSystemGesturesEnabled(boolean enabled); + void setTouchpadAccelerationEnabled(boolean enabled); + void setShowTouches(boolean enabled); void setNonInteractiveDisplays(int[] displayIds); @@ -463,6 +465,9 @@ interface NativeInputManagerService { public native void setTouchpadSystemGesturesEnabled(boolean enabled); @Override + public native void setTouchpadAccelerationEnabled(boolean enabled); + + @Override public native void setShowTouches(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 911c686c711f..e1f3f0ef5615 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -357,6 +357,7 @@ public: void setTouchpadRightClickZoneEnabled(bool enabled); void setTouchpadThreeFingerTapShortcutEnabled(bool enabled); void setTouchpadSystemGesturesEnabled(bool enabled); + void setTouchpadAccelerationEnabled(bool enabled); void setInputDeviceEnabled(uint32_t deviceId, bool enabled); void setShowTouches(bool enabled); void setNonInteractiveDisplays(const std::set<ui::LogicalDisplayId>& displayIds); @@ -540,6 +541,10 @@ private: // True to enable system gestures (three- and four-finger swipes) on touchpads. bool touchpadSystemGesturesEnabled{true}; + // True if the speed of the pointer will increase as the user moves + // their finger faster on the touchpad. + bool touchpadAccelerationEnabled{true}; + // True if a pointer icon should be shown for stylus pointers. bool stylusPointerIconEnabled{false}; @@ -869,6 +874,7 @@ void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outCon outConfig->touchpadThreeFingerTapShortcutEnabled = mLocked.touchpadThreeFingerTapShortcutEnabled; outConfig->touchpadSystemGesturesEnabled = mLocked.touchpadSystemGesturesEnabled; + outConfig->touchpadAccelerationEnabled = mLocked.touchpadAccelerationEnabled; outConfig->disabledDevices = mLocked.disabledInputDevices; @@ -1666,6 +1672,21 @@ void NativeInputManager::setTouchpadSystemGesturesEnabled(bool enabled) { InputReaderConfiguration::Change::TOUCHPAD_SETTINGS); } +void NativeInputManager::setTouchpadAccelerationEnabled(bool enabled) { + { // acquire lock + std::scoped_lock _l(mLock); + + if (mLocked.touchpadAccelerationEnabled == enabled) { + return; + } + + mLocked.touchpadAccelerationEnabled = enabled; + } // release lock + + mInputManager->getReader().requestRefreshConfiguration( + InputReaderConfiguration::Change::TOUCHPAD_SETTINGS); +} + void NativeInputManager::setInputDeviceEnabled(uint32_t deviceId, bool enabled) { bool refresh = false; @@ -2644,6 +2665,13 @@ static void nativeSetTouchpadSystemGesturesEnabled(JNIEnv* env, jobject nativeIm im->setTouchpadSystemGesturesEnabled(enabled); } +static void nativeSetTouchpadAccelerationEnabled(JNIEnv* env, jobject nativeImplObj, + jboolean enabled) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + + im->setTouchpadAccelerationEnabled(enabled); +} + static void nativeSetShowTouches(JNIEnv* env, jobject nativeImplObj, jboolean enabled) { NativeInputManager* im = getNativeInputManager(env, nativeImplObj); @@ -3354,6 +3382,7 @@ static const JNINativeMethod gInputManagerMethods[] = { {"setTouchpadThreeFingerTapShortcutEnabled", "(Z)V", (void*)nativeSetTouchpadThreeFingerTapShortcutEnabled}, {"setTouchpadSystemGesturesEnabled", "(Z)V", (void*)nativeSetTouchpadSystemGesturesEnabled}, + {"setTouchpadAccelerationEnabled", "(Z)V", (void*)nativeSetTouchpadAccelerationEnabled}, {"setShowTouches", "(Z)V", (void*)nativeSetShowTouches}, {"setNonInteractiveDisplays", "([I)V", (void*)nativeSetNonInteractiveDisplays}, {"reloadCalibration", "()V", (void*)nativeReloadCalibration}, |