blob: 11427c3135d8843dc52e5f166f36d1fb76655e69 [file] [log] [blame]
Siarhei Vishniakou473174e2017-12-27 16:44:42 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "InputClassifier"
18
19#include "InputClassifier.h"
20
21#include <algorithm>
22#include <cmath>
23#include <inttypes.h>
24#include <log/log.h>
25#if defined(__linux__)
26 #include <pthread.h>
27#endif
28#include <server_configurable_flags/get_flags.h>
29
30#include <android/hardware/input/classifier/1.0/IInputClassifier.h>
31
32using android::hardware::hidl_bitfield;
33using android::hardware::hidl_vec;
34using namespace android::hardware::input;
35
36namespace android {
37
38static constexpr bool DEBUG = false;
39
40// Category (=namespace) name for the input settings that are applied at boot time
41static const char* INPUT_NATIVE_BOOT = "input_native_boot";
42// Feature flag name for the deep press feature
43static const char* DEEP_PRESS_ENABLED = "deep_press_enabled";
44
45//Max number of elements to store in mEvents.
46static constexpr size_t MAX_EVENTS = 5;
47
48template<class K, class V>
49static V getValueForKey(const std::unordered_map<K, V>& map, K key, V defaultValue) {
50 auto it = map.find(key);
51 if (it == map.end()) {
52 return defaultValue;
53 }
54 return it->second;
55}
56
57static common::V1_0::Source getSource(uint32_t source) {
58 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_UNKNOWN) ==
59 common::V1_0::Source::UNKNOWN, "SOURCE_UNKNOWN mismatch");
60 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_KEYBOARD) ==
61 common::V1_0::Source::KEYBOARD, "SOURCE_KEYBOARD mismatch");
62 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_DPAD) ==
63 common::V1_0::Source::DPAD, "SOURCE_DPAD mismatch");
64 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_GAMEPAD) ==
65 common::V1_0::Source::GAMEPAD, "SOURCE_GAMEPAD mismatch");
66 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_TOUCHSCREEN) ==
67 common::V1_0::Source::TOUCHSCREEN, "SOURCE_TOUCHSCREEN mismatch");
68 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_MOUSE) ==
69 common::V1_0::Source::MOUSE, "SOURCE_MOUSE mismatch");
70 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_STYLUS) ==
71 common::V1_0::Source::STYLUS, "SOURCE_STYLUS mismatch");
72 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_BLUETOOTH_STYLUS) ==
73 common::V1_0::Source::BLUETOOTH_STYLUS, "SOURCE_BLUETOOTH_STYLUS mismatch");
74 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_TRACKBALL) ==
75 common::V1_0::Source::TRACKBALL, "SOURCE_TRACKBALL mismatch");
76 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_MOUSE_RELATIVE) ==
77 common::V1_0::Source::MOUSE_RELATIVE, "SOURCE_MOUSE_RELATIVE mismatch");
78 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_TOUCHPAD) ==
79 common::V1_0::Source::TOUCHPAD, "SOURCE_TOUCHPAD mismatch");
80 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_TOUCH_NAVIGATION) ==
81 common::V1_0::Source::TOUCH_NAVIGATION, "SOURCE_TOUCH_NAVIGATION mismatch");
82 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_JOYSTICK) ==
83 common::V1_0::Source::JOYSTICK, "SOURCE_JOYSTICK mismatch");
84 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_ROTARY_ENCODER) ==
85 common::V1_0::Source::ROTARY_ENCODER, "SOURCE_ROTARY_ENCODER mismatch");
86 static_assert(static_cast<common::V1_0::Source>(AINPUT_SOURCE_ANY) ==
87 common::V1_0::Source::ANY, "SOURCE_ANY mismatch");
88 return static_cast<common::V1_0::Source>(source);
89}
90
91static common::V1_0::Action getAction(int32_t actionMasked) {
92 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_DOWN) ==
93 common::V1_0::Action::DOWN, "ACTION_DOWN mismatch");
94 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_UP) ==
95 common::V1_0::Action::UP, "ACTION_UP mismatch");
96 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_MOVE) ==
97 common::V1_0::Action::MOVE, "ACTION_MOVE mismatch");
98 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_CANCEL) ==
99 common::V1_0::Action::CANCEL, "ACTION_CANCEL mismatch");
100 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_OUTSIDE) ==
101 common::V1_0::Action::OUTSIDE, "ACTION_OUTSIDE mismatch");
102 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_POINTER_DOWN) ==
103 common::V1_0::Action::POINTER_DOWN, "ACTION_POINTER_DOWN mismatch");
104 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_POINTER_UP) ==
105 common::V1_0::Action::POINTER_UP, "ACTION_POINTER_UP mismatch");
106 static_assert(static_cast<common::V1_0::Action>( AMOTION_EVENT_ACTION_HOVER_MOVE) ==
107 common::V1_0::Action::HOVER_MOVE, "ACTION_HOVER_MOVE mismatch");
108 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_SCROLL) ==
109 common::V1_0::Action::SCROLL, "ACTION_SCROLL mismatch");
110 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_HOVER_ENTER) ==
111 common::V1_0::Action::HOVER_ENTER, "ACTION_HOVER_ENTER mismatch");
112 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_HOVER_EXIT) ==
113 common::V1_0::Action::HOVER_EXIT, "ACTION_HOVER_EXIT mismatch");
114 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_BUTTON_PRESS) ==
115 common::V1_0::Action::BUTTON_PRESS, "ACTION_BUTTON_PRESS mismatch");
116 static_assert(static_cast<common::V1_0::Action>(AMOTION_EVENT_ACTION_BUTTON_RELEASE) ==
117 common::V1_0::Action::BUTTON_RELEASE, "ACTION_BUTTON_RELEASE mismatch");
118 return static_cast<common::V1_0::Action>(actionMasked);
119}
120
121static common::V1_0::Button getActionButton(int32_t actionButton) {
122 static_assert(static_cast<common::V1_0::Button>(0) ==
123 common::V1_0::Button::NONE, "BUTTON_NONE mismatch");
124 static_assert(static_cast<common::V1_0::Button>(AMOTION_EVENT_BUTTON_PRIMARY) ==
125 common::V1_0::Button::PRIMARY, "BUTTON_PRIMARY mismatch");
126 static_assert(static_cast<common::V1_0::Button>(AMOTION_EVENT_BUTTON_SECONDARY) ==
127 common::V1_0::Button::SECONDARY, "BUTTON_SECONDARY mismatch");
128 static_assert(static_cast<common::V1_0::Button>(AMOTION_EVENT_BUTTON_TERTIARY) ==
129 common::V1_0::Button::TERTIARY, "BUTTON_TERTIARY mismatch");
130 static_assert(static_cast<common::V1_0::Button>(AMOTION_EVENT_BUTTON_BACK) ==
131 common::V1_0::Button::BACK, "BUTTON_BACK mismatch");
132 static_assert(static_cast<common::V1_0::Button>(AMOTION_EVENT_BUTTON_FORWARD) ==
133 common::V1_0::Button::FORWARD, "BUTTON_FORWARD mismatch");
134 static_assert(static_cast<common::V1_0::Button>(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY) ==
135 common::V1_0::Button::STYLUS_PRIMARY, "BUTTON_STYLUS_PRIMARY mismatch");
136 static_assert(static_cast<common::V1_0::Button>(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY) ==
137 common::V1_0::Button::STYLUS_SECONDARY, "BUTTON_STYLUS_SECONDARY mismatch");
138 return static_cast<common::V1_0::Button>(actionButton);
139}
140
141static hidl_bitfield<common::V1_0::Flag> getFlags(int32_t flags) {
142 static_assert(static_cast<common::V1_0::Flag>(AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED) ==
143 common::V1_0::Flag::WINDOW_IS_OBSCURED);
144 static_assert(static_cast<common::V1_0::Flag>(AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE) ==
145 common::V1_0::Flag::IS_GENERATED_GESTURE);
146 static_assert(static_cast<common::V1_0::Flag>(AMOTION_EVENT_FLAG_TAINTED) ==
147 common::V1_0::Flag::TAINTED);
148 return static_cast<hidl_bitfield<common::V1_0::Flag>>(flags);
149}
150
151static hidl_bitfield<common::V1_0::PolicyFlag> getPolicyFlags(int32_t flags) {
152 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_WAKE) ==
153 common::V1_0::PolicyFlag::WAKE);
154 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_VIRTUAL) ==
155 common::V1_0::PolicyFlag::VIRTUAL);
156 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_FUNCTION) ==
157 common::V1_0::PolicyFlag::FUNCTION);
158 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_GESTURE) ==
159 common::V1_0::PolicyFlag::GESTURE);
160 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_INJECTED) ==
161 common::V1_0::PolicyFlag::INJECTED);
162 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_TRUSTED) ==
163 common::V1_0::PolicyFlag::TRUSTED);
164 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_FILTERED) ==
165 common::V1_0::PolicyFlag::FILTERED);
166 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_DISABLE_KEY_REPEAT) ==
167 common::V1_0::PolicyFlag::DISABLE_KEY_REPEAT);
168 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_INTERACTIVE) ==
169 common::V1_0::PolicyFlag::INTERACTIVE);
170 static_assert(static_cast<common::V1_0::PolicyFlag>(POLICY_FLAG_PASS_TO_USER) ==
171 common::V1_0::PolicyFlag::PASS_TO_USER);
172 return static_cast<hidl_bitfield<common::V1_0::PolicyFlag>>(flags);
173}
174
175static hidl_bitfield<common::V1_0::EdgeFlag> getEdgeFlags(int32_t flags) {
176 static_assert(static_cast<common::V1_0::EdgeFlag>(AMOTION_EVENT_EDGE_FLAG_NONE) ==
177 common::V1_0::EdgeFlag::NONE);
178 static_assert(static_cast<common::V1_0::EdgeFlag>(AMOTION_EVENT_EDGE_FLAG_TOP) ==
179 common::V1_0::EdgeFlag::TOP);
180 static_assert(static_cast<common::V1_0::EdgeFlag>(AMOTION_EVENT_EDGE_FLAG_BOTTOM) ==
181 common::V1_0::EdgeFlag::BOTTOM);
182 static_assert(static_cast<common::V1_0::EdgeFlag>(AMOTION_EVENT_EDGE_FLAG_LEFT) ==
183 common::V1_0::EdgeFlag::LEFT);
184 static_assert(static_cast<common::V1_0::EdgeFlag>(AMOTION_EVENT_EDGE_FLAG_RIGHT) ==
185 common::V1_0::EdgeFlag::RIGHT);
186 return static_cast<hidl_bitfield<common::V1_0::EdgeFlag>>(flags);
187}
188
189static hidl_bitfield<common::V1_0::Meta> getMetastate(int32_t state) {
190 static_assert(static_cast<common::V1_0::Meta>(AMETA_NONE) ==
191 common::V1_0::Meta::NONE);
192 static_assert(static_cast<common::V1_0::Meta>(AMETA_ALT_ON) ==
193 common::V1_0::Meta::ALT_ON);
194 static_assert(static_cast<common::V1_0::Meta>(AMETA_ALT_LEFT_ON) ==
195 common::V1_0::Meta::ALT_LEFT_ON);
196 static_assert(static_cast<common::V1_0::Meta>(AMETA_ALT_RIGHT_ON) ==
197 common::V1_0::Meta::ALT_RIGHT_ON);
198 static_assert(static_cast<common::V1_0::Meta>(AMETA_SHIFT_ON) ==
199 common::V1_0::Meta::SHIFT_ON);
200 static_assert(static_cast<common::V1_0::Meta>(AMETA_SHIFT_LEFT_ON) ==
201 common::V1_0::Meta::SHIFT_LEFT_ON);
202 static_assert(static_cast<common::V1_0::Meta>(AMETA_SHIFT_RIGHT_ON) ==
203 common::V1_0::Meta::SHIFT_RIGHT_ON);
204 static_assert(static_cast<common::V1_0::Meta>(AMETA_SYM_ON) ==
205 common::V1_0::Meta::SYM_ON);
206 static_assert(static_cast<common::V1_0::Meta>(AMETA_FUNCTION_ON) ==
207 common::V1_0::Meta::FUNCTION_ON);
208 static_assert(static_cast<common::V1_0::Meta>(AMETA_CTRL_ON) ==
209 common::V1_0::Meta::CTRL_ON);
210 static_assert(static_cast<common::V1_0::Meta>(AMETA_CTRL_LEFT_ON) ==
211 common::V1_0::Meta::CTRL_LEFT_ON);
212 static_assert(static_cast<common::V1_0::Meta>(AMETA_CTRL_RIGHT_ON) ==
213 common::V1_0::Meta::CTRL_RIGHT_ON);
214 static_assert(static_cast<common::V1_0::Meta>(AMETA_META_ON) ==
215 common::V1_0::Meta::META_ON);
216 static_assert(static_cast<common::V1_0::Meta>(AMETA_META_LEFT_ON) ==
217 common::V1_0::Meta::META_LEFT_ON);
218 static_assert(static_cast<common::V1_0::Meta>(AMETA_META_RIGHT_ON) ==
219 common::V1_0::Meta::META_RIGHT_ON);
220 static_assert(static_cast<common::V1_0::Meta>(AMETA_CAPS_LOCK_ON) ==
221 common::V1_0::Meta::CAPS_LOCK_ON);
222 static_assert(static_cast<common::V1_0::Meta>(AMETA_NUM_LOCK_ON) ==
223 common::V1_0::Meta::NUM_LOCK_ON);
224 static_assert(static_cast<common::V1_0::Meta>(AMETA_SCROLL_LOCK_ON) ==
225 common::V1_0::Meta::SCROLL_LOCK_ON);
226 return static_cast<hidl_bitfield<common::V1_0::Meta>>(state);
227}
228
229static hidl_bitfield<common::V1_0::Button> getButtonState(int32_t buttonState) {
230 // No need for static_assert here.
231 // The button values have already been asserted in getActionButton(..) above
232 return static_cast<hidl_bitfield<common::V1_0::Button>>(buttonState);
233}
234
235static common::V1_0::ToolType getToolType(int32_t toolType) {
236 static_assert(static_cast<common::V1_0::ToolType>(AMOTION_EVENT_TOOL_TYPE_UNKNOWN) ==
237 common::V1_0::ToolType::UNKNOWN);
238 static_assert(static_cast<common::V1_0::ToolType>(AMOTION_EVENT_TOOL_TYPE_FINGER) ==
239 common::V1_0::ToolType::FINGER);
240 static_assert(static_cast<common::V1_0::ToolType>(AMOTION_EVENT_TOOL_TYPE_STYLUS) ==
241 common::V1_0::ToolType::STYLUS);
242 static_assert(static_cast<common::V1_0::ToolType>(AMOTION_EVENT_TOOL_TYPE_MOUSE) ==
243 common::V1_0::ToolType::MOUSE);
244 static_assert(static_cast<common::V1_0::ToolType>(AMOTION_EVENT_TOOL_TYPE_ERASER) ==
245 common::V1_0::ToolType::ERASER);
246 return static_cast<common::V1_0::ToolType>(toolType);
247}
248
249static common::V1_0::Axis getAxis(uint64_t axis) {
250 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_X) ==
251 common::V1_0::Axis::X);
252 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_Y) ==
253 common::V1_0::Axis::Y);
254 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_PRESSURE) ==
255 common::V1_0::Axis::PRESSURE);
256 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_SIZE) ==
257 common::V1_0::Axis::SIZE);
258 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_TOUCH_MAJOR) ==
259 common::V1_0::Axis::TOUCH_MAJOR);
260 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_TOUCH_MINOR) ==
261 common::V1_0::Axis::TOUCH_MINOR);
262 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_TOOL_MAJOR) ==
263 common::V1_0::Axis::TOOL_MAJOR);
264 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_TOOL_MINOR) ==
265 common::V1_0::Axis::TOOL_MINOR);
266 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_ORIENTATION) ==
267 common::V1_0::Axis::ORIENTATION);
268 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_VSCROLL) ==
269 common::V1_0::Axis::VSCROLL);
270 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_HSCROLL) ==
271 common::V1_0::Axis::HSCROLL);
272 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_Z) ==
273 common::V1_0::Axis::Z);
274 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_RX) ==
275 common::V1_0::Axis::RX);
276 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_RY) ==
277 common::V1_0::Axis::RY);
278 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_RZ) ==
279 common::V1_0::Axis::RZ);
280 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_HAT_X) ==
281 common::V1_0::Axis::HAT_X);
282 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_HAT_Y) ==
283 common::V1_0::Axis::HAT_Y);
284 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_LTRIGGER) ==
285 common::V1_0::Axis::LTRIGGER);
286 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_RTRIGGER) ==
287 common::V1_0::Axis::RTRIGGER);
288 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_THROTTLE) ==
289 common::V1_0::Axis::THROTTLE);
290 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_RUDDER) ==
291 common::V1_0::Axis::RUDDER);
292 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_WHEEL) ==
293 common::V1_0::Axis::WHEEL);
294 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GAS) ==
295 common::V1_0::Axis::GAS);
296 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_BRAKE) ==
297 common::V1_0::Axis::BRAKE);
298 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_DISTANCE) ==
299 common::V1_0::Axis::DISTANCE);
300 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_TILT) ==
301 common::V1_0::Axis::TILT);
302 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_SCROLL) ==
303 common::V1_0::Axis::SCROLL);
304 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_RELATIVE_X) ==
305 common::V1_0::Axis::RELATIVE_X);
306 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_RELATIVE_Y) ==
307 common::V1_0::Axis::RELATIVE_Y);
308 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_1) ==
309 common::V1_0::Axis::GENERIC_1);
310 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_2) ==
311 common::V1_0::Axis::GENERIC_2);
312 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_3) ==
313 common::V1_0::Axis::GENERIC_3);
314 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_4) ==
315 common::V1_0::Axis::GENERIC_4);
316 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_5) ==
317 common::V1_0::Axis::GENERIC_5);
318 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_6) ==
319 common::V1_0::Axis::GENERIC_6);
320 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_7) ==
321 common::V1_0::Axis::GENERIC_7);
322 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_8) ==
323 common::V1_0::Axis::GENERIC_8);
324 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_9) ==
325 common::V1_0::Axis::GENERIC_9);
326 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_10) ==
327 common::V1_0::Axis::GENERIC_10);
328 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_11) ==
329 common::V1_0::Axis::GENERIC_11);
330 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_12) ==
331 common::V1_0::Axis::GENERIC_12);
332 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_13) ==
333 common::V1_0::Axis::GENERIC_13);
334 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_14) ==
335 common::V1_0::Axis::GENERIC_14);
336 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_15) ==
337 common::V1_0::Axis::GENERIC_15);
338 static_assert(static_cast<common::V1_0::Axis>(AMOTION_EVENT_AXIS_GENERIC_16) ==
339 common::V1_0::Axis::GENERIC_16);
340 return static_cast<common::V1_0::Axis>(axis);
341}
342
343static common::V1_0::VideoFrame getHalVideoFrame(const TouchVideoFrame& frame) {
344 common::V1_0::VideoFrame out;
345 out.width = frame.getWidth();
346 out.height = frame.getHeight();
347 out.data = frame.getData();
348 struct timeval timestamp = frame.getTimestamp();
349 out.timestamp = seconds_to_nanoseconds(timestamp.tv_sec) +
350 microseconds_to_nanoseconds(timestamp.tv_usec);
351 return out;
352}
353
354static std::vector<common::V1_0::VideoFrame> convertVideoFrames(
355 const std::vector<TouchVideoFrame>& frames) {
356 std::vector<common::V1_0::VideoFrame> out;
357 for (const TouchVideoFrame& frame : frames) {
358 out.push_back(getHalVideoFrame(frame));
359 }
360 return out;
361}
362
363static uint8_t getActionIndex(int32_t action) {
364 return (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>
365 AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
366}
367
368static void getHidlPropertiesAndCoords(const NotifyMotionArgs& args,
369 std::vector<common::V1_0::PointerProperties>* outPointerProperties,
370 std::vector<common::V1_0::PointerCoords>* outPointerCoords) {
371 outPointerProperties->reserve(args.pointerCount);
372 outPointerCoords->reserve(args.pointerCount);
373 for (size_t i = 0; i < args.pointerCount; i++) {
374 common::V1_0::PointerProperties properties;
375 properties.id = args.pointerProperties[i].id;
376 properties.toolType = getToolType(args.pointerProperties[i].toolType);
377 outPointerProperties->push_back(properties);
378
379 common::V1_0::PointerCoords coords;
380 BitSet64 bits (args.pointerCoords[i].bits);
381 std::vector<float> values;
382 size_t index = 0;
383 while (!bits.isEmpty()) {
384 uint32_t axis = bits.clearFirstMarkedBit();
385 coords.bits |= 1 << static_cast<uint64_t>(getAxis(axis));
386 float value = args.pointerCoords[i].values[index++];
387 values.push_back(value);
388 }
389 coords.values = values;
390 outPointerCoords->push_back(coords);
391 }
392}
393
394static common::V1_0::MotionEvent getMotionEvent(const NotifyMotionArgs& args) {
395 common::V1_0::MotionEvent event;
396 event.deviceId = args.deviceId;
397 event.source = getSource(args.source);
398 event.displayId = args.displayId;
399 event.downTime = args.downTime;
400 event.eventTime = args.eventTime;
401 event.action = getAction(args.action & AMOTION_EVENT_ACTION_MASK);
402 event.actionIndex = getActionIndex(args.action);
403 event.actionButton = getActionButton(args.actionButton);
404 event.flags = getFlags(args.flags);
405 event.policyFlags = getPolicyFlags(args.policyFlags);
406 event.edgeFlags = getEdgeFlags(args.edgeFlags);
407 event.metaState = getMetastate(args.metaState);
408 event.buttonState = getButtonState(args.buttonState);
409 event.xPrecision = args.xPrecision;
410 event.yPrecision = args.yPrecision;
411
412 std::vector<common::V1_0::PointerProperties> pointerProperties;
413 std::vector<common::V1_0::PointerCoords> pointerCoords;
414 getHidlPropertiesAndCoords(args, /*out*/&pointerProperties, /*out*/&pointerCoords);
415 event.pointerProperties = pointerProperties;
416 event.pointerCoords = pointerCoords;
417
418 event.deviceTimestamp = args.deviceTimestamp;
419 event.frames = convertVideoFrames(args.videoFrames);
420
421 return event;
422}
423
424static MotionClassification getMotionClassification(common::V1_0::Classification classification) {
425 static_assert(MotionClassification::NONE ==
426 static_cast<MotionClassification>(common::V1_0::Classification::NONE));
427 static_assert(MotionClassification::AMBIGUOUS_GESTURE ==
428 static_cast<MotionClassification>(common::V1_0::Classification::AMBIGUOUS_GESTURE));
429 static_assert(MotionClassification::DEEP_PRESS ==
430 static_cast<MotionClassification>(common::V1_0::Classification::DEEP_PRESS));
431 return static_cast<MotionClassification>(classification);
432}
433
434static bool isTouchEvent(const NotifyMotionArgs& args) {
435 return args.source == AINPUT_SOURCE_TOUCHPAD || args.source == AINPUT_SOURCE_TOUCHSCREEN;
436}
437
438// Check if the "deep touch" feature is on.
439static bool deepPressEnabled() {
440 std::string flag_value = server_configurable_flags::GetServerConfigurableFlag(
441 INPUT_NATIVE_BOOT, DEEP_PRESS_ENABLED, "true");
442 std::transform(flag_value.begin(), flag_value.end(), flag_value.begin(), ::tolower);
443 if (flag_value == "1" || flag_value == "true") {
444 ALOGI("Deep press feature enabled.");
445 return true;
446 }
447 ALOGI("Deep press feature is not enabled.");
448 return false;
449}
450
451
452// --- ClassifierEvent ---
453
454ClassifierEvent::ClassifierEvent(std::unique_ptr<NotifyMotionArgs> args) :
455 type(ClassifierEventType::MOTION), args(std::move(args)) { };
456ClassifierEvent::ClassifierEvent(std::unique_ptr<NotifyDeviceResetArgs> args) :
457 type(ClassifierEventType::DEVICE_RESET), args(std::move(args)) { };
458ClassifierEvent::ClassifierEvent(ClassifierEventType type, std::unique_ptr<NotifyArgs> args) :
459 type(type), args(std::move(args)) { };
460
461ClassifierEvent::ClassifierEvent(ClassifierEvent&& other) :
462 type(other.type), args(std::move(other.args)) { };
463
464ClassifierEvent& ClassifierEvent::operator=(ClassifierEvent&& other) {
465 type = other.type;
466 args = std::move(other.args);
467 return *this;
468}
469
470ClassifierEvent ClassifierEvent::createHalResetEvent() {
471 return ClassifierEvent(ClassifierEventType::HAL_RESET, nullptr);
472}
473
474ClassifierEvent ClassifierEvent::createExitEvent() {
475 return ClassifierEvent(ClassifierEventType::EXIT, nullptr);
476}
477
478std::optional<int32_t> ClassifierEvent::getDeviceId() const {
479 switch (type) {
480 case ClassifierEventType::MOTION: {
481 NotifyMotionArgs* motionArgs = static_cast<NotifyMotionArgs*>(args.get());
482 return motionArgs->deviceId;
483 }
484 case ClassifierEventType::DEVICE_RESET: {
485 NotifyDeviceResetArgs* deviceResetArgs =
486 static_cast<NotifyDeviceResetArgs*>(args.get());
487 return deviceResetArgs->deviceId;
488 }
489 case ClassifierEventType::HAL_RESET: {
490 return std::nullopt;
491 }
492 case ClassifierEventType::EXIT: {
493 return std::nullopt;
494 }
495 }
496}
497
498// --- MotionClassifier ---
499
500MotionClassifier::MotionClassifier(
501 sp<android::hardware::input::classifier::V1_0::IInputClassifier> service) :
502 mEvents(MAX_EVENTS), mService(service) {
503 mHalThread = std::thread(&MotionClassifier::callInputClassifierHal, this);
504#if defined(__linux__)
505 // Set the thread name for debugging
506 pthread_setname_np(mHalThread.native_handle(), "InputClassifier");
507#endif
508}
509
510MotionClassifier::~MotionClassifier() {
511 requestExit();
512 mHalThread.join();
513}
514
515void MotionClassifier::ensureHalThread(const char* function) {
516 if (DEBUG) {
517 if (std::this_thread::get_id() != mHalThread.get_id()) {
518 ALOGE("Function %s should only be called from InputClassifier thread", function);
519 }
520 }
521}
522
523/**
524 * Obtain the classification from the HAL for a given MotionEvent.
525 * Should only be called from the InputClassifier thread (mHalThread).
526 * Should not be called from the thread that notifyMotion runs on.
527 *
528 * There is no way to provide a timeout for a HAL call. So if the HAL takes too long
529 * to return a classification, this would directly impact the touch latency.
530 * To remove any possibility of negatively affecting the touch latency, the HAL
531 * is called from a dedicated thread.
532 */
533void MotionClassifier::callInputClassifierHal() {
534 ensureHalThread(__func__);
535 while (true) {
536 ClassifierEvent event = mEvents.pop();
537 switch (event.type) {
538 case ClassifierEventType::MOTION: {
539 NotifyMotionArgs* motionArgs = static_cast<NotifyMotionArgs*>(event.args.get());
540 common::V1_0::MotionEvent motionEvent = getMotionEvent(*motionArgs);
541 common::V1_0::Classification halClassification = mService->classify(motionEvent);
542 updateClassification(motionArgs->deviceId, motionArgs->eventTime,
543 getMotionClassification(halClassification));
544 break;
545 }
546 case ClassifierEventType::DEVICE_RESET: {
547 const int32_t deviceId = *(event.getDeviceId());
548 mService->resetDevice(deviceId);
549 setClassification(deviceId, MotionClassification::NONE);
550 break;
551 }
552 case ClassifierEventType::HAL_RESET: {
553 mService->reset();
554 clearClassifications();
555 break;
556 }
557 case ClassifierEventType::EXIT: {
558 clearClassifications();
559 return;
560 }
561 }
562 }
563}
564
565void MotionClassifier::requestExit() {
566 reset();
567 mEvents.push(ClassifierEvent::createExitEvent());
568}
569
570void MotionClassifier::updateClassification(int32_t deviceId, nsecs_t eventTime,
571 MotionClassification classification) {
572 std::scoped_lock lock(mLock);
573 const nsecs_t lastDownTime = getValueForKey(mLastDownTimes, deviceId, static_cast<nsecs_t>(0));
574 if (eventTime < lastDownTime) {
575 // HAL just finished processing an event that belonged to an earlier gesture,
576 // but new gesture is already in progress. Drop this classification.
577 ALOGW("Received late classification. Late by at least %" PRId64 " ms.",
578 nanoseconds_to_milliseconds(lastDownTime - eventTime));
579 return;
580 }
581 mClassifications[deviceId] = classification;
582}
583
584void MotionClassifier::setClassification(int32_t deviceId, MotionClassification classification) {
585 std::scoped_lock lock(mLock);
586 mClassifications[deviceId] = classification;
587}
588
589void MotionClassifier::clearClassifications() {
590 std::scoped_lock lock(mLock);
591 mClassifications.clear();
592}
593
594MotionClassification MotionClassifier::getClassification(int32_t deviceId) {
595 std::scoped_lock lock(mLock);
596 return getValueForKey(mClassifications, deviceId, MotionClassification::NONE);
597}
598
599void MotionClassifier::updateLastDownTime(int32_t deviceId, nsecs_t downTime) {
600 std::scoped_lock lock(mLock);
601 mLastDownTimes[deviceId] = downTime;
602 mClassifications[deviceId] = MotionClassification::NONE;
603}
604
605MotionClassification MotionClassifier::classify(const NotifyMotionArgs& args) {
606 if (!mService) {
607 // If HAL is not present, do nothing
608 return MotionClassification::NONE;
609 }
610 if ((args.action & AMOTION_EVENT_ACTION_MASK) == AMOTION_EVENT_ACTION_DOWN) {
611 updateLastDownTime(args.deviceId, args.downTime);
612 }
613
614 ClassifierEvent event(std::make_unique<NotifyMotionArgs>(args));
615 bool elementAdded = mEvents.push(std::move(event));
616 if (!elementAdded) {
617 // Queue should not ever overfill. Suspect HAL is slow.
618 ALOGE("Dropped element with eventTime %" PRIu64, args.eventTime);
619 reset();
620 return MotionClassification::NONE;
621 }
622 return getClassification(args.deviceId);
623}
624
625void MotionClassifier::reset() {
626 mEvents.clear();
627 mEvents.push(ClassifierEvent::createHalResetEvent());
628}
629
630/**
631 * Per-device reset. Clear the outstanding events that are going to be sent to HAL.
632 * Request InputClassifier thread to call resetDevice for this particular device.
633 */
634void MotionClassifier::reset(const NotifyDeviceResetArgs& args) {
635 int32_t deviceId = args.deviceId;
636 // Clear the pending events right away, to avoid unnecessary work done by the HAL.
637 mEvents.erase([deviceId](const ClassifierEvent& event) {
638 std::optional<int32_t> eventDeviceId = event.getDeviceId();
639 return eventDeviceId && (*eventDeviceId == deviceId);
640 });
641 mEvents.push(std::make_unique<NotifyDeviceResetArgs>(args));
642}
643
644// --- InputClassifier ---
645
646InputClassifier::InputClassifier(const sp<InputListenerInterface>& listener) :
647 mListener(listener) {
648 if (deepPressEnabled()) {
649 sp<android::hardware::input::classifier::V1_0::IInputClassifier> service =
650 classifier::V1_0::IInputClassifier::getService();
651 if (service) {
652 mMotionClassifier = std::make_unique<MotionClassifier>(service);
653 } else {
654 ALOGI("Could not obtain InputClassifier HAL");
655 }
656 }
657};
658
659void InputClassifier::notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
660 // pass through
661 mListener->notifyConfigurationChanged(args);
662}
663
664void InputClassifier::notifyKey(const NotifyKeyArgs* args) {
665 // pass through
666 mListener->notifyKey(args);
667}
668
669void InputClassifier::notifyMotion(const NotifyMotionArgs* args) {
670 if (mMotionClassifier && isTouchEvent(*args)) {
671 // We only cover touch events, for now.
672 NotifyMotionArgs newArgs = NotifyMotionArgs(*args);
673 newArgs.classification = mMotionClassifier->classify(newArgs);
674 args = &newArgs;
675 }
676 mListener->notifyMotion(args);
677}
678
679void InputClassifier::notifySwitch(const NotifySwitchArgs* args) {
680 // pass through
681 mListener->notifySwitch(args);
682}
683
684void InputClassifier::notifyDeviceReset(const NotifyDeviceResetArgs* args) {
685 if (mMotionClassifier) {
686 mMotionClassifier->reset(*args);
687 }
688 // continue to next stage
689 mListener->notifyDeviceReset(args);
690}
691
692} // namespace android