summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/input/InputSettings.java31
-rw-r--r--core/java/android/hardware/input/input_framework.aconfig7
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java7
-rw-r--r--services/core/java/com/android/server/input/InputSettingsObserver.java9
-rw-r--r--services/core/java/com/android/server/input/KeyGestureController.java7
-rw-r--r--services/core/java/com/android/server/input/NativeInputManagerService.java5
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp41
-rw-r--r--tests/Input/src/com/android/server/input/InputManagerServiceTests.kt1
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())