Add a debug flag to convert all touch pointers to stylus
When the sysprop `persist.debug.input.simulate_stylus_with_touch`
is set, all pointers reported by TouchInputMapper will be converted
into stylus pointers.
Changes to the flag will require a reboot to take effect.
Bug: 217741685
Test: manual
Change-Id: I7723be718354872509a9e85beda10acdbe25dd48
diff --git a/services/inputflinger/reader/Android.bp b/services/inputflinger/reader/Android.bp
index 51546ce..3bd3275 100644
--- a/services/inputflinger/reader/Android.bp
+++ b/services/inputflinger/reader/Android.bp
@@ -71,6 +71,7 @@
"libstatslog",
"libui",
"libutils",
+ "PlatformProperties",
],
static_libs: [
"libc++fs",
diff --git a/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp b/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp
index ff3a592..41a8426 100644
--- a/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp
+++ b/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp
@@ -18,6 +18,8 @@
#include "MultiTouchInputMapper.h"
+#include <android/sysprop/InputProperties.sysprop.h>
+
namespace android {
// --- Constants ---
@@ -309,6 +311,10 @@
outPointer.toolType = AMOTION_EVENT_TOOL_TYPE_FINGER;
}
}
+ if (shouldSimulateStylusWithTouch() &&
+ outPointer.toolType == AMOTION_EVENT_TOOL_TYPE_FINGER) {
+ outPointer.toolType = AMOTION_EVENT_TOOL_TYPE_STYLUS;
+ }
bool isHovering = mTouchButtonAccumulator.getToolType() != AMOTION_EVENT_TOOL_TYPE_MOUSE &&
(mTouchButtonAccumulator.isHovering() ||
@@ -385,7 +391,15 @@
}
bool MultiTouchInputMapper::hasStylus() const {
- return mMultiTouchMotionAccumulator.hasStylus() || mTouchButtonAccumulator.hasStylus();
+ return mMultiTouchMotionAccumulator.hasStylus() || mTouchButtonAccumulator.hasStylus() ||
+ shouldSimulateStylusWithTouch();
+}
+
+bool MultiTouchInputMapper::shouldSimulateStylusWithTouch() const {
+ static const bool SIMULATE_STYLUS_WITH_TOUCH =
+ sysprop::InputProperties::simulate_stylus_with_touch().value_or(false);
+ return SIMULATE_STYLUS_WITH_TOUCH &&
+ mParameters.deviceType == Parameters::DeviceType::TOUCH_SCREEN;
}
} // namespace android
diff --git a/services/inputflinger/reader/mapper/MultiTouchInputMapper.h b/services/inputflinger/reader/mapper/MultiTouchInputMapper.h
index 225ad49..b7c3457 100644
--- a/services/inputflinger/reader/mapper/MultiTouchInputMapper.h
+++ b/services/inputflinger/reader/mapper/MultiTouchInputMapper.h
@@ -104,6 +104,14 @@
bool hasStylus() const override;
private:
+ // simulate_stylus_with_touch is a debug mode that converts all finger pointers reported by this
+ // mapper's touchscreen into stylus pointers, and adds SOURCE_STYLUS to the input device.
+ // It is used to simulate stylus events for debugging and testing on a device that does not
+ // support styluses. It can be enabled using
+ // "adb shell setprop persist.debug.input.simulate_stylus_with_touch true",
+ // and requires a reboot to take effect.
+ inline bool shouldSimulateStylusWithTouch() const;
+
// If the slot is in use, return the bit id. Return std::nullopt otherwise.
std::optional<int32_t> getActiveBitId(const MultiTouchMotionAccumulator::Slot& inSlot);
MultiTouchMotionAccumulator mMultiTouchMotionAccumulator;