diff options
| author | 2024-11-04 11:52:12 +0000 | |
|---|---|---|
| committer | 2024-11-04 11:52:12 +0000 | |
| commit | cd48e7c13add65ebc99d89519d670dbad7a30b1e (patch) | |
| tree | 9baee44853cb04a72e71319f4cf823055ea661e7 | |
| parent | d062f25dd0eeee0c2e866cbe60ef309177f23cb5 (diff) | |
| parent | ad76b221733a445f62889a6f0fb3c606fee2ec53 (diff) | |
Merge "Input: add option to make 3-finger tap a shortcut" into main
8 files changed, 105 insertions, 3 deletions
diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java index 4a9efe0a675b..c4566981d3b5 100644 --- a/core/java/android/hardware/input/InputSettings.java +++ b/core/java/android/hardware/input/InputSettings.java @@ -20,16 +20,18 @@ import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FL import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS; import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG; import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG; +import static com.android.hardware.input.Flags.enableCustomizableInputGestures; import static com.android.hardware.input.Flags.keyboardA11yBounceKeysFlag; +import static com.android.hardware.input.Flags.keyboardA11yMouseKeys; import static com.android.hardware.input.Flags.keyboardA11ySlowKeysFlag; import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag; -import static com.android.hardware.input.Flags.keyboardA11yMouseKeys; import static com.android.hardware.input.Flags.mouseReverseVerticalScrolling; import static com.android.hardware.input.Flags.mouseSwapPrimaryButton; import static com.android.hardware.input.Flags.touchpadTapDragging; +import static com.android.hardware.input.Flags.touchpadThreeFingerTapShortcut; import static com.android.hardware.input.Flags.touchpadVisualizer; -import static com.android.input.flags.Flags.enableInputFilterRustImpl; import static com.android.input.flags.Flags.FLAG_KEYBOARD_REPEAT_KEYS; +import static com.android.input.flags.Flags.enableInputFilterRustImpl; import static com.android.input.flags.Flags.keyboardRepeatKeys; import android.Manifest; @@ -379,6 +381,15 @@ public class InputSettings { } /** + * Returns true if the feature flag for the touchpad three-finger tap shortcut is enabled. + * + * @hide + */ + public static boolean isTouchpadThreeFingerTapShortcutFeatureFlagEnabled() { + return enableCustomizableInputGestures() && touchpadThreeFingerTapShortcut(); + } + + /** * Returns true if the feature flag for mouse reverse vertical scrolling is enabled. * @hide */ @@ -498,6 +509,22 @@ public class InputSettings { } /** + * Returns true if three-finger taps on the touchpad should trigger a customizable shortcut + * rather than a middle click. + * + * The returned value only applies to gesture-compatible touchpads. + * + * @param context The application context. + * @return Whether three-finger taps should trigger the shortcut. + * + * @hide + */ + public static boolean useTouchpadThreeFingerTapShortcut(@NonNull Context context) { + // TODO(b/365063048): determine whether to enable the shortcut based on the settings. + return isTouchpadThreeFingerTapShortcutFeatureFlagEnabled(); + } + + /** * Whether a pointer icon will be shown over the location of a stylus pointer. * * @hide diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig index 71c91e913376..f9cb94aca54e 100644 --- a/core/java/android/hardware/input/input_framework.aconfig +++ b/core/java/android/hardware/input/input_framework.aconfig @@ -158,3 +158,10 @@ flag { description: "Allows privileged focused windows to capture power key events." bug: "357144512" } + +flag { + name: "touchpad_three_finger_tap_shortcut" + namespace: "input" + description: "Turns three-finger touchpad taps into a customizable shortcut." + bug: "365063048" +} diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 26929f5999eb..eefa15e1cbaa 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -64,7 +64,6 @@ import android.hardware.input.IKeyboardBacklightListener; import android.hardware.input.IStickyModifierStateListener; import android.hardware.input.ITabletModeChangedListener; import android.hardware.input.InputDeviceIdentifier; -import android.hardware.input.InputGestureData; import android.hardware.input.InputManager; import android.hardware.input.InputSensorInfo; import android.hardware.input.InputSettings; @@ -2313,6 +2312,12 @@ public class InputManagerService extends IInputManager.Stub // Native callback. @SuppressWarnings("unused") + private void notifyTouchpadThreeFingerTap() { + mKeyGestureController.handleTouchpadThreeFingerTap(); + } + + // Native callback. + @SuppressWarnings("unused") private void notifySwitch(long whenNanos, int switchValues, int switchMask) { if (DEBUG) { Slog.d(TAG, "notifySwitch: values=" + Integer.toHexString(switchValues) diff --git a/services/core/java/com/android/server/input/InputSettingsObserver.java b/services/core/java/com/android/server/input/InputSettingsObserver.java index d1a6d3b9bb00..420db9041dc2 100644 --- a/services/core/java/com/android/server/input/InputSettingsObserver.java +++ b/services/core/java/com/android/server/input/InputSettingsObserver.java @@ -143,6 +143,10 @@ class InputSettingsObserver extends ContentObserver { observer.accept("just booted"); } + // TODO(b/365063048): add an entry to mObservers that calls this instead, once we have a + // setting that can be observed. + updateTouchpadThreeFingerTapShortcutEnabled(); + configureUserActivityPokeInterval(); } @@ -205,6 +209,11 @@ class InputSettingsObserver extends ContentObserver { mNative.setTouchpadRightClickZoneEnabled(InputSettings.useTouchpadRightClickZone(mContext)); } + private void updateTouchpadThreeFingerTapShortcutEnabled() { + mNative.setTouchpadThreeFingerTapShortcutEnabled( + InputSettings.useTouchpadThreeFingerTapShortcut(mContext)); + } + private void updateShowTouches() { mNative.setShowTouches(getBoolean(Settings.System.SHOW_TOUCHES, false)); } diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java index ebeef651c19b..96ef07004b38 100644 --- a/services/core/java/com/android/server/input/KeyGestureController.java +++ b/services/core/java/com/android/server/input/KeyGestureController.java @@ -1134,6 +1134,13 @@ final class KeyGestureController { handleKeyGesture(event, null /*focusedToken*/); } + public void handleTouchpadThreeFingerTap() { + // TODO(b/365063048): trigger a custom shortcut based on the three-finger tap. + if (DEBUG) { + Slog.d(TAG, "Three-finger touchpad tap occurred"); + } + } + @MainThread public void setCurrentUserId(@UserIdInt int userId) { synchronized (mUserLock) { diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index 283fdea92b63..8903c27b491a 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -143,6 +143,8 @@ interface NativeInputManagerService { void setTouchpadRightClickZoneEnabled(boolean enabled); + void setTouchpadThreeFingerTapShortcutEnabled(boolean enabled); + void setShowTouches(boolean enabled); void setNonInteractiveDisplays(int[] displayIds); @@ -427,6 +429,9 @@ interface NativeInputManagerService { public native void setTouchpadRightClickZoneEnabled(boolean enabled); @Override + public native void setTouchpadThreeFingerTapShortcutEnabled(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 416e60f06c06..e4ac8261afab 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -110,6 +110,7 @@ static struct { jmethodID notifyInputDevicesChanged; jmethodID notifyTouchpadHardwareState; jmethodID notifyTouchpadGestureInfo; + jmethodID notifyTouchpadThreeFingerTap; jmethodID notifySwitch; jmethodID notifyInputChannelBroken; jmethodID notifyNoFocusedWindowAnr; @@ -345,6 +346,7 @@ public: void setTouchpadTapDraggingEnabled(bool enabled); void setShouldNotifyTouchpadHardwareState(bool enabled); void setTouchpadRightClickZoneEnabled(bool enabled); + void setTouchpadThreeFingerTapShortcutEnabled(bool enabled); void setInputDeviceEnabled(uint32_t deviceId, bool enabled); void setShowTouches(bool enabled); void setNonInteractiveDisplays(const std::set<ui::LogicalDisplayId>& displayIds); @@ -370,6 +372,7 @@ public: void notifyTouchpadHardwareState(const SelfContainedHardwareState& schs, int32_t deviceId) override; void notifyTouchpadGestureInfo(enum GestureType type, int32_t deviceId) override; + void notifyTouchpadThreeFingerTap() override; std::shared_ptr<KeyCharacterMap> getKeyboardLayoutOverlay( const InputDeviceIdentifier& identifier, const std::optional<KeyboardLayoutInfo> keyboardLayoutInfo) override; @@ -510,6 +513,10 @@ private: // into context (a.k.a. "right") clicks. bool touchpadRightClickZoneEnabled{false}; + // True to use three-finger tap as a customizable shortcut; false to use it as a + // middle-click. + bool touchpadThreeFingerTapShortcutEnabled{false}; + // True if a pointer icon should be shown for stylus pointers. bool stylusPointerIconEnabled{false}; @@ -780,6 +787,8 @@ void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outCon outConfig->touchpadTapDraggingEnabled = mLocked.touchpadTapDraggingEnabled; outConfig->shouldNotifyTouchpadHardwareState = mLocked.shouldNotifyTouchpadHardwareState; outConfig->touchpadRightClickZoneEnabled = mLocked.touchpadRightClickZoneEnabled; + outConfig->touchpadThreeFingerTapShortcutEnabled = + mLocked.touchpadThreeFingerTapShortcutEnabled; outConfig->disabledDevices = mLocked.disabledInputDevices; @@ -1034,6 +1043,13 @@ void NativeInputManager::notifyTouchpadGestureInfo(enum GestureType type, int32_ checkAndClearExceptionFromCallback(env, "notifyTouchpadGestureInfo"); } +void NativeInputManager::notifyTouchpadThreeFingerTap() { + ATRACE_CALL(); + JNIEnv* env = jniEnv(); + env->CallVoidMethod(mServiceObj, gServiceClassInfo.notifyTouchpadThreeFingerTap); + checkAndClearExceptionFromCallback(env, "notifyTouchpadThreeFingerTap"); +} + std::shared_ptr<KeyCharacterMap> NativeInputManager::getKeyboardLayoutOverlay( const InputDeviceIdentifier& identifier, const std::optional<KeyboardLayoutInfo> keyboardLayoutInfo) { @@ -1495,6 +1511,22 @@ void NativeInputManager::setTouchpadRightClickZoneEnabled(bool enabled) { InputReaderConfiguration::Change::TOUCHPAD_SETTINGS); } +void NativeInputManager::setTouchpadThreeFingerTapShortcutEnabled(bool enabled) { + { // acquire lock + std::scoped_lock _l(mLock); + + if (mLocked.touchpadThreeFingerTapShortcutEnabled == enabled) { + return; + } + + ALOGI("Setting touchpad three finger tap shortcut to %s.", toString(enabled)); + mLocked.touchpadThreeFingerTapShortcutEnabled = enabled; + } // release lock + + mInputManager->getReader().requestRefreshConfiguration( + InputReaderConfiguration::Change::TOUCHPAD_SETTINGS); +} + void NativeInputManager::setInputDeviceEnabled(uint32_t deviceId, bool enabled) { bool refresh = false; @@ -2437,6 +2469,11 @@ static void nativeSetTouchpadRightClickZoneEnabled(JNIEnv* env, jobject nativeIm im->setTouchpadRightClickZoneEnabled(enabled); } +static void nativeSetTouchpadThreeFingerTapShortcutEnabled(JNIEnv* env, jobject nativeImplObj, + jboolean enabled) { + getNativeInputManager(env, nativeImplObj)->setTouchpadThreeFingerTapShortcutEnabled(enabled); +} + static void nativeSetShowTouches(JNIEnv* env, jobject nativeImplObj, jboolean enabled) { NativeInputManager* im = getNativeInputManager(env, nativeImplObj); @@ -3119,6 +3156,8 @@ static const JNINativeMethod gInputManagerMethods[] = { {"setShouldNotifyTouchpadHardwareState", "(Z)V", (void*)nativeSetShouldNotifyTouchpadHardwareState}, {"setTouchpadRightClickZoneEnabled", "(Z)V", (void*)nativeSetTouchpadRightClickZoneEnabled}, + {"setTouchpadThreeFingerTapShortcutEnabled", "(Z)V", + (void*)nativeSetTouchpadThreeFingerTapShortcutEnabled}, {"setShowTouches", "(Z)V", (void*)nativeSetShowTouches}, {"setNonInteractiveDisplays", "([I)V", (void*)nativeSetNonInteractiveDisplays}, {"reloadCalibration", "()V", (void*)nativeReloadCalibration}, @@ -3229,6 +3268,8 @@ int register_android_server_InputManager(JNIEnv* env) { GET_METHOD_ID(gServiceClassInfo.notifyTouchpadGestureInfo, clazz, "notifyTouchpadGestureInfo", "(II)V") + GET_METHOD_ID(gServiceClassInfo.notifyTouchpadThreeFingerTap, clazz, + "notifyTouchpadThreeFingerTap", "()V") GET_METHOD_ID(gServiceClassInfo.notifySwitch, clazz, "notifySwitch", "(JII)V"); diff --git a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt index 927958eb62cc..f2d3229a098c 100644 --- a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt +++ b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt @@ -206,6 +206,7 @@ class InputManagerServiceTests { verify(native).setTouchpadTapDraggingEnabled(anyBoolean()) verify(native).setShouldNotifyTouchpadHardwareState(anyBoolean()) verify(native).setTouchpadRightClickZoneEnabled(anyBoolean()) + verify(native).setTouchpadThreeFingerTapShortcutEnabled(anyBoolean()) verify(native).setShowTouches(anyBoolean()) verify(native).setMotionClassifierEnabled(anyBoolean()) verify(native).setMaximumObscuringOpacityForTouch(anyFloat()) |