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