blob: 855247f29dd6b85d9d8dd93b9d56468ff6ced6cd [file] [log] [blame]
Michael Wrightd02c5b62014-02-10 15:10:22 -08001/*
2 * Copyright (C) 2010 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#include "../InputReader.h"
18
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -070019#include <inttypes.h>
Michael Wrightd02c5b62014-02-10 15:10:22 -080020#include <utils/List.h>
21#include <gtest/gtest.h>
22#include <math.h>
23
24namespace android {
25
26// An arbitrary time value.
27static const nsecs_t ARBITRARY_TIME = 1234;
28
29// Arbitrary display properties.
30static const int32_t DISPLAY_ID = 0;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -070031static const int32_t SECONDARY_DISPLAY_ID = DISPLAY_ID + 1;
Michael Wrightd02c5b62014-02-10 15:10:22 -080032static const int32_t DISPLAY_WIDTH = 480;
33static const int32_t DISPLAY_HEIGHT = 800;
Santos Cordonfa5cf462017-04-05 10:37:00 -070034static const int32_t VIRTUAL_DISPLAY_ID = 1;
35static const int32_t VIRTUAL_DISPLAY_WIDTH = 400;
36static const int32_t VIRTUAL_DISPLAY_HEIGHT = 500;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -070037static const char* VIRTUAL_DISPLAY_UNIQUE_ID = "virtual:1";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -070038static constexpr std::optional<uint8_t> NO_PORT = std::nullopt; // no physical port is specified
Michael Wrightd02c5b62014-02-10 15:10:22 -080039
40// Error tolerance for floating point assertions.
41static const float EPSILON = 0.001f;
42
43template<typename T>
44static inline T min(T a, T b) {
45 return a < b ? a : b;
46}
47
48static inline float avg(float x, float y) {
49 return (x + y) / 2;
50}
51
52
53// --- FakePointerController ---
54
55class FakePointerController : public PointerControllerInterface {
56 bool mHaveBounds;
57 float mMinX, mMinY, mMaxX, mMaxY;
58 float mX, mY;
59 int32_t mButtonState;
Andrii Kulian620f6d92018-09-14 16:51:59 -070060 int32_t mDisplayId;
Michael Wrightd02c5b62014-02-10 15:10:22 -080061
62protected:
63 virtual ~FakePointerController() { }
64
65public:
66 FakePointerController() :
67 mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
Andrii Kulian620f6d92018-09-14 16:51:59 -070068 mButtonState(0), mDisplayId(ADISPLAY_ID_DEFAULT) {
Michael Wrightd02c5b62014-02-10 15:10:22 -080069 }
70
71 void setBounds(float minX, float minY, float maxX, float maxY) {
72 mHaveBounds = true;
73 mMinX = minX;
74 mMinY = minY;
75 mMaxX = maxX;
76 mMaxY = maxY;
77 }
78
Andrii Kulian620f6d92018-09-14 16:51:59 -070079 void setDisplayId(int32_t displayId) {
80 mDisplayId = displayId;
81 }
82
Michael Wrightd02c5b62014-02-10 15:10:22 -080083 virtual void setPosition(float x, float y) {
84 mX = x;
85 mY = y;
86 }
87
88 virtual void setButtonState(int32_t buttonState) {
89 mButtonState = buttonState;
90 }
91
92 virtual int32_t getButtonState() const {
93 return mButtonState;
94 }
95
96 virtual void getPosition(float* outX, float* outY) const {
97 *outX = mX;
98 *outY = mY;
99 }
100
Andrii Kulian620f6d92018-09-14 16:51:59 -0700101 virtual int32_t getDisplayId() const {
102 return mDisplayId;
103 }
104
Michael Wrightd02c5b62014-02-10 15:10:22 -0800105private:
106 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
107 *outMinX = mMinX;
108 *outMinY = mMinY;
109 *outMaxX = mMaxX;
110 *outMaxY = mMaxY;
111 return mHaveBounds;
112 }
113
114 virtual void move(float deltaX, float deltaY) {
115 mX += deltaX;
116 if (mX < mMinX) mX = mMinX;
117 if (mX > mMaxX) mX = mMaxX;
118 mY += deltaY;
119 if (mY < mMinY) mY = mMinY;
120 if (mY > mMaxY) mY = mMaxY;
121 }
122
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100123 virtual void fade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800124 }
125
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100126 virtual void unfade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800127 }
128
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100129 virtual void setPresentation(Presentation) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800130 }
131
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100132 virtual void setSpots(const PointerCoords*, const uint32_t*, BitSet32) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800133 }
134
135 virtual void clearSpots() {
136 }
137};
138
139
140// --- FakeInputReaderPolicy ---
141
142class FakeInputReaderPolicy : public InputReaderPolicyInterface {
143 InputReaderConfiguration mConfig;
144 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
145 Vector<InputDeviceInfo> mInputDevices;
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100146 std::vector<DisplayViewport> mViewports;
Jason Gerecke489fda82012-09-07 17:19:40 -0700147 TouchAffineTransformation transform;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800148
149protected:
150 virtual ~FakeInputReaderPolicy() { }
151
152public:
153 FakeInputReaderPolicy() {
154 }
155
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700156 virtual void clearViewports() {
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100157 mViewports.clear();
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100158 mConfig.setDisplayViewports(mViewports);
Santos Cordonfa5cf462017-04-05 10:37:00 -0700159 }
160
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700161 std::optional<DisplayViewport> getDisplayViewportByUniqueId(const std::string& uniqueId) const {
162 return mConfig.getDisplayViewportByUniqueId(uniqueId);
163 }
164 std::optional<DisplayViewport> getDisplayViewportByType(ViewportType type) const {
165 return mConfig.getDisplayViewportByType(type);
166 }
167
168 std::optional<DisplayViewport> getDisplayViewportByPort(uint8_t displayPort) const {
169 return mConfig.getDisplayViewportByPort(displayPort);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700170 }
171
172 void addDisplayViewport(int32_t displayId, int32_t width, int32_t height, int32_t orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700173 const std::string& uniqueId, std::optional<uint8_t> physicalPort,
174 ViewportType viewportType) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700175 const DisplayViewport viewport = createDisplayViewport(displayId, width, height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700176 orientation, uniqueId, physicalPort, viewportType);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -0700177 mViewports.push_back(viewport);
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100178 mConfig.setDisplayViewports(mViewports);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800179 }
180
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100181 void addExcludedDeviceName(const std::string& deviceName) {
182 mConfig.excludedDeviceNames.push_back(deviceName);
Michael Wrightd02c5b62014-02-10 15:10:22 -0800183 }
184
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700185 void addInputPortAssociation(const std::string& inputPort, uint8_t displayPort) {
186 mConfig.portAssociations.insert({inputPort, displayPort});
187 }
188
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700189 void addDisabledDevice(int32_t deviceId) {
190 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
191 bool currentlyEnabled = index < 0;
192 if (currentlyEnabled) {
193 mConfig.disabledDevices.add(deviceId);
194 }
195 }
196
197 void removeDisabledDevice(int32_t deviceId) {
198 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
199 bool currentlyEnabled = index < 0;
200 if (!currentlyEnabled) {
201 mConfig.disabledDevices.remove(deviceId);
202 }
203 }
204
Michael Wrightd02c5b62014-02-10 15:10:22 -0800205 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
206 mPointerControllers.add(deviceId, controller);
207 }
208
209 const InputReaderConfiguration* getReaderConfiguration() const {
210 return &mConfig;
211 }
212
213 const Vector<InputDeviceInfo>& getInputDevices() const {
214 return mInputDevices;
215 }
216
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100217 TouchAffineTransformation getTouchAffineTransformation(const std::string& inputDeviceDescriptor,
Jason Gerecke71b16e82014-03-10 09:47:59 -0700218 int32_t surfaceRotation) {
Jason Gerecke489fda82012-09-07 17:19:40 -0700219 return transform;
220 }
221
222 void setTouchAffineTransformation(const TouchAffineTransformation t) {
223 transform = t;
Jason Gerecke12d6baa2014-01-27 18:34:20 -0800224 }
225
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800226 void setPointerCapture(bool enabled) {
227 mConfig.pointerCapture = enabled;
228 }
229
Michael Wrightd02c5b62014-02-10 15:10:22 -0800230private:
Santos Cordonfa5cf462017-04-05 10:37:00 -0700231 DisplayViewport createDisplayViewport(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700232 int32_t orientation, const std::string& uniqueId, std::optional<uint8_t> physicalPort,
233 ViewportType type) {
Santos Cordonfa5cf462017-04-05 10:37:00 -0700234 bool isRotated = (orientation == DISPLAY_ORIENTATION_90
235 || orientation == DISPLAY_ORIENTATION_270);
236 DisplayViewport v;
237 v.displayId = displayId;
238 v.orientation = orientation;
239 v.logicalLeft = 0;
240 v.logicalTop = 0;
241 v.logicalRight = isRotated ? height : width;
242 v.logicalBottom = isRotated ? width : height;
243 v.physicalLeft = 0;
244 v.physicalTop = 0;
245 v.physicalRight = isRotated ? height : width;
246 v.physicalBottom = isRotated ? width : height;
247 v.deviceWidth = isRotated ? height : width;
248 v.deviceHeight = isRotated ? width : height;
249 v.uniqueId = uniqueId;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -0700250 v.physicalPort = physicalPort;
Siarhei Vishniakoud6343922018-07-06 23:33:37 +0100251 v.type = type;
Santos Cordonfa5cf462017-04-05 10:37:00 -0700252 return v;
253 }
254
Michael Wrightd02c5b62014-02-10 15:10:22 -0800255 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
256 *outConfig = mConfig;
257 }
258
259 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
260 return mPointerControllers.valueFor(deviceId);
261 }
262
263 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
264 mInputDevices = inputDevices;
265 }
266
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100267 virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier&) {
Yi Kong9b14ac62018-07-17 13:48:38 -0700268 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800269 }
270
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100271 virtual std::string getDeviceAlias(const InputDeviceIdentifier&) {
272 return "";
Michael Wrightd02c5b62014-02-10 15:10:22 -0800273 }
Andrii Kulian620f6d92018-09-14 16:51:59 -0700274
275 virtual void updatePointerDisplay() {
276 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800277};
278
279
280// --- FakeInputListener ---
281
282class FakeInputListener : public InputListenerInterface {
283private:
284 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
285 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
286 List<NotifyKeyArgs> mNotifyKeyArgsQueue;
287 List<NotifyMotionArgs> mNotifyMotionArgsQueue;
288 List<NotifySwitchArgs> mNotifySwitchArgsQueue;
289
290protected:
291 virtual ~FakeInputListener() { }
292
293public:
294 FakeInputListener() {
295 }
296
297 void assertNotifyConfigurationChangedWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700298 NotifyConfigurationChangedArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800299 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
300 << "Expected notifyConfigurationChanged() to have been called.";
301 if (outEventArgs) {
302 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
303 }
304 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
305 }
306
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700307 void assertNotifyConfigurationChangedWasNotCalled() {
308 ASSERT_TRUE(mNotifyConfigurationChangedArgsQueue.empty())
309 << "Expected notifyConfigurationChanged() to not have been called.";
310 }
311
Michael Wrightd02c5b62014-02-10 15:10:22 -0800312 void assertNotifyDeviceResetWasCalled(
Yi Kong9b14ac62018-07-17 13:48:38 -0700313 NotifyDeviceResetArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800314 ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
315 << "Expected notifyDeviceReset() to have been called.";
316 if (outEventArgs) {
317 *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
318 }
319 mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
320 }
321
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700322 void assertNotifyDeviceResetWasNotCalled() {
323 ASSERT_TRUE(mNotifyDeviceResetArgsQueue.empty())
324 << "Expected notifyDeviceReset() to not have been called.";
325 }
326
Yi Kong9b14ac62018-07-17 13:48:38 -0700327 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800328 ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
329 << "Expected notifyKey() to have been called.";
330 if (outEventArgs) {
331 *outEventArgs = *mNotifyKeyArgsQueue.begin();
332 }
333 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
334 }
335
336 void assertNotifyKeyWasNotCalled() {
337 ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
338 << "Expected notifyKey() to not have been called.";
339 }
340
Yi Kong9b14ac62018-07-17 13:48:38 -0700341 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800342 ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
343 << "Expected notifyMotion() to have been called.";
344 if (outEventArgs) {
345 *outEventArgs = *mNotifyMotionArgsQueue.begin();
346 }
347 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
348 }
349
350 void assertNotifyMotionWasNotCalled() {
351 ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
352 << "Expected notifyMotion() to not have been called.";
353 }
354
Yi Kong9b14ac62018-07-17 13:48:38 -0700355 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800356 ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
357 << "Expected notifySwitch() to have been called.";
358 if (outEventArgs) {
359 *outEventArgs = *mNotifySwitchArgsQueue.begin();
360 }
361 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
362 }
363
364private:
365 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
366 mNotifyConfigurationChangedArgsQueue.push_back(*args);
367 }
368
369 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
370 mNotifyDeviceResetArgsQueue.push_back(*args);
371 }
372
373 virtual void notifyKey(const NotifyKeyArgs* args) {
374 mNotifyKeyArgsQueue.push_back(*args);
375 }
376
377 virtual void notifyMotion(const NotifyMotionArgs* args) {
378 mNotifyMotionArgsQueue.push_back(*args);
379 }
380
381 virtual void notifySwitch(const NotifySwitchArgs* args) {
382 mNotifySwitchArgsQueue.push_back(*args);
383 }
384};
385
386
387// --- FakeEventHub ---
388
389class FakeEventHub : public EventHubInterface {
390 struct KeyInfo {
391 int32_t keyCode;
392 uint32_t flags;
393 };
394
395 struct Device {
396 InputDeviceIdentifier identifier;
397 uint32_t classes;
398 PropertyMap configuration;
399 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
400 KeyedVector<int, bool> relativeAxes;
401 KeyedVector<int32_t, int32_t> keyCodeStates;
402 KeyedVector<int32_t, int32_t> scanCodeStates;
403 KeyedVector<int32_t, int32_t> switchStates;
404 KeyedVector<int32_t, int32_t> absoluteAxisValue;
405 KeyedVector<int32_t, KeyInfo> keysByScanCode;
406 KeyedVector<int32_t, KeyInfo> keysByUsageCode;
407 KeyedVector<int32_t, bool> leds;
408 Vector<VirtualKeyDefinition> virtualKeys;
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700409 bool enabled;
410
411 status_t enable() {
412 enabled = true;
413 return OK;
414 }
415
416 status_t disable() {
417 enabled = false;
418 return OK;
419 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800420
Chih-Hung Hsieh6ca70ef2016-04-29 16:23:55 -0700421 explicit Device(uint32_t classes) :
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700422 classes(classes), enabled(true) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800423 }
424 };
425
426 KeyedVector<int32_t, Device*> mDevices;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100427 std::vector<std::string> mExcludedDevices;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800428 List<RawEvent> mEvents;
429
430protected:
431 virtual ~FakeEventHub() {
432 for (size_t i = 0; i < mDevices.size(); i++) {
433 delete mDevices.valueAt(i);
434 }
435 }
436
437public:
438 FakeEventHub() { }
439
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100440 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800441 Device* device = new Device(classes);
442 device->identifier.name = name;
443 mDevices.add(deviceId, device);
444
445 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
446 }
447
448 void removeDevice(int32_t deviceId) {
449 delete mDevices.valueFor(deviceId);
450 mDevices.removeItem(deviceId);
451
452 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
453 }
454
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700455 bool isDeviceEnabled(int32_t deviceId) {
456 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700457 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700458 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
459 return false;
460 }
461 return device->enabled;
462 }
463
464 status_t enableDevice(int32_t deviceId) {
465 status_t result;
466 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700467 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700468 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
469 return BAD_VALUE;
470 }
471 if (device->enabled) {
472 ALOGW("Duplicate call to %s, device %" PRId32 " already enabled", __func__, deviceId);
473 return OK;
474 }
475 result = device->enable();
476 return result;
477 }
478
479 status_t disableDevice(int32_t deviceId) {
480 Device* device = getDevice(deviceId);
Yi Kong9b14ac62018-07-17 13:48:38 -0700481 if (device == nullptr) {
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700482 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
483 return BAD_VALUE;
484 }
485 if (!device->enabled) {
486 ALOGW("Duplicate call to %s, device %" PRId32 " already disabled", __func__, deviceId);
487 return OK;
488 }
489 return device->disable();
490 }
491
Michael Wrightd02c5b62014-02-10 15:10:22 -0800492 void finishDeviceScan() {
493 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
494 }
495
496 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
497 Device* device = getDevice(deviceId);
498 device->configuration.addProperty(key, value);
499 }
500
501 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
502 Device* device = getDevice(deviceId);
503 device->configuration.addAll(configuration);
504 }
505
506 void addAbsoluteAxis(int32_t deviceId, int axis,
507 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
508 Device* device = getDevice(deviceId);
509
510 RawAbsoluteAxisInfo info;
511 info.valid = true;
512 info.minValue = minValue;
513 info.maxValue = maxValue;
514 info.flat = flat;
515 info.fuzz = fuzz;
516 info.resolution = resolution;
517 device->absoluteAxes.add(axis, info);
518 }
519
520 void addRelativeAxis(int32_t deviceId, int32_t axis) {
521 Device* device = getDevice(deviceId);
522 device->relativeAxes.add(axis, true);
523 }
524
525 void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
526 Device* device = getDevice(deviceId);
527 device->keyCodeStates.replaceValueFor(keyCode, state);
528 }
529
530 void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
531 Device* device = getDevice(deviceId);
532 device->scanCodeStates.replaceValueFor(scanCode, state);
533 }
534
535 void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
536 Device* device = getDevice(deviceId);
537 device->switchStates.replaceValueFor(switchCode, state);
538 }
539
540 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
541 Device* device = getDevice(deviceId);
542 device->absoluteAxisValue.replaceValueFor(axis, value);
543 }
544
545 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
546 int32_t keyCode, uint32_t flags) {
547 Device* device = getDevice(deviceId);
548 KeyInfo info;
549 info.keyCode = keyCode;
550 info.flags = flags;
551 if (scanCode) {
552 device->keysByScanCode.add(scanCode, info);
553 }
554 if (usageCode) {
555 device->keysByUsageCode.add(usageCode, info);
556 }
557 }
558
559 void addLed(int32_t deviceId, int32_t led, bool initialState) {
560 Device* device = getDevice(deviceId);
561 device->leds.add(led, initialState);
562 }
563
564 bool getLedState(int32_t deviceId, int32_t led) {
565 Device* device = getDevice(deviceId);
566 return device->leds.valueFor(led);
567 }
568
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100569 std::vector<std::string>& getExcludedDevices() {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800570 return mExcludedDevices;
571 }
572
573 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
574 Device* device = getDevice(deviceId);
575 device->virtualKeys.push(definition);
576 }
577
578 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
579 int32_t code, int32_t value) {
580 RawEvent event;
581 event.when = when;
582 event.deviceId = deviceId;
583 event.type = type;
584 event.code = code;
585 event.value = value;
586 mEvents.push_back(event);
587
588 if (type == EV_ABS) {
589 setAbsoluteAxisValue(deviceId, code, value);
590 }
591 }
592
593 void assertQueueIsEmpty() {
594 ASSERT_EQ(size_t(0), mEvents.size())
595 << "Expected the event queue to be empty (fully consumed).";
596 }
597
598private:
599 Device* getDevice(int32_t deviceId) const {
600 ssize_t index = mDevices.indexOfKey(deviceId);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100601 return index >= 0 ? mDevices.valueAt(index) : nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800602 }
603
604 virtual uint32_t getDeviceClasses(int32_t deviceId) const {
605 Device* device = getDevice(deviceId);
606 return device ? device->classes : 0;
607 }
608
609 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
610 Device* device = getDevice(deviceId);
611 return device ? device->identifier : InputDeviceIdentifier();
612 }
613
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100614 virtual int32_t getDeviceControllerNumber(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800615 return 0;
616 }
617
618 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
619 Device* device = getDevice(deviceId);
620 if (device) {
621 *outConfiguration = device->configuration;
622 }
623 }
624
625 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
626 RawAbsoluteAxisInfo* outAxisInfo) const {
627 Device* device = getDevice(deviceId);
628 if (device) {
629 ssize_t index = device->absoluteAxes.indexOfKey(axis);
630 if (index >= 0) {
631 *outAxisInfo = device->absoluteAxes.valueAt(index);
632 return OK;
633 }
634 }
635 outAxisInfo->clear();
636 return -1;
637 }
638
639 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
640 Device* device = getDevice(deviceId);
641 if (device) {
642 return device->relativeAxes.indexOfKey(axis) >= 0;
643 }
644 return false;
645 }
646
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100647 virtual bool hasInputProperty(int32_t, int) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800648 return false;
649 }
650
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700651 virtual status_t mapKey(int32_t deviceId,
652 int32_t scanCode, int32_t usageCode, int32_t metaState,
653 int32_t* outKeycode, int32_t *outMetaState, uint32_t* outFlags) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800654 Device* device = getDevice(deviceId);
655 if (device) {
656 const KeyInfo* key = getKey(device, scanCode, usageCode);
657 if (key) {
658 if (outKeycode) {
659 *outKeycode = key->keyCode;
660 }
661 if (outFlags) {
662 *outFlags = key->flags;
663 }
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700664 if (outMetaState) {
665 *outMetaState = metaState;
666 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800667 return OK;
668 }
669 }
670 return NAME_NOT_FOUND;
671 }
672
673 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
674 if (usageCode) {
675 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
676 if (index >= 0) {
677 return &device->keysByUsageCode.valueAt(index);
678 }
679 }
680 if (scanCode) {
681 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
682 if (index >= 0) {
683 return &device->keysByScanCode.valueAt(index);
684 }
685 }
Yi Kong9b14ac62018-07-17 13:48:38 -0700686 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800687 }
688
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100689 virtual status_t mapAxis(int32_t, int32_t, AxisInfo*) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800690 return NAME_NOT_FOUND;
691 }
692
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +0100693 virtual void setExcludedDevices(const std::vector<std::string>& devices) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800694 mExcludedDevices = devices;
695 }
696
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100697 virtual size_t getEvents(int, RawEvent* buffer, size_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800698 if (mEvents.empty()) {
699 return 0;
700 }
701
702 *buffer = *mEvents.begin();
703 mEvents.erase(mEvents.begin());
704 return 1;
705 }
706
707 virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
708 Device* device = getDevice(deviceId);
709 if (device) {
710 ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
711 if (index >= 0) {
712 return device->scanCodeStates.valueAt(index);
713 }
714 }
715 return AKEY_STATE_UNKNOWN;
716 }
717
718 virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
719 Device* device = getDevice(deviceId);
720 if (device) {
721 ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
722 if (index >= 0) {
723 return device->keyCodeStates.valueAt(index);
724 }
725 }
726 return AKEY_STATE_UNKNOWN;
727 }
728
729 virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
730 Device* device = getDevice(deviceId);
731 if (device) {
732 ssize_t index = device->switchStates.indexOfKey(sw);
733 if (index >= 0) {
734 return device->switchStates.valueAt(index);
735 }
736 }
737 return AKEY_STATE_UNKNOWN;
738 }
739
740 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
741 int32_t* outValue) const {
742 Device* device = getDevice(deviceId);
743 if (device) {
744 ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
745 if (index >= 0) {
746 *outValue = device->absoluteAxisValue.valueAt(index);
747 return OK;
748 }
749 }
750 *outValue = 0;
751 return -1;
752 }
753
754 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
755 uint8_t* outFlags) const {
756 bool result = false;
757 Device* device = getDevice(deviceId);
758 if (device) {
759 for (size_t i = 0; i < numCodes; i++) {
760 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
761 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
762 outFlags[i] = 1;
763 result = true;
764 }
765 }
766 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
767 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
768 outFlags[i] = 1;
769 result = true;
770 }
771 }
772 }
773 }
774 return result;
775 }
776
777 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
778 Device* device = getDevice(deviceId);
779 if (device) {
780 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
781 return index >= 0;
782 }
783 return false;
784 }
785
786 virtual bool hasLed(int32_t deviceId, int32_t led) const {
787 Device* device = getDevice(deviceId);
788 return device && device->leds.indexOfKey(led) >= 0;
789 }
790
791 virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
792 Device* device = getDevice(deviceId);
793 if (device) {
794 ssize_t index = device->leds.indexOfKey(led);
795 if (index >= 0) {
796 device->leds.replaceValueAt(led, on);
797 } else {
798 ADD_FAILURE()
799 << "Attempted to set the state of an LED that the EventHub declared "
800 "was not present. led=" << led;
801 }
802 }
803 }
804
805 virtual void getVirtualKeyDefinitions(int32_t deviceId,
806 Vector<VirtualKeyDefinition>& outVirtualKeys) const {
807 outVirtualKeys.clear();
808
809 Device* device = getDevice(deviceId);
810 if (device) {
811 outVirtualKeys.appendVector(device->virtualKeys);
812 }
813 }
814
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100815 virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t) const {
Yi Kong9b14ac62018-07-17 13:48:38 -0700816 return nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800817 }
818
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100819 virtual bool setKeyboardLayoutOverlay(int32_t, const sp<KeyCharacterMap>&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800820 return false;
821 }
822
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100823 virtual void vibrate(int32_t, nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800824 }
825
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100826 virtual void cancelVibrate(int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800827 }
828
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100829 virtual bool isExternal(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800830 return false;
831 }
832
Siarhei Vishniakouf93fcf42017-11-22 16:00:14 -0800833 virtual void dump(std::string&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800834 }
835
836 virtual void monitor() {
837 }
838
839 virtual void requestReopenDevices() {
840 }
841
842 virtual void wake() {
843 }
844};
845
846
847// --- FakeInputReaderContext ---
848
849class FakeInputReaderContext : public InputReaderContext {
850 sp<EventHubInterface> mEventHub;
851 sp<InputReaderPolicyInterface> mPolicy;
852 sp<InputListenerInterface> mListener;
853 int32_t mGlobalMetaState;
854 bool mUpdateGlobalMetaStateWasCalled;
855 int32_t mGeneration;
Prabir Pradhan42611e02018-11-27 14:04:02 -0800856 uint32_t mNextSequenceNum;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800857
858public:
859 FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
860 const sp<InputReaderPolicyInterface>& policy,
861 const sp<InputListenerInterface>& listener) :
862 mEventHub(eventHub), mPolicy(policy), mListener(listener),
Prabir Pradhan42611e02018-11-27 14:04:02 -0800863 mGlobalMetaState(0), mNextSequenceNum(1) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800864 }
865
866 virtual ~FakeInputReaderContext() { }
867
868 void assertUpdateGlobalMetaStateWasCalled() {
869 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
870 << "Expected updateGlobalMetaState() to have been called.";
871 mUpdateGlobalMetaStateWasCalled = false;
872 }
873
874 void setGlobalMetaState(int32_t state) {
875 mGlobalMetaState = state;
876 }
877
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800878 uint32_t getGeneration() {
879 return mGeneration;
880 }
881
Michael Wrightd02c5b62014-02-10 15:10:22 -0800882private:
883 virtual void updateGlobalMetaState() {
884 mUpdateGlobalMetaStateWasCalled = true;
885 }
886
887 virtual int32_t getGlobalMetaState() {
888 return mGlobalMetaState;
889 }
890
891 virtual EventHubInterface* getEventHub() {
892 return mEventHub.get();
893 }
894
895 virtual InputReaderPolicyInterface* getPolicy() {
896 return mPolicy.get();
897 }
898
899 virtual InputListenerInterface* getListener() {
900 return mListener.get();
901 }
902
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100903 virtual void disableVirtualKeysUntil(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800904 }
905
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100906 virtual bool shouldDropVirtualKey(nsecs_t, InputDevice*, int32_t, int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800907 return false;
908 }
909
910 virtual void fadePointer() {
911 }
912
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100913 virtual void requestTimeoutAtTime(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800914 }
915
916 virtual int32_t bumpGeneration() {
917 return ++mGeneration;
918 }
Michael Wright842500e2015-03-13 17:32:02 -0700919
920 virtual void getExternalStylusDevices(Vector<InputDeviceInfo>& outDevices) {
921
922 }
923
924 virtual void dispatchExternalStylusState(const StylusState&) {
925
926 }
Prabir Pradhan42611e02018-11-27 14:04:02 -0800927
928 virtual uint32_t getNextSequenceNum() {
929 return mNextSequenceNum++;
930 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800931};
932
933
934// --- FakeInputMapper ---
935
936class FakeInputMapper : public InputMapper {
937 uint32_t mSources;
938 int32_t mKeyboardType;
939 int32_t mMetaState;
940 KeyedVector<int32_t, int32_t> mKeyCodeStates;
941 KeyedVector<int32_t, int32_t> mScanCodeStates;
942 KeyedVector<int32_t, int32_t> mSwitchStates;
943 Vector<int32_t> mSupportedKeyCodes;
944 RawEvent mLastEvent;
945
946 bool mConfigureWasCalled;
947 bool mResetWasCalled;
948 bool mProcessWasCalled;
949
950public:
951 FakeInputMapper(InputDevice* device, uint32_t sources) :
952 InputMapper(device),
953 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
954 mMetaState(0),
955 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
956 }
957
958 virtual ~FakeInputMapper() { }
959
960 void setKeyboardType(int32_t keyboardType) {
961 mKeyboardType = keyboardType;
962 }
963
964 void setMetaState(int32_t metaState) {
965 mMetaState = metaState;
966 }
967
968 void assertConfigureWasCalled() {
969 ASSERT_TRUE(mConfigureWasCalled)
970 << "Expected configure() to have been called.";
971 mConfigureWasCalled = false;
972 }
973
974 void assertResetWasCalled() {
975 ASSERT_TRUE(mResetWasCalled)
976 << "Expected reset() to have been called.";
977 mResetWasCalled = false;
978 }
979
Yi Kong9b14ac62018-07-17 13:48:38 -0700980 void assertProcessWasCalled(RawEvent* outLastEvent = nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800981 ASSERT_TRUE(mProcessWasCalled)
982 << "Expected process() to have been called.";
983 if (outLastEvent) {
984 *outLastEvent = mLastEvent;
985 }
986 mProcessWasCalled = false;
987 }
988
989 void setKeyCodeState(int32_t keyCode, int32_t state) {
990 mKeyCodeStates.replaceValueFor(keyCode, state);
991 }
992
993 void setScanCodeState(int32_t scanCode, int32_t state) {
994 mScanCodeStates.replaceValueFor(scanCode, state);
995 }
996
997 void setSwitchState(int32_t switchCode, int32_t state) {
998 mSwitchStates.replaceValueFor(switchCode, state);
999 }
1000
1001 void addSupportedKeyCode(int32_t keyCode) {
1002 mSupportedKeyCodes.add(keyCode);
1003 }
1004
1005private:
1006 virtual uint32_t getSources() {
1007 return mSources;
1008 }
1009
1010 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
1011 InputMapper::populateDeviceInfo(deviceInfo);
1012
1013 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
1014 deviceInfo->setKeyboardType(mKeyboardType);
1015 }
1016 }
1017
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001018 virtual void configure(nsecs_t, const InputReaderConfiguration*, uint32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001019 mConfigureWasCalled = true;
1020 }
1021
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001022 virtual void reset(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001023 mResetWasCalled = true;
1024 }
1025
1026 virtual void process(const RawEvent* rawEvent) {
1027 mLastEvent = *rawEvent;
1028 mProcessWasCalled = true;
1029 }
1030
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001031 virtual int32_t getKeyCodeState(uint32_t, int32_t keyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001032 ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
1033 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1034 }
1035
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001036 virtual int32_t getScanCodeState(uint32_t, int32_t scanCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001037 ssize_t index = mScanCodeStates.indexOfKey(scanCode);
1038 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1039 }
1040
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001041 virtual int32_t getSwitchState(uint32_t, int32_t switchCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001042 ssize_t index = mSwitchStates.indexOfKey(switchCode);
1043 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
1044 }
1045
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001046 virtual bool markSupportedKeyCodes(uint32_t, size_t numCodes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001047 const int32_t* keyCodes, uint8_t* outFlags) {
1048 bool result = false;
1049 for (size_t i = 0; i < numCodes; i++) {
1050 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
1051 if (keyCodes[i] == mSupportedKeyCodes[j]) {
1052 outFlags[i] = 1;
1053 result = true;
1054 }
1055 }
1056 }
1057 return result;
1058 }
1059
1060 virtual int32_t getMetaState() {
1061 return mMetaState;
1062 }
1063
1064 virtual void fadePointer() {
1065 }
1066};
1067
1068
1069// --- InstrumentedInputReader ---
1070
1071class InstrumentedInputReader : public InputReader {
1072 InputDevice* mNextDevice;
1073
1074public:
1075 InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
1076 const sp<InputReaderPolicyInterface>& policy,
1077 const sp<InputListenerInterface>& listener) :
1078 InputReader(eventHub, policy, listener),
Yi Kong9b14ac62018-07-17 13:48:38 -07001079 mNextDevice(nullptr) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001080 }
1081
1082 virtual ~InstrumentedInputReader() {
1083 if (mNextDevice) {
1084 delete mNextDevice;
1085 }
1086 }
1087
1088 void setNextDevice(InputDevice* device) {
1089 mNextDevice = device;
1090 }
1091
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001092 InputDevice* newDevice(int32_t deviceId, int32_t controllerNumber, const std::string& name,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001093 uint32_t classes) {
1094 InputDeviceIdentifier identifier;
1095 identifier.name = name;
1096 int32_t generation = deviceId + 1;
1097 return new InputDevice(&mContext, deviceId, generation, controllerNumber, identifier,
1098 classes);
1099 }
1100
1101protected:
1102 virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
1103 const InputDeviceIdentifier& identifier, uint32_t classes) {
1104 if (mNextDevice) {
1105 InputDevice* device = mNextDevice;
Yi Kong9b14ac62018-07-17 13:48:38 -07001106 mNextDevice = nullptr;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001107 return device;
1108 }
1109 return InputReader::createDeviceLocked(deviceId, controllerNumber, identifier, classes);
1110 }
1111
1112 friend class InputReaderTest;
1113};
1114
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001115// --- InputReaderPolicyTest ---
1116class InputReaderPolicyTest : public testing::Test {
Siarhei Vishniakoucd7ac1e2018-10-15 13:39:50 -07001117protected:
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001118 sp<FakeInputReaderPolicy> mFakePolicy;
1119
1120 virtual void SetUp() {
1121 mFakePolicy = new FakeInputReaderPolicy();
1122 }
1123 virtual void TearDown() {
1124 mFakePolicy.clear();
1125 }
1126};
1127
1128/**
1129 * Check that empty set of viewports is an acceptable configuration.
1130 * Also try to get internal viewport two different ways - by type and by uniqueId.
1131 *
1132 * There will be confusion if two viewports with empty uniqueId and identical type are present.
1133 * Such configuration is not currently allowed.
1134 */
1135TEST_F(InputReaderPolicyTest, Viewports_GetCleared) {
Siarhei Vishniakoucd7ac1e2018-10-15 13:39:50 -07001136 static const std::string uniqueId = "local:0";
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001137
1138 // We didn't add any viewports yet, so there shouldn't be any.
1139 std::optional<DisplayViewport> internalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001140 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001141 ASSERT_FALSE(internalViewport);
1142
1143 // Add an internal viewport, then clear it
1144 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001145 DISPLAY_ORIENTATION_0, uniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001146
1147 // Check matching by uniqueId
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001148 internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001149 ASSERT_TRUE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001150 ASSERT_EQ(ViewportType::VIEWPORT_INTERNAL, internalViewport->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001151
1152 // Check matching by viewport type
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001153 internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001154 ASSERT_TRUE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001155 ASSERT_EQ(uniqueId, internalViewport->uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001156
1157 mFakePolicy->clearViewports();
1158 // Make sure nothing is found after clear
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001159 internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001160 ASSERT_FALSE(internalViewport);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001161 internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001162 ASSERT_FALSE(internalViewport);
1163}
1164
1165TEST_F(InputReaderPolicyTest, Viewports_GetByType) {
1166 const std::string internalUniqueId = "local:0";
1167 const std::string externalUniqueId = "local:1";
1168 const std::string virtualUniqueId1 = "virtual:2";
1169 const std::string virtualUniqueId2 = "virtual:3";
1170 constexpr int32_t virtualDisplayId1 = 2;
1171 constexpr int32_t virtualDisplayId2 = 3;
1172
1173 // Add an internal viewport
1174 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001175 DISPLAY_ORIENTATION_0, internalUniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001176 // Add an external viewport
1177 mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001178 DISPLAY_ORIENTATION_0, externalUniqueId, NO_PORT, ViewportType::VIEWPORT_EXTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001179 // Add an virtual viewport
1180 mFakePolicy->addDisplayViewport(virtualDisplayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001181 DISPLAY_ORIENTATION_0, virtualUniqueId1, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001182 // Add another virtual viewport
1183 mFakePolicy->addDisplayViewport(virtualDisplayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001184 DISPLAY_ORIENTATION_0, virtualUniqueId2, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001185
1186 // Check matching by type for internal
1187 std::optional<DisplayViewport> internalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001188 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001189 ASSERT_TRUE(internalViewport);
1190 ASSERT_EQ(internalUniqueId, internalViewport->uniqueId);
1191
1192 // Check matching by type for external
1193 std::optional<DisplayViewport> externalViewport =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001194 mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_EXTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001195 ASSERT_TRUE(externalViewport);
1196 ASSERT_EQ(externalUniqueId, externalViewport->uniqueId);
1197
1198 // Check matching by uniqueId for virtual viewport #1
1199 std::optional<DisplayViewport> virtualViewport1 =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001200 mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId1);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001201 ASSERT_TRUE(virtualViewport1);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001202 ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport1->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001203 ASSERT_EQ(virtualUniqueId1, virtualViewport1->uniqueId);
1204 ASSERT_EQ(virtualDisplayId1, virtualViewport1->displayId);
1205
1206 // Check matching by uniqueId for virtual viewport #2
1207 std::optional<DisplayViewport> virtualViewport2 =
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001208 mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId2);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001209 ASSERT_TRUE(virtualViewport2);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001210 ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport2->type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001211 ASSERT_EQ(virtualUniqueId2, virtualViewport2->uniqueId);
1212 ASSERT_EQ(virtualDisplayId2, virtualViewport2->displayId);
1213}
1214
1215
1216/**
1217 * We can have 2 viewports of the same kind. We can distinguish them by uniqueId, and confirm
1218 * that lookup works by checking display id.
1219 * Check that 2 viewports of each kind is possible, for all existing viewport types.
1220 */
1221TEST_F(InputReaderPolicyTest, Viewports_TwoOfSameType) {
1222 const std::string uniqueId1 = "uniqueId1";
1223 const std::string uniqueId2 = "uniqueId2";
1224 constexpr int32_t displayId1 = 2;
1225 constexpr int32_t displayId2 = 3;
1226
1227 std::vector<ViewportType> types = {ViewportType::VIEWPORT_INTERNAL,
1228 ViewportType::VIEWPORT_EXTERNAL, ViewportType::VIEWPORT_VIRTUAL};
1229 for (const ViewportType& type : types) {
1230 mFakePolicy->clearViewports();
1231 // Add a viewport
1232 mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001233 DISPLAY_ORIENTATION_0, uniqueId1, NO_PORT, type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001234 // Add another viewport
1235 mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001236 DISPLAY_ORIENTATION_0, uniqueId2, NO_PORT, type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001237
1238 // Check that correct display viewport was returned by comparing the display IDs.
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001239 std::optional<DisplayViewport> viewport1 =
1240 mFakePolicy->getDisplayViewportByUniqueId(uniqueId1);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001241 ASSERT_TRUE(viewport1);
1242 ASSERT_EQ(displayId1, viewport1->displayId);
1243 ASSERT_EQ(type, viewport1->type);
1244
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001245 std::optional<DisplayViewport> viewport2 =
1246 mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001247 ASSERT_TRUE(viewport2);
1248 ASSERT_EQ(displayId2, viewport2->displayId);
1249 ASSERT_EQ(type, viewport2->type);
1250
1251 // When there are multiple viewports of the same kind, and uniqueId is not specified
1252 // in the call to getDisplayViewport, then that situation is not supported.
1253 // The viewports can be stored in any order, so we cannot rely on the order, since that
1254 // is just implementation detail.
1255 // However, we can check that it still returns *a* viewport, we just cannot assert
1256 // which one specifically is returned.
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001257 std::optional<DisplayViewport> someViewport = mFakePolicy->getDisplayViewportByType(type);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001258 ASSERT_TRUE(someViewport);
1259 }
1260}
Michael Wrightd02c5b62014-02-10 15:10:22 -08001261
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001262/**
1263 * Check getDisplayViewportByPort
1264 */
1265TEST_F(InputReaderPolicyTest, Viewports_GetByPort) {
1266 constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
1267 const std::string uniqueId1 = "uniqueId1";
1268 const std::string uniqueId2 = "uniqueId2";
1269 constexpr int32_t displayId1 = 1;
1270 constexpr int32_t displayId2 = 2;
1271 const uint8_t hdmi1 = 0;
1272 const uint8_t hdmi2 = 1;
1273 const uint8_t hdmi3 = 2;
1274
1275 mFakePolicy->clearViewports();
1276 // Add a viewport that's associated with some display port that's not of interest.
1277 mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1278 DISPLAY_ORIENTATION_0, uniqueId1, hdmi3, type);
1279 // Add another viewport, connected to HDMI1 port
1280 mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1281 DISPLAY_ORIENTATION_0, uniqueId2, hdmi1, type);
1282
1283 // Check that correct display viewport was returned by comparing the display ports.
1284 std::optional<DisplayViewport> hdmi1Viewport = mFakePolicy->getDisplayViewportByPort(hdmi1);
1285 ASSERT_TRUE(hdmi1Viewport);
1286 ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1287 ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1288
1289 // Check that we can still get the same viewport using the uniqueId
1290 hdmi1Viewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
1291 ASSERT_TRUE(hdmi1Viewport);
1292 ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1293 ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1294 ASSERT_EQ(type, hdmi1Viewport->type);
1295
1296 // Check that we cannot find a port with "HDMI2", because we never added one
1297 std::optional<DisplayViewport> hdmi2Viewport = mFakePolicy->getDisplayViewportByPort(hdmi2);
1298 ASSERT_FALSE(hdmi2Viewport);
1299}
1300
Michael Wrightd02c5b62014-02-10 15:10:22 -08001301// --- InputReaderTest ---
1302
1303class InputReaderTest : public testing::Test {
1304protected:
1305 sp<FakeInputListener> mFakeListener;
1306 sp<FakeInputReaderPolicy> mFakePolicy;
1307 sp<FakeEventHub> mFakeEventHub;
1308 sp<InstrumentedInputReader> mReader;
1309
1310 virtual void SetUp() {
1311 mFakeEventHub = new FakeEventHub();
1312 mFakePolicy = new FakeInputReaderPolicy();
1313 mFakeListener = new FakeInputListener();
1314
1315 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
1316 }
1317
1318 virtual void TearDown() {
1319 mReader.clear();
1320
1321 mFakeListener.clear();
1322 mFakePolicy.clear();
1323 mFakeEventHub.clear();
1324 }
1325
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001326 void addDevice(int32_t deviceId, const std::string& name, uint32_t classes,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001327 const PropertyMap* configuration) {
1328 mFakeEventHub->addDevice(deviceId, name, classes);
1329
1330 if (configuration) {
1331 mFakeEventHub->addConfigurationMap(deviceId, configuration);
1332 }
1333 mFakeEventHub->finishDeviceScan();
1334 mReader->loopOnce();
1335 mReader->loopOnce();
1336 mFakeEventHub->assertQueueIsEmpty();
1337 }
1338
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001339 void disableDevice(int32_t deviceId, InputDevice* device) {
1340 mFakePolicy->addDisabledDevice(deviceId);
1341 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1342 }
1343
1344 void enableDevice(int32_t deviceId, InputDevice* device) {
1345 mFakePolicy->removeDisabledDevice(deviceId);
1346 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1347 }
1348
1349 void configureDevice(uint32_t changes, InputDevice* device) {
1350 device->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1351 }
1352
Michael Wrightd02c5b62014-02-10 15:10:22 -08001353 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, int32_t controllerNumber,
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001354 const std::string& name, uint32_t classes, uint32_t sources,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001355 const PropertyMap* configuration) {
1356 InputDevice* device = mReader->newDevice(deviceId, controllerNumber, name, classes);
1357 FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1358 device->addMapper(mapper);
1359 mReader->setNextDevice(device);
1360 addDevice(deviceId, name, classes, configuration);
1361 return mapper;
1362 }
1363};
1364
1365TEST_F(InputReaderTest, GetInputDevices) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001366 ASSERT_NO_FATAL_FAILURE(addDevice(1, "keyboard",
Yi Kong9b14ac62018-07-17 13:48:38 -07001367 INPUT_DEVICE_CLASS_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001368 ASSERT_NO_FATAL_FAILURE(addDevice(2, "ignored",
Yi Kong9b14ac62018-07-17 13:48:38 -07001369 0, nullptr)); // no classes so device will be ignored
Michael Wrightd02c5b62014-02-10 15:10:22 -08001370
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001371
Michael Wrightd02c5b62014-02-10 15:10:22 -08001372 Vector<InputDeviceInfo> inputDevices;
1373 mReader->getInputDevices(inputDevices);
1374
1375 ASSERT_EQ(1U, inputDevices.size());
1376 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001377 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001378 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1379 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1380 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1381
1382 // Should also have received a notification describing the new input devices.
1383 inputDevices = mFakePolicy->getInputDevices();
1384 ASSERT_EQ(1U, inputDevices.size());
1385 ASSERT_EQ(1, inputDevices[0].getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001386 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001387 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1388 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1389 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1390}
1391
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001392TEST_F(InputReaderTest, WhenEnabledChanges_SendsDeviceResetNotification) {
1393 constexpr int32_t deviceId = 1;
1394 constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001395 InputDevice* device = mReader->newDevice(deviceId, 0, "fake", deviceClass);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001396 // Must add at least one mapper or the device will be ignored!
1397 FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1398 device->addMapper(mapper);
1399 mReader->setNextDevice(device);
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001400 addDevice(deviceId, "fake", deviceClass, nullptr);
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001401
Yi Kong9b14ac62018-07-17 13:48:38 -07001402 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(nullptr));
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001403
1404 NotifyDeviceResetArgs resetArgs;
1405 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1406 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1407 ASSERT_EQ(deviceId, resetArgs.deviceId);
1408
1409 ASSERT_EQ(device->isEnabled(), true);
1410 disableDevice(deviceId, device);
1411 mReader->loopOnce();
1412
1413 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1414 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1415 ASSERT_EQ(deviceId, resetArgs.deviceId);
1416 ASSERT_EQ(device->isEnabled(), false);
1417
1418 disableDevice(deviceId, device);
1419 mReader->loopOnce();
1420 mFakeListener->assertNotifyDeviceResetWasNotCalled();
1421 mFakeListener->assertNotifyConfigurationChangedWasNotCalled();
1422 ASSERT_EQ(device->isEnabled(), false);
1423
1424 enableDevice(deviceId, device);
1425 mReader->loopOnce();
1426 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1427 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1428 ASSERT_EQ(deviceId, resetArgs.deviceId);
1429 ASSERT_EQ(device->isEnabled(), true);
1430}
1431
Michael Wrightd02c5b62014-02-10 15:10:22 -08001432TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001433 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001434 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001435 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001436 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1437
1438 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1439 AINPUT_SOURCE_ANY, AKEYCODE_A))
1440 << "Should return unknown when the device id is >= 0 but unknown.";
1441
1442 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1443 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1444 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1445
1446 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1447 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1448 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1449
1450 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1451 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1452 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1453
1454 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1455 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1456 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1457}
1458
1459TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001460 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001461 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001462 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001463 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1464
1465 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1466 AINPUT_SOURCE_ANY, KEY_A))
1467 << "Should return unknown when the device id is >= 0 but unknown.";
1468
1469 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1470 AINPUT_SOURCE_TRACKBALL, KEY_A))
1471 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1472
1473 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1474 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1475 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1476
1477 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1478 AINPUT_SOURCE_TRACKBALL, KEY_A))
1479 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1480
1481 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1482 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1483 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1484}
1485
1486TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001487 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001488 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001489 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001490 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1491
1492 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1493 AINPUT_SOURCE_ANY, SW_LID))
1494 << "Should return unknown when the device id is >= 0 but unknown.";
1495
1496 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1497 AINPUT_SOURCE_TRACKBALL, SW_LID))
1498 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1499
1500 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1501 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1502 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1503
1504 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1505 AINPUT_SOURCE_TRACKBALL, SW_LID))
1506 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1507
1508 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1509 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1510 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1511}
1512
1513TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001514 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001515 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001516 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001517
Michael Wrightd02c5b62014-02-10 15:10:22 -08001518 mapper->addSupportedKeyCode(AKEYCODE_A);
1519 mapper->addSupportedKeyCode(AKEYCODE_B);
1520
1521 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1522 uint8_t flags[4] = { 0, 0, 0, 1 };
1523
1524 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1525 << "Should return false when device id is >= 0 but unknown.";
1526 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1527
1528 flags[3] = 1;
1529 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1530 << "Should return false when device id is valid but the sources are not supported by the device.";
1531 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1532
1533 flags[3] = 1;
1534 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1535 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1536 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1537
1538 flags[3] = 1;
1539 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1540 << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1541 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1542
1543 flags[3] = 1;
1544 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1545 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1546 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1547}
1548
1549TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001550 addDevice(1, "ignored", INPUT_DEVICE_CLASS_KEYBOARD, nullptr);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001551
1552 NotifyConfigurationChangedArgs args;
1553
1554 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1555 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1556}
1557
1558TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
Yi Kong9b14ac62018-07-17 13:48:38 -07001559 FakeInputMapper* mapper = nullptr;
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001560 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
Yi Kong9b14ac62018-07-17 13:48:38 -07001561 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001562
1563 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1564 mReader->loopOnce();
1565 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1566
1567 RawEvent event;
1568 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1569 ASSERT_EQ(0, event.when);
1570 ASSERT_EQ(1, event.deviceId);
1571 ASSERT_EQ(EV_KEY, event.type);
1572 ASSERT_EQ(KEY_A, event.code);
1573 ASSERT_EQ(1, event.value);
1574}
1575
Prabir Pradhan42611e02018-11-27 14:04:02 -08001576TEST_F(InputReaderTest, DeviceReset_IncrementsSequenceNumber) {
1577 constexpr int32_t deviceId = 1;
1578 constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
1579 InputDevice* device = mReader->newDevice(deviceId, 0, "fake", deviceClass);
1580 // Must add at least one mapper or the device will be ignored!
1581 FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1582 device->addMapper(mapper);
1583 mReader->setNextDevice(device);
1584 addDevice(deviceId, "fake", deviceClass, nullptr);
1585
1586 NotifyDeviceResetArgs resetArgs;
1587 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1588 uint32_t prevSequenceNum = resetArgs.sequenceNum;
1589
1590 disableDevice(deviceId, device);
1591 mReader->loopOnce();
1592 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1593 ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1594 prevSequenceNum = resetArgs.sequenceNum;
1595
1596 enableDevice(deviceId, device);
1597 mReader->loopOnce();
1598 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1599 ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1600 prevSequenceNum = resetArgs.sequenceNum;
1601
1602 disableDevice(deviceId, device);
1603 mReader->loopOnce();
1604 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1605 ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1606 prevSequenceNum = resetArgs.sequenceNum;
1607}
1608
Michael Wrightd02c5b62014-02-10 15:10:22 -08001609
1610// --- InputDeviceTest ---
1611
1612class InputDeviceTest : public testing::Test {
1613protected:
1614 static const char* DEVICE_NAME;
1615 static const int32_t DEVICE_ID;
1616 static const int32_t DEVICE_GENERATION;
1617 static const int32_t DEVICE_CONTROLLER_NUMBER;
1618 static const uint32_t DEVICE_CLASSES;
1619
1620 sp<FakeEventHub> mFakeEventHub;
1621 sp<FakeInputReaderPolicy> mFakePolicy;
1622 sp<FakeInputListener> mFakeListener;
1623 FakeInputReaderContext* mFakeContext;
1624
1625 InputDevice* mDevice;
1626
1627 virtual void SetUp() {
1628 mFakeEventHub = new FakeEventHub();
1629 mFakePolicy = new FakeInputReaderPolicy();
1630 mFakeListener = new FakeInputListener();
1631 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1632
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001633 mFakeEventHub->addDevice(DEVICE_ID, DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001634 InputDeviceIdentifier identifier;
1635 identifier.name = DEVICE_NAME;
1636 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1637 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1638 }
1639
1640 virtual void TearDown() {
1641 delete mDevice;
1642
1643 delete mFakeContext;
1644 mFakeListener.clear();
1645 mFakePolicy.clear();
1646 mFakeEventHub.clear();
1647 }
1648};
1649
1650const char* InputDeviceTest::DEVICE_NAME = "device";
1651const int32_t InputDeviceTest::DEVICE_ID = 1;
1652const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
1653const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0;
1654const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1655 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1656
1657TEST_F(InputDeviceTest, ImmutableProperties) {
1658 ASSERT_EQ(DEVICE_ID, mDevice->getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001659 ASSERT_STREQ(DEVICE_NAME, mDevice->getName().c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001660 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1661}
1662
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001663TEST_F(InputDeviceTest, WhenDeviceCreated_EnabledIsTrue) {
1664 ASSERT_EQ(mDevice->isEnabled(), true);
1665}
1666
Michael Wrightd02c5b62014-02-10 15:10:22 -08001667TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1668 // Configuration.
1669 InputReaderConfiguration config;
1670 mDevice->configure(ARBITRARY_TIME, &config, 0);
1671
1672 // Reset.
1673 mDevice->reset(ARBITRARY_TIME);
1674
1675 NotifyDeviceResetArgs resetArgs;
1676 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1677 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1678 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1679
1680 // Metadata.
1681 ASSERT_TRUE(mDevice->isIgnored());
1682 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1683
1684 InputDeviceInfo info;
1685 mDevice->getDeviceInfo(&info);
1686 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001687 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001688 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1689 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1690
1691 // State queries.
1692 ASSERT_EQ(0, mDevice->getMetaState());
1693
1694 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1695 << "Ignored device should return unknown key code state.";
1696 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1697 << "Ignored device should return unknown scan code state.";
1698 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1699 << "Ignored device should return unknown switch state.";
1700
1701 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1702 uint8_t flags[2] = { 0, 1 };
1703 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1704 << "Ignored device should never mark any key codes.";
1705 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1706 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1707}
1708
1709TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1710 // Configuration.
1711 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1712
1713 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1714 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1715 mapper1->setMetaState(AMETA_ALT_ON);
1716 mapper1->addSupportedKeyCode(AKEYCODE_A);
1717 mapper1->addSupportedKeyCode(AKEYCODE_B);
1718 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1719 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1720 mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1721 mapper1->setScanCodeState(3, AKEY_STATE_UP);
1722 mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1723 mDevice->addMapper(mapper1);
1724
1725 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1726 mapper2->setMetaState(AMETA_SHIFT_ON);
1727 mDevice->addMapper(mapper2);
1728
1729 InputReaderConfiguration config;
1730 mDevice->configure(ARBITRARY_TIME, &config, 0);
1731
1732 String8 propertyValue;
1733 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1734 << "Device should have read configuration during configuration phase.";
1735 ASSERT_STREQ("value", propertyValue.string());
1736
1737 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1738 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1739
1740 // Reset
1741 mDevice->reset(ARBITRARY_TIME);
1742 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1743 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1744
1745 NotifyDeviceResetArgs resetArgs;
1746 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1747 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1748 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1749
1750 // Metadata.
1751 ASSERT_FALSE(mDevice->isIgnored());
1752 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1753
1754 InputDeviceInfo info;
1755 mDevice->getDeviceInfo(&info);
1756 ASSERT_EQ(DEVICE_ID, info.getId());
Siarhei Vishniakouec8f7252018-07-06 11:19:32 +01001757 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
Michael Wrightd02c5b62014-02-10 15:10:22 -08001758 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1759 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1760
1761 // State queries.
1762 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1763 << "Should query mappers and combine meta states.";
1764
1765 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1766 << "Should return unknown key code state when source not supported.";
1767 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1768 << "Should return unknown scan code state when source not supported.";
1769 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1770 << "Should return unknown switch state when source not supported.";
1771
1772 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1773 << "Should query mapper when source is supported.";
1774 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1775 << "Should query mapper when source is supported.";
1776 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1777 << "Should query mapper when source is supported.";
1778
1779 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1780 uint8_t flags[4] = { 0, 0, 0, 1 };
1781 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1782 << "Should do nothing when source is unsupported.";
1783 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1784 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1785 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1786 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1787
1788 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1789 << "Should query mapper when source is supported.";
1790 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1791 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1792 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1793 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1794
1795 // Event handling.
1796 RawEvent event;
1797 mDevice->process(&event, 1);
1798
1799 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1800 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1801}
1802
1803
1804// --- InputMapperTest ---
1805
1806class InputMapperTest : public testing::Test {
1807protected:
1808 static const char* DEVICE_NAME;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001809 static const char* DEVICE_LOCATION;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001810 static const int32_t DEVICE_ID;
1811 static const int32_t DEVICE_GENERATION;
1812 static const int32_t DEVICE_CONTROLLER_NUMBER;
1813 static const uint32_t DEVICE_CLASSES;
1814
1815 sp<FakeEventHub> mFakeEventHub;
1816 sp<FakeInputReaderPolicy> mFakePolicy;
1817 sp<FakeInputListener> mFakeListener;
1818 FakeInputReaderContext* mFakeContext;
1819 InputDevice* mDevice;
1820
1821 virtual void SetUp() {
1822 mFakeEventHub = new FakeEventHub();
1823 mFakePolicy = new FakeInputReaderPolicy();
1824 mFakeListener = new FakeInputListener();
1825 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1826 InputDeviceIdentifier identifier;
1827 identifier.name = DEVICE_NAME;
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001828 identifier.location = DEVICE_LOCATION;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001829 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1830 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1831
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001832 mFakeEventHub->addDevice(mDevice->getId(), DEVICE_NAME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001833 }
1834
1835 virtual void TearDown() {
1836 delete mDevice;
1837 delete mFakeContext;
1838 mFakeListener.clear();
1839 mFakePolicy.clear();
1840 mFakeEventHub.clear();
1841 }
1842
1843 void addConfigurationProperty(const char* key, const char* value) {
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001844 mFakeEventHub->addConfigurationProperty(mDevice->getId(), String8(key), String8(value));
Michael Wrightd02c5b62014-02-10 15:10:22 -08001845 }
1846
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001847 void configureDevice(uint32_t changes) {
1848 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1849 }
1850
Michael Wrightd02c5b62014-02-10 15:10:22 -08001851 void addMapperAndConfigure(InputMapper* mapper) {
1852 mDevice->addMapper(mapper);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001853 configureDevice(0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001854 mDevice->reset(ARBITRARY_TIME);
1855 }
1856
1857 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001858 int32_t orientation, const std::string& uniqueId,
1859 std::optional<uint8_t> physicalPort, ViewportType viewportType) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001860 mFakePolicy->addDisplayViewport(
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001861 displayId, width, height, orientation, uniqueId, physicalPort, viewportType);
Santos Cordonfa5cf462017-04-05 10:37:00 -07001862 configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1863 }
1864
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001865 void clearViewports() {
1866 mFakePolicy->clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08001867 }
1868
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001869 static void process(InputMapper* mapper, nsecs_t when, int32_t type,
Michael Wrightd02c5b62014-02-10 15:10:22 -08001870 int32_t code, int32_t value) {
1871 RawEvent event;
1872 event.when = when;
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001873 event.deviceId = mapper->getDeviceId();
Michael Wrightd02c5b62014-02-10 15:10:22 -08001874 event.type = type;
1875 event.code = code;
1876 event.value = value;
1877 mapper->process(&event);
1878 }
1879
1880 static void assertMotionRange(const InputDeviceInfo& info,
1881 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1882 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
Yi Kong9b14ac62018-07-17 13:48:38 -07001883 ASSERT_TRUE(range != nullptr) << "Axis: " << axis << " Source: " << source;
Michael Wrightd02c5b62014-02-10 15:10:22 -08001884 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1885 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1886 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1887 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1888 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1889 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1890 }
1891
1892 static void assertPointerCoords(const PointerCoords& coords,
1893 float x, float y, float pressure, float size,
1894 float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1895 float orientation, float distance) {
1896 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1897 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1898 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1899 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1900 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1901 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1902 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1903 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1904 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1905 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1906 }
1907
1908 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1909 float actualX, actualY;
1910 controller->getPosition(&actualX, &actualY);
1911 ASSERT_NEAR(x, actualX, 1);
1912 ASSERT_NEAR(y, actualY, 1);
1913 }
1914};
1915
1916const char* InputMapperTest::DEVICE_NAME = "device";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001917const char* InputMapperTest::DEVICE_LOCATION = "USB1";
Michael Wrightd02c5b62014-02-10 15:10:22 -08001918const int32_t InputMapperTest::DEVICE_ID = 1;
1919const int32_t InputMapperTest::DEVICE_GENERATION = 2;
1920const int32_t InputMapperTest::DEVICE_CONTROLLER_NUMBER = 0;
1921const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1922
1923
1924// --- SwitchInputMapperTest ---
1925
1926class SwitchInputMapperTest : public InputMapperTest {
1927protected:
1928};
1929
1930TEST_F(SwitchInputMapperTest, GetSources) {
1931 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1932 addMapperAndConfigure(mapper);
1933
1934 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1935}
1936
1937TEST_F(SwitchInputMapperTest, GetSwitchState) {
1938 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1939 addMapperAndConfigure(mapper);
1940
1941 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1942 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1943
1944 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1945 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1946}
1947
1948TEST_F(SwitchInputMapperTest, Process) {
1949 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1950 addMapperAndConfigure(mapper);
1951
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001952 process(mapper, ARBITRARY_TIME, EV_SW, SW_LID, 1);
1953 process(mapper, ARBITRARY_TIME, EV_SW, SW_JACK_PHYSICAL_INSERT, 1);
1954 process(mapper, ARBITRARY_TIME, EV_SW, SW_HEADPHONE_INSERT, 0);
1955 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001956
1957 NotifySwitchArgs args;
1958 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1959 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
Dan Albert1bd2fc02016-02-02 15:11:57 -08001960 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT), args.switchValues);
1961 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT),
Michael Wrightd02c5b62014-02-10 15:10:22 -08001962 args.switchMask);
1963 ASSERT_EQ(uint32_t(0), args.policyFlags);
1964}
1965
1966
1967// --- KeyboardInputMapperTest ---
1968
1969class KeyboardInputMapperTest : public InputMapperTest {
1970protected:
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001971 const std::string UNIQUE_ID = "local:0";
1972
1973 void prepareDisplay(int32_t orientation);
1974
Michael Wrightd02c5b62014-02-10 15:10:22 -08001975 void testDPadKeyRotation(KeyboardInputMapper* mapper,
1976 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1977};
1978
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001979/* Similar to setDisplayInfoAndReconfigure, but pre-populates all parameters except for the
1980 * orientation.
1981 */
1982void KeyboardInputMapperTest::prepareDisplay(int32_t orientation) {
1983 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07001984 orientation, UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001985}
1986
Michael Wrightd02c5b62014-02-10 15:10:22 -08001987void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07001988 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001989 NotifyKeyArgs args;
1990
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001991 process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001992 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1993 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1994 ASSERT_EQ(originalScanCode, args.scanCode);
1995 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1996
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08001997 process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001998 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1999 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2000 ASSERT_EQ(originalScanCode, args.scanCode);
2001 ASSERT_EQ(rotatedKeyCode, args.keyCode);
2002}
2003
2004
2005TEST_F(KeyboardInputMapperTest, GetSources) {
2006 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2007 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2008 addMapperAndConfigure(mapper);
2009
2010 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
2011}
2012
2013TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
2014 const int32_t USAGE_A = 0x070004;
2015 const int32_t USAGE_UNKNOWN = 0x07ffff;
2016 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
2017 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
2018
2019 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2020 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2021 addMapperAndConfigure(mapper);
2022
2023 // Key down by scan code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002024 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_HOME, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002025 NotifyKeyArgs args;
2026 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2027 ASSERT_EQ(DEVICE_ID, args.deviceId);
2028 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2029 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2030 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2031 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2032 ASSERT_EQ(KEY_HOME, args.scanCode);
2033 ASSERT_EQ(AMETA_NONE, args.metaState);
2034 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2035 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2036 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2037
2038 // Key up by scan code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002039 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_HOME, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002040 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2041 ASSERT_EQ(DEVICE_ID, args.deviceId);
2042 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2043 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2044 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2045 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2046 ASSERT_EQ(KEY_HOME, args.scanCode);
2047 ASSERT_EQ(AMETA_NONE, args.metaState);
2048 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2049 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2050 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2051
2052 // Key down by usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002053 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2054 process(mapper, ARBITRARY_TIME, EV_KEY, 0, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002055 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2056 ASSERT_EQ(DEVICE_ID, args.deviceId);
2057 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2058 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2059 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2060 ASSERT_EQ(AKEYCODE_A, args.keyCode);
2061 ASSERT_EQ(0, args.scanCode);
2062 ASSERT_EQ(AMETA_NONE, args.metaState);
2063 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2064 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2065 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2066
2067 // Key up by usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002068 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2069 process(mapper, ARBITRARY_TIME + 1, EV_KEY, 0, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002070 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2071 ASSERT_EQ(DEVICE_ID, args.deviceId);
2072 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2073 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2074 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2075 ASSERT_EQ(AKEYCODE_A, args.keyCode);
2076 ASSERT_EQ(0, args.scanCode);
2077 ASSERT_EQ(AMETA_NONE, args.metaState);
2078 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2079 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2080 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2081
2082 // Key down with unknown scan code or usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002083 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2084 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UNKNOWN, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002085 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2086 ASSERT_EQ(DEVICE_ID, args.deviceId);
2087 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2088 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2089 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2090 ASSERT_EQ(0, args.keyCode);
2091 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2092 ASSERT_EQ(AMETA_NONE, args.metaState);
2093 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2094 ASSERT_EQ(0U, args.policyFlags);
2095 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2096
2097 // Key up with unknown scan code or usage code.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002098 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2099 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_UNKNOWN, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002100 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2101 ASSERT_EQ(DEVICE_ID, args.deviceId);
2102 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2103 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2104 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2105 ASSERT_EQ(0, args.keyCode);
2106 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2107 ASSERT_EQ(AMETA_NONE, args.metaState);
2108 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2109 ASSERT_EQ(0U, args.policyFlags);
2110 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2111}
2112
2113TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
2114 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
2115 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2116
2117 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2118 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2119 addMapperAndConfigure(mapper);
2120
2121 // Initial metastate.
2122 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2123
2124 // Metakey down.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002125 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_LEFTSHIFT, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002126 NotifyKeyArgs args;
2127 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2128 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2129 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2130 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2131
2132 // Key down.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002133 process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_A, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002134 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2135 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2136 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2137
2138 // Key up.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002139 process(mapper, ARBITRARY_TIME + 2, EV_KEY, KEY_A, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002140 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2141 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2142 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2143
2144 // Metakey up.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002145 process(mapper, ARBITRARY_TIME + 3, EV_KEY, KEY_LEFTSHIFT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002146 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2147 ASSERT_EQ(AMETA_NONE, args.metaState);
2148 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2149 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2150}
2151
2152TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
2153 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2154 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2155 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2156 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2157
2158 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2159 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2160 addMapperAndConfigure(mapper);
2161
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002162 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002163 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2164 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2165 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2166 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2167 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2168 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2169 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2170 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2171}
2172
2173TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
2174 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2175 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2176 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2177 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2178
2179 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2180 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2181 addConfigurationProperty("keyboard.orientationAware", "1");
2182 addMapperAndConfigure(mapper);
2183
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002184 prepareDisplay(DISPLAY_ORIENTATION_0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002185 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2186 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2187 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2188 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2189 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2190 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2191 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2192 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2193
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002194 clearViewports();
2195 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002196 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2197 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
2198 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2199 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
2200 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2201 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
2202 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2203 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
2204
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002205 clearViewports();
2206 prepareDisplay(DISPLAY_ORIENTATION_180);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002207 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2208 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
2209 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2210 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
2211 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2212 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
2213 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2214 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
2215
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002216 clearViewports();
2217 prepareDisplay(DISPLAY_ORIENTATION_270);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002218 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2219 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
2220 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2221 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
2222 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2223 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
2224 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2225 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
2226
2227 // Special case: if orientation changes while key is down, we still emit the same keycode
2228 // in the key up as we did in the key down.
2229 NotifyKeyArgs args;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002230 clearViewports();
2231 prepareDisplay(DISPLAY_ORIENTATION_270);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002232 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002233 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2234 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2235 ASSERT_EQ(KEY_UP, args.scanCode);
2236 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2237
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002238 clearViewports();
2239 prepareDisplay(DISPLAY_ORIENTATION_180);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002240 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002241 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2242 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2243 ASSERT_EQ(KEY_UP, args.scanCode);
2244 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2245}
2246
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002247TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_NotOrientationAware) {
2248 // If the keyboard is not orientation aware,
2249 // key events should not be associated with a specific display id
2250 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2251
2252 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2253 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2254 addMapperAndConfigure(mapper);
2255 NotifyKeyArgs args;
2256
2257 // Display id should be ADISPLAY_ID_NONE without any display configuration.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002258 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002259 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002260 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2262 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2263
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002264 prepareDisplay(DISPLAY_ORIENTATION_0);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002265 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002266 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002267 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002268 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2269 ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2270}
2271
2272TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_OrientationAware) {
2273 // If the keyboard is orientation aware,
2274 // key events should be associated with the internal viewport
2275 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2276
2277 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2278 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2279 addConfigurationProperty("keyboard.orientationAware", "1");
2280 addMapperAndConfigure(mapper);
2281 NotifyKeyArgs args;
2282
2283 // Display id should be ADISPLAY_ID_NONE without any display configuration.
2284 // ^--- already checked by the previous test
2285
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002286 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002287 UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002288 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002289 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002290 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002291 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2292 ASSERT_EQ(DISPLAY_ID, args.displayId);
2293
2294 constexpr int32_t newDisplayId = 2;
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07002295 clearViewports();
2296 setDisplayInfoAndReconfigure(newDisplayId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002297 UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002298 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002299 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002300 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
Siarhei Vishniakoua62a8dd2018-06-08 21:17:33 +01002301 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2302 ASSERT_EQ(newDisplayId, args.displayId);
2303}
2304
Michael Wrightd02c5b62014-02-10 15:10:22 -08002305TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
2306 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2307 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2308 addMapperAndConfigure(mapper);
2309
2310 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
2311 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2312
2313 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
2314 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2315}
2316
2317TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
2318 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2319 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2320 addMapperAndConfigure(mapper);
2321
2322 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
2323 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2324
2325 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
2326 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2327}
2328
2329TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
2330 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2331 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2332 addMapperAndConfigure(mapper);
2333
2334 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2335
2336 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
2337 uint8_t flags[2] = { 0, 0 };
2338 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
2339 ASSERT_TRUE(flags[0]);
2340 ASSERT_FALSE(flags[1]);
2341}
2342
2343TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
2344 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
2345 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
2346 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
2347 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
2348 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
2349 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
2350
2351 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2352 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2353 addMapperAndConfigure(mapper);
2354
2355 // Initialization should have turned all of the lights off.
2356 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2357 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2358 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2359
2360 // Toggle caps lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002361 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2362 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002363 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2364 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2365 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2366 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
2367
2368 // Toggle num lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002369 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2370 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002371 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2372 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2373 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2374 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
2375
2376 // Toggle caps lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002377 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2378 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002379 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2380 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2381 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2382 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
2383
2384 // Toggle scroll lock on.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002385 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2386 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002387 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2388 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2389 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2390 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2391
2392 // Toggle num lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002393 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2394 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002395 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2396 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2397 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2398 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2399
2400 // Toggle scroll lock off.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002401 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2402 process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002403 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2404 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2405 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2406 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2407}
2408
2409
2410// --- CursorInputMapperTest ---
2411
2412class CursorInputMapperTest : public InputMapperTest {
2413protected:
2414 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
2415
2416 sp<FakePointerController> mFakePointerController;
2417
2418 virtual void SetUp() {
2419 InputMapperTest::SetUp();
2420
2421 mFakePointerController = new FakePointerController();
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002422 mFakePolicy->setPointerController(mDevice->getId(), mFakePointerController);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002423 }
2424
2425 void testMotionRotation(CursorInputMapper* mapper,
2426 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002427
2428 void prepareDisplay(int32_t orientation) {
2429 const std::string uniqueId = "local:0";
2430 const ViewportType viewportType = ViewportType::VIEWPORT_INTERNAL;
2431 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
2432 orientation, uniqueId, NO_PORT, viewportType);
2433 }
Michael Wrightd02c5b62014-02-10 15:10:22 -08002434};
2435
2436const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
2437
2438void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
2439 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
2440 NotifyMotionArgs args;
2441
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002442 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, originalX);
2443 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, originalY);
2444 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002445 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2446 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2447 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2448 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
2449 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
2450 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2451}
2452
2453TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
2454 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2455 addConfigurationProperty("cursor.mode", "pointer");
2456 addMapperAndConfigure(mapper);
2457
2458 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2459}
2460
2461TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
2462 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2463 addConfigurationProperty("cursor.mode", "navigation");
2464 addMapperAndConfigure(mapper);
2465
2466 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
2467}
2468
2469TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
2470 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2471 addConfigurationProperty("cursor.mode", "pointer");
2472 addMapperAndConfigure(mapper);
2473
2474 InputDeviceInfo info;
2475 mapper->populateDeviceInfo(&info);
2476
2477 // Initially there may not be a valid motion range.
Yi Kong9b14ac62018-07-17 13:48:38 -07002478 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
2479 ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002480 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2481 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
2482
2483 // When the bounds are set, then there should be a valid motion range.
2484 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
2485
2486 InputDeviceInfo info2;
2487 mapper->populateDeviceInfo(&info2);
2488
2489 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2490 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
2491 1, 800 - 1, 0.0f, 0.0f));
2492 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2493 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
2494 2, 480 - 1, 0.0f, 0.0f));
2495 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2496 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
2497 0.0f, 1.0f, 0.0f, 0.0f));
2498}
2499
2500TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2501 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2502 addConfigurationProperty("cursor.mode", "navigation");
2503 addMapperAndConfigure(mapper);
2504
2505 InputDeviceInfo info;
2506 mapper->populateDeviceInfo(&info);
2507
2508 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2509 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
2510 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2511 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2512 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
2513 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2514 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2515 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2516 0.0f, 1.0f, 0.0f, 0.0f));
2517}
2518
2519TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2520 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2521 addConfigurationProperty("cursor.mode", "navigation");
2522 addMapperAndConfigure(mapper);
2523
2524 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2525
2526 NotifyMotionArgs args;
2527
2528 // Button press.
2529 // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002530 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2531 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002532 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2533 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2534 ASSERT_EQ(DEVICE_ID, args.deviceId);
2535 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2536 ASSERT_EQ(uint32_t(0), args.policyFlags);
2537 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2538 ASSERT_EQ(0, args.flags);
2539 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2540 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2541 ASSERT_EQ(0, args.edgeFlags);
2542 ASSERT_EQ(uint32_t(1), args.pointerCount);
2543 ASSERT_EQ(0, args.pointerProperties[0].id);
2544 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2545 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2546 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2547 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2548 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2549 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2550
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002551 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2552 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2553 ASSERT_EQ(DEVICE_ID, args.deviceId);
2554 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2555 ASSERT_EQ(uint32_t(0), args.policyFlags);
2556 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2557 ASSERT_EQ(0, args.flags);
2558 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2559 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2560 ASSERT_EQ(0, args.edgeFlags);
2561 ASSERT_EQ(uint32_t(1), args.pointerCount);
2562 ASSERT_EQ(0, args.pointerProperties[0].id);
2563 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2564 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2565 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2566 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2567 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2568 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2569
Michael Wrightd02c5b62014-02-10 15:10:22 -08002570 // Button release. Should have same down time.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002571 process(mapper, ARBITRARY_TIME + 1, EV_KEY, BTN_MOUSE, 0);
2572 process(mapper, ARBITRARY_TIME + 1, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002573 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2574 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2575 ASSERT_EQ(DEVICE_ID, args.deviceId);
2576 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2577 ASSERT_EQ(uint32_t(0), args.policyFlags);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002578 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2579 ASSERT_EQ(0, args.flags);
2580 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2581 ASSERT_EQ(0, args.buttonState);
2582 ASSERT_EQ(0, args.edgeFlags);
2583 ASSERT_EQ(uint32_t(1), args.pointerCount);
2584 ASSERT_EQ(0, args.pointerProperties[0].id);
2585 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2586 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2587 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2588 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2589 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2590 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2591
2592 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2593 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2594 ASSERT_EQ(DEVICE_ID, args.deviceId);
2595 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2596 ASSERT_EQ(uint32_t(0), args.policyFlags);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002597 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2598 ASSERT_EQ(0, args.flags);
2599 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2600 ASSERT_EQ(0, args.buttonState);
2601 ASSERT_EQ(0, args.edgeFlags);
2602 ASSERT_EQ(uint32_t(1), args.pointerCount);
2603 ASSERT_EQ(0, args.pointerProperties[0].id);
2604 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2605 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2606 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2607 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2608 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2609 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2610}
2611
2612TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2613 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2614 addConfigurationProperty("cursor.mode", "navigation");
2615 addMapperAndConfigure(mapper);
2616
2617 NotifyMotionArgs args;
2618
2619 // Motion in X but not Y.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002620 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2621 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002622 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2623 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2624 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2625 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2626
2627 // Motion in Y but not X.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002628 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2629 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002630 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2631 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2632 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2633 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2634}
2635
2636TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2637 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2638 addConfigurationProperty("cursor.mode", "navigation");
2639 addMapperAndConfigure(mapper);
2640
2641 NotifyMotionArgs args;
2642
2643 // Button press.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002644 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2645 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002646 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2647 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2648 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2649 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2650
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002651 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2652 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2653 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2654 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2655
Michael Wrightd02c5b62014-02-10 15:10:22 -08002656 // Button release.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002657 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2658 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002659 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002660 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2661 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2662 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2663
2664 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002665 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2666 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2667 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2668}
2669
2670TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2671 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2672 addConfigurationProperty("cursor.mode", "navigation");
2673 addMapperAndConfigure(mapper);
2674
2675 NotifyMotionArgs args;
2676
2677 // Combined X, Y and Button.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002678 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2679 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2680 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2681 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002682 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2683 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2684 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2685 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2686 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2687
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002688 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2689 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2690 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2691 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2692 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2693
Michael Wrightd02c5b62014-02-10 15:10:22 -08002694 // Move X, Y a bit while pressed.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002695 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 2);
2696 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 1);
2697 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002698 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2699 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2700 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2701 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2702 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2703
2704 // Release Button.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002705 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2706 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002707 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002708 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2709 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2710 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2711
2712 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002713 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2714 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2715 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2716}
2717
2718TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2719 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2720 addConfigurationProperty("cursor.mode", "navigation");
2721 addMapperAndConfigure(mapper);
2722
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002723 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002724 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2725 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2726 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2727 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2728 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2729 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2730 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2731 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2732}
2733
2734TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2735 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2736 addConfigurationProperty("cursor.mode", "navigation");
2737 addConfigurationProperty("cursor.orientationAware", "1");
2738 addMapperAndConfigure(mapper);
2739
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002740 prepareDisplay(DISPLAY_ORIENTATION_0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002741 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2742 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2743 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2744 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2745 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2746 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2747 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2748 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2749
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002750 prepareDisplay(DISPLAY_ORIENTATION_90);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002751 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0));
2752 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1));
2753 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1));
2754 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1));
2755 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0));
2756 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1));
2757 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1));
2758 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1));
2759
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002760 prepareDisplay(DISPLAY_ORIENTATION_180);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002761 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1));
2762 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1));
2763 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0));
2764 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1));
2765 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1));
2766 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1));
2767 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0));
2768 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1));
2769
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07002770 prepareDisplay(DISPLAY_ORIENTATION_270);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002771 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0));
2772 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1));
2773 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1));
2774 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1));
2775 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0));
2776 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1));
2777 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1));
2778 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1));
2779}
2780
2781TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2782 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2783 addConfigurationProperty("cursor.mode", "pointer");
2784 addMapperAndConfigure(mapper);
2785
2786 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2787 mFakePointerController->setPosition(100, 200);
2788 mFakePointerController->setButtonState(0);
2789
2790 NotifyMotionArgs motionArgs;
2791 NotifyKeyArgs keyArgs;
2792
2793 // press BTN_LEFT, release BTN_LEFT
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002794 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 1);
2795 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002796 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2797 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2798 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2799 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2800 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2801 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2802
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002803 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2804 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2805 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2806 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2807 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2808 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2809
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002810 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 0);
2811 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002812 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002813 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002814 ASSERT_EQ(0, motionArgs.buttonState);
2815 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002816 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2817 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2818
2819 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002820 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002821 ASSERT_EQ(0, motionArgs.buttonState);
2822 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002823 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2824 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2825
2826 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002827 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002828 ASSERT_EQ(0, motionArgs.buttonState);
2829 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002830 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2831 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2832
2833 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002834 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 1);
2835 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 1);
2836 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002837 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2838 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2839 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2840 motionArgs.buttonState);
2841 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2842 mFakePointerController->getButtonState());
2843 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2844 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2845
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002846 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2847 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2848 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2849 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2850 mFakePointerController->getButtonState());
2851 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2852 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2853
2854 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2855 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2856 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2857 motionArgs.buttonState);
2858 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2859 mFakePointerController->getButtonState());
2860 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2861 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2862
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002863 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 0);
2864 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002865 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002866 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002867 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2868 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002869 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2870 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2871
2872 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002873 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002874 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2875 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002876 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2877 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2878
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002879 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2880 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002881 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002882 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2883 ASSERT_EQ(0, motionArgs.buttonState);
2884 ASSERT_EQ(0, mFakePointerController->getButtonState());
2885 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2886 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002887 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2888 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002889
2890 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002891 ASSERT_EQ(0, motionArgs.buttonState);
2892 ASSERT_EQ(0, mFakePointerController->getButtonState());
2893 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2894 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2895 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002896
Michael Wrightd02c5b62014-02-10 15:10:22 -08002897 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2898 ASSERT_EQ(0, motionArgs.buttonState);
2899 ASSERT_EQ(0, mFakePointerController->getButtonState());
2900 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2901 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2902 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2903
2904 // press BTN_BACK, release BTN_BACK
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002905 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 1);
2906 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002907 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2908 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2909 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002910
Michael Wrightd02c5b62014-02-10 15:10:22 -08002911 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002912 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002913 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2914 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002915 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2916 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2917
2918 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2919 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2920 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2921 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002922 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2923 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2924
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002925 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 0);
2926 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002927 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002928 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002929 ASSERT_EQ(0, motionArgs.buttonState);
2930 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002931 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2932 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2933
2934 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002935 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002936 ASSERT_EQ(0, motionArgs.buttonState);
2937 ASSERT_EQ(0, mFakePointerController->getButtonState());
2938
Michael Wrightd02c5b62014-02-10 15:10:22 -08002939 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2940 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2941 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2942 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2943 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2944
2945 // press BTN_SIDE, release BTN_SIDE
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002946 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 1);
2947 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002948 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2949 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2950 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002951
Michael Wrightd02c5b62014-02-10 15:10:22 -08002952 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002953 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002954 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2955 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002956 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2957 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2958
2959 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2960 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2961 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2962 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002963 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2964 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2965
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002966 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 0);
2967 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002968 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002969 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002970 ASSERT_EQ(0, motionArgs.buttonState);
2971 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002972 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2973 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002974
2975 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2976 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2977 ASSERT_EQ(0, motionArgs.buttonState);
2978 ASSERT_EQ(0, mFakePointerController->getButtonState());
2979 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2980 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2981
Michael Wrightd02c5b62014-02-10 15:10:22 -08002982 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2983 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2984 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2985
2986 // press BTN_FORWARD, release BTN_FORWARD
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08002987 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 1);
2988 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002989 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2990 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2991 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002992
Michael Wrightd02c5b62014-02-10 15:10:22 -08002993 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002994 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002995 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2996 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002997 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2998 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2999
3000 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3001 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3002 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3003 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003004 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3005 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3006
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003007 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 0);
3008 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003009 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003010 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003011 ASSERT_EQ(0, motionArgs.buttonState);
3012 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003013 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3014 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003015
3016 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3017 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3018 ASSERT_EQ(0, motionArgs.buttonState);
3019 ASSERT_EQ(0, mFakePointerController->getButtonState());
3020 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3021 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3022
Michael Wrightd02c5b62014-02-10 15:10:22 -08003023 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3024 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3025 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3026
3027 // press BTN_EXTRA, release BTN_EXTRA
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003028 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 1);
3029 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003030 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3031 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3032 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003033
Michael Wrightd02c5b62014-02-10 15:10:22 -08003034 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003035 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003036 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3037 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003038 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3039 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3040
3041 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3042 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3043 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3044 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003045 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3046 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3047
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003048 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 0);
3049 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003050 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003051 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003052 ASSERT_EQ(0, motionArgs.buttonState);
3053 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08003054 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3055 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003056
3057 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3058 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3059 ASSERT_EQ(0, motionArgs.buttonState);
3060 ASSERT_EQ(0, mFakePointerController->getButtonState());
3061 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3062 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3063
Michael Wrightd02c5b62014-02-10 15:10:22 -08003064 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3065 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3066 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3067}
3068
3069TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
3070 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3071 addConfigurationProperty("cursor.mode", "pointer");
3072 addMapperAndConfigure(mapper);
3073
3074 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3075 mFakePointerController->setPosition(100, 200);
3076 mFakePointerController->setButtonState(0);
3077
3078 NotifyMotionArgs args;
3079
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003080 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3081 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3082 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003083 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003084 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3085 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3086 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3087 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3088 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3089}
3090
3091TEST_F(CursorInputMapperTest, Process_PointerCapture) {
3092 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3093 addConfigurationProperty("cursor.mode", "pointer");
3094 mFakePolicy->setPointerCapture(true);
3095 addMapperAndConfigure(mapper);
3096
3097 NotifyDeviceResetArgs resetArgs;
3098 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3099 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3100 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3101
3102 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3103 mFakePointerController->setPosition(100, 200);
3104 mFakePointerController->setButtonState(0);
3105
3106 NotifyMotionArgs args;
3107
3108 // Move.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003109 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3110 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3111 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003112 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3113 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3114 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3115 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3116 10.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3117 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3118
3119 // Button press.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003120 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
3121 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003122 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3123 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3124 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
3125 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3126 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3127 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3128 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3129 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
3130 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3131 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3132
3133 // Button release.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003134 process(mapper, ARBITRARY_TIME + 2, EV_KEY, BTN_MOUSE, 0);
3135 process(mapper, ARBITRARY_TIME + 2, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003136 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3137 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3138 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
3139 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3140 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3141 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3142 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3143 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
3144 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3145 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3146
3147 // Another move.
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003148 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 30);
3149 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 40);
3150 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003151 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3152 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3153 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3154 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3155 30.0f, 40.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3156 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3157
3158 // Disable pointer capture and check that the device generation got bumped
3159 // and events are generated the usual way.
3160 const uint32_t generation = mFakeContext->getGeneration();
3161 mFakePolicy->setPointerCapture(false);
3162 configureDevice(InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
3163 ASSERT_TRUE(mFakeContext->getGeneration() != generation);
3164
3165 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3166 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3167 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3168
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003169 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3170 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3171 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08003172 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3173 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003174 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3175 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3176 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3177 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3178}
3179
Andrii Kulian620f6d92018-09-14 16:51:59 -07003180TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) {
3181 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3182 addMapperAndConfigure(mapper);
3183
3184 // Setup PointerController for second display.
3185 constexpr int32_t SECOND_DISPLAY_ID = 1;
3186 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3187 mFakePointerController->setPosition(100, 200);
3188 mFakePointerController->setButtonState(0);
3189 mFakePointerController->setDisplayId(SECOND_DISPLAY_ID);
3190
3191 NotifyMotionArgs args;
3192 process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3193 process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3194 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3195 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3196 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3197 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3198 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3199 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3200 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3201 ASSERT_EQ(SECOND_DISPLAY_ID, args.displayId);
3202}
3203
Michael Wrightd02c5b62014-02-10 15:10:22 -08003204
3205// --- TouchInputMapperTest ---
3206
3207class TouchInputMapperTest : public InputMapperTest {
3208protected:
3209 static const int32_t RAW_X_MIN;
3210 static const int32_t RAW_X_MAX;
3211 static const int32_t RAW_Y_MIN;
3212 static const int32_t RAW_Y_MAX;
3213 static const int32_t RAW_TOUCH_MIN;
3214 static const int32_t RAW_TOUCH_MAX;
3215 static const int32_t RAW_TOOL_MIN;
3216 static const int32_t RAW_TOOL_MAX;
3217 static const int32_t RAW_PRESSURE_MIN;
3218 static const int32_t RAW_PRESSURE_MAX;
3219 static const int32_t RAW_ORIENTATION_MIN;
3220 static const int32_t RAW_ORIENTATION_MAX;
3221 static const int32_t RAW_DISTANCE_MIN;
3222 static const int32_t RAW_DISTANCE_MAX;
3223 static const int32_t RAW_TILT_MIN;
3224 static const int32_t RAW_TILT_MAX;
3225 static const int32_t RAW_ID_MIN;
3226 static const int32_t RAW_ID_MAX;
3227 static const int32_t RAW_SLOT_MIN;
3228 static const int32_t RAW_SLOT_MAX;
3229 static const float X_PRECISION;
3230 static const float Y_PRECISION;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003231 static const float X_PRECISION_VIRTUAL;
3232 static const float Y_PRECISION_VIRTUAL;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003233
3234 static const float GEOMETRIC_SCALE;
Jason Gerecke489fda82012-09-07 17:19:40 -07003235 static const TouchAffineTransformation AFFINE_TRANSFORM;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003236
3237 static const VirtualKeyDefinition VIRTUAL_KEYS[2];
3238
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003239 const std::string UNIQUE_ID = "local:0";
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003240 const std::string SECONDARY_UNIQUE_ID = "local:1";
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003241
Michael Wrightd02c5b62014-02-10 15:10:22 -08003242 enum Axes {
3243 POSITION = 1 << 0,
3244 TOUCH = 1 << 1,
3245 TOOL = 1 << 2,
3246 PRESSURE = 1 << 3,
3247 ORIENTATION = 1 << 4,
3248 MINOR = 1 << 5,
3249 ID = 1 << 6,
3250 DISTANCE = 1 << 7,
3251 TILT = 1 << 8,
3252 SLOT = 1 << 9,
3253 TOOL_TYPE = 1 << 10,
3254 };
3255
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003256 void prepareDisplay(int32_t orientation, std::optional<uint8_t> port = NO_PORT);
3257 void prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port = NO_PORT);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003258 void prepareVirtualDisplay(int32_t orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003259 void prepareVirtualKeys();
Jason Gerecke489fda82012-09-07 17:19:40 -07003260 void prepareLocationCalibration();
Michael Wrightd02c5b62014-02-10 15:10:22 -08003261 int32_t toRawX(float displayX);
3262 int32_t toRawY(float displayY);
Jason Gerecke489fda82012-09-07 17:19:40 -07003263 float toCookedX(float rawX, float rawY);
3264 float toCookedY(float rawX, float rawY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003265 float toDisplayX(int32_t rawX);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003266 float toDisplayX(int32_t rawX, int32_t displayWidth);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003267 float toDisplayY(int32_t rawY);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003268 float toDisplayY(int32_t rawY, int32_t displayHeight);
3269
Michael Wrightd02c5b62014-02-10 15:10:22 -08003270};
3271
3272const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
3273const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
3274const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
3275const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
3276const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
3277const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
3278const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
3279const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
Michael Wrightaa449c92017-12-13 21:21:43 +00003280const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = 0;
3281const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = 255;
Michael Wrightd02c5b62014-02-10 15:10:22 -08003282const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
3283const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
3284const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
3285const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
3286const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
3287const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
3288const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
3289const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
3290const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
3291const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
3292const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
3293const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
Santos Cordonfa5cf462017-04-05 10:37:00 -07003294const float TouchInputMapperTest::X_PRECISION_VIRTUAL =
3295 float(RAW_X_MAX - RAW_X_MIN + 1) / VIRTUAL_DISPLAY_WIDTH;
3296const float TouchInputMapperTest::Y_PRECISION_VIRTUAL =
3297 float(RAW_Y_MAX - RAW_Y_MIN + 1) / VIRTUAL_DISPLAY_HEIGHT;
Jason Gerecke489fda82012-09-07 17:19:40 -07003298const TouchAffineTransformation TouchInputMapperTest::AFFINE_TRANSFORM =
3299 TouchAffineTransformation(1, -2, 3, -4, 5, -6);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003300
3301const float TouchInputMapperTest::GEOMETRIC_SCALE =
3302 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
3303 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
3304
3305const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
3306 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
3307 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
3308};
3309
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003310void TouchInputMapperTest::prepareDisplay(int32_t orientation, std::optional<uint8_t> port) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003311 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003312 UNIQUE_ID, port, ViewportType::VIEWPORT_INTERNAL);
3313}
3314
3315void TouchInputMapperTest::prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port) {
3316 setDisplayInfoAndReconfigure(SECONDARY_DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
3317 DISPLAY_ORIENTATION_0, SECONDARY_UNIQUE_ID, port, type);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003318}
3319
Santos Cordonfa5cf462017-04-05 10:37:00 -07003320void TouchInputMapperTest::prepareVirtualDisplay(int32_t orientation) {
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07003321 setDisplayInfoAndReconfigure(VIRTUAL_DISPLAY_ID, VIRTUAL_DISPLAY_WIDTH,
3322 VIRTUAL_DISPLAY_HEIGHT, orientation,
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07003323 VIRTUAL_DISPLAY_UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
Santos Cordonfa5cf462017-04-05 10:37:00 -07003324}
3325
Michael Wrightd02c5b62014-02-10 15:10:22 -08003326void TouchInputMapperTest::prepareVirtualKeys() {
3327 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
3328 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
3329 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
3330 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
3331}
3332
Jason Gerecke489fda82012-09-07 17:19:40 -07003333void TouchInputMapperTest::prepareLocationCalibration() {
3334 mFakePolicy->setTouchAffineTransformation(AFFINE_TRANSFORM);
3335}
3336
Michael Wrightd02c5b62014-02-10 15:10:22 -08003337int32_t TouchInputMapperTest::toRawX(float displayX) {
3338 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
3339}
3340
3341int32_t TouchInputMapperTest::toRawY(float displayY) {
3342 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
3343}
3344
Jason Gerecke489fda82012-09-07 17:19:40 -07003345float TouchInputMapperTest::toCookedX(float rawX, float rawY) {
3346 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3347 return rawX;
3348}
3349
3350float TouchInputMapperTest::toCookedY(float rawX, float rawY) {
3351 AFFINE_TRANSFORM.applyTo(rawX, rawY);
3352 return rawY;
3353}
3354
Michael Wrightd02c5b62014-02-10 15:10:22 -08003355float TouchInputMapperTest::toDisplayX(int32_t rawX) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003356 return toDisplayX(rawX, DISPLAY_WIDTH);
3357}
3358
3359float TouchInputMapperTest::toDisplayX(int32_t rawX, int32_t displayWidth) {
3360 return float(rawX - RAW_X_MIN) * displayWidth / (RAW_X_MAX - RAW_X_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003361}
3362
3363float TouchInputMapperTest::toDisplayY(int32_t rawY) {
Santos Cordonfa5cf462017-04-05 10:37:00 -07003364 return toDisplayY(rawY, DISPLAY_HEIGHT);
3365}
3366
3367float TouchInputMapperTest::toDisplayY(int32_t rawY, int32_t displayHeight) {
3368 return float(rawY - RAW_Y_MIN) * displayHeight / (RAW_Y_MAX - RAW_Y_MIN + 1);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003369}
3370
3371
3372// --- SingleTouchInputMapperTest ---
3373
3374class SingleTouchInputMapperTest : public TouchInputMapperTest {
3375protected:
3376 void prepareButtons();
3377 void prepareAxes(int axes);
3378
3379 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3380 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3381 void processUp(SingleTouchInputMapper* mappery);
3382 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
3383 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
3384 void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
3385 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
3386 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
3387 void processSync(SingleTouchInputMapper* mapper);
3388};
3389
3390void SingleTouchInputMapperTest::prepareButtons() {
3391 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
3392}
3393
3394void SingleTouchInputMapperTest::prepareAxes(int axes) {
3395 if (axes & POSITION) {
3396 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
3397 RAW_X_MIN, RAW_X_MAX, 0, 0);
3398 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
3399 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3400 }
3401 if (axes & PRESSURE) {
3402 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
3403 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3404 }
3405 if (axes & TOOL) {
3406 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
3407 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3408 }
3409 if (axes & DISTANCE) {
3410 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
3411 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3412 }
3413 if (axes & TILT) {
3414 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
3415 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3416 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
3417 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3418 }
3419}
3420
3421void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003422 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1);
3423 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3424 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003425}
3426
3427void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003428 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3429 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003430}
3431
3432void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003433 process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003434}
3435
3436void SingleTouchInputMapperTest::processPressure(
3437 SingleTouchInputMapper* mapper, int32_t pressure) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003438 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_PRESSURE, pressure);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003439}
3440
3441void SingleTouchInputMapperTest::processToolMajor(
3442 SingleTouchInputMapper* mapper, int32_t toolMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003443 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003444}
3445
3446void SingleTouchInputMapperTest::processDistance(
3447 SingleTouchInputMapper* mapper, int32_t distance) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003448 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_DISTANCE, distance);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003449}
3450
3451void SingleTouchInputMapperTest::processTilt(
3452 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003453 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_X, tiltX);
3454 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_Y, tiltY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003455}
3456
3457void SingleTouchInputMapperTest::processKey(
3458 SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003459 process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003460}
3461
3462void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08003463 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003464}
3465
3466
3467TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
3468 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3469 prepareButtons();
3470 prepareAxes(POSITION);
3471 addMapperAndConfigure(mapper);
3472
3473 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
3474}
3475
3476TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
3477 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3478 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
3479 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
3480 prepareButtons();
3481 prepareAxes(POSITION);
3482 addMapperAndConfigure(mapper);
3483
3484 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3485}
3486
3487TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
3488 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3489 prepareButtons();
3490 prepareAxes(POSITION);
3491 addConfigurationProperty("touch.deviceType", "touchPad");
3492 addMapperAndConfigure(mapper);
3493
3494 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3495}
3496
3497TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
3498 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3499 prepareButtons();
3500 prepareAxes(POSITION);
3501 addConfigurationProperty("touch.deviceType", "touchScreen");
3502 addMapperAndConfigure(mapper);
3503
3504 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
3505}
3506
3507TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
3508 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3509 addConfigurationProperty("touch.deviceType", "touchScreen");
3510 prepareDisplay(DISPLAY_ORIENTATION_0);
3511 prepareButtons();
3512 prepareAxes(POSITION);
3513 prepareVirtualKeys();
3514 addMapperAndConfigure(mapper);
3515
3516 // Unknown key.
3517 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
3518
3519 // Virtual key is down.
3520 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3521 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3522 processDown(mapper, x, y);
3523 processSync(mapper);
3524 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3525
3526 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3527
3528 // Virtual key is up.
3529 processUp(mapper);
3530 processSync(mapper);
3531 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3532
3533 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3534}
3535
3536TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
3537 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3538 addConfigurationProperty("touch.deviceType", "touchScreen");
3539 prepareDisplay(DISPLAY_ORIENTATION_0);
3540 prepareButtons();
3541 prepareAxes(POSITION);
3542 prepareVirtualKeys();
3543 addMapperAndConfigure(mapper);
3544
3545 // Unknown key.
3546 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
3547
3548 // Virtual key is down.
3549 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3550 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3551 processDown(mapper, x, y);
3552 processSync(mapper);
3553 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3554
3555 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3556
3557 // Virtual key is up.
3558 processUp(mapper);
3559 processSync(mapper);
3560 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3561
3562 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3563}
3564
3565TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
3566 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3567 addConfigurationProperty("touch.deviceType", "touchScreen");
3568 prepareDisplay(DISPLAY_ORIENTATION_0);
3569 prepareButtons();
3570 prepareAxes(POSITION);
3571 prepareVirtualKeys();
3572 addMapperAndConfigure(mapper);
3573
3574 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
3575 uint8_t flags[2] = { 0, 0 };
3576 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
3577 ASSERT_TRUE(flags[0]);
3578 ASSERT_FALSE(flags[1]);
3579}
3580
3581TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
3582 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3583 addConfigurationProperty("touch.deviceType", "touchScreen");
3584 prepareDisplay(DISPLAY_ORIENTATION_0);
3585 prepareButtons();
3586 prepareAxes(POSITION);
3587 prepareVirtualKeys();
3588 addMapperAndConfigure(mapper);
3589
3590 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3591
3592 NotifyKeyArgs args;
3593
3594 // Press virtual key.
3595 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3596 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3597 processDown(mapper, x, y);
3598 processSync(mapper);
3599
3600 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3601 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3602 ASSERT_EQ(DEVICE_ID, args.deviceId);
3603 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3604 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3605 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
3606 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3607 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3608 ASSERT_EQ(KEY_HOME, args.scanCode);
3609 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3610 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3611
3612 // Release virtual key.
3613 processUp(mapper);
3614 processSync(mapper);
3615
3616 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3617 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3618 ASSERT_EQ(DEVICE_ID, args.deviceId);
3619 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3620 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3621 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
3622 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3623 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3624 ASSERT_EQ(KEY_HOME, args.scanCode);
3625 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3626 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3627
3628 // Should not have sent any motions.
3629 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3630}
3631
3632TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
3633 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3634 addConfigurationProperty("touch.deviceType", "touchScreen");
3635 prepareDisplay(DISPLAY_ORIENTATION_0);
3636 prepareButtons();
3637 prepareAxes(POSITION);
3638 prepareVirtualKeys();
3639 addMapperAndConfigure(mapper);
3640
3641 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3642
3643 NotifyKeyArgs keyArgs;
3644
3645 // Press virtual key.
3646 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3647 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3648 processDown(mapper, x, y);
3649 processSync(mapper);
3650
3651 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3652 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3653 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3654 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3655 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3656 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3657 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
3658 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3659 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3660 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3661 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3662
3663 // Move out of bounds. This should generate a cancel and a pointer down since we moved
3664 // into the display area.
3665 y -= 100;
3666 processMove(mapper, x, y);
3667 processSync(mapper);
3668
3669 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3670 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3671 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3672 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3673 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3674 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3675 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
3676 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
3677 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3678 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3679 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3680 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3681
3682 NotifyMotionArgs motionArgs;
3683 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3684 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3685 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3686 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3687 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3688 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3689 ASSERT_EQ(0, motionArgs.flags);
3690 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3691 ASSERT_EQ(0, motionArgs.buttonState);
3692 ASSERT_EQ(0, motionArgs.edgeFlags);
3693 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3694 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3695 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3696 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3697 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3698 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3699 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3700 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3701
3702 // Keep moving out of bounds. Should generate a pointer move.
3703 y -= 50;
3704 processMove(mapper, x, y);
3705 processSync(mapper);
3706
3707 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3708 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3709 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3710 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3711 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3712 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3713 ASSERT_EQ(0, motionArgs.flags);
3714 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3715 ASSERT_EQ(0, motionArgs.buttonState);
3716 ASSERT_EQ(0, motionArgs.edgeFlags);
3717 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3718 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3719 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3720 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3721 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3722 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3723 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3724 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3725
3726 // Release out of bounds. Should generate a pointer up.
3727 processUp(mapper);
3728 processSync(mapper);
3729
3730 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3731 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3732 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3733 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3734 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3735 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3736 ASSERT_EQ(0, motionArgs.flags);
3737 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3738 ASSERT_EQ(0, motionArgs.buttonState);
3739 ASSERT_EQ(0, motionArgs.edgeFlags);
3740 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3741 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3742 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3743 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3744 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3745 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3746 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3747 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3748
3749 // Should not have sent any more keys or motions.
3750 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3751 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3752}
3753
3754TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
3755 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3756 addConfigurationProperty("touch.deviceType", "touchScreen");
3757 prepareDisplay(DISPLAY_ORIENTATION_0);
3758 prepareButtons();
3759 prepareAxes(POSITION);
3760 prepareVirtualKeys();
3761 addMapperAndConfigure(mapper);
3762
3763 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3764
3765 NotifyMotionArgs motionArgs;
3766
3767 // Initially go down out of bounds.
3768 int32_t x = -10;
3769 int32_t y = -10;
3770 processDown(mapper, x, y);
3771 processSync(mapper);
3772
3773 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3774
3775 // Move into the display area. Should generate a pointer down.
3776 x = 50;
3777 y = 75;
3778 processMove(mapper, x, y);
3779 processSync(mapper);
3780
3781 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3782 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3783 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3784 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3785 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3786 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3787 ASSERT_EQ(0, motionArgs.flags);
3788 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3789 ASSERT_EQ(0, motionArgs.buttonState);
3790 ASSERT_EQ(0, motionArgs.edgeFlags);
3791 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3792 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3793 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3794 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3795 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3796 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3797 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3798 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3799
3800 // Release. Should generate a pointer up.
3801 processUp(mapper);
3802 processSync(mapper);
3803
3804 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3805 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3806 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3807 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3808 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3809 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3810 ASSERT_EQ(0, motionArgs.flags);
3811 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3812 ASSERT_EQ(0, motionArgs.buttonState);
3813 ASSERT_EQ(0, motionArgs.edgeFlags);
3814 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3815 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3816 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3817 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3818 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3819 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3820 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3821 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3822
3823 // Should not have sent any more keys or motions.
3824 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3825 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3826}
3827
Santos Cordonfa5cf462017-04-05 10:37:00 -07003828TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture_VirtualDisplay) {
3829 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3830 addConfigurationProperty("touch.deviceType", "touchScreen");
3831 addConfigurationProperty("touch.displayId", VIRTUAL_DISPLAY_UNIQUE_ID);
3832
3833 prepareVirtualDisplay(DISPLAY_ORIENTATION_0);
3834 prepareButtons();
3835 prepareAxes(POSITION);
3836 prepareVirtualKeys();
3837 addMapperAndConfigure(mapper);
3838
3839 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3840
3841 NotifyMotionArgs motionArgs;
3842
3843 // Down.
3844 int32_t x = 100;
3845 int32_t y = 125;
3846 processDown(mapper, x, y);
3847 processSync(mapper);
3848
3849 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3850 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3851 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3852 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3853 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3854 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3855 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3856 ASSERT_EQ(0, motionArgs.flags);
3857 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3858 ASSERT_EQ(0, motionArgs.buttonState);
3859 ASSERT_EQ(0, motionArgs.edgeFlags);
3860 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3861 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3862 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3863 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3864 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3865 1, 0, 0, 0, 0, 0, 0, 0));
3866 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3867 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3868 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3869
3870 // Move.
3871 x += 50;
3872 y += 75;
3873 processMove(mapper, x, y);
3874 processSync(mapper);
3875
3876 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3877 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3878 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3879 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3880 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3881 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3882 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3883 ASSERT_EQ(0, motionArgs.flags);
3884 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3885 ASSERT_EQ(0, motionArgs.buttonState);
3886 ASSERT_EQ(0, motionArgs.edgeFlags);
3887 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3888 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3889 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3890 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3891 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3892 1, 0, 0, 0, 0, 0, 0, 0));
3893 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3894 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3895 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3896
3897 // Up.
3898 processUp(mapper);
3899 processSync(mapper);
3900
3901 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3902 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3903 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3904 ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3905 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3906 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3907 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3908 ASSERT_EQ(0, motionArgs.flags);
3909 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3910 ASSERT_EQ(0, motionArgs.buttonState);
3911 ASSERT_EQ(0, motionArgs.edgeFlags);
3912 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3913 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3914 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3915 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3916 toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3917 1, 0, 0, 0, 0, 0, 0, 0));
3918 ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3919 ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3920 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3921
3922 // Should not have sent any more keys or motions.
3923 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3924 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3925}
3926
Michael Wrightd02c5b62014-02-10 15:10:22 -08003927TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
3928 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3929 addConfigurationProperty("touch.deviceType", "touchScreen");
3930 prepareDisplay(DISPLAY_ORIENTATION_0);
3931 prepareButtons();
3932 prepareAxes(POSITION);
3933 prepareVirtualKeys();
3934 addMapperAndConfigure(mapper);
3935
3936 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3937
3938 NotifyMotionArgs motionArgs;
3939
3940 // Down.
3941 int32_t x = 100;
3942 int32_t y = 125;
3943 processDown(mapper, x, y);
3944 processSync(mapper);
3945
3946 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3947 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3948 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3949 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3950 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3951 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3952 ASSERT_EQ(0, motionArgs.flags);
3953 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3954 ASSERT_EQ(0, motionArgs.buttonState);
3955 ASSERT_EQ(0, motionArgs.edgeFlags);
3956 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3957 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3958 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3959 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3960 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3961 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3962 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3963 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3964
3965 // Move.
3966 x += 50;
3967 y += 75;
3968 processMove(mapper, x, y);
3969 processSync(mapper);
3970
3971 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3972 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3973 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3974 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3975 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3976 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3977 ASSERT_EQ(0, motionArgs.flags);
3978 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3979 ASSERT_EQ(0, motionArgs.buttonState);
3980 ASSERT_EQ(0, motionArgs.edgeFlags);
3981 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3982 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3983 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3984 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3985 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3986 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3987 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3988 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3989
3990 // Up.
3991 processUp(mapper);
3992 processSync(mapper);
3993
3994 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3995 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3996 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3997 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3998 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3999 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4000 ASSERT_EQ(0, motionArgs.flags);
4001 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4002 ASSERT_EQ(0, motionArgs.buttonState);
4003 ASSERT_EQ(0, motionArgs.edgeFlags);
4004 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4005 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4006 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4007 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4008 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
4009 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4010 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4011 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4012
4013 // Should not have sent any more keys or motions.
4014 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4015 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4016}
4017
4018TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
4019 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4020 addConfigurationProperty("touch.deviceType", "touchScreen");
4021 prepareButtons();
4022 prepareAxes(POSITION);
4023 addConfigurationProperty("touch.orientationAware", "0");
4024 addMapperAndConfigure(mapper);
4025
4026 NotifyMotionArgs args;
4027
4028 // Rotation 90.
4029 prepareDisplay(DISPLAY_ORIENTATION_90);
4030 processDown(mapper, toRawX(50), toRawY(75));
4031 processSync(mapper);
4032
4033 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4034 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4035 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4036
4037 processUp(mapper);
4038 processSync(mapper);
4039 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4040}
4041
4042TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
4043 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4044 addConfigurationProperty("touch.deviceType", "touchScreen");
4045 prepareButtons();
4046 prepareAxes(POSITION);
4047 addMapperAndConfigure(mapper);
4048
4049 NotifyMotionArgs args;
4050
4051 // Rotation 0.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004052 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004053 prepareDisplay(DISPLAY_ORIENTATION_0);
4054 processDown(mapper, toRawX(50), toRawY(75));
4055 processSync(mapper);
4056
4057 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4058 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4059 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4060
4061 processUp(mapper);
4062 processSync(mapper);
4063 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4064
4065 // Rotation 90.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004066 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004067 prepareDisplay(DISPLAY_ORIENTATION_90);
4068 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
4069 processSync(mapper);
4070
4071 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4072 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4073 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4074
4075 processUp(mapper);
4076 processSync(mapper);
4077 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4078
4079 // Rotation 180.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004080 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004081 prepareDisplay(DISPLAY_ORIENTATION_180);
4082 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
4083 processSync(mapper);
4084
4085 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4086 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4087 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4088
4089 processUp(mapper);
4090 processSync(mapper);
4091 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4092
4093 // Rotation 270.
Siarhei Vishniakou05a8fe22018-10-03 16:38:28 -07004094 clearViewports();
Michael Wrightd02c5b62014-02-10 15:10:22 -08004095 prepareDisplay(DISPLAY_ORIENTATION_270);
4096 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
4097 processSync(mapper);
4098
4099 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4100 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4101 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4102
4103 processUp(mapper);
4104 processSync(mapper);
4105 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4106}
4107
4108TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
4109 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4110 addConfigurationProperty("touch.deviceType", "touchScreen");
4111 prepareDisplay(DISPLAY_ORIENTATION_0);
4112 prepareButtons();
4113 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
4114 addMapperAndConfigure(mapper);
4115
4116 // These calculations are based on the input device calibration documentation.
4117 int32_t rawX = 100;
4118 int32_t rawY = 200;
4119 int32_t rawPressure = 10;
4120 int32_t rawToolMajor = 12;
4121 int32_t rawDistance = 2;
4122 int32_t rawTiltX = 30;
4123 int32_t rawTiltY = 110;
4124
4125 float x = toDisplayX(rawX);
4126 float y = toDisplayY(rawY);
4127 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
4128 float size = float(rawToolMajor) / RAW_TOOL_MAX;
4129 float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
4130 float distance = float(rawDistance);
4131
4132 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
4133 float tiltScale = M_PI / 180;
4134 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
4135 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
4136 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
4137 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
4138
4139 processDown(mapper, rawX, rawY);
4140 processPressure(mapper, rawPressure);
4141 processToolMajor(mapper, rawToolMajor);
4142 processDistance(mapper, rawDistance);
4143 processTilt(mapper, rawTiltX, rawTiltY);
4144 processSync(mapper);
4145
4146 NotifyMotionArgs args;
4147 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4148 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4149 x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
4150 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
4151}
4152
Jason Gerecke489fda82012-09-07 17:19:40 -07004153TEST_F(SingleTouchInputMapperTest, Process_XYAxes_AffineCalibration) {
4154 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4155 addConfigurationProperty("touch.deviceType", "touchScreen");
4156 prepareDisplay(DISPLAY_ORIENTATION_0);
4157 prepareLocationCalibration();
4158 prepareButtons();
4159 prepareAxes(POSITION);
4160 addMapperAndConfigure(mapper);
4161
4162 int32_t rawX = 100;
4163 int32_t rawY = 200;
4164
4165 float x = toDisplayX(toCookedX(rawX, rawY));
4166 float y = toDisplayY(toCookedY(rawX, rawY));
4167
4168 processDown(mapper, rawX, rawY);
4169 processSync(mapper);
4170
4171 NotifyMotionArgs args;
4172 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4173 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4174 x, y, 1, 0, 0, 0, 0, 0, 0, 0));
4175}
4176
Michael Wrightd02c5b62014-02-10 15:10:22 -08004177TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
4178 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4179 addConfigurationProperty("touch.deviceType", "touchScreen");
4180 prepareDisplay(DISPLAY_ORIENTATION_0);
4181 prepareButtons();
4182 prepareAxes(POSITION);
4183 addMapperAndConfigure(mapper);
4184
4185 NotifyMotionArgs motionArgs;
4186 NotifyKeyArgs keyArgs;
4187
4188 processDown(mapper, 100, 200);
4189 processSync(mapper);
4190 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4191 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4192 ASSERT_EQ(0, motionArgs.buttonState);
4193
4194 // press BTN_LEFT, release BTN_LEFT
4195 processKey(mapper, BTN_LEFT, 1);
4196 processSync(mapper);
4197 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4198 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4199 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4200
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004201 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4202 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4203 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4204
Michael Wrightd02c5b62014-02-10 15:10:22 -08004205 processKey(mapper, BTN_LEFT, 0);
4206 processSync(mapper);
4207 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004208 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004209 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004210
4211 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004212 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004213 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004214
4215 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
4216 processKey(mapper, BTN_RIGHT, 1);
4217 processKey(mapper, BTN_MIDDLE, 1);
4218 processSync(mapper);
4219 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4220 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4221 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4222 motionArgs.buttonState);
4223
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004224 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4225 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4226 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4227
4228 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4229 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4230 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4231 motionArgs.buttonState);
4232
Michael Wrightd02c5b62014-02-10 15:10:22 -08004233 processKey(mapper, BTN_RIGHT, 0);
4234 processSync(mapper);
4235 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004236 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004237 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004238
4239 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004240 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004241 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004242
4243 processKey(mapper, BTN_MIDDLE, 0);
4244 processSync(mapper);
4245 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004246 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004247 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004248
4249 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004250 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004251 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004252
4253 // press BTN_BACK, release BTN_BACK
4254 processKey(mapper, BTN_BACK, 1);
4255 processSync(mapper);
4256 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4257 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4258 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004259
Michael Wrightd02c5b62014-02-10 15:10:22 -08004260 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004261 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004262 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4263
4264 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4265 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4266 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004267
4268 processKey(mapper, BTN_BACK, 0);
4269 processSync(mapper);
4270 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004271 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004272 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004273
4274 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004275 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004276 ASSERT_EQ(0, motionArgs.buttonState);
4277
Michael Wrightd02c5b62014-02-10 15:10:22 -08004278 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4279 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4280 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4281
4282 // press BTN_SIDE, release BTN_SIDE
4283 processKey(mapper, BTN_SIDE, 1);
4284 processSync(mapper);
4285 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4286 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4287 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004288
Michael Wrightd02c5b62014-02-10 15:10:22 -08004289 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004290 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004291 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4292
4293 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4294 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4295 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004296
4297 processKey(mapper, BTN_SIDE, 0);
4298 processSync(mapper);
4299 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004300 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004301 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004302
4303 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004304 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004305 ASSERT_EQ(0, motionArgs.buttonState);
4306
Michael Wrightd02c5b62014-02-10 15:10:22 -08004307 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4308 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4309 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4310
4311 // press BTN_FORWARD, release BTN_FORWARD
4312 processKey(mapper, BTN_FORWARD, 1);
4313 processSync(mapper);
4314 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4315 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4316 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004317
Michael Wrightd02c5b62014-02-10 15:10:22 -08004318 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004319 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004320 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4321
4322 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4323 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4324 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004325
4326 processKey(mapper, BTN_FORWARD, 0);
4327 processSync(mapper);
4328 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004329 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004330 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004331
4332 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004333 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004334 ASSERT_EQ(0, motionArgs.buttonState);
4335
Michael Wrightd02c5b62014-02-10 15:10:22 -08004336 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4337 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4338 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4339
4340 // press BTN_EXTRA, release BTN_EXTRA
4341 processKey(mapper, BTN_EXTRA, 1);
4342 processSync(mapper);
4343 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4344 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4345 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004346
Michael Wrightd02c5b62014-02-10 15:10:22 -08004347 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004348 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004349 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4350
4351 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4352 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4353 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004354
4355 processKey(mapper, BTN_EXTRA, 0);
4356 processSync(mapper);
4357 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004358 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004359 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004360
4361 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004362 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004363 ASSERT_EQ(0, motionArgs.buttonState);
4364
Michael Wrightd02c5b62014-02-10 15:10:22 -08004365 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4366 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4367 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4368
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004369 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4370
Michael Wrightd02c5b62014-02-10 15:10:22 -08004371 // press BTN_STYLUS, release BTN_STYLUS
4372 processKey(mapper, BTN_STYLUS, 1);
4373 processSync(mapper);
4374 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4375 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004376 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
4377
4378 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4379 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4380 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004381
4382 processKey(mapper, BTN_STYLUS, 0);
4383 processSync(mapper);
4384 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004385 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004386 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004387
4388 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004389 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004390 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004391
4392 // press BTN_STYLUS2, release BTN_STYLUS2
4393 processKey(mapper, BTN_STYLUS2, 1);
4394 processSync(mapper);
4395 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4396 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004397 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
4398
4399 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4400 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4401 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004402
4403 processKey(mapper, BTN_STYLUS2, 0);
4404 processSync(mapper);
4405 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004406 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004407 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004408
4409 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08004410 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08004411 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004412
4413 // release touch
4414 processUp(mapper);
4415 processSync(mapper);
4416 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4417 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4418 ASSERT_EQ(0, motionArgs.buttonState);
4419}
4420
4421TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4422 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4423 addConfigurationProperty("touch.deviceType", "touchScreen");
4424 prepareDisplay(DISPLAY_ORIENTATION_0);
4425 prepareButtons();
4426 prepareAxes(POSITION);
4427 addMapperAndConfigure(mapper);
4428
4429 NotifyMotionArgs motionArgs;
4430
4431 // default tool type is finger
4432 processDown(mapper, 100, 200);
4433 processSync(mapper);
4434 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4435 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4436 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4437
4438 // eraser
4439 processKey(mapper, BTN_TOOL_RUBBER, 1);
4440 processSync(mapper);
4441 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4442 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4443 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4444
4445 // stylus
4446 processKey(mapper, BTN_TOOL_RUBBER, 0);
4447 processKey(mapper, BTN_TOOL_PEN, 1);
4448 processSync(mapper);
4449 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4450 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4451 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4452
4453 // brush
4454 processKey(mapper, BTN_TOOL_PEN, 0);
4455 processKey(mapper, BTN_TOOL_BRUSH, 1);
4456 processSync(mapper);
4457 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4458 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4459 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4460
4461 // pencil
4462 processKey(mapper, BTN_TOOL_BRUSH, 0);
4463 processKey(mapper, BTN_TOOL_PENCIL, 1);
4464 processSync(mapper);
4465 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4466 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4467 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4468
4469 // airbrush
4470 processKey(mapper, BTN_TOOL_PENCIL, 0);
4471 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
4472 processSync(mapper);
4473 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4474 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4475 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4476
4477 // mouse
4478 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
4479 processKey(mapper, BTN_TOOL_MOUSE, 1);
4480 processSync(mapper);
4481 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4482 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4483 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4484
4485 // lens
4486 processKey(mapper, BTN_TOOL_MOUSE, 0);
4487 processKey(mapper, BTN_TOOL_LENS, 1);
4488 processSync(mapper);
4489 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4490 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4491 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4492
4493 // double-tap
4494 processKey(mapper, BTN_TOOL_LENS, 0);
4495 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4496 processSync(mapper);
4497 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4498 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4499 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4500
4501 // triple-tap
4502 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4503 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4504 processSync(mapper);
4505 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4506 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4507 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4508
4509 // quad-tap
4510 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4511 processKey(mapper, BTN_TOOL_QUADTAP, 1);
4512 processSync(mapper);
4513 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4514 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4515 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4516
4517 // finger
4518 processKey(mapper, BTN_TOOL_QUADTAP, 0);
4519 processKey(mapper, BTN_TOOL_FINGER, 1);
4520 processSync(mapper);
4521 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4522 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4523 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4524
4525 // stylus trumps finger
4526 processKey(mapper, BTN_TOOL_PEN, 1);
4527 processSync(mapper);
4528 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4529 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4530 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4531
4532 // eraser trumps stylus
4533 processKey(mapper, BTN_TOOL_RUBBER, 1);
4534 processSync(mapper);
4535 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4536 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4537 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4538
4539 // mouse trumps eraser
4540 processKey(mapper, BTN_TOOL_MOUSE, 1);
4541 processSync(mapper);
4542 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4543 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4544 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4545
4546 // back to default tool type
4547 processKey(mapper, BTN_TOOL_MOUSE, 0);
4548 processKey(mapper, BTN_TOOL_RUBBER, 0);
4549 processKey(mapper, BTN_TOOL_PEN, 0);
4550 processKey(mapper, BTN_TOOL_FINGER, 0);
4551 processSync(mapper);
4552 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4553 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4554 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4555}
4556
4557TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
4558 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4559 addConfigurationProperty("touch.deviceType", "touchScreen");
4560 prepareDisplay(DISPLAY_ORIENTATION_0);
4561 prepareButtons();
4562 prepareAxes(POSITION);
4563 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
4564 addMapperAndConfigure(mapper);
4565
4566 NotifyMotionArgs motionArgs;
4567
4568 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
4569 processKey(mapper, BTN_TOOL_FINGER, 1);
4570 processMove(mapper, 100, 200);
4571 processSync(mapper);
4572 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4573 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4574 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4575 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4576
4577 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4578 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4579 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4580 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4581
4582 // move a little
4583 processMove(mapper, 150, 250);
4584 processSync(mapper);
4585 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4586 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4587 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4588 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4589
4590 // down when BTN_TOUCH is pressed, pressure defaults to 1
4591 processKey(mapper, BTN_TOUCH, 1);
4592 processSync(mapper);
4593 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4594 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4595 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4596 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4597
4598 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4599 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4600 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4601 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4602
4603 // up when BTN_TOUCH is released, hover restored
4604 processKey(mapper, BTN_TOUCH, 0);
4605 processSync(mapper);
4606 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4607 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4608 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4609 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4610
4611 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4612 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4613 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4614 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4615
4616 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4617 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4618 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4619 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4620
4621 // exit hover when pointer goes away
4622 processKey(mapper, BTN_TOOL_FINGER, 0);
4623 processSync(mapper);
4624 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4625 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4626 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4627 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4628}
4629
4630TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
4631 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4632 addConfigurationProperty("touch.deviceType", "touchScreen");
4633 prepareDisplay(DISPLAY_ORIENTATION_0);
4634 prepareButtons();
4635 prepareAxes(POSITION | PRESSURE);
4636 addMapperAndConfigure(mapper);
4637
4638 NotifyMotionArgs motionArgs;
4639
4640 // initially hovering because pressure is 0
4641 processDown(mapper, 100, 200);
4642 processPressure(mapper, 0);
4643 processSync(mapper);
4644 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4645 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4646 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4647 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4648
4649 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4650 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4651 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4652 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4653
4654 // move a little
4655 processMove(mapper, 150, 250);
4656 processSync(mapper);
4657 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4658 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4659 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4660 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4661
4662 // down when pressure is non-zero
4663 processPressure(mapper, RAW_PRESSURE_MAX);
4664 processSync(mapper);
4665 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4666 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4667 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4668 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4669
4670 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4671 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4672 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4673 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4674
4675 // up when pressure becomes 0, hover restored
4676 processPressure(mapper, 0);
4677 processSync(mapper);
4678 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4679 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4680 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4681 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4682
4683 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4684 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4685 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4686 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4687
4688 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4689 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4690 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4691 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4692
4693 // exit hover when pointer goes away
4694 processUp(mapper);
4695 processSync(mapper);
4696 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4697 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4698 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4699 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4700}
4701
Michael Wrightd02c5b62014-02-10 15:10:22 -08004702// --- MultiTouchInputMapperTest ---
4703
4704class MultiTouchInputMapperTest : public TouchInputMapperTest {
4705protected:
4706 void prepareAxes(int axes);
4707
4708 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
4709 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
4710 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
4711 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
4712 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
4713 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
4714 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
4715 void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
4716 void processId(MultiTouchInputMapper* mapper, int32_t id);
4717 void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
4718 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
4719 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004720 void processTimestamp(MultiTouchInputMapper* mapper, uint32_t value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004721 void processMTSync(MultiTouchInputMapper* mapper);
4722 void processSync(MultiTouchInputMapper* mapper);
4723};
4724
4725void MultiTouchInputMapperTest::prepareAxes(int axes) {
4726 if (axes & POSITION) {
4727 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
4728 RAW_X_MIN, RAW_X_MAX, 0, 0);
4729 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
4730 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
4731 }
4732 if (axes & TOUCH) {
4733 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
4734 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4735 if (axes & MINOR) {
4736 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
4737 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4738 }
4739 }
4740 if (axes & TOOL) {
4741 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
4742 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
4743 if (axes & MINOR) {
4744 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
4745 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
4746 }
4747 }
4748 if (axes & ORIENTATION) {
4749 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
4750 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
4751 }
4752 if (axes & PRESSURE) {
4753 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
4754 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
4755 }
4756 if (axes & DISTANCE) {
4757 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
4758 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
4759 }
4760 if (axes & ID) {
4761 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
4762 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
4763 }
4764 if (axes & SLOT) {
4765 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
4766 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
4767 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
4768 }
4769 if (axes & TOOL_TYPE) {
4770 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
4771 0, MT_TOOL_MAX, 0, 0);
4772 }
4773}
4774
4775void MultiTouchInputMapperTest::processPosition(
4776 MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004777 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, x);
4778 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, y);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004779}
4780
4781void MultiTouchInputMapperTest::processTouchMajor(
4782 MultiTouchInputMapper* mapper, int32_t touchMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004783 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004784}
4785
4786void MultiTouchInputMapperTest::processTouchMinor(
4787 MultiTouchInputMapper* mapper, int32_t touchMinor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004788 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004789}
4790
4791void MultiTouchInputMapperTest::processToolMajor(
4792 MultiTouchInputMapper* mapper, int32_t toolMajor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004793 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004794}
4795
4796void MultiTouchInputMapperTest::processToolMinor(
4797 MultiTouchInputMapper* mapper, int32_t toolMinor) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004798 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004799}
4800
4801void MultiTouchInputMapperTest::processOrientation(
4802 MultiTouchInputMapper* mapper, int32_t orientation) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004803 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_ORIENTATION, orientation);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004804}
4805
4806void MultiTouchInputMapperTest::processPressure(
4807 MultiTouchInputMapper* mapper, int32_t pressure) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004808 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_PRESSURE, pressure);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004809}
4810
4811void MultiTouchInputMapperTest::processDistance(
4812 MultiTouchInputMapper* mapper, int32_t distance) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004813 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_DISTANCE, distance);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004814}
4815
4816void MultiTouchInputMapperTest::processId(
4817 MultiTouchInputMapper* mapper, int32_t id) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004818 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, id);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004819}
4820
4821void MultiTouchInputMapperTest::processSlot(
4822 MultiTouchInputMapper* mapper, int32_t slot) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004823 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, slot);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004824}
4825
4826void MultiTouchInputMapperTest::processToolType(
4827 MultiTouchInputMapper* mapper, int32_t toolType) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004828 process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004829}
4830
4831void MultiTouchInputMapperTest::processKey(
4832 MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004833 process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004834}
4835
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004836void MultiTouchInputMapperTest::processTimestamp(MultiTouchInputMapper* mapper, uint32_t value) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004837 process(mapper, ARBITRARY_TIME, EV_MSC, MSC_TIMESTAMP, value);
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08004838}
4839
Michael Wrightd02c5b62014-02-10 15:10:22 -08004840void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004841 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_MT_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004842}
4843
4844void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
Siarhei Vishniakouad71ad02018-11-16 11:24:35 -08004845 process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08004846}
4847
4848
4849TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
4850 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4851 addConfigurationProperty("touch.deviceType", "touchScreen");
4852 prepareDisplay(DISPLAY_ORIENTATION_0);
4853 prepareAxes(POSITION);
4854 prepareVirtualKeys();
4855 addMapperAndConfigure(mapper);
4856
4857 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4858
4859 NotifyMotionArgs motionArgs;
4860
4861 // Two fingers down at once.
4862 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4863 processPosition(mapper, x1, y1);
4864 processMTSync(mapper);
4865 processPosition(mapper, x2, y2);
4866 processMTSync(mapper);
4867 processSync(mapper);
4868
4869 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4870 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4871 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4872 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4873 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4874 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4875 ASSERT_EQ(0, motionArgs.flags);
4876 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4877 ASSERT_EQ(0, motionArgs.buttonState);
4878 ASSERT_EQ(0, motionArgs.edgeFlags);
4879 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4880 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4881 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4882 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4883 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4884 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4885 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4886 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4887
4888 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4889 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4890 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4891 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4892 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4893 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4894 motionArgs.action);
4895 ASSERT_EQ(0, motionArgs.flags);
4896 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4897 ASSERT_EQ(0, motionArgs.buttonState);
4898 ASSERT_EQ(0, motionArgs.edgeFlags);
4899 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4900 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4901 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4902 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4903 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4904 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4905 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4906 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4907 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4908 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4909 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4910 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4911
4912 // Move.
4913 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4914 processPosition(mapper, x1, y1);
4915 processMTSync(mapper);
4916 processPosition(mapper, x2, y2);
4917 processMTSync(mapper);
4918 processSync(mapper);
4919
4920 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4921 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4922 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4923 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4924 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4925 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4926 ASSERT_EQ(0, motionArgs.flags);
4927 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4928 ASSERT_EQ(0, motionArgs.buttonState);
4929 ASSERT_EQ(0, motionArgs.edgeFlags);
4930 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4931 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4932 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4933 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4934 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4935 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4936 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4937 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4938 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4939 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4940 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4941 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4942
4943 // First finger up.
4944 x2 += 15; y2 -= 20;
4945 processPosition(mapper, x2, y2);
4946 processMTSync(mapper);
4947 processSync(mapper);
4948
4949 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4950 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4951 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4952 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4953 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4954 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4955 motionArgs.action);
4956 ASSERT_EQ(0, motionArgs.flags);
4957 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4958 ASSERT_EQ(0, motionArgs.buttonState);
4959 ASSERT_EQ(0, motionArgs.edgeFlags);
4960 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4961 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4962 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4963 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4964 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4965 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4966 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4967 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4968 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4969 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4970 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4971 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4972
4973 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4974 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4975 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4976 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4977 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4978 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4979 ASSERT_EQ(0, motionArgs.flags);
4980 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4981 ASSERT_EQ(0, motionArgs.buttonState);
4982 ASSERT_EQ(0, motionArgs.edgeFlags);
4983 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4984 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4985 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4986 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4987 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4988 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4989 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4990 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4991
4992 // Move.
4993 x2 += 20; y2 -= 25;
4994 processPosition(mapper, x2, y2);
4995 processMTSync(mapper);
4996 processSync(mapper);
4997
4998 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4999 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5000 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5001 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5002 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5003 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5004 ASSERT_EQ(0, motionArgs.flags);
5005 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5006 ASSERT_EQ(0, motionArgs.buttonState);
5007 ASSERT_EQ(0, motionArgs.edgeFlags);
5008 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5009 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5010 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5011 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5012 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5013 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5014 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5015 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5016
5017 // New finger down.
5018 int32_t x3 = 700, y3 = 300;
5019 processPosition(mapper, x2, y2);
5020 processMTSync(mapper);
5021 processPosition(mapper, x3, y3);
5022 processMTSync(mapper);
5023 processSync(mapper);
5024
5025 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5026 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5027 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5028 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5029 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5030 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5031 motionArgs.action);
5032 ASSERT_EQ(0, motionArgs.flags);
5033 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5034 ASSERT_EQ(0, motionArgs.buttonState);
5035 ASSERT_EQ(0, motionArgs.edgeFlags);
5036 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5037 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5038 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5039 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5040 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5041 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5042 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5043 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5044 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5045 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5046 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5047 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5048
5049 // Second finger up.
5050 x3 += 30; y3 -= 20;
5051 processPosition(mapper, x3, y3);
5052 processMTSync(mapper);
5053 processSync(mapper);
5054
5055 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5056 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5057 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5058 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5059 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5060 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5061 motionArgs.action);
5062 ASSERT_EQ(0, motionArgs.flags);
5063 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5064 ASSERT_EQ(0, motionArgs.buttonState);
5065 ASSERT_EQ(0, motionArgs.edgeFlags);
5066 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5067 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5068 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5069 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5070 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5071 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5072 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5073 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5074 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5075 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5076 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5077 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5078
5079 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5080 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5081 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5082 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5083 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5084 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5085 ASSERT_EQ(0, motionArgs.flags);
5086 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5087 ASSERT_EQ(0, motionArgs.buttonState);
5088 ASSERT_EQ(0, motionArgs.edgeFlags);
5089 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5090 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5091 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5092 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5093 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5094 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5095 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5096 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5097
5098 // Last finger up.
5099 processMTSync(mapper);
5100 processSync(mapper);
5101
5102 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5103 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5104 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5105 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5106 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5107 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5108 ASSERT_EQ(0, motionArgs.flags);
5109 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5110 ASSERT_EQ(0, motionArgs.buttonState);
5111 ASSERT_EQ(0, motionArgs.edgeFlags);
5112 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5113 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5114 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5115 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5116 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5117 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5118 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5119 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5120
5121 // Should not have sent any more keys or motions.
5122 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5123 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5124}
5125
5126TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
5127 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5128 addConfigurationProperty("touch.deviceType", "touchScreen");
5129 prepareDisplay(DISPLAY_ORIENTATION_0);
5130 prepareAxes(POSITION | ID);
5131 prepareVirtualKeys();
5132 addMapperAndConfigure(mapper);
5133
5134 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5135
5136 NotifyMotionArgs motionArgs;
5137
5138 // Two fingers down at once.
5139 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5140 processPosition(mapper, x1, y1);
5141 processId(mapper, 1);
5142 processMTSync(mapper);
5143 processPosition(mapper, x2, y2);
5144 processId(mapper, 2);
5145 processMTSync(mapper);
5146 processSync(mapper);
5147
5148 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5149 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5150 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5151 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5152 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5153 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5154 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5155
5156 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5157 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5158 motionArgs.action);
5159 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5160 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5161 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5162 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5163 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5164 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5165 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5166 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5167 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5168
5169 // Move.
5170 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5171 processPosition(mapper, x1, y1);
5172 processId(mapper, 1);
5173 processMTSync(mapper);
5174 processPosition(mapper, x2, y2);
5175 processId(mapper, 2);
5176 processMTSync(mapper);
5177 processSync(mapper);
5178
5179 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5180 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5181 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5182 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5183 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5184 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5185 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5186 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5187 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5188 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5189 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5190
5191 // First finger up.
5192 x2 += 15; y2 -= 20;
5193 processPosition(mapper, x2, y2);
5194 processId(mapper, 2);
5195 processMTSync(mapper);
5196 processSync(mapper);
5197
5198 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5199 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5200 motionArgs.action);
5201 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5202 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5203 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5204 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5205 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5206 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5207 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5208 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5209 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5210
5211 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5212 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5213 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5214 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5215 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5216 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5217 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5218
5219 // Move.
5220 x2 += 20; y2 -= 25;
5221 processPosition(mapper, x2, y2);
5222 processId(mapper, 2);
5223 processMTSync(mapper);
5224 processSync(mapper);
5225
5226 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5227 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5228 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5229 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5230 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5231 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5232 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5233
5234 // New finger down.
5235 int32_t x3 = 700, y3 = 300;
5236 processPosition(mapper, x2, y2);
5237 processId(mapper, 2);
5238 processMTSync(mapper);
5239 processPosition(mapper, x3, y3);
5240 processId(mapper, 3);
5241 processMTSync(mapper);
5242 processSync(mapper);
5243
5244 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5245 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5246 motionArgs.action);
5247 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5248 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5249 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5250 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5251 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5252 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5253 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5254 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5255 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5256
5257 // Second finger up.
5258 x3 += 30; y3 -= 20;
5259 processPosition(mapper, x3, y3);
5260 processId(mapper, 3);
5261 processMTSync(mapper);
5262 processSync(mapper);
5263
5264 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5265 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5266 motionArgs.action);
5267 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5268 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5269 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5270 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5271 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5272 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5273 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5274 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5275 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5276
5277 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5278 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5279 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5280 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5281 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5282 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5283 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5284
5285 // Last finger up.
5286 processMTSync(mapper);
5287 processSync(mapper);
5288
5289 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5290 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5291 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5292 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5293 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5294 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5295 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5296
5297 // Should not have sent any more keys or motions.
5298 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5299 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5300}
5301
5302TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
5303 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5304 addConfigurationProperty("touch.deviceType", "touchScreen");
5305 prepareDisplay(DISPLAY_ORIENTATION_0);
5306 prepareAxes(POSITION | ID | SLOT);
5307 prepareVirtualKeys();
5308 addMapperAndConfigure(mapper);
5309
5310 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5311
5312 NotifyMotionArgs motionArgs;
5313
5314 // Two fingers down at once.
5315 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5316 processPosition(mapper, x1, y1);
5317 processId(mapper, 1);
5318 processSlot(mapper, 1);
5319 processPosition(mapper, x2, y2);
5320 processId(mapper, 2);
5321 processSync(mapper);
5322
5323 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5324 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5325 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5326 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5327 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5328 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5329 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5330
5331 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5332 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5333 motionArgs.action);
5334 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5335 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5336 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5337 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5338 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5339 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5340 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5341 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5342 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5343
5344 // Move.
5345 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5346 processSlot(mapper, 0);
5347 processPosition(mapper, x1, y1);
5348 processSlot(mapper, 1);
5349 processPosition(mapper, x2, y2);
5350 processSync(mapper);
5351
5352 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5353 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5354 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5355 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5356 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5357 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5358 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5359 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5360 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5361 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5362 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5363
5364 // First finger up.
5365 x2 += 15; y2 -= 20;
5366 processSlot(mapper, 0);
5367 processId(mapper, -1);
5368 processSlot(mapper, 1);
5369 processPosition(mapper, x2, y2);
5370 processSync(mapper);
5371
5372 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5373 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5374 motionArgs.action);
5375 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5376 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5377 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5378 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5379 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5380 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5381 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5382 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5383 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5384
5385 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5386 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5387 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5388 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5389 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5390 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5391 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5392
5393 // Move.
5394 x2 += 20; y2 -= 25;
5395 processPosition(mapper, x2, y2);
5396 processSync(mapper);
5397
5398 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5399 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5400 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5401 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5402 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5403 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5404 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5405
5406 // New finger down.
5407 int32_t x3 = 700, y3 = 300;
5408 processPosition(mapper, x2, y2);
5409 processSlot(mapper, 0);
5410 processId(mapper, 3);
5411 processPosition(mapper, x3, y3);
5412 processSync(mapper);
5413
5414 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5415 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5416 motionArgs.action);
5417 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5418 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5419 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5420 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5421 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5422 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5423 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5424 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5425 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5426
5427 // Second finger up.
5428 x3 += 30; y3 -= 20;
5429 processSlot(mapper, 1);
5430 processId(mapper, -1);
5431 processSlot(mapper, 0);
5432 processPosition(mapper, x3, y3);
5433 processSync(mapper);
5434
5435 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5436 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5437 motionArgs.action);
5438 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5439 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5440 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5441 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5442 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5443 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5444 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5445 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5446 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5447
5448 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5449 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5450 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5451 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5452 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5453 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5454 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5455
5456 // Last finger up.
5457 processId(mapper, -1);
5458 processSync(mapper);
5459
5460 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5461 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5462 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5463 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5464 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5465 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5466 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5467
5468 // Should not have sent any more keys or motions.
5469 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5470 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5471}
5472
5473TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
5474 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5475 addConfigurationProperty("touch.deviceType", "touchScreen");
5476 prepareDisplay(DISPLAY_ORIENTATION_0);
5477 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
5478 addMapperAndConfigure(mapper);
5479
5480 // These calculations are based on the input device calibration documentation.
5481 int32_t rawX = 100;
5482 int32_t rawY = 200;
5483 int32_t rawTouchMajor = 7;
5484 int32_t rawTouchMinor = 6;
5485 int32_t rawToolMajor = 9;
5486 int32_t rawToolMinor = 8;
5487 int32_t rawPressure = 11;
5488 int32_t rawDistance = 0;
5489 int32_t rawOrientation = 3;
5490 int32_t id = 5;
5491
5492 float x = toDisplayX(rawX);
5493 float y = toDisplayY(rawY);
5494 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
5495 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5496 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5497 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5498 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5499 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5500 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
5501 float distance = float(rawDistance);
5502
5503 processPosition(mapper, rawX, rawY);
5504 processTouchMajor(mapper, rawTouchMajor);
5505 processTouchMinor(mapper, rawTouchMinor);
5506 processToolMajor(mapper, rawToolMajor);
5507 processToolMinor(mapper, rawToolMinor);
5508 processPressure(mapper, rawPressure);
5509 processOrientation(mapper, rawOrientation);
5510 processDistance(mapper, rawDistance);
5511 processId(mapper, id);
5512 processMTSync(mapper);
5513 processSync(mapper);
5514
5515 NotifyMotionArgs args;
5516 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5517 ASSERT_EQ(0, args.pointerProperties[0].id);
5518 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5519 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
5520 orientation, distance));
5521}
5522
5523TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
5524 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5525 addConfigurationProperty("touch.deviceType", "touchScreen");
5526 prepareDisplay(DISPLAY_ORIENTATION_0);
5527 prepareAxes(POSITION | TOUCH | TOOL | MINOR);
5528 addConfigurationProperty("touch.size.calibration", "geometric");
5529 addMapperAndConfigure(mapper);
5530
5531 // These calculations are based on the input device calibration documentation.
5532 int32_t rawX = 100;
5533 int32_t rawY = 200;
5534 int32_t rawTouchMajor = 140;
5535 int32_t rawTouchMinor = 120;
5536 int32_t rawToolMajor = 180;
5537 int32_t rawToolMinor = 160;
5538
5539 float x = toDisplayX(rawX);
5540 float y = toDisplayY(rawY);
5541 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5542 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5543 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5544 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5545 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5546
5547 processPosition(mapper, rawX, rawY);
5548 processTouchMajor(mapper, rawTouchMajor);
5549 processTouchMinor(mapper, rawTouchMinor);
5550 processToolMajor(mapper, rawToolMajor);
5551 processToolMinor(mapper, rawToolMinor);
5552 processMTSync(mapper);
5553 processSync(mapper);
5554
5555 NotifyMotionArgs args;
5556 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5557 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5558 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
5559}
5560
5561TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
5562 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5563 addConfigurationProperty("touch.deviceType", "touchScreen");
5564 prepareDisplay(DISPLAY_ORIENTATION_0);
5565 prepareAxes(POSITION | TOUCH | TOOL);
5566 addConfigurationProperty("touch.size.calibration", "diameter");
5567 addConfigurationProperty("touch.size.scale", "10");
5568 addConfigurationProperty("touch.size.bias", "160");
5569 addConfigurationProperty("touch.size.isSummed", "1");
5570 addMapperAndConfigure(mapper);
5571
5572 // These calculations are based on the input device calibration documentation.
5573 // Note: We only provide a single common touch/tool value because the device is assumed
5574 // not to emit separate values for each pointer (isSummed = 1).
5575 int32_t rawX = 100;
5576 int32_t rawY = 200;
5577 int32_t rawX2 = 150;
5578 int32_t rawY2 = 250;
5579 int32_t rawTouchMajor = 5;
5580 int32_t rawToolMajor = 8;
5581
5582 float x = toDisplayX(rawX);
5583 float y = toDisplayY(rawY);
5584 float x2 = toDisplayX(rawX2);
5585 float y2 = toDisplayY(rawY2);
5586 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
5587 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
5588 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
5589
5590 processPosition(mapper, rawX, rawY);
5591 processTouchMajor(mapper, rawTouchMajor);
5592 processToolMajor(mapper, rawToolMajor);
5593 processMTSync(mapper);
5594 processPosition(mapper, rawX2, rawY2);
5595 processTouchMajor(mapper, rawTouchMajor);
5596 processToolMajor(mapper, rawToolMajor);
5597 processMTSync(mapper);
5598 processSync(mapper);
5599
5600 NotifyMotionArgs args;
5601 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5602 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
5603
5604 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5605 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5606 args.action);
5607 ASSERT_EQ(size_t(2), args.pointerCount);
5608 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5609 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5610 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
5611 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
5612}
5613
5614TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
5615 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5616 addConfigurationProperty("touch.deviceType", "touchScreen");
5617 prepareDisplay(DISPLAY_ORIENTATION_0);
5618 prepareAxes(POSITION | TOUCH | TOOL);
5619 addConfigurationProperty("touch.size.calibration", "area");
5620 addConfigurationProperty("touch.size.scale", "43");
5621 addConfigurationProperty("touch.size.bias", "3");
5622 addMapperAndConfigure(mapper);
5623
5624 // These calculations are based on the input device calibration documentation.
5625 int32_t rawX = 100;
5626 int32_t rawY = 200;
5627 int32_t rawTouchMajor = 5;
5628 int32_t rawToolMajor = 8;
5629
5630 float x = toDisplayX(rawX);
5631 float y = toDisplayY(rawY);
5632 float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
5633 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
5634 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
5635
5636 processPosition(mapper, rawX, rawY);
5637 processTouchMajor(mapper, rawTouchMajor);
5638 processToolMajor(mapper, rawToolMajor);
5639 processMTSync(mapper);
5640 processSync(mapper);
5641
5642 NotifyMotionArgs args;
5643 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5644 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5645 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5646}
5647
5648TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
5649 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5650 addConfigurationProperty("touch.deviceType", "touchScreen");
5651 prepareDisplay(DISPLAY_ORIENTATION_0);
5652 prepareAxes(POSITION | PRESSURE);
5653 addConfigurationProperty("touch.pressure.calibration", "amplitude");
5654 addConfigurationProperty("touch.pressure.scale", "0.01");
5655 addMapperAndConfigure(mapper);
5656
Michael Wrightaa449c92017-12-13 21:21:43 +00005657 InputDeviceInfo info;
5658 mapper->populateDeviceInfo(&info);
5659 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
5660 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TOUCHSCREEN,
5661 0.0f, RAW_PRESSURE_MAX * 0.01, 0.0f, 0.0f));
5662
Michael Wrightd02c5b62014-02-10 15:10:22 -08005663 // These calculations are based on the input device calibration documentation.
5664 int32_t rawX = 100;
5665 int32_t rawY = 200;
5666 int32_t rawPressure = 60;
5667
5668 float x = toDisplayX(rawX);
5669 float y = toDisplayY(rawY);
5670 float pressure = float(rawPressure) * 0.01f;
5671
5672 processPosition(mapper, rawX, rawY);
5673 processPressure(mapper, rawPressure);
5674 processMTSync(mapper);
5675 processSync(mapper);
5676
5677 NotifyMotionArgs args;
5678 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5679 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5680 x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
5681}
5682
5683TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
5684 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5685 addConfigurationProperty("touch.deviceType", "touchScreen");
5686 prepareDisplay(DISPLAY_ORIENTATION_0);
5687 prepareAxes(POSITION | ID | SLOT);
5688 addMapperAndConfigure(mapper);
5689
5690 NotifyMotionArgs motionArgs;
5691 NotifyKeyArgs keyArgs;
5692
5693 processId(mapper, 1);
5694 processPosition(mapper, 100, 200);
5695 processSync(mapper);
5696 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5697 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5698 ASSERT_EQ(0, motionArgs.buttonState);
5699
5700 // press BTN_LEFT, release BTN_LEFT
5701 processKey(mapper, BTN_LEFT, 1);
5702 processSync(mapper);
5703 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5704 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5705 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5706
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005707 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5708 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5709 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5710
Michael Wrightd02c5b62014-02-10 15:10:22 -08005711 processKey(mapper, BTN_LEFT, 0);
5712 processSync(mapper);
5713 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005714 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005715 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005716
5717 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005718 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005719 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005720
5721 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
5722 processKey(mapper, BTN_RIGHT, 1);
5723 processKey(mapper, BTN_MIDDLE, 1);
5724 processSync(mapper);
5725 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5726 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5727 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5728 motionArgs.buttonState);
5729
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005730 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5731 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5732 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
5733
5734 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5735 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5736 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5737 motionArgs.buttonState);
5738
Michael Wrightd02c5b62014-02-10 15:10:22 -08005739 processKey(mapper, BTN_RIGHT, 0);
5740 processSync(mapper);
5741 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005742 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005743 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005744
5745 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005746 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005747 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005748
5749 processKey(mapper, BTN_MIDDLE, 0);
5750 processSync(mapper);
5751 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005752 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005753 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005754
5755 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005756 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005757 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005758
5759 // press BTN_BACK, release BTN_BACK
5760 processKey(mapper, BTN_BACK, 1);
5761 processSync(mapper);
5762 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5763 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5764 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005765
Michael Wrightd02c5b62014-02-10 15:10:22 -08005766 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005767 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005768 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5769
5770 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5771 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5772 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005773
5774 processKey(mapper, BTN_BACK, 0);
5775 processSync(mapper);
5776 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005777 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005778 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005779
5780 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005781 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005782 ASSERT_EQ(0, motionArgs.buttonState);
5783
Michael Wrightd02c5b62014-02-10 15:10:22 -08005784 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5785 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5786 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5787
5788 // press BTN_SIDE, release BTN_SIDE
5789 processKey(mapper, BTN_SIDE, 1);
5790 processSync(mapper);
5791 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5792 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5793 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005794
Michael Wrightd02c5b62014-02-10 15:10:22 -08005795 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005796 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005797 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5798
5799 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5800 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5801 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005802
5803 processKey(mapper, BTN_SIDE, 0);
5804 processSync(mapper);
5805 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005806 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005807 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005808
5809 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005810 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005811 ASSERT_EQ(0, motionArgs.buttonState);
5812
Michael Wrightd02c5b62014-02-10 15:10:22 -08005813 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5814 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5815 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5816
5817 // press BTN_FORWARD, release BTN_FORWARD
5818 processKey(mapper, BTN_FORWARD, 1);
5819 processSync(mapper);
5820 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5821 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5822 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005823
Michael Wrightd02c5b62014-02-10 15:10:22 -08005824 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005825 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005826 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5827
5828 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5829 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5830 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005831
5832 processKey(mapper, BTN_FORWARD, 0);
5833 processSync(mapper);
5834 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005835 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005836 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005837
5838 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005839 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005840 ASSERT_EQ(0, motionArgs.buttonState);
5841
Michael Wrightd02c5b62014-02-10 15:10:22 -08005842 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5843 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5844 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5845
5846 // press BTN_EXTRA, release BTN_EXTRA
5847 processKey(mapper, BTN_EXTRA, 1);
5848 processSync(mapper);
5849 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5850 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5851 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005852
Michael Wrightd02c5b62014-02-10 15:10:22 -08005853 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005854 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005855 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5856
5857 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5858 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5859 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005860
5861 processKey(mapper, BTN_EXTRA, 0);
5862 processSync(mapper);
5863 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005864 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005865 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005866
5867 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005868 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005869 ASSERT_EQ(0, motionArgs.buttonState);
5870
Michael Wrightd02c5b62014-02-10 15:10:22 -08005871 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5872 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5873 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5874
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005875 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5876
Michael Wrightd02c5b62014-02-10 15:10:22 -08005877 // press BTN_STYLUS, release BTN_STYLUS
5878 processKey(mapper, BTN_STYLUS, 1);
5879 processSync(mapper);
5880 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5881 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005882 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
5883
5884 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5885 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5886 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005887
5888 processKey(mapper, BTN_STYLUS, 0);
5889 processSync(mapper);
5890 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005891 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005892 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005893
5894 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005895 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005896 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005897
5898 // press BTN_STYLUS2, release BTN_STYLUS2
5899 processKey(mapper, BTN_STYLUS2, 1);
5900 processSync(mapper);
5901 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5902 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005903 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
5904
5905 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5906 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5907 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005908
5909 processKey(mapper, BTN_STYLUS2, 0);
5910 processSync(mapper);
5911 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005912 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005913 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005914
5915 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005916 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005917 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005918
5919 // release touch
5920 processId(mapper, -1);
5921 processSync(mapper);
5922 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5923 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5924 ASSERT_EQ(0, motionArgs.buttonState);
5925}
5926
5927TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
5928 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5929 addConfigurationProperty("touch.deviceType", "touchScreen");
5930 prepareDisplay(DISPLAY_ORIENTATION_0);
5931 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
5932 addMapperAndConfigure(mapper);
5933
5934 NotifyMotionArgs motionArgs;
5935
5936 // default tool type is finger
5937 processId(mapper, 1);
5938 processPosition(mapper, 100, 200);
5939 processSync(mapper);
5940 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5941 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5942 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5943
5944 // eraser
5945 processKey(mapper, BTN_TOOL_RUBBER, 1);
5946 processSync(mapper);
5947 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5948 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5949 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5950
5951 // stylus
5952 processKey(mapper, BTN_TOOL_RUBBER, 0);
5953 processKey(mapper, BTN_TOOL_PEN, 1);
5954 processSync(mapper);
5955 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5956 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5957 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5958
5959 // brush
5960 processKey(mapper, BTN_TOOL_PEN, 0);
5961 processKey(mapper, BTN_TOOL_BRUSH, 1);
5962 processSync(mapper);
5963 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5964 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5965 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5966
5967 // pencil
5968 processKey(mapper, BTN_TOOL_BRUSH, 0);
5969 processKey(mapper, BTN_TOOL_PENCIL, 1);
5970 processSync(mapper);
5971 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5972 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5973 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5974
5975 // airbrush
5976 processKey(mapper, BTN_TOOL_PENCIL, 0);
5977 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
5978 processSync(mapper);
5979 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5980 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5981 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5982
5983 // mouse
5984 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
5985 processKey(mapper, BTN_TOOL_MOUSE, 1);
5986 processSync(mapper);
5987 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5988 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5989 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5990
5991 // lens
5992 processKey(mapper, BTN_TOOL_MOUSE, 0);
5993 processKey(mapper, BTN_TOOL_LENS, 1);
5994 processSync(mapper);
5995 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5996 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5997 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5998
5999 // double-tap
6000 processKey(mapper, BTN_TOOL_LENS, 0);
6001 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
6002 processSync(mapper);
6003 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6004 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6005 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6006
6007 // triple-tap
6008 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
6009 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
6010 processSync(mapper);
6011 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6012 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6013 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6014
6015 // quad-tap
6016 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
6017 processKey(mapper, BTN_TOOL_QUADTAP, 1);
6018 processSync(mapper);
6019 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6020 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6021 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6022
6023 // finger
6024 processKey(mapper, BTN_TOOL_QUADTAP, 0);
6025 processKey(mapper, BTN_TOOL_FINGER, 1);
6026 processSync(mapper);
6027 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6028 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6029 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6030
6031 // stylus trumps finger
6032 processKey(mapper, BTN_TOOL_PEN, 1);
6033 processSync(mapper);
6034 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6035 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6036 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
6037
6038 // eraser trumps stylus
6039 processKey(mapper, BTN_TOOL_RUBBER, 1);
6040 processSync(mapper);
6041 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6042 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6043 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
6044
6045 // mouse trumps eraser
6046 processKey(mapper, BTN_TOOL_MOUSE, 1);
6047 processSync(mapper);
6048 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6049 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6050 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
6051
6052 // MT tool type trumps BTN tool types: MT_TOOL_FINGER
6053 processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
6054 processSync(mapper);
6055 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6056 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6057 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6058
6059 // MT tool type trumps BTN tool types: MT_TOOL_PEN
6060 processToolType(mapper, MT_TOOL_PEN);
6061 processSync(mapper);
6062 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6063 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6064 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
6065
6066 // back to default tool type
6067 processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
6068 processKey(mapper, BTN_TOOL_MOUSE, 0);
6069 processKey(mapper, BTN_TOOL_RUBBER, 0);
6070 processKey(mapper, BTN_TOOL_PEN, 0);
6071 processKey(mapper, BTN_TOOL_FINGER, 0);
6072 processSync(mapper);
6073 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6074 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6075 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6076}
6077
6078TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
6079 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6080 addConfigurationProperty("touch.deviceType", "touchScreen");
6081 prepareDisplay(DISPLAY_ORIENTATION_0);
6082 prepareAxes(POSITION | ID | SLOT);
6083 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
6084 addMapperAndConfigure(mapper);
6085
6086 NotifyMotionArgs motionArgs;
6087
6088 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
6089 processId(mapper, 1);
6090 processPosition(mapper, 100, 200);
6091 processSync(mapper);
6092 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6093 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6094 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6095 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6096
6097 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6098 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6099 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6100 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6101
6102 // move a little
6103 processPosition(mapper, 150, 250);
6104 processSync(mapper);
6105 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6106 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6107 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6108 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6109
6110 // down when BTN_TOUCH is pressed, pressure defaults to 1
6111 processKey(mapper, BTN_TOUCH, 1);
6112 processSync(mapper);
6113 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6114 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6115 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6116 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6117
6118 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6119 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6120 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6121 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6122
6123 // up when BTN_TOUCH is released, hover restored
6124 processKey(mapper, BTN_TOUCH, 0);
6125 processSync(mapper);
6126 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6127 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6128 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6129 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6130
6131 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6132 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6133 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6134 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6135
6136 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6137 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6138 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6139 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6140
6141 // exit hover when pointer goes away
6142 processId(mapper, -1);
6143 processSync(mapper);
6144 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6145 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6146 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6147 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6148}
6149
6150TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
6151 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6152 addConfigurationProperty("touch.deviceType", "touchScreen");
6153 prepareDisplay(DISPLAY_ORIENTATION_0);
6154 prepareAxes(POSITION | ID | SLOT | PRESSURE);
6155 addMapperAndConfigure(mapper);
6156
6157 NotifyMotionArgs motionArgs;
6158
6159 // initially hovering because pressure is 0
6160 processId(mapper, 1);
6161 processPosition(mapper, 100, 200);
6162 processPressure(mapper, 0);
6163 processSync(mapper);
6164 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6165 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6166 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6167 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6168
6169 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6170 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6171 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6172 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6173
6174 // move a little
6175 processPosition(mapper, 150, 250);
6176 processSync(mapper);
6177 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6178 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6179 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6180 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6181
6182 // down when pressure becomes non-zero
6183 processPressure(mapper, RAW_PRESSURE_MAX);
6184 processSync(mapper);
6185 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6186 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6187 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6188 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6189
6190 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6191 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6192 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6193 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6194
6195 // up when pressure becomes 0, hover restored
6196 processPressure(mapper, 0);
6197 processSync(mapper);
6198 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6199 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6200 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6201 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6202
6203 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6204 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6205 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6206 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6207
6208 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6209 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6210 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6211 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6212
6213 // exit hover when pointer goes away
6214 processId(mapper, -1);
6215 processSync(mapper);
6216 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6217 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6218 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6219 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6220}
6221
Siarhei Vishniakou16f90692017-12-27 14:29:55 -08006222TEST_F(MultiTouchInputMapperTest, Process_HandlesTimestamp) {
6223 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6224
6225 addConfigurationProperty("touch.deviceType", "touchScreen");
6226 prepareDisplay(DISPLAY_ORIENTATION_0);
6227 prepareAxes(POSITION);
6228 addMapperAndConfigure(mapper);
6229 NotifyMotionArgs args;
6230
6231 // By default, deviceTimestamp should be zero
6232 processPosition(mapper, 100, 100);
6233 processMTSync(mapper);
6234 processSync(mapper);
6235 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6236 ASSERT_EQ(0U, args.deviceTimestamp);
6237
6238 // Now the timestamp of 1000 is reported by evdev and should appear in MotionArgs
6239 processPosition(mapper, 0, 0);
6240 processTimestamp(mapper, 1000);
6241 processMTSync(mapper);
6242 processSync(mapper);
6243 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6244 ASSERT_EQ(1000U, args.deviceTimestamp);
6245}
6246
Siarhei Vishniakoueaf7acd2018-01-09 12:35:51 -08006247TEST_F(MultiTouchInputMapperTest, WhenMapperIsReset_TimestampIsCleared) {
6248 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6249
6250 addConfigurationProperty("touch.deviceType", "touchScreen");
6251 prepareDisplay(DISPLAY_ORIENTATION_0);
6252 prepareAxes(POSITION);
6253 addMapperAndConfigure(mapper);
6254 NotifyMotionArgs args;
6255
6256 // Send a touch event with a timestamp
6257 processPosition(mapper, 100, 100);
6258 processTimestamp(mapper, 1);
6259 processMTSync(mapper);
6260 processSync(mapper);
6261 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6262 ASSERT_EQ(1U, args.deviceTimestamp);
6263
6264 // Since the data accumulates, and new timestamp has not arrived, deviceTimestamp won't change
6265 processPosition(mapper, 100, 200);
6266 processMTSync(mapper);
6267 processSync(mapper);
6268 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6269 ASSERT_EQ(1U, args.deviceTimestamp);
6270
6271 mapper->reset(/* when */ 0);
6272 // After the mapper is reset, deviceTimestamp should become zero again
6273 processPosition(mapper, 100, 300);
6274 processMTSync(mapper);
6275 processSync(mapper);
6276 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6277 ASSERT_EQ(0U, args.deviceTimestamp);
6278}
6279
Siarhei Vishniakou8158e7e2018-10-15 14:28:20 -07006280/**
6281 * Set the input device port <--> display port associations, and check that the
6282 * events are routed to the display that matches the display port.
6283 * This can be checked by looking at the displayId of the resulting NotifyMotionArgs.
6284 */
6285TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayPort) {
6286 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6287 const std::string usb2 = "USB2";
6288 const uint8_t hdmi1 = 0;
6289 const uint8_t hdmi2 = 1;
6290 const std::string secondaryUniqueId = "uniqueId2";
6291 constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
6292
6293 addConfigurationProperty("touch.deviceType", "touchScreen");
6294 prepareAxes(POSITION);
6295 addMapperAndConfigure(mapper);
6296
6297 mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
6298 mFakePolicy->addInputPortAssociation(usb2, hdmi2);
6299
6300 // We are intentionally not adding the viewport for display 1 yet. Since the port association
6301 // for this input device is specified, and the matching viewport is not present,
6302 // the input device should be disabled (at the mapper level).
6303
6304 // Add viewport for display 2 on hdmi2
6305 prepareSecondaryDisplay(type, hdmi2);
6306 // Send a touch event
6307 processPosition(mapper, 100, 100);
6308 processSync(mapper);
6309 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
6310
6311 // Add viewport for display 1 on hdmi1
6312 prepareDisplay(DISPLAY_ORIENTATION_0, hdmi1);
6313 // Send a touch event again
6314 processPosition(mapper, 100, 100);
6315 processSync(mapper);
6316
6317 NotifyMotionArgs args;
6318 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6319 ASSERT_EQ(DISPLAY_ID, args.displayId);
6320}
Michael Wrightd02c5b62014-02-10 15:10:22 -08006321
Andrii Kulian620f6d92018-09-14 16:51:59 -07006322TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) {
6323 // Setup PointerController for second display.
6324 sp<FakePointerController> fakePointerController = new FakePointerController();
6325 fakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
6326 fakePointerController->setPosition(100, 200);
6327 fakePointerController->setButtonState(0);
6328 fakePointerController->setDisplayId(SECONDARY_DISPLAY_ID);
6329 mFakePolicy->setPointerController(mDevice->getId(), fakePointerController);
6330
6331 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6332 prepareDisplay(DISPLAY_ORIENTATION_0);
6333 prepareAxes(POSITION);
6334 addMapperAndConfigure(mapper);
6335
6336 // Check source is mouse that would obtain the PointerController.
6337 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
6338
6339 NotifyMotionArgs motionArgs;
6340 processPosition(mapper, 100, 100);
6341 processSync(mapper);
6342
6343 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6344 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6345 ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId);
6346}
6347
Michael Wrightd02c5b62014-02-10 15:10:22 -08006348} // namespace android