blob: 7082fe18b27f8373e7c8751fe451eff8c5cd6702 [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;
31static const int32_t DISPLAY_WIDTH = 480;
32static const int32_t DISPLAY_HEIGHT = 800;
33
34// Error tolerance for floating point assertions.
35static const float EPSILON = 0.001f;
36
37template<typename T>
38static inline T min(T a, T b) {
39 return a < b ? a : b;
40}
41
42static inline float avg(float x, float y) {
43 return (x + y) / 2;
44}
45
46
47// --- FakePointerController ---
48
49class FakePointerController : public PointerControllerInterface {
50 bool mHaveBounds;
51 float mMinX, mMinY, mMaxX, mMaxY;
52 float mX, mY;
53 int32_t mButtonState;
54
55protected:
56 virtual ~FakePointerController() { }
57
58public:
59 FakePointerController() :
60 mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
61 mButtonState(0) {
62 }
63
64 void setBounds(float minX, float minY, float maxX, float maxY) {
65 mHaveBounds = true;
66 mMinX = minX;
67 mMinY = minY;
68 mMaxX = maxX;
69 mMaxY = maxY;
70 }
71
72 virtual void setPosition(float x, float y) {
73 mX = x;
74 mY = y;
75 }
76
77 virtual void setButtonState(int32_t buttonState) {
78 mButtonState = buttonState;
79 }
80
81 virtual int32_t getButtonState() const {
82 return mButtonState;
83 }
84
85 virtual void getPosition(float* outX, float* outY) const {
86 *outX = mX;
87 *outY = mY;
88 }
89
90private:
91 virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
92 *outMinX = mMinX;
93 *outMinY = mMinY;
94 *outMaxX = mMaxX;
95 *outMaxY = mMaxY;
96 return mHaveBounds;
97 }
98
99 virtual void move(float deltaX, float deltaY) {
100 mX += deltaX;
101 if (mX < mMinX) mX = mMinX;
102 if (mX > mMaxX) mX = mMaxX;
103 mY += deltaY;
104 if (mY < mMinY) mY = mMinY;
105 if (mY > mMaxY) mY = mMaxY;
106 }
107
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100108 virtual void fade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800109 }
110
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100111 virtual void unfade(Transition) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800112 }
113
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100114 virtual void setPresentation(Presentation) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800115 }
116
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100117 virtual void setSpots(const PointerCoords*, const uint32_t*, BitSet32) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800118 }
119
120 virtual void clearSpots() {
121 }
122};
123
124
125// --- FakeInputReaderPolicy ---
126
127class FakeInputReaderPolicy : public InputReaderPolicyInterface {
128 InputReaderConfiguration mConfig;
129 KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
130 Vector<InputDeviceInfo> mInputDevices;
Jason Gerecke489fda82012-09-07 17:19:40 -0700131 TouchAffineTransformation transform;
Michael Wrightd02c5b62014-02-10 15:10:22 -0800132
133protected:
134 virtual ~FakeInputReaderPolicy() { }
135
136public:
137 FakeInputReaderPolicy() {
138 }
139
140 void setDisplayInfo(int32_t displayId, int32_t width, int32_t height, int32_t orientation) {
141 // Set the size of both the internal and external display at the same time.
142 bool isRotated = (orientation == DISPLAY_ORIENTATION_90
143 || orientation == DISPLAY_ORIENTATION_270);
144 DisplayViewport v;
145 v.displayId = displayId;
146 v.orientation = orientation;
147 v.logicalLeft = 0;
148 v.logicalTop = 0;
149 v.logicalRight = isRotated ? height : width;
150 v.logicalBottom = isRotated ? width : height;
151 v.physicalLeft = 0;
152 v.physicalTop = 0;
153 v.physicalRight = isRotated ? height : width;
154 v.physicalBottom = isRotated ? width : height;
155 v.deviceWidth = isRotated ? height : width;
156 v.deviceHeight = isRotated ? width : height;
157 mConfig.setDisplayInfo(false /*external*/, v);
158 mConfig.setDisplayInfo(true /*external*/, v);
159 }
160
161 void addExcludedDeviceName(const String8& deviceName) {
162 mConfig.excludedDeviceNames.push(deviceName);
163 }
164
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700165 void addDisabledDevice(int32_t deviceId) {
166 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
167 bool currentlyEnabled = index < 0;
168 if (currentlyEnabled) {
169 mConfig.disabledDevices.add(deviceId);
170 }
171 }
172
173 void removeDisabledDevice(int32_t deviceId) {
174 ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
175 bool currentlyEnabled = index < 0;
176 if (!currentlyEnabled) {
177 mConfig.disabledDevices.remove(deviceId);
178 }
179 }
180
Michael Wrightd02c5b62014-02-10 15:10:22 -0800181 void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
182 mPointerControllers.add(deviceId, controller);
183 }
184
185 const InputReaderConfiguration* getReaderConfiguration() const {
186 return &mConfig;
187 }
188
189 const Vector<InputDeviceInfo>& getInputDevices() const {
190 return mInputDevices;
191 }
192
Jason Gerecke71b16e82014-03-10 09:47:59 -0700193 TouchAffineTransformation getTouchAffineTransformation(const String8& inputDeviceDescriptor,
194 int32_t surfaceRotation) {
Jason Gerecke489fda82012-09-07 17:19:40 -0700195 return transform;
196 }
197
198 void setTouchAffineTransformation(const TouchAffineTransformation t) {
199 transform = t;
Jason Gerecke12d6baa2014-01-27 18:34:20 -0800200 }
201
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800202 void setPointerCapture(bool enabled) {
203 mConfig.pointerCapture = enabled;
204 }
205
Michael Wrightd02c5b62014-02-10 15:10:22 -0800206private:
207 virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
208 *outConfig = mConfig;
209 }
210
211 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
212 return mPointerControllers.valueFor(deviceId);
213 }
214
215 virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
216 mInputDevices = inputDevices;
217 }
218
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100219 virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800220 return NULL;
221 }
222
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100223 virtual String8 getDeviceAlias(const InputDeviceIdentifier&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800224 return String8::empty();
225 }
226};
227
228
229// --- FakeInputListener ---
230
231class FakeInputListener : public InputListenerInterface {
232private:
233 List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
234 List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
235 List<NotifyKeyArgs> mNotifyKeyArgsQueue;
236 List<NotifyMotionArgs> mNotifyMotionArgsQueue;
237 List<NotifySwitchArgs> mNotifySwitchArgsQueue;
238
239protected:
240 virtual ~FakeInputListener() { }
241
242public:
243 FakeInputListener() {
244 }
245
246 void assertNotifyConfigurationChangedWasCalled(
247 NotifyConfigurationChangedArgs* outEventArgs = NULL) {
248 ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
249 << "Expected notifyConfigurationChanged() to have been called.";
250 if (outEventArgs) {
251 *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
252 }
253 mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
254 }
255
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700256 void assertNotifyConfigurationChangedWasNotCalled() {
257 ASSERT_TRUE(mNotifyConfigurationChangedArgsQueue.empty())
258 << "Expected notifyConfigurationChanged() to not have been called.";
259 }
260
Michael Wrightd02c5b62014-02-10 15:10:22 -0800261 void assertNotifyDeviceResetWasCalled(
262 NotifyDeviceResetArgs* outEventArgs = NULL) {
263 ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
264 << "Expected notifyDeviceReset() to have been called.";
265 if (outEventArgs) {
266 *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
267 }
268 mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
269 }
270
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700271 void assertNotifyDeviceResetWasNotCalled() {
272 ASSERT_TRUE(mNotifyDeviceResetArgsQueue.empty())
273 << "Expected notifyDeviceReset() to not have been called.";
274 }
275
Michael Wrightd02c5b62014-02-10 15:10:22 -0800276 void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = NULL) {
277 ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
278 << "Expected notifyKey() to have been called.";
279 if (outEventArgs) {
280 *outEventArgs = *mNotifyKeyArgsQueue.begin();
281 }
282 mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
283 }
284
285 void assertNotifyKeyWasNotCalled() {
286 ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
287 << "Expected notifyKey() to not have been called.";
288 }
289
290 void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = NULL) {
291 ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
292 << "Expected notifyMotion() to have been called.";
293 if (outEventArgs) {
294 *outEventArgs = *mNotifyMotionArgsQueue.begin();
295 }
296 mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
297 }
298
299 void assertNotifyMotionWasNotCalled() {
300 ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
301 << "Expected notifyMotion() to not have been called.";
302 }
303
304 void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = NULL) {
305 ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
306 << "Expected notifySwitch() to have been called.";
307 if (outEventArgs) {
308 *outEventArgs = *mNotifySwitchArgsQueue.begin();
309 }
310 mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
311 }
312
313private:
314 virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
315 mNotifyConfigurationChangedArgsQueue.push_back(*args);
316 }
317
318 virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
319 mNotifyDeviceResetArgsQueue.push_back(*args);
320 }
321
322 virtual void notifyKey(const NotifyKeyArgs* args) {
323 mNotifyKeyArgsQueue.push_back(*args);
324 }
325
326 virtual void notifyMotion(const NotifyMotionArgs* args) {
327 mNotifyMotionArgsQueue.push_back(*args);
328 }
329
330 virtual void notifySwitch(const NotifySwitchArgs* args) {
331 mNotifySwitchArgsQueue.push_back(*args);
332 }
333};
334
335
336// --- FakeEventHub ---
337
338class FakeEventHub : public EventHubInterface {
339 struct KeyInfo {
340 int32_t keyCode;
341 uint32_t flags;
342 };
343
344 struct Device {
345 InputDeviceIdentifier identifier;
346 uint32_t classes;
347 PropertyMap configuration;
348 KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
349 KeyedVector<int, bool> relativeAxes;
350 KeyedVector<int32_t, int32_t> keyCodeStates;
351 KeyedVector<int32_t, int32_t> scanCodeStates;
352 KeyedVector<int32_t, int32_t> switchStates;
353 KeyedVector<int32_t, int32_t> absoluteAxisValue;
354 KeyedVector<int32_t, KeyInfo> keysByScanCode;
355 KeyedVector<int32_t, KeyInfo> keysByUsageCode;
356 KeyedVector<int32_t, bool> leds;
357 Vector<VirtualKeyDefinition> virtualKeys;
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700358 bool enabled;
359
360 status_t enable() {
361 enabled = true;
362 return OK;
363 }
364
365 status_t disable() {
366 enabled = false;
367 return OK;
368 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800369
Chih-Hung Hsieh6ca70ef2016-04-29 16:23:55 -0700370 explicit Device(uint32_t classes) :
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700371 classes(classes), enabled(true) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800372 }
373 };
374
375 KeyedVector<int32_t, Device*> mDevices;
376 Vector<String8> mExcludedDevices;
377 List<RawEvent> mEvents;
378
379protected:
380 virtual ~FakeEventHub() {
381 for (size_t i = 0; i < mDevices.size(); i++) {
382 delete mDevices.valueAt(i);
383 }
384 }
385
386public:
387 FakeEventHub() { }
388
389 void addDevice(int32_t deviceId, const String8& name, uint32_t classes) {
390 Device* device = new Device(classes);
391 device->identifier.name = name;
392 mDevices.add(deviceId, device);
393
394 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
395 }
396
397 void removeDevice(int32_t deviceId) {
398 delete mDevices.valueFor(deviceId);
399 mDevices.removeItem(deviceId);
400
401 enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
402 }
403
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -0700404 bool isDeviceEnabled(int32_t deviceId) {
405 Device* device = getDevice(deviceId);
406 if (device == NULL) {
407 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
408 return false;
409 }
410 return device->enabled;
411 }
412
413 status_t enableDevice(int32_t deviceId) {
414 status_t result;
415 Device* device = getDevice(deviceId);
416 if (device == NULL) {
417 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
418 return BAD_VALUE;
419 }
420 if (device->enabled) {
421 ALOGW("Duplicate call to %s, device %" PRId32 " already enabled", __func__, deviceId);
422 return OK;
423 }
424 result = device->enable();
425 return result;
426 }
427
428 status_t disableDevice(int32_t deviceId) {
429 Device* device = getDevice(deviceId);
430 if (device == NULL) {
431 ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
432 return BAD_VALUE;
433 }
434 if (!device->enabled) {
435 ALOGW("Duplicate call to %s, device %" PRId32 " already disabled", __func__, deviceId);
436 return OK;
437 }
438 return device->disable();
439 }
440
Michael Wrightd02c5b62014-02-10 15:10:22 -0800441 void finishDeviceScan() {
442 enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
443 }
444
445 void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
446 Device* device = getDevice(deviceId);
447 device->configuration.addProperty(key, value);
448 }
449
450 void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
451 Device* device = getDevice(deviceId);
452 device->configuration.addAll(configuration);
453 }
454
455 void addAbsoluteAxis(int32_t deviceId, int axis,
456 int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
457 Device* device = getDevice(deviceId);
458
459 RawAbsoluteAxisInfo info;
460 info.valid = true;
461 info.minValue = minValue;
462 info.maxValue = maxValue;
463 info.flat = flat;
464 info.fuzz = fuzz;
465 info.resolution = resolution;
466 device->absoluteAxes.add(axis, info);
467 }
468
469 void addRelativeAxis(int32_t deviceId, int32_t axis) {
470 Device* device = getDevice(deviceId);
471 device->relativeAxes.add(axis, true);
472 }
473
474 void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
475 Device* device = getDevice(deviceId);
476 device->keyCodeStates.replaceValueFor(keyCode, state);
477 }
478
479 void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
480 Device* device = getDevice(deviceId);
481 device->scanCodeStates.replaceValueFor(scanCode, state);
482 }
483
484 void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
485 Device* device = getDevice(deviceId);
486 device->switchStates.replaceValueFor(switchCode, state);
487 }
488
489 void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
490 Device* device = getDevice(deviceId);
491 device->absoluteAxisValue.replaceValueFor(axis, value);
492 }
493
494 void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
495 int32_t keyCode, uint32_t flags) {
496 Device* device = getDevice(deviceId);
497 KeyInfo info;
498 info.keyCode = keyCode;
499 info.flags = flags;
500 if (scanCode) {
501 device->keysByScanCode.add(scanCode, info);
502 }
503 if (usageCode) {
504 device->keysByUsageCode.add(usageCode, info);
505 }
506 }
507
508 void addLed(int32_t deviceId, int32_t led, bool initialState) {
509 Device* device = getDevice(deviceId);
510 device->leds.add(led, initialState);
511 }
512
513 bool getLedState(int32_t deviceId, int32_t led) {
514 Device* device = getDevice(deviceId);
515 return device->leds.valueFor(led);
516 }
517
518 Vector<String8>& getExcludedDevices() {
519 return mExcludedDevices;
520 }
521
522 void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
523 Device* device = getDevice(deviceId);
524 device->virtualKeys.push(definition);
525 }
526
527 void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
528 int32_t code, int32_t value) {
529 RawEvent event;
530 event.when = when;
531 event.deviceId = deviceId;
532 event.type = type;
533 event.code = code;
534 event.value = value;
535 mEvents.push_back(event);
536
537 if (type == EV_ABS) {
538 setAbsoluteAxisValue(deviceId, code, value);
539 }
540 }
541
542 void assertQueueIsEmpty() {
543 ASSERT_EQ(size_t(0), mEvents.size())
544 << "Expected the event queue to be empty (fully consumed).";
545 }
546
547private:
548 Device* getDevice(int32_t deviceId) const {
549 ssize_t index = mDevices.indexOfKey(deviceId);
550 return index >= 0 ? mDevices.valueAt(index) : NULL;
551 }
552
553 virtual uint32_t getDeviceClasses(int32_t deviceId) const {
554 Device* device = getDevice(deviceId);
555 return device ? device->classes : 0;
556 }
557
558 virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
559 Device* device = getDevice(deviceId);
560 return device ? device->identifier : InputDeviceIdentifier();
561 }
562
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100563 virtual int32_t getDeviceControllerNumber(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800564 return 0;
565 }
566
567 virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
568 Device* device = getDevice(deviceId);
569 if (device) {
570 *outConfiguration = device->configuration;
571 }
572 }
573
574 virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
575 RawAbsoluteAxisInfo* outAxisInfo) const {
576 Device* device = getDevice(deviceId);
577 if (device) {
578 ssize_t index = device->absoluteAxes.indexOfKey(axis);
579 if (index >= 0) {
580 *outAxisInfo = device->absoluteAxes.valueAt(index);
581 return OK;
582 }
583 }
584 outAxisInfo->clear();
585 return -1;
586 }
587
588 virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
589 Device* device = getDevice(deviceId);
590 if (device) {
591 return device->relativeAxes.indexOfKey(axis) >= 0;
592 }
593 return false;
594 }
595
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100596 virtual bool hasInputProperty(int32_t, int) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800597 return false;
598 }
599
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700600 virtual status_t mapKey(int32_t deviceId,
601 int32_t scanCode, int32_t usageCode, int32_t metaState,
602 int32_t* outKeycode, int32_t *outMetaState, uint32_t* outFlags) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800603 Device* device = getDevice(deviceId);
604 if (device) {
605 const KeyInfo* key = getKey(device, scanCode, usageCode);
606 if (key) {
607 if (outKeycode) {
608 *outKeycode = key->keyCode;
609 }
610 if (outFlags) {
611 *outFlags = key->flags;
612 }
Dmitry Torokhov0faaa0b2015-09-24 13:13:55 -0700613 if (outMetaState) {
614 *outMetaState = metaState;
615 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800616 return OK;
617 }
618 }
619 return NAME_NOT_FOUND;
620 }
621
622 const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
623 if (usageCode) {
624 ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
625 if (index >= 0) {
626 return &device->keysByUsageCode.valueAt(index);
627 }
628 }
629 if (scanCode) {
630 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
631 if (index >= 0) {
632 return &device->keysByScanCode.valueAt(index);
633 }
634 }
635 return NULL;
636 }
637
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100638 virtual status_t mapAxis(int32_t, int32_t, AxisInfo*) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800639 return NAME_NOT_FOUND;
640 }
641
642 virtual void setExcludedDevices(const Vector<String8>& devices) {
643 mExcludedDevices = devices;
644 }
645
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100646 virtual size_t getEvents(int, RawEvent* buffer, size_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800647 if (mEvents.empty()) {
648 return 0;
649 }
650
651 *buffer = *mEvents.begin();
652 mEvents.erase(mEvents.begin());
653 return 1;
654 }
655
656 virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
657 Device* device = getDevice(deviceId);
658 if (device) {
659 ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
660 if (index >= 0) {
661 return device->scanCodeStates.valueAt(index);
662 }
663 }
664 return AKEY_STATE_UNKNOWN;
665 }
666
667 virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
668 Device* device = getDevice(deviceId);
669 if (device) {
670 ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
671 if (index >= 0) {
672 return device->keyCodeStates.valueAt(index);
673 }
674 }
675 return AKEY_STATE_UNKNOWN;
676 }
677
678 virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
679 Device* device = getDevice(deviceId);
680 if (device) {
681 ssize_t index = device->switchStates.indexOfKey(sw);
682 if (index >= 0) {
683 return device->switchStates.valueAt(index);
684 }
685 }
686 return AKEY_STATE_UNKNOWN;
687 }
688
689 virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
690 int32_t* outValue) const {
691 Device* device = getDevice(deviceId);
692 if (device) {
693 ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
694 if (index >= 0) {
695 *outValue = device->absoluteAxisValue.valueAt(index);
696 return OK;
697 }
698 }
699 *outValue = 0;
700 return -1;
701 }
702
703 virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
704 uint8_t* outFlags) const {
705 bool result = false;
706 Device* device = getDevice(deviceId);
707 if (device) {
708 for (size_t i = 0; i < numCodes; i++) {
709 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
710 if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
711 outFlags[i] = 1;
712 result = true;
713 }
714 }
715 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
716 if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
717 outFlags[i] = 1;
718 result = true;
719 }
720 }
721 }
722 }
723 return result;
724 }
725
726 virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
727 Device* device = getDevice(deviceId);
728 if (device) {
729 ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
730 return index >= 0;
731 }
732 return false;
733 }
734
735 virtual bool hasLed(int32_t deviceId, int32_t led) const {
736 Device* device = getDevice(deviceId);
737 return device && device->leds.indexOfKey(led) >= 0;
738 }
739
740 virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
741 Device* device = getDevice(deviceId);
742 if (device) {
743 ssize_t index = device->leds.indexOfKey(led);
744 if (index >= 0) {
745 device->leds.replaceValueAt(led, on);
746 } else {
747 ADD_FAILURE()
748 << "Attempted to set the state of an LED that the EventHub declared "
749 "was not present. led=" << led;
750 }
751 }
752 }
753
754 virtual void getVirtualKeyDefinitions(int32_t deviceId,
755 Vector<VirtualKeyDefinition>& outVirtualKeys) const {
756 outVirtualKeys.clear();
757
758 Device* device = getDevice(deviceId);
759 if (device) {
760 outVirtualKeys.appendVector(device->virtualKeys);
761 }
762 }
763
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100764 virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800765 return NULL;
766 }
767
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100768 virtual bool setKeyboardLayoutOverlay(int32_t, const sp<KeyCharacterMap>&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800769 return false;
770 }
771
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100772 virtual void vibrate(int32_t, nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800773 }
774
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100775 virtual void cancelVibrate(int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800776 }
777
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100778 virtual bool isExternal(int32_t) const {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800779 return false;
780 }
781
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100782 virtual void dump(String8&) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800783 }
784
785 virtual void monitor() {
786 }
787
788 virtual void requestReopenDevices() {
789 }
790
791 virtual void wake() {
792 }
793};
794
795
796// --- FakeInputReaderContext ---
797
798class FakeInputReaderContext : public InputReaderContext {
799 sp<EventHubInterface> mEventHub;
800 sp<InputReaderPolicyInterface> mPolicy;
801 sp<InputListenerInterface> mListener;
802 int32_t mGlobalMetaState;
803 bool mUpdateGlobalMetaStateWasCalled;
804 int32_t mGeneration;
805
806public:
807 FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
808 const sp<InputReaderPolicyInterface>& policy,
809 const sp<InputListenerInterface>& listener) :
810 mEventHub(eventHub), mPolicy(policy), mListener(listener),
811 mGlobalMetaState(0) {
812 }
813
814 virtual ~FakeInputReaderContext() { }
815
816 void assertUpdateGlobalMetaStateWasCalled() {
817 ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
818 << "Expected updateGlobalMetaState() to have been called.";
819 mUpdateGlobalMetaStateWasCalled = false;
820 }
821
822 void setGlobalMetaState(int32_t state) {
823 mGlobalMetaState = state;
824 }
825
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -0800826 uint32_t getGeneration() {
827 return mGeneration;
828 }
829
Michael Wrightd02c5b62014-02-10 15:10:22 -0800830private:
831 virtual void updateGlobalMetaState() {
832 mUpdateGlobalMetaStateWasCalled = true;
833 }
834
835 virtual int32_t getGlobalMetaState() {
836 return mGlobalMetaState;
837 }
838
839 virtual EventHubInterface* getEventHub() {
840 return mEventHub.get();
841 }
842
843 virtual InputReaderPolicyInterface* getPolicy() {
844 return mPolicy.get();
845 }
846
847 virtual InputListenerInterface* getListener() {
848 return mListener.get();
849 }
850
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100851 virtual void disableVirtualKeysUntil(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800852 }
853
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100854 virtual bool shouldDropVirtualKey(nsecs_t, InputDevice*, int32_t, int32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800855 return false;
856 }
857
858 virtual void fadePointer() {
859 }
860
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100861 virtual void requestTimeoutAtTime(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800862 }
863
864 virtual int32_t bumpGeneration() {
865 return ++mGeneration;
866 }
Michael Wright842500e2015-03-13 17:32:02 -0700867
868 virtual void getExternalStylusDevices(Vector<InputDeviceInfo>& outDevices) {
869
870 }
871
872 virtual void dispatchExternalStylusState(const StylusState&) {
873
874 }
Michael Wrightd02c5b62014-02-10 15:10:22 -0800875};
876
877
878// --- FakeInputMapper ---
879
880class FakeInputMapper : public InputMapper {
881 uint32_t mSources;
882 int32_t mKeyboardType;
883 int32_t mMetaState;
884 KeyedVector<int32_t, int32_t> mKeyCodeStates;
885 KeyedVector<int32_t, int32_t> mScanCodeStates;
886 KeyedVector<int32_t, int32_t> mSwitchStates;
887 Vector<int32_t> mSupportedKeyCodes;
888 RawEvent mLastEvent;
889
890 bool mConfigureWasCalled;
891 bool mResetWasCalled;
892 bool mProcessWasCalled;
893
894public:
895 FakeInputMapper(InputDevice* device, uint32_t sources) :
896 InputMapper(device),
897 mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
898 mMetaState(0),
899 mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
900 }
901
902 virtual ~FakeInputMapper() { }
903
904 void setKeyboardType(int32_t keyboardType) {
905 mKeyboardType = keyboardType;
906 }
907
908 void setMetaState(int32_t metaState) {
909 mMetaState = metaState;
910 }
911
912 void assertConfigureWasCalled() {
913 ASSERT_TRUE(mConfigureWasCalled)
914 << "Expected configure() to have been called.";
915 mConfigureWasCalled = false;
916 }
917
918 void assertResetWasCalled() {
919 ASSERT_TRUE(mResetWasCalled)
920 << "Expected reset() to have been called.";
921 mResetWasCalled = false;
922 }
923
924 void assertProcessWasCalled(RawEvent* outLastEvent = NULL) {
925 ASSERT_TRUE(mProcessWasCalled)
926 << "Expected process() to have been called.";
927 if (outLastEvent) {
928 *outLastEvent = mLastEvent;
929 }
930 mProcessWasCalled = false;
931 }
932
933 void setKeyCodeState(int32_t keyCode, int32_t state) {
934 mKeyCodeStates.replaceValueFor(keyCode, state);
935 }
936
937 void setScanCodeState(int32_t scanCode, int32_t state) {
938 mScanCodeStates.replaceValueFor(scanCode, state);
939 }
940
941 void setSwitchState(int32_t switchCode, int32_t state) {
942 mSwitchStates.replaceValueFor(switchCode, state);
943 }
944
945 void addSupportedKeyCode(int32_t keyCode) {
946 mSupportedKeyCodes.add(keyCode);
947 }
948
949private:
950 virtual uint32_t getSources() {
951 return mSources;
952 }
953
954 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
955 InputMapper::populateDeviceInfo(deviceInfo);
956
957 if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
958 deviceInfo->setKeyboardType(mKeyboardType);
959 }
960 }
961
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100962 virtual void configure(nsecs_t, const InputReaderConfiguration*, uint32_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800963 mConfigureWasCalled = true;
964 }
965
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100966 virtual void reset(nsecs_t) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800967 mResetWasCalled = true;
968 }
969
970 virtual void process(const RawEvent* rawEvent) {
971 mLastEvent = *rawEvent;
972 mProcessWasCalled = true;
973 }
974
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100975 virtual int32_t getKeyCodeState(uint32_t, int32_t keyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800976 ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
977 return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
978 }
979
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100980 virtual int32_t getScanCodeState(uint32_t, int32_t scanCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800981 ssize_t index = mScanCodeStates.indexOfKey(scanCode);
982 return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
983 }
984
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100985 virtual int32_t getSwitchState(uint32_t, int32_t switchCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -0800986 ssize_t index = mSwitchStates.indexOfKey(switchCode);
987 return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
988 }
989
Narayan Kamath39efe3e2014-10-17 10:37:08 +0100990 virtual bool markSupportedKeyCodes(uint32_t, size_t numCodes,
Michael Wrightd02c5b62014-02-10 15:10:22 -0800991 const int32_t* keyCodes, uint8_t* outFlags) {
992 bool result = false;
993 for (size_t i = 0; i < numCodes; i++) {
994 for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
995 if (keyCodes[i] == mSupportedKeyCodes[j]) {
996 outFlags[i] = 1;
997 result = true;
998 }
999 }
1000 }
1001 return result;
1002 }
1003
1004 virtual int32_t getMetaState() {
1005 return mMetaState;
1006 }
1007
1008 virtual void fadePointer() {
1009 }
1010};
1011
1012
1013// --- InstrumentedInputReader ---
1014
1015class InstrumentedInputReader : public InputReader {
1016 InputDevice* mNextDevice;
1017
1018public:
1019 InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
1020 const sp<InputReaderPolicyInterface>& policy,
1021 const sp<InputListenerInterface>& listener) :
1022 InputReader(eventHub, policy, listener),
1023 mNextDevice(NULL) {
1024 }
1025
1026 virtual ~InstrumentedInputReader() {
1027 if (mNextDevice) {
1028 delete mNextDevice;
1029 }
1030 }
1031
1032 void setNextDevice(InputDevice* device) {
1033 mNextDevice = device;
1034 }
1035
1036 InputDevice* newDevice(int32_t deviceId, int32_t controllerNumber, const String8& name,
1037 uint32_t classes) {
1038 InputDeviceIdentifier identifier;
1039 identifier.name = name;
1040 int32_t generation = deviceId + 1;
1041 return new InputDevice(&mContext, deviceId, generation, controllerNumber, identifier,
1042 classes);
1043 }
1044
1045protected:
1046 virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
1047 const InputDeviceIdentifier& identifier, uint32_t classes) {
1048 if (mNextDevice) {
1049 InputDevice* device = mNextDevice;
1050 mNextDevice = NULL;
1051 return device;
1052 }
1053 return InputReader::createDeviceLocked(deviceId, controllerNumber, identifier, classes);
1054 }
1055
1056 friend class InputReaderTest;
1057};
1058
1059
1060// --- InputReaderTest ---
1061
1062class InputReaderTest : public testing::Test {
1063protected:
1064 sp<FakeInputListener> mFakeListener;
1065 sp<FakeInputReaderPolicy> mFakePolicy;
1066 sp<FakeEventHub> mFakeEventHub;
1067 sp<InstrumentedInputReader> mReader;
1068
1069 virtual void SetUp() {
1070 mFakeEventHub = new FakeEventHub();
1071 mFakePolicy = new FakeInputReaderPolicy();
1072 mFakeListener = new FakeInputListener();
1073
1074 mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
1075 }
1076
1077 virtual void TearDown() {
1078 mReader.clear();
1079
1080 mFakeListener.clear();
1081 mFakePolicy.clear();
1082 mFakeEventHub.clear();
1083 }
1084
1085 void addDevice(int32_t deviceId, const String8& name, uint32_t classes,
1086 const PropertyMap* configuration) {
1087 mFakeEventHub->addDevice(deviceId, name, classes);
1088
1089 if (configuration) {
1090 mFakeEventHub->addConfigurationMap(deviceId, configuration);
1091 }
1092 mFakeEventHub->finishDeviceScan();
1093 mReader->loopOnce();
1094 mReader->loopOnce();
1095 mFakeEventHub->assertQueueIsEmpty();
1096 }
1097
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001098 void disableDevice(int32_t deviceId, InputDevice* device) {
1099 mFakePolicy->addDisabledDevice(deviceId);
1100 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1101 }
1102
1103 void enableDevice(int32_t deviceId, InputDevice* device) {
1104 mFakePolicy->removeDisabledDevice(deviceId);
1105 configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1106 }
1107
1108 void configureDevice(uint32_t changes, InputDevice* device) {
1109 device->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1110 }
1111
Michael Wrightd02c5b62014-02-10 15:10:22 -08001112 FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, int32_t controllerNumber,
1113 const String8& name, uint32_t classes, uint32_t sources,
1114 const PropertyMap* configuration) {
1115 InputDevice* device = mReader->newDevice(deviceId, controllerNumber, name, classes);
1116 FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1117 device->addMapper(mapper);
1118 mReader->setNextDevice(device);
1119 addDevice(deviceId, name, classes, configuration);
1120 return mapper;
1121 }
1122};
1123
1124TEST_F(InputReaderTest, GetInputDevices) {
1125 ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"),
1126 INPUT_DEVICE_CLASS_KEYBOARD, NULL));
1127 ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("ignored"),
1128 0, NULL)); // no classes so device will be ignored
1129
1130 Vector<InputDeviceInfo> inputDevices;
1131 mReader->getInputDevices(inputDevices);
1132
1133 ASSERT_EQ(1U, inputDevices.size());
1134 ASSERT_EQ(1, inputDevices[0].getId());
1135 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.string());
1136 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1137 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1138 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1139
1140 // Should also have received a notification describing the new input devices.
1141 inputDevices = mFakePolicy->getInputDevices();
1142 ASSERT_EQ(1U, inputDevices.size());
1143 ASSERT_EQ(1, inputDevices[0].getId());
1144 ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.string());
1145 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1146 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1147 ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1148}
1149
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001150TEST_F(InputReaderTest, WhenEnabledChanges_SendsDeviceResetNotification) {
1151 constexpr int32_t deviceId = 1;
1152 constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
1153 InputDevice* device = mReader->newDevice(deviceId, 0, String8("fake"), deviceClass);
1154 // Must add at least one mapper or the device will be ignored!
1155 FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1156 device->addMapper(mapper);
1157 mReader->setNextDevice(device);
1158 addDevice(deviceId, String8("fake"), deviceClass, NULL);
1159
1160 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(NULL));
1161
1162 NotifyDeviceResetArgs resetArgs;
1163 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1164 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1165 ASSERT_EQ(deviceId, resetArgs.deviceId);
1166
1167 ASSERT_EQ(device->isEnabled(), true);
1168 disableDevice(deviceId, device);
1169 mReader->loopOnce();
1170
1171 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1172 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1173 ASSERT_EQ(deviceId, resetArgs.deviceId);
1174 ASSERT_EQ(device->isEnabled(), false);
1175
1176 disableDevice(deviceId, device);
1177 mReader->loopOnce();
1178 mFakeListener->assertNotifyDeviceResetWasNotCalled();
1179 mFakeListener->assertNotifyConfigurationChangedWasNotCalled();
1180 ASSERT_EQ(device->isEnabled(), false);
1181
1182 enableDevice(deviceId, device);
1183 mReader->loopOnce();
1184 mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1185 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1186 ASSERT_EQ(deviceId, resetArgs.deviceId);
1187 ASSERT_EQ(device->isEnabled(), true);
1188}
1189
Michael Wrightd02c5b62014-02-10 15:10:22 -08001190TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
1191 FakeInputMapper* mapper = NULL;
1192 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
1193 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1194 mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1195
1196 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1197 AINPUT_SOURCE_ANY, AKEYCODE_A))
1198 << "Should return unknown when the device id is >= 0 but unknown.";
1199
1200 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1201 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1202 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1203
1204 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1205 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1206 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1207
1208 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1209 AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1210 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1211
1212 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1213 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1214 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1215}
1216
1217TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
1218 FakeInputMapper* mapper = NULL;
1219 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
1220 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1221 mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1222
1223 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1224 AINPUT_SOURCE_ANY, KEY_A))
1225 << "Should return unknown when the device id is >= 0 but unknown.";
1226
1227 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1228 AINPUT_SOURCE_TRACKBALL, KEY_A))
1229 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1230
1231 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1232 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1233 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1234
1235 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1236 AINPUT_SOURCE_TRACKBALL, KEY_A))
1237 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1238
1239 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1240 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1241 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1242}
1243
1244TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
1245 FakeInputMapper* mapper = NULL;
1246 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
1247 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1248 mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1249
1250 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1251 AINPUT_SOURCE_ANY, SW_LID))
1252 << "Should return unknown when the device id is >= 0 but unknown.";
1253
1254 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1255 AINPUT_SOURCE_TRACKBALL, SW_LID))
1256 << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1257
1258 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1259 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1260 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1261
1262 ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1263 AINPUT_SOURCE_TRACKBALL, SW_LID))
1264 << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1265
1266 ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1267 AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1268 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1269}
1270
1271TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
1272 FakeInputMapper* mapper = NULL;
1273 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
1274 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1275 mapper->addSupportedKeyCode(AKEYCODE_A);
1276 mapper->addSupportedKeyCode(AKEYCODE_B);
1277
1278 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1279 uint8_t flags[4] = { 0, 0, 0, 1 };
1280
1281 ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1282 << "Should return false when device id is >= 0 but unknown.";
1283 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1284
1285 flags[3] = 1;
1286 ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1287 << "Should return false when device id is valid but the sources are not supported by the device.";
1288 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1289
1290 flags[3] = 1;
1291 ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1292 << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1293 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1294
1295 flags[3] = 1;
1296 ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1297 << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1298 ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1299
1300 flags[3] = 1;
1301 ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1302 << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1303 ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1304}
1305
1306TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
1307 addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD, NULL);
1308
1309 NotifyConfigurationChangedArgs args;
1310
1311 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1312 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1313}
1314
1315TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
1316 FakeInputMapper* mapper = NULL;
1317 ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, String8("fake"),
1318 INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1319
1320 mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1321 mReader->loopOnce();
1322 ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1323
1324 RawEvent event;
1325 ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1326 ASSERT_EQ(0, event.when);
1327 ASSERT_EQ(1, event.deviceId);
1328 ASSERT_EQ(EV_KEY, event.type);
1329 ASSERT_EQ(KEY_A, event.code);
1330 ASSERT_EQ(1, event.value);
1331}
1332
1333
1334// --- InputDeviceTest ---
1335
1336class InputDeviceTest : public testing::Test {
1337protected:
1338 static const char* DEVICE_NAME;
1339 static const int32_t DEVICE_ID;
1340 static const int32_t DEVICE_GENERATION;
1341 static const int32_t DEVICE_CONTROLLER_NUMBER;
1342 static const uint32_t DEVICE_CLASSES;
1343
1344 sp<FakeEventHub> mFakeEventHub;
1345 sp<FakeInputReaderPolicy> mFakePolicy;
1346 sp<FakeInputListener> mFakeListener;
1347 FakeInputReaderContext* mFakeContext;
1348
1349 InputDevice* mDevice;
1350
1351 virtual void SetUp() {
1352 mFakeEventHub = new FakeEventHub();
1353 mFakePolicy = new FakeInputReaderPolicy();
1354 mFakeListener = new FakeInputListener();
1355 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1356
1357 mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
1358 InputDeviceIdentifier identifier;
1359 identifier.name = DEVICE_NAME;
1360 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1361 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1362 }
1363
1364 virtual void TearDown() {
1365 delete mDevice;
1366
1367 delete mFakeContext;
1368 mFakeListener.clear();
1369 mFakePolicy.clear();
1370 mFakeEventHub.clear();
1371 }
1372};
1373
1374const char* InputDeviceTest::DEVICE_NAME = "device";
1375const int32_t InputDeviceTest::DEVICE_ID = 1;
1376const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
1377const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0;
1378const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1379 | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1380
1381TEST_F(InputDeviceTest, ImmutableProperties) {
1382 ASSERT_EQ(DEVICE_ID, mDevice->getId());
1383 ASSERT_STREQ(DEVICE_NAME, mDevice->getName());
1384 ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1385}
1386
Siarhei Vishniakoue54cb852017-03-21 17:48:16 -07001387TEST_F(InputDeviceTest, WhenDeviceCreated_EnabledIsTrue) {
1388 ASSERT_EQ(mDevice->isEnabled(), true);
1389}
1390
Michael Wrightd02c5b62014-02-10 15:10:22 -08001391TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1392 // Configuration.
1393 InputReaderConfiguration config;
1394 mDevice->configure(ARBITRARY_TIME, &config, 0);
1395
1396 // Reset.
1397 mDevice->reset(ARBITRARY_TIME);
1398
1399 NotifyDeviceResetArgs resetArgs;
1400 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1401 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1402 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1403
1404 // Metadata.
1405 ASSERT_TRUE(mDevice->isIgnored());
1406 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1407
1408 InputDeviceInfo info;
1409 mDevice->getDeviceInfo(&info);
1410 ASSERT_EQ(DEVICE_ID, info.getId());
1411 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.string());
1412 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1413 ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1414
1415 // State queries.
1416 ASSERT_EQ(0, mDevice->getMetaState());
1417
1418 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1419 << "Ignored device should return unknown key code state.";
1420 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1421 << "Ignored device should return unknown scan code state.";
1422 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1423 << "Ignored device should return unknown switch state.";
1424
1425 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1426 uint8_t flags[2] = { 0, 1 };
1427 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1428 << "Ignored device should never mark any key codes.";
1429 ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1430 ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1431}
1432
1433TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1434 // Configuration.
1435 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1436
1437 FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1438 mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1439 mapper1->setMetaState(AMETA_ALT_ON);
1440 mapper1->addSupportedKeyCode(AKEYCODE_A);
1441 mapper1->addSupportedKeyCode(AKEYCODE_B);
1442 mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1443 mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1444 mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1445 mapper1->setScanCodeState(3, AKEY_STATE_UP);
1446 mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1447 mDevice->addMapper(mapper1);
1448
1449 FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1450 mapper2->setMetaState(AMETA_SHIFT_ON);
1451 mDevice->addMapper(mapper2);
1452
1453 InputReaderConfiguration config;
1454 mDevice->configure(ARBITRARY_TIME, &config, 0);
1455
1456 String8 propertyValue;
1457 ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1458 << "Device should have read configuration during configuration phase.";
1459 ASSERT_STREQ("value", propertyValue.string());
1460
1461 ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1462 ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1463
1464 // Reset
1465 mDevice->reset(ARBITRARY_TIME);
1466 ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1467 ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1468
1469 NotifyDeviceResetArgs resetArgs;
1470 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1471 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1472 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1473
1474 // Metadata.
1475 ASSERT_FALSE(mDevice->isIgnored());
1476 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1477
1478 InputDeviceInfo info;
1479 mDevice->getDeviceInfo(&info);
1480 ASSERT_EQ(DEVICE_ID, info.getId());
1481 ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.string());
1482 ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1483 ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1484
1485 // State queries.
1486 ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1487 << "Should query mappers and combine meta states.";
1488
1489 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1490 << "Should return unknown key code state when source not supported.";
1491 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1492 << "Should return unknown scan code state when source not supported.";
1493 ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1494 << "Should return unknown switch state when source not supported.";
1495
1496 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1497 << "Should query mapper when source is supported.";
1498 ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1499 << "Should query mapper when source is supported.";
1500 ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1501 << "Should query mapper when source is supported.";
1502
1503 const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1504 uint8_t flags[4] = { 0, 0, 0, 1 };
1505 ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1506 << "Should do nothing when source is unsupported.";
1507 ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1508 ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1509 ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1510 ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1511
1512 ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1513 << "Should query mapper when source is supported.";
1514 ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1515 ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1516 ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1517 ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1518
1519 // Event handling.
1520 RawEvent event;
1521 mDevice->process(&event, 1);
1522
1523 ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1524 ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1525}
1526
1527
1528// --- InputMapperTest ---
1529
1530class InputMapperTest : public testing::Test {
1531protected:
1532 static const char* DEVICE_NAME;
1533 static const int32_t DEVICE_ID;
1534 static const int32_t DEVICE_GENERATION;
1535 static const int32_t DEVICE_CONTROLLER_NUMBER;
1536 static const uint32_t DEVICE_CLASSES;
1537
1538 sp<FakeEventHub> mFakeEventHub;
1539 sp<FakeInputReaderPolicy> mFakePolicy;
1540 sp<FakeInputListener> mFakeListener;
1541 FakeInputReaderContext* mFakeContext;
1542 InputDevice* mDevice;
1543
1544 virtual void SetUp() {
1545 mFakeEventHub = new FakeEventHub();
1546 mFakePolicy = new FakeInputReaderPolicy();
1547 mFakeListener = new FakeInputListener();
1548 mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1549 InputDeviceIdentifier identifier;
1550 identifier.name = DEVICE_NAME;
1551 mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1552 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1553
1554 mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
1555 }
1556
1557 virtual void TearDown() {
1558 delete mDevice;
1559 delete mFakeContext;
1560 mFakeListener.clear();
1561 mFakePolicy.clear();
1562 mFakeEventHub.clear();
1563 }
1564
1565 void addConfigurationProperty(const char* key, const char* value) {
1566 mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8(key), String8(value));
1567 }
1568
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001569 void configureDevice(uint32_t changes) {
1570 mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1571 }
1572
Michael Wrightd02c5b62014-02-10 15:10:22 -08001573 void addMapperAndConfigure(InputMapper* mapper) {
1574 mDevice->addMapper(mapper);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001575 configureDevice(0);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001576 mDevice->reset(ARBITRARY_TIME);
1577 }
1578
1579 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
1580 int32_t orientation) {
1581 mFakePolicy->setDisplayInfo(displayId, width, height, orientation);
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08001582 configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
Michael Wrightd02c5b62014-02-10 15:10:22 -08001583 }
1584
1585 static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type,
1586 int32_t code, int32_t value) {
1587 RawEvent event;
1588 event.when = when;
1589 event.deviceId = deviceId;
1590 event.type = type;
1591 event.code = code;
1592 event.value = value;
1593 mapper->process(&event);
1594 }
1595
1596 static void assertMotionRange(const InputDeviceInfo& info,
1597 int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1598 const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
1599 ASSERT_TRUE(range != NULL) << "Axis: " << axis << " Source: " << source;
1600 ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1601 ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1602 ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1603 ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1604 ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1605 ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1606 }
1607
1608 static void assertPointerCoords(const PointerCoords& coords,
1609 float x, float y, float pressure, float size,
1610 float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1611 float orientation, float distance) {
1612 ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1613 ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1614 ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1615 ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1616 ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1617 ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1618 ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1619 ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1620 ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1621 ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1622 }
1623
1624 static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1625 float actualX, actualY;
1626 controller->getPosition(&actualX, &actualY);
1627 ASSERT_NEAR(x, actualX, 1);
1628 ASSERT_NEAR(y, actualY, 1);
1629 }
1630};
1631
1632const char* InputMapperTest::DEVICE_NAME = "device";
1633const int32_t InputMapperTest::DEVICE_ID = 1;
1634const int32_t InputMapperTest::DEVICE_GENERATION = 2;
1635const int32_t InputMapperTest::DEVICE_CONTROLLER_NUMBER = 0;
1636const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1637
1638
1639// --- SwitchInputMapperTest ---
1640
1641class SwitchInputMapperTest : public InputMapperTest {
1642protected:
1643};
1644
1645TEST_F(SwitchInputMapperTest, GetSources) {
1646 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1647 addMapperAndConfigure(mapper);
1648
1649 ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1650}
1651
1652TEST_F(SwitchInputMapperTest, GetSwitchState) {
1653 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1654 addMapperAndConfigure(mapper);
1655
1656 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1657 ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1658
1659 mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1660 ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1661}
1662
1663TEST_F(SwitchInputMapperTest, Process) {
1664 SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1665 addMapperAndConfigure(mapper);
1666
1667 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 1);
1668 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_JACK_PHYSICAL_INSERT, 1);
1669 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_HEADPHONE_INSERT, 0);
1670 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
1671
1672 NotifySwitchArgs args;
1673 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1674 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
Dan Albert1bd2fc02016-02-02 15:11:57 -08001675 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT), args.switchValues);
1676 ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT),
Michael Wrightd02c5b62014-02-10 15:10:22 -08001677 args.switchMask);
1678 ASSERT_EQ(uint32_t(0), args.policyFlags);
1679}
1680
1681
1682// --- KeyboardInputMapperTest ---
1683
1684class KeyboardInputMapperTest : public InputMapperTest {
1685protected:
1686 void testDPadKeyRotation(KeyboardInputMapper* mapper,
1687 int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1688};
1689
1690void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
Narayan Kamath39efe3e2014-10-17 10:37:08 +01001691 int32_t originalScanCode, int32_t, int32_t rotatedKeyCode) {
Michael Wrightd02c5b62014-02-10 15:10:22 -08001692 NotifyKeyArgs args;
1693
1694 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 1);
1695 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1696 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1697 ASSERT_EQ(originalScanCode, args.scanCode);
1698 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1699
1700 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 0);
1701 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1702 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1703 ASSERT_EQ(originalScanCode, args.scanCode);
1704 ASSERT_EQ(rotatedKeyCode, args.keyCode);
1705}
1706
1707
1708TEST_F(KeyboardInputMapperTest, GetSources) {
1709 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1710 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1711 addMapperAndConfigure(mapper);
1712
1713 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
1714}
1715
1716TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
1717 const int32_t USAGE_A = 0x070004;
1718 const int32_t USAGE_UNKNOWN = 0x07ffff;
1719 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1720 mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
1721
1722 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1723 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1724 addMapperAndConfigure(mapper);
1725
1726 // Key down by scan code.
1727 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1728 EV_KEY, KEY_HOME, 1);
1729 NotifyKeyArgs args;
1730 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1731 ASSERT_EQ(DEVICE_ID, args.deviceId);
1732 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1733 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1734 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1735 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1736 ASSERT_EQ(KEY_HOME, args.scanCode);
1737 ASSERT_EQ(AMETA_NONE, args.metaState);
1738 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1739 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1740 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1741
1742 // Key up by scan code.
1743 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1744 EV_KEY, KEY_HOME, 0);
1745 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1746 ASSERT_EQ(DEVICE_ID, args.deviceId);
1747 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1748 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1749 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1750 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1751 ASSERT_EQ(KEY_HOME, args.scanCode);
1752 ASSERT_EQ(AMETA_NONE, args.metaState);
1753 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1754 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1755 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1756
1757 // Key down by usage code.
1758 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1759 EV_MSC, MSC_SCAN, USAGE_A);
1760 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1761 EV_KEY, 0, 1);
1762 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1763 ASSERT_EQ(DEVICE_ID, args.deviceId);
1764 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1765 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1766 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1767 ASSERT_EQ(AKEYCODE_A, args.keyCode);
1768 ASSERT_EQ(0, args.scanCode);
1769 ASSERT_EQ(AMETA_NONE, args.metaState);
1770 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1771 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1772 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1773
1774 // Key up by usage code.
1775 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1776 EV_MSC, MSC_SCAN, USAGE_A);
1777 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1778 EV_KEY, 0, 0);
1779 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1780 ASSERT_EQ(DEVICE_ID, args.deviceId);
1781 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1782 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1783 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1784 ASSERT_EQ(AKEYCODE_A, args.keyCode);
1785 ASSERT_EQ(0, args.scanCode);
1786 ASSERT_EQ(AMETA_NONE, args.metaState);
1787 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1788 ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1789 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1790
1791 // Key down with unknown scan code or usage code.
1792 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1793 EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
1794 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1795 EV_KEY, KEY_UNKNOWN, 1);
1796 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1797 ASSERT_EQ(DEVICE_ID, args.deviceId);
1798 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1799 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1800 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1801 ASSERT_EQ(0, args.keyCode);
1802 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
1803 ASSERT_EQ(AMETA_NONE, args.metaState);
1804 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1805 ASSERT_EQ(0U, args.policyFlags);
1806 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1807
1808 // Key up with unknown scan code or usage code.
1809 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1810 EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
1811 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1812 EV_KEY, KEY_UNKNOWN, 0);
1813 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1814 ASSERT_EQ(DEVICE_ID, args.deviceId);
1815 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1816 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1817 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1818 ASSERT_EQ(0, args.keyCode);
1819 ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
1820 ASSERT_EQ(AMETA_NONE, args.metaState);
1821 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1822 ASSERT_EQ(0U, args.policyFlags);
1823 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1824}
1825
1826TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
1827 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
1828 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
1829
1830 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1831 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1832 addMapperAndConfigure(mapper);
1833
1834 // Initial metastate.
1835 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1836
1837 // Metakey down.
1838 process(mapper, ARBITRARY_TIME, DEVICE_ID,
1839 EV_KEY, KEY_LEFTSHIFT, 1);
1840 NotifyKeyArgs args;
1841 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1842 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1843 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1844 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1845
1846 // Key down.
1847 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
1848 EV_KEY, KEY_A, 1);
1849 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1850 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1851 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1852
1853 // Key up.
1854 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID,
1855 EV_KEY, KEY_A, 0);
1856 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1857 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1858 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1859
1860 // Metakey up.
1861 process(mapper, ARBITRARY_TIME + 3, DEVICE_ID,
1862 EV_KEY, KEY_LEFTSHIFT, 0);
1863 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1864 ASSERT_EQ(AMETA_NONE, args.metaState);
1865 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1866 ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1867}
1868
1869TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
1870 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
1871 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
1872 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1873 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
1874
1875 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1876 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1877 addMapperAndConfigure(mapper);
1878
1879 setDisplayInfoAndReconfigure(DISPLAY_ID,
1880 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1881 DISPLAY_ORIENTATION_90);
1882 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1883 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
1884 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1885 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
1886 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1887 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
1888 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1889 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
1890}
1891
1892TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
1893 mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
1894 mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
1895 mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
1896 mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
1897
1898 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1899 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1900 addConfigurationProperty("keyboard.orientationAware", "1");
1901 addMapperAndConfigure(mapper);
1902
1903 setDisplayInfoAndReconfigure(DISPLAY_ID,
1904 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1905 DISPLAY_ORIENTATION_0);
1906 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1907 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
1908 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1909 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
1910 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1911 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
1912 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1913 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
1914
1915 setDisplayInfoAndReconfigure(DISPLAY_ID,
1916 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1917 DISPLAY_ORIENTATION_90);
1918 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1919 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
1920 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1921 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
1922 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1923 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
1924 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1925 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
1926
1927 setDisplayInfoAndReconfigure(DISPLAY_ID,
1928 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1929 DISPLAY_ORIENTATION_180);
1930 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1931 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
1932 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1933 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
1934 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1935 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
1936 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1937 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
1938
1939 setDisplayInfoAndReconfigure(DISPLAY_ID,
1940 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1941 DISPLAY_ORIENTATION_270);
1942 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1943 KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
1944 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1945 KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
1946 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1947 KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
1948 ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1949 KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
1950
1951 // Special case: if orientation changes while key is down, we still emit the same keycode
1952 // in the key up as we did in the key down.
1953 NotifyKeyArgs args;
1954
1955 setDisplayInfoAndReconfigure(DISPLAY_ID,
1956 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1957 DISPLAY_ORIENTATION_270);
1958 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
1959 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1960 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1961 ASSERT_EQ(KEY_UP, args.scanCode);
1962 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1963
1964 setDisplayInfoAndReconfigure(DISPLAY_ID,
1965 DISPLAY_WIDTH, DISPLAY_HEIGHT,
1966 DISPLAY_ORIENTATION_180);
1967 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
1968 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1969 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1970 ASSERT_EQ(KEY_UP, args.scanCode);
1971 ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1972}
1973
1974TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
1975 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1976 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1977 addMapperAndConfigure(mapper);
1978
1979 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
1980 ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
1981
1982 mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
1983 ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
1984}
1985
1986TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
1987 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1988 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1989 addMapperAndConfigure(mapper);
1990
1991 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
1992 ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
1993
1994 mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
1995 ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
1996}
1997
1998TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
1999 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2000 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2001 addMapperAndConfigure(mapper);
2002
2003 mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2004
2005 const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
2006 uint8_t flags[2] = { 0, 0 };
2007 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
2008 ASSERT_TRUE(flags[0]);
2009 ASSERT_FALSE(flags[1]);
2010}
2011
2012TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
2013 mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
2014 mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
2015 mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
2016 mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
2017 mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
2018 mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
2019
2020 KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2021 AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2022 addMapperAndConfigure(mapper);
2023
2024 // Initialization should have turned all of the lights off.
2025 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2026 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2027 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2028
2029 // Toggle caps lock on.
2030 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2031 EV_KEY, KEY_CAPSLOCK, 1);
2032 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2033 EV_KEY, KEY_CAPSLOCK, 0);
2034 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2035 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2036 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2037 ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
2038
2039 // Toggle num lock on.
2040 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2041 EV_KEY, KEY_NUMLOCK, 1);
2042 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2043 EV_KEY, KEY_NUMLOCK, 0);
2044 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2045 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2046 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2047 ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
2048
2049 // Toggle caps lock off.
2050 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2051 EV_KEY, KEY_CAPSLOCK, 1);
2052 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2053 EV_KEY, KEY_CAPSLOCK, 0);
2054 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2055 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2056 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2057 ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
2058
2059 // Toggle scroll lock on.
2060 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2061 EV_KEY, KEY_SCROLLLOCK, 1);
2062 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2063 EV_KEY, KEY_SCROLLLOCK, 0);
2064 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2065 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2066 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2067 ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2068
2069 // Toggle num lock off.
2070 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2071 EV_KEY, KEY_NUMLOCK, 1);
2072 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2073 EV_KEY, KEY_NUMLOCK, 0);
2074 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2075 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2076 ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2077 ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2078
2079 // Toggle scroll lock off.
2080 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2081 EV_KEY, KEY_SCROLLLOCK, 1);
2082 process(mapper, ARBITRARY_TIME, DEVICE_ID,
2083 EV_KEY, KEY_SCROLLLOCK, 0);
2084 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2085 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2086 ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2087 ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2088}
2089
2090
2091// --- CursorInputMapperTest ---
2092
2093class CursorInputMapperTest : public InputMapperTest {
2094protected:
2095 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
2096
2097 sp<FakePointerController> mFakePointerController;
2098
2099 virtual void SetUp() {
2100 InputMapperTest::SetUp();
2101
2102 mFakePointerController = new FakePointerController();
2103 mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController);
2104 }
2105
2106 void testMotionRotation(CursorInputMapper* mapper,
2107 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
2108};
2109
2110const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
2111
2112void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
2113 int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
2114 NotifyMotionArgs args;
2115
2116 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, originalX);
2117 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, originalY);
2118 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2119 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2120 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2121 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2122 float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
2123 float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
2124 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2125}
2126
2127TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
2128 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2129 addConfigurationProperty("cursor.mode", "pointer");
2130 addMapperAndConfigure(mapper);
2131
2132 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2133}
2134
2135TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
2136 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2137 addConfigurationProperty("cursor.mode", "navigation");
2138 addMapperAndConfigure(mapper);
2139
2140 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
2141}
2142
2143TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
2144 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2145 addConfigurationProperty("cursor.mode", "pointer");
2146 addMapperAndConfigure(mapper);
2147
2148 InputDeviceInfo info;
2149 mapper->populateDeviceInfo(&info);
2150
2151 // Initially there may not be a valid motion range.
2152 ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
2153 ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
2154 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2155 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
2156
2157 // When the bounds are set, then there should be a valid motion range.
2158 mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
2159
2160 InputDeviceInfo info2;
2161 mapper->populateDeviceInfo(&info2);
2162
2163 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2164 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
2165 1, 800 - 1, 0.0f, 0.0f));
2166 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2167 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
2168 2, 480 - 1, 0.0f, 0.0f));
2169 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2170 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
2171 0.0f, 1.0f, 0.0f, 0.0f));
2172}
2173
2174TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2175 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2176 addConfigurationProperty("cursor.mode", "navigation");
2177 addMapperAndConfigure(mapper);
2178
2179 InputDeviceInfo info;
2180 mapper->populateDeviceInfo(&info);
2181
2182 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2183 AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
2184 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2185 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2186 AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
2187 -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2188 ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2189 AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2190 0.0f, 1.0f, 0.0f, 0.0f));
2191}
2192
2193TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2194 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2195 addConfigurationProperty("cursor.mode", "navigation");
2196 addMapperAndConfigure(mapper);
2197
2198 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2199
2200 NotifyMotionArgs args;
2201
2202 // Button press.
2203 // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
2204 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2205 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2206 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2207 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2208 ASSERT_EQ(DEVICE_ID, args.deviceId);
2209 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2210 ASSERT_EQ(uint32_t(0), args.policyFlags);
2211 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2212 ASSERT_EQ(0, args.flags);
2213 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2214 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2215 ASSERT_EQ(0, args.edgeFlags);
2216 ASSERT_EQ(uint32_t(1), args.pointerCount);
2217 ASSERT_EQ(0, args.pointerProperties[0].id);
2218 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2219 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2220 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2221 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2222 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2223 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2224
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002225 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2226 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2227 ASSERT_EQ(DEVICE_ID, args.deviceId);
2228 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2229 ASSERT_EQ(uint32_t(0), args.policyFlags);
2230 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2231 ASSERT_EQ(0, args.flags);
2232 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2233 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2234 ASSERT_EQ(0, args.edgeFlags);
2235 ASSERT_EQ(uint32_t(1), args.pointerCount);
2236 ASSERT_EQ(0, args.pointerProperties[0].id);
2237 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2238 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2239 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2240 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2241 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2242 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2243
Michael Wrightd02c5b62014-02-10 15:10:22 -08002244 // Button release. Should have same down time.
2245 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2246 process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2247 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2248 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2249 ASSERT_EQ(DEVICE_ID, args.deviceId);
2250 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2251 ASSERT_EQ(uint32_t(0), args.policyFlags);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002252 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2253 ASSERT_EQ(0, args.flags);
2254 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2255 ASSERT_EQ(0, args.buttonState);
2256 ASSERT_EQ(0, args.edgeFlags);
2257 ASSERT_EQ(uint32_t(1), args.pointerCount);
2258 ASSERT_EQ(0, args.pointerProperties[0].id);
2259 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2260 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2261 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2262 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2263 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2264 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2265
2266 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2267 ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2268 ASSERT_EQ(DEVICE_ID, args.deviceId);
2269 ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2270 ASSERT_EQ(uint32_t(0), args.policyFlags);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002271 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2272 ASSERT_EQ(0, args.flags);
2273 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2274 ASSERT_EQ(0, args.buttonState);
2275 ASSERT_EQ(0, args.edgeFlags);
2276 ASSERT_EQ(uint32_t(1), args.pointerCount);
2277 ASSERT_EQ(0, args.pointerProperties[0].id);
2278 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2279 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2280 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2281 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2282 ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2283 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2284}
2285
2286TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2287 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2288 addConfigurationProperty("cursor.mode", "navigation");
2289 addMapperAndConfigure(mapper);
2290
2291 NotifyMotionArgs args;
2292
2293 // Motion in X but not Y.
2294 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
2295 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2296 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2297 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2298 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2299 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2300
2301 // Motion in Y but not X.
2302 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
2303 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2304 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2305 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2306 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2307 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2308}
2309
2310TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2311 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2312 addConfigurationProperty("cursor.mode", "navigation");
2313 addMapperAndConfigure(mapper);
2314
2315 NotifyMotionArgs args;
2316
2317 // Button press.
2318 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2319 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2320 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2321 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2322 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2323 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2324
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002325 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2326 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2327 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2328 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2329
Michael Wrightd02c5b62014-02-10 15:10:22 -08002330 // Button release.
2331 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2332 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2333 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002334 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2335 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2336 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2337
2338 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002339 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2340 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2341 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2342}
2343
2344TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2345 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2346 addConfigurationProperty("cursor.mode", "navigation");
2347 addMapperAndConfigure(mapper);
2348
2349 NotifyMotionArgs args;
2350
2351 // Combined X, Y and Button.
2352 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
2353 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
2354 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2355 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2356 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2357 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2358 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2359 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2360 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2361
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002362 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2363 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2364 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2365 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2366 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2367
Michael Wrightd02c5b62014-02-10 15:10:22 -08002368 // Move X, Y a bit while pressed.
2369 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 2);
2370 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 1);
2371 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2372 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2373 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2374 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2375 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2376 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2377
2378 // Release Button.
2379 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2380 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2381 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002382 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2383 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2384 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2385
2386 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002387 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2388 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2389 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2390}
2391
2392TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2393 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2394 addConfigurationProperty("cursor.mode", "navigation");
2395 addMapperAndConfigure(mapper);
2396
2397 setDisplayInfoAndReconfigure(DISPLAY_ID,
2398 DISPLAY_WIDTH, DISPLAY_HEIGHT,
2399 DISPLAY_ORIENTATION_90);
2400 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2401 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2402 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2403 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2404 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2405 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2406 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2407 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2408}
2409
2410TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2411 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2412 addConfigurationProperty("cursor.mode", "navigation");
2413 addConfigurationProperty("cursor.orientationAware", "1");
2414 addMapperAndConfigure(mapper);
2415
2416 setDisplayInfoAndReconfigure(DISPLAY_ID,
2417 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0);
2418 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1));
2419 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1));
2420 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0));
2421 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1));
2422 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1));
2423 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2424 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0));
2425 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1));
2426
2427 setDisplayInfoAndReconfigure(DISPLAY_ID,
2428 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_90);
2429 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0));
2430 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1));
2431 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1));
2432 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1));
2433 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0));
2434 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1));
2435 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1));
2436 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1));
2437
2438 setDisplayInfoAndReconfigure(DISPLAY_ID,
2439 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_180);
2440 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1));
2441 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1));
2442 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0));
2443 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1));
2444 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1));
2445 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1));
2446 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0));
2447 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1));
2448
2449 setDisplayInfoAndReconfigure(DISPLAY_ID,
2450 DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_270);
2451 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0));
2452 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1));
2453 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1));
2454 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1));
2455 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0));
2456 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1));
2457 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1));
2458 ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1));
2459}
2460
2461TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2462 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2463 addConfigurationProperty("cursor.mode", "pointer");
2464 addMapperAndConfigure(mapper);
2465
2466 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2467 mFakePointerController->setPosition(100, 200);
2468 mFakePointerController->setButtonState(0);
2469
2470 NotifyMotionArgs motionArgs;
2471 NotifyKeyArgs keyArgs;
2472
2473 // press BTN_LEFT, release BTN_LEFT
2474 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 1);
2475 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2476 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2477 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2478 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2479 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2480 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2481 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2482
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002483 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2484 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2485 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2486 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2487 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2488 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2489
Michael Wrightd02c5b62014-02-10 15:10:22 -08002490 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 0);
2491 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2492 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002493 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002494 ASSERT_EQ(0, motionArgs.buttonState);
2495 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002496 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2497 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2498
2499 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002500 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002501 ASSERT_EQ(0, motionArgs.buttonState);
2502 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002503 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2504 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2505
2506 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002507 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002508 ASSERT_EQ(0, motionArgs.buttonState);
2509 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002510 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2511 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2512
2513 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
2514 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 1);
2515 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 1);
2516 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2517 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2518 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2519 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2520 motionArgs.buttonState);
2521 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2522 mFakePointerController->getButtonState());
2523 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2524 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2525
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002526 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2527 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2528 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2529 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2530 mFakePointerController->getButtonState());
2531 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2532 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2533
2534 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2535 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2536 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2537 motionArgs.buttonState);
2538 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2539 mFakePointerController->getButtonState());
2540 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2541 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2542
Michael Wrightd02c5b62014-02-10 15:10:22 -08002543 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 0);
2544 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2545 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002546 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002547 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2548 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002549 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2550 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2551
2552 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002553 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002554 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2555 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002556 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2557 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2558
2559 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0);
2560 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2561 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002562 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2563 ASSERT_EQ(0, motionArgs.buttonState);
2564 ASSERT_EQ(0, mFakePointerController->getButtonState());
2565 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2566 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2567 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0);
2568 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2569
2570 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002571 ASSERT_EQ(0, motionArgs.buttonState);
2572 ASSERT_EQ(0, mFakePointerController->getButtonState());
2573 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2574 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2575 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 -08002576
Michael Wrightd02c5b62014-02-10 15:10:22 -08002577 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2578 ASSERT_EQ(0, motionArgs.buttonState);
2579 ASSERT_EQ(0, mFakePointerController->getButtonState());
2580 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2581 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2582 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2583
2584 // press BTN_BACK, release BTN_BACK
2585 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 1);
2586 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2587 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2588 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2589 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002590
Michael Wrightd02c5b62014-02-10 15:10:22 -08002591 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002592 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002593 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2594 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002595 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2596 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2597
2598 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2599 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2600 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2601 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002602 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2603 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2604
2605 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 0);
2606 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2607 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002608 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002609 ASSERT_EQ(0, motionArgs.buttonState);
2610 ASSERT_EQ(0, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002611 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2612 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2613
2614 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08002615 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002616 ASSERT_EQ(0, motionArgs.buttonState);
2617 ASSERT_EQ(0, mFakePointerController->getButtonState());
2618
Michael Wrightd02c5b62014-02-10 15:10:22 -08002619 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2620 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2621 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2622 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2623 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2624
2625 // press BTN_SIDE, release BTN_SIDE
2626 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 1);
2627 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2628 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2629 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2630 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002631
Michael Wrightd02c5b62014-02-10 15:10:22 -08002632 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002633 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002634 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2635 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002636 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2637 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2638
2639 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2640 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2641 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2642 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002643 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2644 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2645
2646 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 0);
2647 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2648 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002649 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002650 ASSERT_EQ(0, motionArgs.buttonState);
2651 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002652 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2653 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 -08002654
2655 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2656 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2657 ASSERT_EQ(0, motionArgs.buttonState);
2658 ASSERT_EQ(0, mFakePointerController->getButtonState());
2659 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2660 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2661
Michael Wrightd02c5b62014-02-10 15:10:22 -08002662 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2663 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2664 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2665
2666 // press BTN_FORWARD, release BTN_FORWARD
2667 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 1);
2668 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2669 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2670 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2671 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002672
Michael Wrightd02c5b62014-02-10 15:10:22 -08002673 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002674 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002675 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2676 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002677 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2678 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2679
2680 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2681 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2682 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2683 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002684 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2685 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2686
2687 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 0);
2688 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2689 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002690 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002691 ASSERT_EQ(0, motionArgs.buttonState);
2692 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002693 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2694 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 -08002695
2696 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2697 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2698 ASSERT_EQ(0, motionArgs.buttonState);
2699 ASSERT_EQ(0, mFakePointerController->getButtonState());
2700 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2701 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2702
Michael Wrightd02c5b62014-02-10 15:10:22 -08002703 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2704 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2705 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2706
2707 // press BTN_EXTRA, release BTN_EXTRA
2708 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 1);
2709 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2710 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2711 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2712 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002713
Michael Wrightd02c5b62014-02-10 15:10:22 -08002714 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002715 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002716 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2717 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002718 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2719 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2720
2721 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2722 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2723 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2724 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002725 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2726 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2727
2728 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 0);
2729 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2730 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08002731 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002732 ASSERT_EQ(0, motionArgs.buttonState);
2733 ASSERT_EQ(0, mFakePointerController->getButtonState());
Michael Wrightd02c5b62014-02-10 15:10:22 -08002734 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2735 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 -08002736
2737 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2738 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2739 ASSERT_EQ(0, motionArgs.buttonState);
2740 ASSERT_EQ(0, mFakePointerController->getButtonState());
2741 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2742 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2743
Michael Wrightd02c5b62014-02-10 15:10:22 -08002744 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2745 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2746 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2747}
2748
2749TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
2750 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2751 addConfigurationProperty("cursor.mode", "pointer");
2752 addMapperAndConfigure(mapper);
2753
2754 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2755 mFakePointerController->setPosition(100, 200);
2756 mFakePointerController->setButtonState(0);
2757
2758 NotifyMotionArgs args;
2759
2760 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
2761 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
2762 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2763 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
Vladislav Kaznacheev78f97b32016-12-15 18:14:58 -08002764 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
2765 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
2766 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2767 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2768 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
2769}
2770
2771TEST_F(CursorInputMapperTest, Process_PointerCapture) {
2772 CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2773 addConfigurationProperty("cursor.mode", "pointer");
2774 mFakePolicy->setPointerCapture(true);
2775 addMapperAndConfigure(mapper);
2776
2777 NotifyDeviceResetArgs resetArgs;
2778 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
2779 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
2780 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
2781
2782 mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2783 mFakePointerController->setPosition(100, 200);
2784 mFakePointerController->setButtonState(0);
2785
2786 NotifyMotionArgs args;
2787
2788 // Move.
2789 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
2790 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
2791 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2792 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2793 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2794 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2795 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2796 10.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2797 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
2798
2799 // Button press.
2800 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
2801 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2802 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2803 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2804 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2805 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2806 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2807 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2808 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2809 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2810 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2811 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2812
2813 // Button release.
2814 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
2815 process(mapper, ARBITRARY_TIME + 2, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2816 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2817 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2818 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2819 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2820 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2821 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2822 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2823 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2824 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2825 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2826
2827 // Another move.
2828 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 30);
2829 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 40);
2830 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2831 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2832 ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
2833 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2834 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2835 30.0f, 40.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2836 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
2837
2838 // Disable pointer capture and check that the device generation got bumped
2839 // and events are generated the usual way.
2840 const uint32_t generation = mFakeContext->getGeneration();
2841 mFakePolicy->setPointerCapture(false);
2842 configureDevice(InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
2843 ASSERT_TRUE(mFakeContext->getGeneration() != generation);
2844
2845 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
2846 ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
2847 ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
2848
2849 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
2850 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
2851 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2852 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2853 ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002854 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
2855 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2856 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2857 ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
2858}
2859
2860
2861// --- TouchInputMapperTest ---
2862
2863class TouchInputMapperTest : public InputMapperTest {
2864protected:
2865 static const int32_t RAW_X_MIN;
2866 static const int32_t RAW_X_MAX;
2867 static const int32_t RAW_Y_MIN;
2868 static const int32_t RAW_Y_MAX;
2869 static const int32_t RAW_TOUCH_MIN;
2870 static const int32_t RAW_TOUCH_MAX;
2871 static const int32_t RAW_TOOL_MIN;
2872 static const int32_t RAW_TOOL_MAX;
2873 static const int32_t RAW_PRESSURE_MIN;
2874 static const int32_t RAW_PRESSURE_MAX;
2875 static const int32_t RAW_ORIENTATION_MIN;
2876 static const int32_t RAW_ORIENTATION_MAX;
2877 static const int32_t RAW_DISTANCE_MIN;
2878 static const int32_t RAW_DISTANCE_MAX;
2879 static const int32_t RAW_TILT_MIN;
2880 static const int32_t RAW_TILT_MAX;
2881 static const int32_t RAW_ID_MIN;
2882 static const int32_t RAW_ID_MAX;
2883 static const int32_t RAW_SLOT_MIN;
2884 static const int32_t RAW_SLOT_MAX;
2885 static const float X_PRECISION;
2886 static const float Y_PRECISION;
2887
2888 static const float GEOMETRIC_SCALE;
Jason Gerecke489fda82012-09-07 17:19:40 -07002889 static const TouchAffineTransformation AFFINE_TRANSFORM;
Michael Wrightd02c5b62014-02-10 15:10:22 -08002890
2891 static const VirtualKeyDefinition VIRTUAL_KEYS[2];
2892
2893 enum Axes {
2894 POSITION = 1 << 0,
2895 TOUCH = 1 << 1,
2896 TOOL = 1 << 2,
2897 PRESSURE = 1 << 3,
2898 ORIENTATION = 1 << 4,
2899 MINOR = 1 << 5,
2900 ID = 1 << 6,
2901 DISTANCE = 1 << 7,
2902 TILT = 1 << 8,
2903 SLOT = 1 << 9,
2904 TOOL_TYPE = 1 << 10,
2905 };
2906
2907 void prepareDisplay(int32_t orientation);
2908 void prepareVirtualKeys();
Jason Gerecke489fda82012-09-07 17:19:40 -07002909 void prepareLocationCalibration();
Michael Wrightd02c5b62014-02-10 15:10:22 -08002910 int32_t toRawX(float displayX);
2911 int32_t toRawY(float displayY);
Jason Gerecke489fda82012-09-07 17:19:40 -07002912 float toCookedX(float rawX, float rawY);
2913 float toCookedY(float rawX, float rawY);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002914 float toDisplayX(int32_t rawX);
2915 float toDisplayY(int32_t rawY);
2916};
2917
2918const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
2919const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
2920const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
2921const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
2922const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
2923const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
2924const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
2925const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
2926const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = RAW_TOUCH_MIN;
2927const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = RAW_TOUCH_MAX;
2928const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
2929const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
2930const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
2931const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
2932const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
2933const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
2934const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
2935const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
2936const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
2937const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
2938const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
2939const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
Jason Gerecke489fda82012-09-07 17:19:40 -07002940const TouchAffineTransformation TouchInputMapperTest::AFFINE_TRANSFORM =
2941 TouchAffineTransformation(1, -2, 3, -4, 5, -6);
Michael Wrightd02c5b62014-02-10 15:10:22 -08002942
2943const float TouchInputMapperTest::GEOMETRIC_SCALE =
2944 avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
2945 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
2946
2947const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
2948 { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
2949 { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
2950};
2951
2952void TouchInputMapperTest::prepareDisplay(int32_t orientation) {
2953 setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation);
2954}
2955
2956void TouchInputMapperTest::prepareVirtualKeys() {
2957 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
2958 mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
2959 mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
2960 mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
2961}
2962
Jason Gerecke489fda82012-09-07 17:19:40 -07002963void TouchInputMapperTest::prepareLocationCalibration() {
2964 mFakePolicy->setTouchAffineTransformation(AFFINE_TRANSFORM);
2965}
2966
Michael Wrightd02c5b62014-02-10 15:10:22 -08002967int32_t TouchInputMapperTest::toRawX(float displayX) {
2968 return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
2969}
2970
2971int32_t TouchInputMapperTest::toRawY(float displayY) {
2972 return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
2973}
2974
Jason Gerecke489fda82012-09-07 17:19:40 -07002975float TouchInputMapperTest::toCookedX(float rawX, float rawY) {
2976 AFFINE_TRANSFORM.applyTo(rawX, rawY);
2977 return rawX;
2978}
2979
2980float TouchInputMapperTest::toCookedY(float rawX, float rawY) {
2981 AFFINE_TRANSFORM.applyTo(rawX, rawY);
2982 return rawY;
2983}
2984
Michael Wrightd02c5b62014-02-10 15:10:22 -08002985float TouchInputMapperTest::toDisplayX(int32_t rawX) {
2986 return float(rawX - RAW_X_MIN) * DISPLAY_WIDTH / (RAW_X_MAX - RAW_X_MIN + 1);
2987}
2988
2989float TouchInputMapperTest::toDisplayY(int32_t rawY) {
2990 return float(rawY - RAW_Y_MIN) * DISPLAY_HEIGHT / (RAW_Y_MAX - RAW_Y_MIN + 1);
2991}
2992
2993
2994// --- SingleTouchInputMapperTest ---
2995
2996class SingleTouchInputMapperTest : public TouchInputMapperTest {
2997protected:
2998 void prepareButtons();
2999 void prepareAxes(int axes);
3000
3001 void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3002 void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3003 void processUp(SingleTouchInputMapper* mappery);
3004 void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
3005 void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
3006 void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
3007 void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
3008 void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
3009 void processSync(SingleTouchInputMapper* mapper);
3010};
3011
3012void SingleTouchInputMapperTest::prepareButtons() {
3013 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
3014}
3015
3016void SingleTouchInputMapperTest::prepareAxes(int axes) {
3017 if (axes & POSITION) {
3018 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
3019 RAW_X_MIN, RAW_X_MAX, 0, 0);
3020 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
3021 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3022 }
3023 if (axes & PRESSURE) {
3024 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
3025 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3026 }
3027 if (axes & TOOL) {
3028 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
3029 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3030 }
3031 if (axes & DISTANCE) {
3032 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
3033 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3034 }
3035 if (axes & TILT) {
3036 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
3037 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3038 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
3039 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3040 }
3041}
3042
3043void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
3044 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 1);
3045 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
3046 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
3047}
3048
3049void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
3050 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
3051 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
3052}
3053
3054void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
3055 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0);
3056}
3057
3058void SingleTouchInputMapperTest::processPressure(
3059 SingleTouchInputMapper* mapper, int32_t pressure) {
3060 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, pressure);
3061}
3062
3063void SingleTouchInputMapperTest::processToolMajor(
3064 SingleTouchInputMapper* mapper, int32_t toolMajor) {
3065 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
3066}
3067
3068void SingleTouchInputMapperTest::processDistance(
3069 SingleTouchInputMapper* mapper, int32_t distance) {
3070 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_DISTANCE, distance);
3071}
3072
3073void SingleTouchInputMapperTest::processTilt(
3074 SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
3075 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_X, tiltX);
3076 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_Y, tiltY);
3077}
3078
3079void SingleTouchInputMapperTest::processKey(
3080 SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
3081 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
3082}
3083
3084void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
3085 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
3086}
3087
3088
3089TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
3090 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3091 prepareButtons();
3092 prepareAxes(POSITION);
3093 addMapperAndConfigure(mapper);
3094
3095 ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
3096}
3097
3098TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
3099 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3100 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
3101 mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
3102 prepareButtons();
3103 prepareAxes(POSITION);
3104 addMapperAndConfigure(mapper);
3105
3106 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3107}
3108
3109TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
3110 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3111 prepareButtons();
3112 prepareAxes(POSITION);
3113 addConfigurationProperty("touch.deviceType", "touchPad");
3114 addMapperAndConfigure(mapper);
3115
3116 ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3117}
3118
3119TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
3120 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3121 prepareButtons();
3122 prepareAxes(POSITION);
3123 addConfigurationProperty("touch.deviceType", "touchScreen");
3124 addMapperAndConfigure(mapper);
3125
3126 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
3127}
3128
3129TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
3130 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3131 addConfigurationProperty("touch.deviceType", "touchScreen");
3132 prepareDisplay(DISPLAY_ORIENTATION_0);
3133 prepareButtons();
3134 prepareAxes(POSITION);
3135 prepareVirtualKeys();
3136 addMapperAndConfigure(mapper);
3137
3138 // Unknown key.
3139 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
3140
3141 // Virtual key is down.
3142 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3143 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3144 processDown(mapper, x, y);
3145 processSync(mapper);
3146 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3147
3148 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3149
3150 // Virtual key is up.
3151 processUp(mapper);
3152 processSync(mapper);
3153 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3154
3155 ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3156}
3157
3158TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
3159 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3160 addConfigurationProperty("touch.deviceType", "touchScreen");
3161 prepareDisplay(DISPLAY_ORIENTATION_0);
3162 prepareButtons();
3163 prepareAxes(POSITION);
3164 prepareVirtualKeys();
3165 addMapperAndConfigure(mapper);
3166
3167 // Unknown key.
3168 ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
3169
3170 // Virtual key is down.
3171 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3172 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3173 processDown(mapper, x, y);
3174 processSync(mapper);
3175 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3176
3177 ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3178
3179 // Virtual key is up.
3180 processUp(mapper);
3181 processSync(mapper);
3182 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3183
3184 ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3185}
3186
3187TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
3188 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3189 addConfigurationProperty("touch.deviceType", "touchScreen");
3190 prepareDisplay(DISPLAY_ORIENTATION_0);
3191 prepareButtons();
3192 prepareAxes(POSITION);
3193 prepareVirtualKeys();
3194 addMapperAndConfigure(mapper);
3195
3196 const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
3197 uint8_t flags[2] = { 0, 0 };
3198 ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
3199 ASSERT_TRUE(flags[0]);
3200 ASSERT_FALSE(flags[1]);
3201}
3202
3203TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
3204 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3205 addConfigurationProperty("touch.deviceType", "touchScreen");
3206 prepareDisplay(DISPLAY_ORIENTATION_0);
3207 prepareButtons();
3208 prepareAxes(POSITION);
3209 prepareVirtualKeys();
3210 addMapperAndConfigure(mapper);
3211
3212 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3213
3214 NotifyKeyArgs args;
3215
3216 // Press virtual key.
3217 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3218 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3219 processDown(mapper, x, y);
3220 processSync(mapper);
3221
3222 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3223 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3224 ASSERT_EQ(DEVICE_ID, args.deviceId);
3225 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3226 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3227 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
3228 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3229 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3230 ASSERT_EQ(KEY_HOME, args.scanCode);
3231 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3232 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3233
3234 // Release virtual key.
3235 processUp(mapper);
3236 processSync(mapper);
3237
3238 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3239 ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3240 ASSERT_EQ(DEVICE_ID, args.deviceId);
3241 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3242 ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3243 ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
3244 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3245 ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3246 ASSERT_EQ(KEY_HOME, args.scanCode);
3247 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3248 ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3249
3250 // Should not have sent any motions.
3251 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3252}
3253
3254TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
3255 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3256 addConfigurationProperty("touch.deviceType", "touchScreen");
3257 prepareDisplay(DISPLAY_ORIENTATION_0);
3258 prepareButtons();
3259 prepareAxes(POSITION);
3260 prepareVirtualKeys();
3261 addMapperAndConfigure(mapper);
3262
3263 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3264
3265 NotifyKeyArgs keyArgs;
3266
3267 // Press virtual key.
3268 int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3269 int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3270 processDown(mapper, x, y);
3271 processSync(mapper);
3272
3273 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3274 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3275 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3276 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3277 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3278 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3279 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
3280 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3281 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3282 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3283 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3284
3285 // Move out of bounds. This should generate a cancel and a pointer down since we moved
3286 // into the display area.
3287 y -= 100;
3288 processMove(mapper, x, y);
3289 processSync(mapper);
3290
3291 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3292 ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3293 ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3294 ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3295 ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3296 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3297 ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
3298 | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
3299 ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3300 ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3301 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3302 ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3303
3304 NotifyMotionArgs motionArgs;
3305 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3306 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3307 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3308 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3309 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3310 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3311 ASSERT_EQ(0, motionArgs.flags);
3312 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3313 ASSERT_EQ(0, motionArgs.buttonState);
3314 ASSERT_EQ(0, motionArgs.edgeFlags);
3315 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3316 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3317 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3318 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3319 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3320 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3321 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3322 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3323
3324 // Keep moving out of bounds. Should generate a pointer move.
3325 y -= 50;
3326 processMove(mapper, x, y);
3327 processSync(mapper);
3328
3329 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3330 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3331 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3332 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3333 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3334 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3335 ASSERT_EQ(0, motionArgs.flags);
3336 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3337 ASSERT_EQ(0, motionArgs.buttonState);
3338 ASSERT_EQ(0, motionArgs.edgeFlags);
3339 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3340 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3341 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3342 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3343 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3344 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3345 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3346 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3347
3348 // Release out of bounds. Should generate a pointer up.
3349 processUp(mapper);
3350 processSync(mapper);
3351
3352 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3353 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3354 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3355 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3356 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3357 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3358 ASSERT_EQ(0, motionArgs.flags);
3359 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3360 ASSERT_EQ(0, motionArgs.buttonState);
3361 ASSERT_EQ(0, motionArgs.edgeFlags);
3362 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3363 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3364 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3365 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3366 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3367 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3368 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3369 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3370
3371 // Should not have sent any more keys or motions.
3372 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3373 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3374}
3375
3376TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
3377 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3378 addConfigurationProperty("touch.deviceType", "touchScreen");
3379 prepareDisplay(DISPLAY_ORIENTATION_0);
3380 prepareButtons();
3381 prepareAxes(POSITION);
3382 prepareVirtualKeys();
3383 addMapperAndConfigure(mapper);
3384
3385 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3386
3387 NotifyMotionArgs motionArgs;
3388
3389 // Initially go down out of bounds.
3390 int32_t x = -10;
3391 int32_t y = -10;
3392 processDown(mapper, x, y);
3393 processSync(mapper);
3394
3395 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3396
3397 // Move into the display area. Should generate a pointer down.
3398 x = 50;
3399 y = 75;
3400 processMove(mapper, x, y);
3401 processSync(mapper);
3402
3403 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3404 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3405 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3406 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3407 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3408 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3409 ASSERT_EQ(0, motionArgs.flags);
3410 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3411 ASSERT_EQ(0, motionArgs.buttonState);
3412 ASSERT_EQ(0, motionArgs.edgeFlags);
3413 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3414 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3415 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3416 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3417 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3418 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3419 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3420 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3421
3422 // Release. Should generate a pointer up.
3423 processUp(mapper);
3424 processSync(mapper);
3425
3426 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3427 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3428 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3429 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3430 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3431 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3432 ASSERT_EQ(0, motionArgs.flags);
3433 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3434 ASSERT_EQ(0, motionArgs.buttonState);
3435 ASSERT_EQ(0, motionArgs.edgeFlags);
3436 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3437 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3438 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3439 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3440 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3441 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3442 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3443 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3444
3445 // Should not have sent any more keys or motions.
3446 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3447 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3448}
3449
3450TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
3451 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3452 addConfigurationProperty("touch.deviceType", "touchScreen");
3453 prepareDisplay(DISPLAY_ORIENTATION_0);
3454 prepareButtons();
3455 prepareAxes(POSITION);
3456 prepareVirtualKeys();
3457 addMapperAndConfigure(mapper);
3458
3459 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3460
3461 NotifyMotionArgs motionArgs;
3462
3463 // Down.
3464 int32_t x = 100;
3465 int32_t y = 125;
3466 processDown(mapper, x, y);
3467 processSync(mapper);
3468
3469 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3470 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3471 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3472 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3473 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3474 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3475 ASSERT_EQ(0, motionArgs.flags);
3476 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3477 ASSERT_EQ(0, motionArgs.buttonState);
3478 ASSERT_EQ(0, motionArgs.edgeFlags);
3479 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3480 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3481 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3482 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3483 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3484 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3485 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3486 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3487
3488 // Move.
3489 x += 50;
3490 y += 75;
3491 processMove(mapper, x, y);
3492 processSync(mapper);
3493
3494 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3495 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3496 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3497 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3498 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3499 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3500 ASSERT_EQ(0, motionArgs.flags);
3501 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3502 ASSERT_EQ(0, motionArgs.buttonState);
3503 ASSERT_EQ(0, motionArgs.edgeFlags);
3504 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3505 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3506 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3507 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3508 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3509 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3510 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3511 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3512
3513 // Up.
3514 processUp(mapper);
3515 processSync(mapper);
3516
3517 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3518 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3519 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3520 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3521 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3522 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3523 ASSERT_EQ(0, motionArgs.flags);
3524 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3525 ASSERT_EQ(0, motionArgs.buttonState);
3526 ASSERT_EQ(0, motionArgs.edgeFlags);
3527 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3528 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3529 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3530 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3531 toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3532 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3533 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3534 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3535
3536 // Should not have sent any more keys or motions.
3537 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3538 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3539}
3540
3541TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
3542 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3543 addConfigurationProperty("touch.deviceType", "touchScreen");
3544 prepareButtons();
3545 prepareAxes(POSITION);
3546 addConfigurationProperty("touch.orientationAware", "0");
3547 addMapperAndConfigure(mapper);
3548
3549 NotifyMotionArgs args;
3550
3551 // Rotation 90.
3552 prepareDisplay(DISPLAY_ORIENTATION_90);
3553 processDown(mapper, toRawX(50), toRawY(75));
3554 processSync(mapper);
3555
3556 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3557 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3558 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3559
3560 processUp(mapper);
3561 processSync(mapper);
3562 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3563}
3564
3565TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
3566 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3567 addConfigurationProperty("touch.deviceType", "touchScreen");
3568 prepareButtons();
3569 prepareAxes(POSITION);
3570 addMapperAndConfigure(mapper);
3571
3572 NotifyMotionArgs args;
3573
3574 // Rotation 0.
3575 prepareDisplay(DISPLAY_ORIENTATION_0);
3576 processDown(mapper, toRawX(50), toRawY(75));
3577 processSync(mapper);
3578
3579 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3580 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3581 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3582
3583 processUp(mapper);
3584 processSync(mapper);
3585 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3586
3587 // Rotation 90.
3588 prepareDisplay(DISPLAY_ORIENTATION_90);
3589 processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
3590 processSync(mapper);
3591
3592 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3593 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3594 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3595
3596 processUp(mapper);
3597 processSync(mapper);
3598 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3599
3600 // Rotation 180.
3601 prepareDisplay(DISPLAY_ORIENTATION_180);
3602 processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
3603 processSync(mapper);
3604
3605 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3606 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3607 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3608
3609 processUp(mapper);
3610 processSync(mapper);
3611 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3612
3613 // Rotation 270.
3614 prepareDisplay(DISPLAY_ORIENTATION_270);
3615 processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
3616 processSync(mapper);
3617
3618 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3619 ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3620 ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3621
3622 processUp(mapper);
3623 processSync(mapper);
3624 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3625}
3626
3627TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
3628 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3629 addConfigurationProperty("touch.deviceType", "touchScreen");
3630 prepareDisplay(DISPLAY_ORIENTATION_0);
3631 prepareButtons();
3632 prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
3633 addMapperAndConfigure(mapper);
3634
3635 // These calculations are based on the input device calibration documentation.
3636 int32_t rawX = 100;
3637 int32_t rawY = 200;
3638 int32_t rawPressure = 10;
3639 int32_t rawToolMajor = 12;
3640 int32_t rawDistance = 2;
3641 int32_t rawTiltX = 30;
3642 int32_t rawTiltY = 110;
3643
3644 float x = toDisplayX(rawX);
3645 float y = toDisplayY(rawY);
3646 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
3647 float size = float(rawToolMajor) / RAW_TOOL_MAX;
3648 float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
3649 float distance = float(rawDistance);
3650
3651 float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
3652 float tiltScale = M_PI / 180;
3653 float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
3654 float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
3655 float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
3656 float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
3657
3658 processDown(mapper, rawX, rawY);
3659 processPressure(mapper, rawPressure);
3660 processToolMajor(mapper, rawToolMajor);
3661 processDistance(mapper, rawDistance);
3662 processTilt(mapper, rawTiltX, rawTiltY);
3663 processSync(mapper);
3664
3665 NotifyMotionArgs args;
3666 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3667 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3668 x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
3669 ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
3670}
3671
Jason Gerecke489fda82012-09-07 17:19:40 -07003672TEST_F(SingleTouchInputMapperTest, Process_XYAxes_AffineCalibration) {
3673 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3674 addConfigurationProperty("touch.deviceType", "touchScreen");
3675 prepareDisplay(DISPLAY_ORIENTATION_0);
3676 prepareLocationCalibration();
3677 prepareButtons();
3678 prepareAxes(POSITION);
3679 addMapperAndConfigure(mapper);
3680
3681 int32_t rawX = 100;
3682 int32_t rawY = 200;
3683
3684 float x = toDisplayX(toCookedX(rawX, rawY));
3685 float y = toDisplayY(toCookedY(rawX, rawY));
3686
3687 processDown(mapper, rawX, rawY);
3688 processSync(mapper);
3689
3690 NotifyMotionArgs args;
3691 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3692 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3693 x, y, 1, 0, 0, 0, 0, 0, 0, 0));
3694}
3695
Michael Wrightd02c5b62014-02-10 15:10:22 -08003696TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
3697 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3698 addConfigurationProperty("touch.deviceType", "touchScreen");
3699 prepareDisplay(DISPLAY_ORIENTATION_0);
3700 prepareButtons();
3701 prepareAxes(POSITION);
3702 addMapperAndConfigure(mapper);
3703
3704 NotifyMotionArgs motionArgs;
3705 NotifyKeyArgs keyArgs;
3706
3707 processDown(mapper, 100, 200);
3708 processSync(mapper);
3709 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3710 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3711 ASSERT_EQ(0, motionArgs.buttonState);
3712
3713 // press BTN_LEFT, release BTN_LEFT
3714 processKey(mapper, BTN_LEFT, 1);
3715 processSync(mapper);
3716 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3717 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3718 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
3719
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003720 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3721 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3722 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
3723
Michael Wrightd02c5b62014-02-10 15:10:22 -08003724 processKey(mapper, BTN_LEFT, 0);
3725 processSync(mapper);
3726 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003727 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003728 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003729
3730 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003731 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003732 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003733
3734 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
3735 processKey(mapper, BTN_RIGHT, 1);
3736 processKey(mapper, BTN_MIDDLE, 1);
3737 processSync(mapper);
3738 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3739 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3740 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
3741 motionArgs.buttonState);
3742
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003743 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3744 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3745 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
3746
3747 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3748 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3749 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
3750 motionArgs.buttonState);
3751
Michael Wrightd02c5b62014-02-10 15:10:22 -08003752 processKey(mapper, BTN_RIGHT, 0);
3753 processSync(mapper);
3754 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003755 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003756 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003757
3758 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003759 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003760 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003761
3762 processKey(mapper, BTN_MIDDLE, 0);
3763 processSync(mapper);
3764 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003765 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003766 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003767
3768 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003769 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003770 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003771
3772 // press BTN_BACK, release BTN_BACK
3773 processKey(mapper, BTN_BACK, 1);
3774 processSync(mapper);
3775 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3776 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3777 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003778
Michael Wrightd02c5b62014-02-10 15:10:22 -08003779 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003780 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003781 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3782
3783 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3784 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3785 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003786
3787 processKey(mapper, BTN_BACK, 0);
3788 processSync(mapper);
3789 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003790 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003791 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003792
3793 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003794 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003795 ASSERT_EQ(0, motionArgs.buttonState);
3796
Michael Wrightd02c5b62014-02-10 15:10:22 -08003797 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3798 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3799 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3800
3801 // press BTN_SIDE, release BTN_SIDE
3802 processKey(mapper, BTN_SIDE, 1);
3803 processSync(mapper);
3804 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3805 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3806 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003807
Michael Wrightd02c5b62014-02-10 15:10:22 -08003808 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003809 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003810 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3811
3812 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3813 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3814 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003815
3816 processKey(mapper, BTN_SIDE, 0);
3817 processSync(mapper);
3818 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003819 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003820 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003821
3822 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003823 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003824 ASSERT_EQ(0, motionArgs.buttonState);
3825
Michael Wrightd02c5b62014-02-10 15:10:22 -08003826 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3827 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3828 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3829
3830 // press BTN_FORWARD, release BTN_FORWARD
3831 processKey(mapper, BTN_FORWARD, 1);
3832 processSync(mapper);
3833 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3834 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3835 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003836
Michael Wrightd02c5b62014-02-10 15:10:22 -08003837 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003838 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003839 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3840
3841 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3842 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3843 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003844
3845 processKey(mapper, BTN_FORWARD, 0);
3846 processSync(mapper);
3847 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003848 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003849 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003850
3851 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003852 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003853 ASSERT_EQ(0, motionArgs.buttonState);
3854
Michael Wrightd02c5b62014-02-10 15:10:22 -08003855 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3856 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3857 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3858
3859 // press BTN_EXTRA, release BTN_EXTRA
3860 processKey(mapper, BTN_EXTRA, 1);
3861 processSync(mapper);
3862 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3863 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3864 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003865
Michael Wrightd02c5b62014-02-10 15:10:22 -08003866 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003867 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003868 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3869
3870 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3871 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3872 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003873
3874 processKey(mapper, BTN_EXTRA, 0);
3875 processSync(mapper);
3876 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003877 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003878 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003879
3880 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003881 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003882 ASSERT_EQ(0, motionArgs.buttonState);
3883
Michael Wrightd02c5b62014-02-10 15:10:22 -08003884 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3885 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3886 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3887
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003888 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3889
Michael Wrightd02c5b62014-02-10 15:10:22 -08003890 // press BTN_STYLUS, release BTN_STYLUS
3891 processKey(mapper, BTN_STYLUS, 1);
3892 processSync(mapper);
3893 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3894 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003895 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
3896
3897 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3898 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3899 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003900
3901 processKey(mapper, BTN_STYLUS, 0);
3902 processSync(mapper);
3903 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003904 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003905 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003906
3907 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003908 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003909 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003910
3911 // press BTN_STYLUS2, release BTN_STYLUS2
3912 processKey(mapper, BTN_STYLUS2, 1);
3913 processSync(mapper);
3914 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3915 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003916 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
3917
3918 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3919 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3920 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003921
3922 processKey(mapper, BTN_STYLUS2, 0);
3923 processSync(mapper);
3924 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003925 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003926 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003927
3928 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08003929 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08003930 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08003931
3932 // release touch
3933 processUp(mapper);
3934 processSync(mapper);
3935 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3936 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3937 ASSERT_EQ(0, motionArgs.buttonState);
3938}
3939
3940TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
3941 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3942 addConfigurationProperty("touch.deviceType", "touchScreen");
3943 prepareDisplay(DISPLAY_ORIENTATION_0);
3944 prepareButtons();
3945 prepareAxes(POSITION);
3946 addMapperAndConfigure(mapper);
3947
3948 NotifyMotionArgs motionArgs;
3949
3950 // default tool type is finger
3951 processDown(mapper, 100, 200);
3952 processSync(mapper);
3953 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3954 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3955 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3956
3957 // eraser
3958 processKey(mapper, BTN_TOOL_RUBBER, 1);
3959 processSync(mapper);
3960 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3961 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3962 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
3963
3964 // stylus
3965 processKey(mapper, BTN_TOOL_RUBBER, 0);
3966 processKey(mapper, BTN_TOOL_PEN, 1);
3967 processSync(mapper);
3968 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3969 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3970 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3971
3972 // brush
3973 processKey(mapper, BTN_TOOL_PEN, 0);
3974 processKey(mapper, BTN_TOOL_BRUSH, 1);
3975 processSync(mapper);
3976 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3977 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3978 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3979
3980 // pencil
3981 processKey(mapper, BTN_TOOL_BRUSH, 0);
3982 processKey(mapper, BTN_TOOL_PENCIL, 1);
3983 processSync(mapper);
3984 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3985 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3986 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3987
3988 // airbrush
3989 processKey(mapper, BTN_TOOL_PENCIL, 0);
3990 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
3991 processSync(mapper);
3992 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3993 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3994 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3995
3996 // mouse
3997 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
3998 processKey(mapper, BTN_TOOL_MOUSE, 1);
3999 processSync(mapper);
4000 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4001 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4002 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4003
4004 // lens
4005 processKey(mapper, BTN_TOOL_MOUSE, 0);
4006 processKey(mapper, BTN_TOOL_LENS, 1);
4007 processSync(mapper);
4008 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4009 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4010 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4011
4012 // double-tap
4013 processKey(mapper, BTN_TOOL_LENS, 0);
4014 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4015 processSync(mapper);
4016 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4017 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4018 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4019
4020 // triple-tap
4021 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4022 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4023 processSync(mapper);
4024 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4025 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4026 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4027
4028 // quad-tap
4029 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4030 processKey(mapper, BTN_TOOL_QUADTAP, 1);
4031 processSync(mapper);
4032 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4033 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4034 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4035
4036 // finger
4037 processKey(mapper, BTN_TOOL_QUADTAP, 0);
4038 processKey(mapper, BTN_TOOL_FINGER, 1);
4039 processSync(mapper);
4040 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4041 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4042 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4043
4044 // stylus trumps finger
4045 processKey(mapper, BTN_TOOL_PEN, 1);
4046 processSync(mapper);
4047 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4048 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4049 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4050
4051 // eraser trumps stylus
4052 processKey(mapper, BTN_TOOL_RUBBER, 1);
4053 processSync(mapper);
4054 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4055 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4056 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4057
4058 // mouse trumps eraser
4059 processKey(mapper, BTN_TOOL_MOUSE, 1);
4060 processSync(mapper);
4061 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4062 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4063 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4064
4065 // back to default tool type
4066 processKey(mapper, BTN_TOOL_MOUSE, 0);
4067 processKey(mapper, BTN_TOOL_RUBBER, 0);
4068 processKey(mapper, BTN_TOOL_PEN, 0);
4069 processKey(mapper, BTN_TOOL_FINGER, 0);
4070 processSync(mapper);
4071 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4072 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4073 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4074}
4075
4076TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
4077 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4078 addConfigurationProperty("touch.deviceType", "touchScreen");
4079 prepareDisplay(DISPLAY_ORIENTATION_0);
4080 prepareButtons();
4081 prepareAxes(POSITION);
4082 mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
4083 addMapperAndConfigure(mapper);
4084
4085 NotifyMotionArgs motionArgs;
4086
4087 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
4088 processKey(mapper, BTN_TOOL_FINGER, 1);
4089 processMove(mapper, 100, 200);
4090 processSync(mapper);
4091 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4092 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4093 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4094 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4095
4096 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4097 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4098 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4099 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4100
4101 // move a little
4102 processMove(mapper, 150, 250);
4103 processSync(mapper);
4104 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4105 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4106 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4107 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4108
4109 // down when BTN_TOUCH is pressed, pressure defaults to 1
4110 processKey(mapper, BTN_TOUCH, 1);
4111 processSync(mapper);
4112 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4113 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4114 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4115 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4116
4117 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4118 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4119 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4120 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4121
4122 // up when BTN_TOUCH is released, hover restored
4123 processKey(mapper, BTN_TOUCH, 0);
4124 processSync(mapper);
4125 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4126 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4127 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4128 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4129
4130 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4131 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4132 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4133 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4134
4135 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4136 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4137 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4138 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4139
4140 // exit hover when pointer goes away
4141 processKey(mapper, BTN_TOOL_FINGER, 0);
4142 processSync(mapper);
4143 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4144 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4145 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4146 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4147}
4148
4149TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
4150 SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4151 addConfigurationProperty("touch.deviceType", "touchScreen");
4152 prepareDisplay(DISPLAY_ORIENTATION_0);
4153 prepareButtons();
4154 prepareAxes(POSITION | PRESSURE);
4155 addMapperAndConfigure(mapper);
4156
4157 NotifyMotionArgs motionArgs;
4158
4159 // initially hovering because pressure is 0
4160 processDown(mapper, 100, 200);
4161 processPressure(mapper, 0);
4162 processSync(mapper);
4163 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4164 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4165 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4166 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4167
4168 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4169 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4170 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4171 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4172
4173 // move a little
4174 processMove(mapper, 150, 250);
4175 processSync(mapper);
4176 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4177 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4178 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4179 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4180
4181 // down when pressure is non-zero
4182 processPressure(mapper, RAW_PRESSURE_MAX);
4183 processSync(mapper);
4184 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4185 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4186 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4187 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4188
4189 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4190 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4191 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4192 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4193
4194 // up when pressure becomes 0, hover restored
4195 processPressure(mapper, 0);
4196 processSync(mapper);
4197 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4198 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4199 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4200 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4201
4202 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4203 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4204 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4205 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4206
4207 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4208 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4209 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4210 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4211
4212 // exit hover when pointer goes away
4213 processUp(mapper);
4214 processSync(mapper);
4215 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4216 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4217 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4218 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4219}
4220
4221
4222// --- MultiTouchInputMapperTest ---
4223
4224class MultiTouchInputMapperTest : public TouchInputMapperTest {
4225protected:
4226 void prepareAxes(int axes);
4227
4228 void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
4229 void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
4230 void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
4231 void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
4232 void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
4233 void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
4234 void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
4235 void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
4236 void processId(MultiTouchInputMapper* mapper, int32_t id);
4237 void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
4238 void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
4239 void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
4240 void processMTSync(MultiTouchInputMapper* mapper);
4241 void processSync(MultiTouchInputMapper* mapper);
4242};
4243
4244void MultiTouchInputMapperTest::prepareAxes(int axes) {
4245 if (axes & POSITION) {
4246 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
4247 RAW_X_MIN, RAW_X_MAX, 0, 0);
4248 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
4249 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
4250 }
4251 if (axes & TOUCH) {
4252 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
4253 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4254 if (axes & MINOR) {
4255 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
4256 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4257 }
4258 }
4259 if (axes & TOOL) {
4260 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
4261 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
4262 if (axes & MINOR) {
4263 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
4264 RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
4265 }
4266 }
4267 if (axes & ORIENTATION) {
4268 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
4269 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
4270 }
4271 if (axes & PRESSURE) {
4272 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
4273 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
4274 }
4275 if (axes & DISTANCE) {
4276 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
4277 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
4278 }
4279 if (axes & ID) {
4280 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
4281 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
4282 }
4283 if (axes & SLOT) {
4284 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
4285 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
4286 mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
4287 }
4288 if (axes & TOOL_TYPE) {
4289 mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
4290 0, MT_TOOL_MAX, 0, 0);
4291 }
4292}
4293
4294void MultiTouchInputMapperTest::processPosition(
4295 MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
4296 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, x);
4297 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, y);
4298}
4299
4300void MultiTouchInputMapperTest::processTouchMajor(
4301 MultiTouchInputMapper* mapper, int32_t touchMajor) {
4302 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
4303}
4304
4305void MultiTouchInputMapperTest::processTouchMinor(
4306 MultiTouchInputMapper* mapper, int32_t touchMinor) {
4307 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
4308}
4309
4310void MultiTouchInputMapperTest::processToolMajor(
4311 MultiTouchInputMapper* mapper, int32_t toolMajor) {
4312 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
4313}
4314
4315void MultiTouchInputMapperTest::processToolMinor(
4316 MultiTouchInputMapper* mapper, int32_t toolMinor) {
4317 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
4318}
4319
4320void MultiTouchInputMapperTest::processOrientation(
4321 MultiTouchInputMapper* mapper, int32_t orientation) {
4322 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, orientation);
4323}
4324
4325void MultiTouchInputMapperTest::processPressure(
4326 MultiTouchInputMapper* mapper, int32_t pressure) {
4327 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, pressure);
4328}
4329
4330void MultiTouchInputMapperTest::processDistance(
4331 MultiTouchInputMapper* mapper, int32_t distance) {
4332 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_DISTANCE, distance);
4333}
4334
4335void MultiTouchInputMapperTest::processId(
4336 MultiTouchInputMapper* mapper, int32_t id) {
4337 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, id);
4338}
4339
4340void MultiTouchInputMapperTest::processSlot(
4341 MultiTouchInputMapper* mapper, int32_t slot) {
4342 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_SLOT, slot);
4343}
4344
4345void MultiTouchInputMapperTest::processToolType(
4346 MultiTouchInputMapper* mapper, int32_t toolType) {
4347 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
4348}
4349
4350void MultiTouchInputMapperTest::processKey(
4351 MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
4352 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
4353}
4354
4355void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
4356 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0);
4357}
4358
4359void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
4360 process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
4361}
4362
4363
4364TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
4365 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4366 addConfigurationProperty("touch.deviceType", "touchScreen");
4367 prepareDisplay(DISPLAY_ORIENTATION_0);
4368 prepareAxes(POSITION);
4369 prepareVirtualKeys();
4370 addMapperAndConfigure(mapper);
4371
4372 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4373
4374 NotifyMotionArgs motionArgs;
4375
4376 // Two fingers down at once.
4377 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4378 processPosition(mapper, x1, y1);
4379 processMTSync(mapper);
4380 processPosition(mapper, x2, y2);
4381 processMTSync(mapper);
4382 processSync(mapper);
4383
4384 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4385 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4386 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4387 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4388 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4389 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4390 ASSERT_EQ(0, motionArgs.flags);
4391 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4392 ASSERT_EQ(0, motionArgs.buttonState);
4393 ASSERT_EQ(0, motionArgs.edgeFlags);
4394 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4395 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4396 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4397 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4398 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4399 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4400 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4401 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4402
4403 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4404 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4405 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4406 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4407 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4408 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4409 motionArgs.action);
4410 ASSERT_EQ(0, motionArgs.flags);
4411 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4412 ASSERT_EQ(0, motionArgs.buttonState);
4413 ASSERT_EQ(0, motionArgs.edgeFlags);
4414 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4415 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4416 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4417 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4418 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4419 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4420 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4421 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4422 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4423 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4424 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4425 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4426
4427 // Move.
4428 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4429 processPosition(mapper, x1, y1);
4430 processMTSync(mapper);
4431 processPosition(mapper, x2, y2);
4432 processMTSync(mapper);
4433 processSync(mapper);
4434
4435 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4436 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4437 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4438 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4439 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4440 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4441 ASSERT_EQ(0, motionArgs.flags);
4442 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4443 ASSERT_EQ(0, motionArgs.buttonState);
4444 ASSERT_EQ(0, motionArgs.edgeFlags);
4445 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4446 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4447 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4448 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4449 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4450 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4451 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4452 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4453 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4454 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4455 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4456 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4457
4458 // First finger up.
4459 x2 += 15; y2 -= 20;
4460 processPosition(mapper, x2, y2);
4461 processMTSync(mapper);
4462 processSync(mapper);
4463
4464 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4465 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4466 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4467 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4468 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4469 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4470 motionArgs.action);
4471 ASSERT_EQ(0, motionArgs.flags);
4472 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4473 ASSERT_EQ(0, motionArgs.buttonState);
4474 ASSERT_EQ(0, motionArgs.edgeFlags);
4475 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4476 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4477 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4478 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4479 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4480 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4481 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4482 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4483 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4484 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4485 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4486 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4487
4488 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4489 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4490 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4491 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4492 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4493 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4494 ASSERT_EQ(0, motionArgs.flags);
4495 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4496 ASSERT_EQ(0, motionArgs.buttonState);
4497 ASSERT_EQ(0, motionArgs.edgeFlags);
4498 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4499 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4500 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4501 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4502 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4503 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4504 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4505 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4506
4507 // Move.
4508 x2 += 20; y2 -= 25;
4509 processPosition(mapper, x2, y2);
4510 processMTSync(mapper);
4511 processSync(mapper);
4512
4513 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4514 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4515 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4516 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4517 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4518 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4519 ASSERT_EQ(0, motionArgs.flags);
4520 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4521 ASSERT_EQ(0, motionArgs.buttonState);
4522 ASSERT_EQ(0, motionArgs.edgeFlags);
4523 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4524 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4525 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4526 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4527 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4528 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4529 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4530 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4531
4532 // New finger down.
4533 int32_t x3 = 700, y3 = 300;
4534 processPosition(mapper, x2, y2);
4535 processMTSync(mapper);
4536 processPosition(mapper, x3, y3);
4537 processMTSync(mapper);
4538 processSync(mapper);
4539
4540 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4541 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4542 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4543 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4544 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4545 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4546 motionArgs.action);
4547 ASSERT_EQ(0, motionArgs.flags);
4548 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4549 ASSERT_EQ(0, motionArgs.buttonState);
4550 ASSERT_EQ(0, motionArgs.edgeFlags);
4551 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4552 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4553 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4554 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4555 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4556 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4557 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4558 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4559 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4560 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4561 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4562 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4563
4564 // Second finger up.
4565 x3 += 30; y3 -= 20;
4566 processPosition(mapper, x3, y3);
4567 processMTSync(mapper);
4568 processSync(mapper);
4569
4570 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4571 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4572 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4573 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4574 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4575 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4576 motionArgs.action);
4577 ASSERT_EQ(0, motionArgs.flags);
4578 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4579 ASSERT_EQ(0, motionArgs.buttonState);
4580 ASSERT_EQ(0, motionArgs.edgeFlags);
4581 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4582 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4583 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4584 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4585 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4586 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4587 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4588 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4589 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4590 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4591 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4592 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4593
4594 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4595 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4596 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4597 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4598 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4599 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4600 ASSERT_EQ(0, motionArgs.flags);
4601 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4602 ASSERT_EQ(0, motionArgs.buttonState);
4603 ASSERT_EQ(0, motionArgs.edgeFlags);
4604 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4605 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4606 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4607 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4608 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4609 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4610 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4611 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4612
4613 // Last finger up.
4614 processMTSync(mapper);
4615 processSync(mapper);
4616
4617 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4618 ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4619 ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4620 ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4621 ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4622 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4623 ASSERT_EQ(0, motionArgs.flags);
4624 ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4625 ASSERT_EQ(0, motionArgs.buttonState);
4626 ASSERT_EQ(0, motionArgs.edgeFlags);
4627 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4628 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4629 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4630 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4631 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4632 ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4633 ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4634 ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4635
4636 // Should not have sent any more keys or motions.
4637 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4638 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4639}
4640
4641TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
4642 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4643 addConfigurationProperty("touch.deviceType", "touchScreen");
4644 prepareDisplay(DISPLAY_ORIENTATION_0);
4645 prepareAxes(POSITION | ID);
4646 prepareVirtualKeys();
4647 addMapperAndConfigure(mapper);
4648
4649 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4650
4651 NotifyMotionArgs motionArgs;
4652
4653 // Two fingers down at once.
4654 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4655 processPosition(mapper, x1, y1);
4656 processId(mapper, 1);
4657 processMTSync(mapper);
4658 processPosition(mapper, x2, y2);
4659 processId(mapper, 2);
4660 processMTSync(mapper);
4661 processSync(mapper);
4662
4663 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4664 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4665 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4666 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4667 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4668 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4669 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4670
4671 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4672 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4673 motionArgs.action);
4674 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4675 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4676 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4677 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4678 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4679 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4680 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4681 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4682 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4683
4684 // Move.
4685 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4686 processPosition(mapper, x1, y1);
4687 processId(mapper, 1);
4688 processMTSync(mapper);
4689 processPosition(mapper, x2, y2);
4690 processId(mapper, 2);
4691 processMTSync(mapper);
4692 processSync(mapper);
4693
4694 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4695 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4696 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4697 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4698 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4699 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4700 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4701 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4702 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4703 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4704 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4705
4706 // First finger up.
4707 x2 += 15; y2 -= 20;
4708 processPosition(mapper, x2, y2);
4709 processId(mapper, 2);
4710 processMTSync(mapper);
4711 processSync(mapper);
4712
4713 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4714 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4715 motionArgs.action);
4716 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4717 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4718 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4719 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4720 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4721 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4722 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4723 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4724 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4725
4726 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4727 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4728 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4729 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4730 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4731 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4732 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4733
4734 // Move.
4735 x2 += 20; y2 -= 25;
4736 processPosition(mapper, x2, y2);
4737 processId(mapper, 2);
4738 processMTSync(mapper);
4739 processSync(mapper);
4740
4741 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4742 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4743 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4744 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4745 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4746 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4747 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4748
4749 // New finger down.
4750 int32_t x3 = 700, y3 = 300;
4751 processPosition(mapper, x2, y2);
4752 processId(mapper, 2);
4753 processMTSync(mapper);
4754 processPosition(mapper, x3, y3);
4755 processId(mapper, 3);
4756 processMTSync(mapper);
4757 processSync(mapper);
4758
4759 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4760 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4761 motionArgs.action);
4762 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4763 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4764 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4765 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4766 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4767 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4768 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4769 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4770 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4771
4772 // Second finger up.
4773 x3 += 30; y3 -= 20;
4774 processPosition(mapper, x3, y3);
4775 processId(mapper, 3);
4776 processMTSync(mapper);
4777 processSync(mapper);
4778
4779 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4780 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4781 motionArgs.action);
4782 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4783 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4784 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4785 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4786 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4787 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4788 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4789 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4790 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4791
4792 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4793 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4794 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4795 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4796 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4797 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4798 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4799
4800 // Last finger up.
4801 processMTSync(mapper);
4802 processSync(mapper);
4803
4804 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4805 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4806 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4807 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4808 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4809 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4810 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4811
4812 // Should not have sent any more keys or motions.
4813 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4814 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4815}
4816
4817TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
4818 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4819 addConfigurationProperty("touch.deviceType", "touchScreen");
4820 prepareDisplay(DISPLAY_ORIENTATION_0);
4821 prepareAxes(POSITION | ID | SLOT);
4822 prepareVirtualKeys();
4823 addMapperAndConfigure(mapper);
4824
4825 mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4826
4827 NotifyMotionArgs motionArgs;
4828
4829 // Two fingers down at once.
4830 int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4831 processPosition(mapper, x1, y1);
4832 processId(mapper, 1);
4833 processSlot(mapper, 1);
4834 processPosition(mapper, x2, y2);
4835 processId(mapper, 2);
4836 processSync(mapper);
4837
4838 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4839 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4840 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4841 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4842 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4843 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4844 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4845
4846 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4847 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4848 motionArgs.action);
4849 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4850 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4851 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4852 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4853 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4854 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4855 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4856 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4857 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4858
4859 // Move.
4860 x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4861 processSlot(mapper, 0);
4862 processPosition(mapper, x1, y1);
4863 processSlot(mapper, 1);
4864 processPosition(mapper, x2, y2);
4865 processSync(mapper);
4866
4867 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4868 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4869 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4870 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4871 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4872 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4873 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4874 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4875 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4876 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4877 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4878
4879 // First finger up.
4880 x2 += 15; y2 -= 20;
4881 processSlot(mapper, 0);
4882 processId(mapper, -1);
4883 processSlot(mapper, 1);
4884 processPosition(mapper, x2, y2);
4885 processSync(mapper);
4886
4887 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4888 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4889 motionArgs.action);
4890 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4891 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4892 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4893 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4894 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4895 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4896 toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4897 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4898 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4899
4900 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4901 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4902 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4903 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4904 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4905 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4906 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4907
4908 // Move.
4909 x2 += 20; y2 -= 25;
4910 processPosition(mapper, x2, y2);
4911 processSync(mapper);
4912
4913 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4914 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4915 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4916 ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4917 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4918 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4919 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4920
4921 // New finger down.
4922 int32_t x3 = 700, y3 = 300;
4923 processPosition(mapper, x2, y2);
4924 processSlot(mapper, 0);
4925 processId(mapper, 3);
4926 processPosition(mapper, x3, y3);
4927 processSync(mapper);
4928
4929 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4930 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4931 motionArgs.action);
4932 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4933 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4934 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4935 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4936 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4937 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4938 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4939 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4940 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4941
4942 // Second finger up.
4943 x3 += 30; y3 -= 20;
4944 processSlot(mapper, 1);
4945 processId(mapper, -1);
4946 processSlot(mapper, 0);
4947 processPosition(mapper, x3, y3);
4948 processSync(mapper);
4949
4950 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4951 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4952 motionArgs.action);
4953 ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4954 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4955 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4956 ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4957 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4958 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4959 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4960 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4961 toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4962
4963 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4964 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4965 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4966 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4967 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4968 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4969 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4970
4971 // Last finger up.
4972 processId(mapper, -1);
4973 processSync(mapper);
4974
4975 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4976 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4977 ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4978 ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4979 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4980 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4981 toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4982
4983 // Should not have sent any more keys or motions.
4984 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4985 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4986}
4987
4988TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
4989 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4990 addConfigurationProperty("touch.deviceType", "touchScreen");
4991 prepareDisplay(DISPLAY_ORIENTATION_0);
4992 prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
4993 addMapperAndConfigure(mapper);
4994
4995 // These calculations are based on the input device calibration documentation.
4996 int32_t rawX = 100;
4997 int32_t rawY = 200;
4998 int32_t rawTouchMajor = 7;
4999 int32_t rawTouchMinor = 6;
5000 int32_t rawToolMajor = 9;
5001 int32_t rawToolMinor = 8;
5002 int32_t rawPressure = 11;
5003 int32_t rawDistance = 0;
5004 int32_t rawOrientation = 3;
5005 int32_t id = 5;
5006
5007 float x = toDisplayX(rawX);
5008 float y = toDisplayY(rawY);
5009 float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
5010 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5011 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5012 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5013 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5014 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5015 float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
5016 float distance = float(rawDistance);
5017
5018 processPosition(mapper, rawX, rawY);
5019 processTouchMajor(mapper, rawTouchMajor);
5020 processTouchMinor(mapper, rawTouchMinor);
5021 processToolMajor(mapper, rawToolMajor);
5022 processToolMinor(mapper, rawToolMinor);
5023 processPressure(mapper, rawPressure);
5024 processOrientation(mapper, rawOrientation);
5025 processDistance(mapper, rawDistance);
5026 processId(mapper, id);
5027 processMTSync(mapper);
5028 processSync(mapper);
5029
5030 NotifyMotionArgs args;
5031 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5032 ASSERT_EQ(0, args.pointerProperties[0].id);
5033 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5034 x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
5035 orientation, distance));
5036}
5037
5038TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
5039 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5040 addConfigurationProperty("touch.deviceType", "touchScreen");
5041 prepareDisplay(DISPLAY_ORIENTATION_0);
5042 prepareAxes(POSITION | TOUCH | TOOL | MINOR);
5043 addConfigurationProperty("touch.size.calibration", "geometric");
5044 addMapperAndConfigure(mapper);
5045
5046 // These calculations are based on the input device calibration documentation.
5047 int32_t rawX = 100;
5048 int32_t rawY = 200;
5049 int32_t rawTouchMajor = 140;
5050 int32_t rawTouchMinor = 120;
5051 int32_t rawToolMajor = 180;
5052 int32_t rawToolMinor = 160;
5053
5054 float x = toDisplayX(rawX);
5055 float y = toDisplayY(rawY);
5056 float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5057 float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5058 float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5059 float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5060 float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5061
5062 processPosition(mapper, rawX, rawY);
5063 processTouchMajor(mapper, rawTouchMajor);
5064 processTouchMinor(mapper, rawTouchMinor);
5065 processToolMajor(mapper, rawToolMajor);
5066 processToolMinor(mapper, rawToolMinor);
5067 processMTSync(mapper);
5068 processSync(mapper);
5069
5070 NotifyMotionArgs args;
5071 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5072 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5073 x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
5074}
5075
5076TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
5077 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5078 addConfigurationProperty("touch.deviceType", "touchScreen");
5079 prepareDisplay(DISPLAY_ORIENTATION_0);
5080 prepareAxes(POSITION | TOUCH | TOOL);
5081 addConfigurationProperty("touch.size.calibration", "diameter");
5082 addConfigurationProperty("touch.size.scale", "10");
5083 addConfigurationProperty("touch.size.bias", "160");
5084 addConfigurationProperty("touch.size.isSummed", "1");
5085 addMapperAndConfigure(mapper);
5086
5087 // These calculations are based on the input device calibration documentation.
5088 // Note: We only provide a single common touch/tool value because the device is assumed
5089 // not to emit separate values for each pointer (isSummed = 1).
5090 int32_t rawX = 100;
5091 int32_t rawY = 200;
5092 int32_t rawX2 = 150;
5093 int32_t rawY2 = 250;
5094 int32_t rawTouchMajor = 5;
5095 int32_t rawToolMajor = 8;
5096
5097 float x = toDisplayX(rawX);
5098 float y = toDisplayY(rawY);
5099 float x2 = toDisplayX(rawX2);
5100 float y2 = toDisplayY(rawY2);
5101 float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
5102 float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
5103 float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
5104
5105 processPosition(mapper, rawX, rawY);
5106 processTouchMajor(mapper, rawTouchMajor);
5107 processToolMajor(mapper, rawToolMajor);
5108 processMTSync(mapper);
5109 processPosition(mapper, rawX2, rawY2);
5110 processTouchMajor(mapper, rawTouchMajor);
5111 processToolMajor(mapper, rawToolMajor);
5112 processMTSync(mapper);
5113 processSync(mapper);
5114
5115 NotifyMotionArgs args;
5116 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5117 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
5118
5119 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5120 ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5121 args.action);
5122 ASSERT_EQ(size_t(2), args.pointerCount);
5123 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5124 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5125 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
5126 x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
5127}
5128
5129TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
5130 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5131 addConfigurationProperty("touch.deviceType", "touchScreen");
5132 prepareDisplay(DISPLAY_ORIENTATION_0);
5133 prepareAxes(POSITION | TOUCH | TOOL);
5134 addConfigurationProperty("touch.size.calibration", "area");
5135 addConfigurationProperty("touch.size.scale", "43");
5136 addConfigurationProperty("touch.size.bias", "3");
5137 addMapperAndConfigure(mapper);
5138
5139 // These calculations are based on the input device calibration documentation.
5140 int32_t rawX = 100;
5141 int32_t rawY = 200;
5142 int32_t rawTouchMajor = 5;
5143 int32_t rawToolMajor = 8;
5144
5145 float x = toDisplayX(rawX);
5146 float y = toDisplayY(rawY);
5147 float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
5148 float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
5149 float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
5150
5151 processPosition(mapper, rawX, rawY);
5152 processTouchMajor(mapper, rawTouchMajor);
5153 processToolMajor(mapper, rawToolMajor);
5154 processMTSync(mapper);
5155 processSync(mapper);
5156
5157 NotifyMotionArgs args;
5158 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5159 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5160 x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5161}
5162
5163TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
5164 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5165 addConfigurationProperty("touch.deviceType", "touchScreen");
5166 prepareDisplay(DISPLAY_ORIENTATION_0);
5167 prepareAxes(POSITION | PRESSURE);
5168 addConfigurationProperty("touch.pressure.calibration", "amplitude");
5169 addConfigurationProperty("touch.pressure.scale", "0.01");
5170 addMapperAndConfigure(mapper);
5171
5172 // These calculations are based on the input device calibration documentation.
5173 int32_t rawX = 100;
5174 int32_t rawY = 200;
5175 int32_t rawPressure = 60;
5176
5177 float x = toDisplayX(rawX);
5178 float y = toDisplayY(rawY);
5179 float pressure = float(rawPressure) * 0.01f;
5180
5181 processPosition(mapper, rawX, rawY);
5182 processPressure(mapper, rawPressure);
5183 processMTSync(mapper);
5184 processSync(mapper);
5185
5186 NotifyMotionArgs args;
5187 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5188 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5189 x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
5190}
5191
5192TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
5193 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5194 addConfigurationProperty("touch.deviceType", "touchScreen");
5195 prepareDisplay(DISPLAY_ORIENTATION_0);
5196 prepareAxes(POSITION | ID | SLOT);
5197 addMapperAndConfigure(mapper);
5198
5199 NotifyMotionArgs motionArgs;
5200 NotifyKeyArgs keyArgs;
5201
5202 processId(mapper, 1);
5203 processPosition(mapper, 100, 200);
5204 processSync(mapper);
5205 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5206 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5207 ASSERT_EQ(0, motionArgs.buttonState);
5208
5209 // press BTN_LEFT, release BTN_LEFT
5210 processKey(mapper, BTN_LEFT, 1);
5211 processSync(mapper);
5212 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5213 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5214 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5215
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005216 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5217 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5218 ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5219
Michael Wrightd02c5b62014-02-10 15:10:22 -08005220 processKey(mapper, BTN_LEFT, 0);
5221 processSync(mapper);
5222 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005223 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005224 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005225
5226 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005227 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005228 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005229
5230 // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
5231 processKey(mapper, BTN_RIGHT, 1);
5232 processKey(mapper, BTN_MIDDLE, 1);
5233 processSync(mapper);
5234 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5235 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5236 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5237 motionArgs.buttonState);
5238
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005239 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5240 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5241 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
5242
5243 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5244 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5245 ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5246 motionArgs.buttonState);
5247
Michael Wrightd02c5b62014-02-10 15:10:22 -08005248 processKey(mapper, BTN_RIGHT, 0);
5249 processSync(mapper);
5250 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005251 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005252 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005253
5254 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005255 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005256 ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005257
5258 processKey(mapper, BTN_MIDDLE, 0);
5259 processSync(mapper);
5260 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005261 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005262 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005263
5264 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005265 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005266 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005267
5268 // press BTN_BACK, release BTN_BACK
5269 processKey(mapper, BTN_BACK, 1);
5270 processSync(mapper);
5271 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5272 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5273 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005274
Michael Wrightd02c5b62014-02-10 15:10:22 -08005275 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005276 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005277 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5278
5279 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5280 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5281 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005282
5283 processKey(mapper, BTN_BACK, 0);
5284 processSync(mapper);
5285 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005286 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005287 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005288
5289 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005290 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005291 ASSERT_EQ(0, motionArgs.buttonState);
5292
Michael Wrightd02c5b62014-02-10 15:10:22 -08005293 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5294 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5295 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5296
5297 // press BTN_SIDE, release BTN_SIDE
5298 processKey(mapper, BTN_SIDE, 1);
5299 processSync(mapper);
5300 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5301 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5302 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005303
Michael Wrightd02c5b62014-02-10 15:10:22 -08005304 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005305 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005306 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5307
5308 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5309 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5310 ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005311
5312 processKey(mapper, BTN_SIDE, 0);
5313 processSync(mapper);
5314 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005315 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005316 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005317
5318 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005319 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005320 ASSERT_EQ(0, motionArgs.buttonState);
5321
Michael Wrightd02c5b62014-02-10 15:10:22 -08005322 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5323 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5324 ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5325
5326 // press BTN_FORWARD, release BTN_FORWARD
5327 processKey(mapper, BTN_FORWARD, 1);
5328 processSync(mapper);
5329 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5330 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5331 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005332
Michael Wrightd02c5b62014-02-10 15:10:22 -08005333 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005334 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005335 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5336
5337 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5338 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5339 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005340
5341 processKey(mapper, BTN_FORWARD, 0);
5342 processSync(mapper);
5343 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005344 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005345 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005346
5347 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005348 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005349 ASSERT_EQ(0, motionArgs.buttonState);
5350
Michael Wrightd02c5b62014-02-10 15:10:22 -08005351 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5352 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5353 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5354
5355 // press BTN_EXTRA, release BTN_EXTRA
5356 processKey(mapper, BTN_EXTRA, 1);
5357 processSync(mapper);
5358 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5359 ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5360 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005361
Michael Wrightd02c5b62014-02-10 15:10:22 -08005362 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005363 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005364 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5365
5366 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5367 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5368 ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005369
5370 processKey(mapper, BTN_EXTRA, 0);
5371 processSync(mapper);
5372 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005373 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005374 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005375
5376 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005377 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005378 ASSERT_EQ(0, motionArgs.buttonState);
5379
Michael Wrightd02c5b62014-02-10 15:10:22 -08005380 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5381 ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5382 ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5383
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005384 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5385
Michael Wrightd02c5b62014-02-10 15:10:22 -08005386 // press BTN_STYLUS, release BTN_STYLUS
5387 processKey(mapper, BTN_STYLUS, 1);
5388 processSync(mapper);
5389 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5390 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005391 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
5392
5393 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5394 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5395 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005396
5397 processKey(mapper, BTN_STYLUS, 0);
5398 processSync(mapper);
5399 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005400 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005401 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005402
5403 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005404 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005405 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005406
5407 // press BTN_STYLUS2, release BTN_STYLUS2
5408 processKey(mapper, BTN_STYLUS2, 1);
5409 processSync(mapper);
5410 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5411 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005412 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
5413
5414 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5415 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5416 ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005417
5418 processKey(mapper, BTN_STYLUS2, 0);
5419 processSync(mapper);
5420 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005421 ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005422 ASSERT_EQ(0, motionArgs.buttonState);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005423
5424 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
Michael Wrightd02c5b62014-02-10 15:10:22 -08005425 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
Vladislav Kaznacheevfb752582016-12-16 14:17:06 -08005426 ASSERT_EQ(0, motionArgs.buttonState);
Michael Wrightd02c5b62014-02-10 15:10:22 -08005427
5428 // release touch
5429 processId(mapper, -1);
5430 processSync(mapper);
5431 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5432 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5433 ASSERT_EQ(0, motionArgs.buttonState);
5434}
5435
5436TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
5437 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5438 addConfigurationProperty("touch.deviceType", "touchScreen");
5439 prepareDisplay(DISPLAY_ORIENTATION_0);
5440 prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
5441 addMapperAndConfigure(mapper);
5442
5443 NotifyMotionArgs motionArgs;
5444
5445 // default tool type is finger
5446 processId(mapper, 1);
5447 processPosition(mapper, 100, 200);
5448 processSync(mapper);
5449 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5450 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5451 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5452
5453 // eraser
5454 processKey(mapper, BTN_TOOL_RUBBER, 1);
5455 processSync(mapper);
5456 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5457 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5458 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5459
5460 // stylus
5461 processKey(mapper, BTN_TOOL_RUBBER, 0);
5462 processKey(mapper, BTN_TOOL_PEN, 1);
5463 processSync(mapper);
5464 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5465 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5466 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5467
5468 // brush
5469 processKey(mapper, BTN_TOOL_PEN, 0);
5470 processKey(mapper, BTN_TOOL_BRUSH, 1);
5471 processSync(mapper);
5472 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5473 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5474 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5475
5476 // pencil
5477 processKey(mapper, BTN_TOOL_BRUSH, 0);
5478 processKey(mapper, BTN_TOOL_PENCIL, 1);
5479 processSync(mapper);
5480 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5481 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5482 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5483
5484 // airbrush
5485 processKey(mapper, BTN_TOOL_PENCIL, 0);
5486 processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
5487 processSync(mapper);
5488 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5489 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5490 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5491
5492 // mouse
5493 processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
5494 processKey(mapper, BTN_TOOL_MOUSE, 1);
5495 processSync(mapper);
5496 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5497 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5498 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5499
5500 // lens
5501 processKey(mapper, BTN_TOOL_MOUSE, 0);
5502 processKey(mapper, BTN_TOOL_LENS, 1);
5503 processSync(mapper);
5504 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5505 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5506 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5507
5508 // double-tap
5509 processKey(mapper, BTN_TOOL_LENS, 0);
5510 processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
5511 processSync(mapper);
5512 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5513 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5514 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5515
5516 // triple-tap
5517 processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
5518 processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
5519 processSync(mapper);
5520 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5521 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5522 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5523
5524 // quad-tap
5525 processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
5526 processKey(mapper, BTN_TOOL_QUADTAP, 1);
5527 processSync(mapper);
5528 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5529 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5530 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5531
5532 // finger
5533 processKey(mapper, BTN_TOOL_QUADTAP, 0);
5534 processKey(mapper, BTN_TOOL_FINGER, 1);
5535 processSync(mapper);
5536 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5537 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5538 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5539
5540 // stylus trumps finger
5541 processKey(mapper, BTN_TOOL_PEN, 1);
5542 processSync(mapper);
5543 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5544 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5545 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5546
5547 // eraser trumps stylus
5548 processKey(mapper, BTN_TOOL_RUBBER, 1);
5549 processSync(mapper);
5550 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5551 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5552 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5553
5554 // mouse trumps eraser
5555 processKey(mapper, BTN_TOOL_MOUSE, 1);
5556 processSync(mapper);
5557 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5558 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5559 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5560
5561 // MT tool type trumps BTN tool types: MT_TOOL_FINGER
5562 processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
5563 processSync(mapper);
5564 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5565 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5566 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5567
5568 // MT tool type trumps BTN tool types: MT_TOOL_PEN
5569 processToolType(mapper, MT_TOOL_PEN);
5570 processSync(mapper);
5571 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5572 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5573 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5574
5575 // back to default tool type
5576 processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
5577 processKey(mapper, BTN_TOOL_MOUSE, 0);
5578 processKey(mapper, BTN_TOOL_RUBBER, 0);
5579 processKey(mapper, BTN_TOOL_PEN, 0);
5580 processKey(mapper, BTN_TOOL_FINGER, 0);
5581 processSync(mapper);
5582 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5583 ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5584 ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5585}
5586
5587TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
5588 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5589 addConfigurationProperty("touch.deviceType", "touchScreen");
5590 prepareDisplay(DISPLAY_ORIENTATION_0);
5591 prepareAxes(POSITION | ID | SLOT);
5592 mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
5593 addMapperAndConfigure(mapper);
5594
5595 NotifyMotionArgs motionArgs;
5596
5597 // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
5598 processId(mapper, 1);
5599 processPosition(mapper, 100, 200);
5600 processSync(mapper);
5601 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5602 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5603 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5604 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5605
5606 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5607 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5608 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5609 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5610
5611 // move a little
5612 processPosition(mapper, 150, 250);
5613 processSync(mapper);
5614 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5615 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5616 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5617 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5618
5619 // down when BTN_TOUCH is pressed, pressure defaults to 1
5620 processKey(mapper, BTN_TOUCH, 1);
5621 processSync(mapper);
5622 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5623 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5624 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5625 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5626
5627 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5628 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5629 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5630 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5631
5632 // up when BTN_TOUCH is released, hover restored
5633 processKey(mapper, BTN_TOUCH, 0);
5634 processSync(mapper);
5635 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5636 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5637 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5638 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5639
5640 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5641 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5642 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5643 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5644
5645 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5646 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5647 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5648 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5649
5650 // exit hover when pointer goes away
5651 processId(mapper, -1);
5652 processSync(mapper);
5653 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5654 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5655 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5656 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5657}
5658
5659TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
5660 MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5661 addConfigurationProperty("touch.deviceType", "touchScreen");
5662 prepareDisplay(DISPLAY_ORIENTATION_0);
5663 prepareAxes(POSITION | ID | SLOT | PRESSURE);
5664 addMapperAndConfigure(mapper);
5665
5666 NotifyMotionArgs motionArgs;
5667
5668 // initially hovering because pressure is 0
5669 processId(mapper, 1);
5670 processPosition(mapper, 100, 200);
5671 processPressure(mapper, 0);
5672 processSync(mapper);
5673 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5674 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5675 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5676 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5677
5678 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5679 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5680 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5681 toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5682
5683 // move a little
5684 processPosition(mapper, 150, 250);
5685 processSync(mapper);
5686 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5687 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5688 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5689 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5690
5691 // down when pressure becomes non-zero
5692 processPressure(mapper, RAW_PRESSURE_MAX);
5693 processSync(mapper);
5694 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5695 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5696 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5697 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5698
5699 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5700 ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5701 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5702 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5703
5704 // up when pressure becomes 0, hover restored
5705 processPressure(mapper, 0);
5706 processSync(mapper);
5707 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5708 ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5709 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5710 toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5711
5712 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5713 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5714 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5715 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5716
5717 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5718 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5719 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5720 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5721
5722 // exit hover when pointer goes away
5723 processId(mapper, -1);
5724 processSync(mapper);
5725 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5726 ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5727 ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5728 toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5729}
5730
5731
5732} // namespace android