• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 #include "TestInputListener.h"
19 
20 #include <gtest/gtest.h>
21 #include <inttypes.h>
22 #include <math.h>
23 
24 
25 namespace android {
26 
27 // An arbitrary time value.
28 static const nsecs_t ARBITRARY_TIME = 1234;
29 
30 // Arbitrary display properties.
31 static const int32_t DISPLAY_ID = 0;
32 static const int32_t SECONDARY_DISPLAY_ID = DISPLAY_ID + 1;
33 static const int32_t DISPLAY_WIDTH = 480;
34 static const int32_t DISPLAY_HEIGHT = 800;
35 static const int32_t VIRTUAL_DISPLAY_ID = 1;
36 static const int32_t VIRTUAL_DISPLAY_WIDTH = 400;
37 static const int32_t VIRTUAL_DISPLAY_HEIGHT = 500;
38 static const char* VIRTUAL_DISPLAY_UNIQUE_ID = "virtual:1";
39 static constexpr std::optional<uint8_t> NO_PORT = std::nullopt; // no physical port is specified
40 
41 // Error tolerance for floating point assertions.
42 static const float EPSILON = 0.001f;
43 
44 template<typename T>
min(T a,T b)45 static inline T min(T a, T b) {
46     return a < b ? a : b;
47 }
48 
avg(float x,float y)49 static inline float avg(float x, float y) {
50     return (x + y) / 2;
51 }
52 
53 
54 // --- FakePointerController ---
55 
56 class FakePointerController : public PointerControllerInterface {
57     bool mHaveBounds;
58     float mMinX, mMinY, mMaxX, mMaxY;
59     float mX, mY;
60     int32_t mButtonState;
61     int32_t mDisplayId;
62 
63 protected:
~FakePointerController()64     virtual ~FakePointerController() { }
65 
66 public:
FakePointerController()67     FakePointerController() :
68         mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
69         mButtonState(0), mDisplayId(ADISPLAY_ID_DEFAULT) {
70     }
71 
setBounds(float minX,float minY,float maxX,float maxY)72     void setBounds(float minX, float minY, float maxX, float maxY) {
73         mHaveBounds = true;
74         mMinX = minX;
75         mMinY = minY;
76         mMaxX = maxX;
77         mMaxY = maxY;
78     }
79 
setDisplayId(int32_t displayId)80     void setDisplayId(int32_t displayId) {
81         mDisplayId = displayId;
82     }
83 
setPosition(float x,float y)84     virtual void setPosition(float x, float y) {
85         mX = x;
86         mY = y;
87     }
88 
setButtonState(int32_t buttonState)89     virtual void setButtonState(int32_t buttonState) {
90         mButtonState = buttonState;
91     }
92 
getButtonState() const93     virtual int32_t getButtonState() const {
94         return mButtonState;
95     }
96 
getPosition(float * outX,float * outY) const97     virtual void getPosition(float* outX, float* outY) const {
98         *outX = mX;
99         *outY = mY;
100     }
101 
getDisplayId() const102     virtual int32_t getDisplayId() const {
103         return mDisplayId;
104     }
105 
getSpots()106     const std::map<int32_t, std::vector<int32_t>>& getSpots() {
107         return mSpotsByDisplay;
108     }
109 
110 private:
getBounds(float * outMinX,float * outMinY,float * outMaxX,float * outMaxY) const111     virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
112         *outMinX = mMinX;
113         *outMinY = mMinY;
114         *outMaxX = mMaxX;
115         *outMaxY = mMaxY;
116         return mHaveBounds;
117     }
118 
move(float deltaX,float deltaY)119     virtual void move(float deltaX, float deltaY) {
120         mX += deltaX;
121         if (mX < mMinX) mX = mMinX;
122         if (mX > mMaxX) mX = mMaxX;
123         mY += deltaY;
124         if (mY < mMinY) mY = mMinY;
125         if (mY > mMaxY) mY = mMaxY;
126     }
127 
fade(Transition)128     virtual void fade(Transition) {
129     }
130 
unfade(Transition)131     virtual void unfade(Transition) {
132     }
133 
setPresentation(Presentation)134     virtual void setPresentation(Presentation) {
135     }
136 
setSpots(const PointerCoords *,const uint32_t *,BitSet32 spotIdBits,int32_t displayId)137     virtual void setSpots(const PointerCoords*, const uint32_t*, BitSet32 spotIdBits,
138             int32_t displayId) {
139         std::vector<int32_t> newSpots;
140         // Add spots for fingers that are down.
141         for (BitSet32 idBits(spotIdBits); !idBits.isEmpty(); ) {
142             uint32_t id = idBits.clearFirstMarkedBit();
143             newSpots.push_back(id);
144         }
145 
146         mSpotsByDisplay[displayId] = newSpots;
147     }
148 
clearSpots()149     virtual void clearSpots() {
150     }
151 
152     std::map<int32_t, std::vector<int32_t>> mSpotsByDisplay;
153 };
154 
155 
156 // --- FakeInputReaderPolicy ---
157 
158 class FakeInputReaderPolicy : public InputReaderPolicyInterface {
159     InputReaderConfiguration mConfig;
160     KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
161     std::vector<InputDeviceInfo> mInputDevices;
162     std::vector<DisplayViewport> mViewports;
163     TouchAffineTransformation transform;
164 
165 protected:
~FakeInputReaderPolicy()166     virtual ~FakeInputReaderPolicy() { }
167 
168 public:
FakeInputReaderPolicy()169     FakeInputReaderPolicy() {
170     }
171 
clearViewports()172     virtual void clearViewports() {
173         mViewports.clear();
174         mConfig.setDisplayViewports(mViewports);
175     }
176 
getDisplayViewportByUniqueId(const std::string & uniqueId) const177     std::optional<DisplayViewport> getDisplayViewportByUniqueId(const std::string& uniqueId) const {
178         return mConfig.getDisplayViewportByUniqueId(uniqueId);
179     }
getDisplayViewportByType(ViewportType type) const180     std::optional<DisplayViewport> getDisplayViewportByType(ViewportType type) const {
181         return mConfig.getDisplayViewportByType(type);
182     }
183 
getDisplayViewportByPort(uint8_t displayPort) const184     std::optional<DisplayViewport> getDisplayViewportByPort(uint8_t displayPort) const {
185         return mConfig.getDisplayViewportByPort(displayPort);
186     }
187 
addDisplayViewport(int32_t displayId,int32_t width,int32_t height,int32_t orientation,const std::string & uniqueId,std::optional<uint8_t> physicalPort,ViewportType viewportType)188     void addDisplayViewport(int32_t displayId, int32_t width, int32_t height, int32_t orientation,
189             const std::string& uniqueId, std::optional<uint8_t> physicalPort,
190             ViewportType viewportType) {
191         const DisplayViewport viewport = createDisplayViewport(displayId, width, height,
192                 orientation, uniqueId, physicalPort, viewportType);
193         mViewports.push_back(viewport);
194         mConfig.setDisplayViewports(mViewports);
195     }
196 
addExcludedDeviceName(const std::string & deviceName)197     void addExcludedDeviceName(const std::string& deviceName) {
198         mConfig.excludedDeviceNames.push_back(deviceName);
199     }
200 
addInputPortAssociation(const std::string & inputPort,uint8_t displayPort)201     void addInputPortAssociation(const std::string& inputPort, uint8_t displayPort) {
202         mConfig.portAssociations.insert({inputPort, displayPort});
203     }
204 
addDisabledDevice(int32_t deviceId)205     void addDisabledDevice(int32_t deviceId) {
206         ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
207         bool currentlyEnabled = index < 0;
208         if (currentlyEnabled) {
209             mConfig.disabledDevices.add(deviceId);
210         }
211     }
212 
removeDisabledDevice(int32_t deviceId)213     void removeDisabledDevice(int32_t deviceId) {
214         ssize_t index = mConfig.disabledDevices.indexOf(deviceId);
215         bool currentlyEnabled = index < 0;
216         if (!currentlyEnabled) {
217             mConfig.disabledDevices.remove(deviceId);
218         }
219     }
220 
setPointerController(int32_t deviceId,const sp<FakePointerController> & controller)221     void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
222         mPointerControllers.add(deviceId, controller);
223     }
224 
getReaderConfiguration() const225     const InputReaderConfiguration* getReaderConfiguration() const {
226         return &mConfig;
227     }
228 
getInputDevices() const229     const std::vector<InputDeviceInfo>& getInputDevices() const {
230         return mInputDevices;
231     }
232 
getTouchAffineTransformation(const std::string & inputDeviceDescriptor,int32_t surfaceRotation)233     TouchAffineTransformation getTouchAffineTransformation(const std::string& inputDeviceDescriptor,
234             int32_t surfaceRotation) {
235         return transform;
236     }
237 
setTouchAffineTransformation(const TouchAffineTransformation t)238     void setTouchAffineTransformation(const TouchAffineTransformation t) {
239         transform = t;
240     }
241 
setPointerCapture(bool enabled)242     void setPointerCapture(bool enabled) {
243         mConfig.pointerCapture = enabled;
244     }
245 
setShowTouches(bool enabled)246     void setShowTouches(bool enabled) {
247         mConfig.showTouches = enabled;
248     }
249 
250 private:
createDisplayViewport(int32_t displayId,int32_t width,int32_t height,int32_t orientation,const std::string & uniqueId,std::optional<uint8_t> physicalPort,ViewportType type)251     DisplayViewport createDisplayViewport(int32_t displayId, int32_t width, int32_t height,
252             int32_t orientation, const std::string& uniqueId, std::optional<uint8_t> physicalPort,
253             ViewportType type) {
254         bool isRotated = (orientation == DISPLAY_ORIENTATION_90
255                 || orientation == DISPLAY_ORIENTATION_270);
256         DisplayViewport v;
257         v.displayId = displayId;
258         v.orientation = orientation;
259         v.logicalLeft = 0;
260         v.logicalTop = 0;
261         v.logicalRight = isRotated ? height : width;
262         v.logicalBottom = isRotated ? width : height;
263         v.physicalLeft = 0;
264         v.physicalTop = 0;
265         v.physicalRight = isRotated ? height : width;
266         v.physicalBottom = isRotated ? width : height;
267         v.deviceWidth = isRotated ? height : width;
268         v.deviceHeight = isRotated ? width : height;
269         v.uniqueId = uniqueId;
270         v.physicalPort = physicalPort;
271         v.type = type;
272         return v;
273     }
274 
getReaderConfiguration(InputReaderConfiguration * outConfig)275     virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
276         *outConfig = mConfig;
277     }
278 
obtainPointerController(int32_t deviceId)279     virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
280         return mPointerControllers.valueFor(deviceId);
281     }
282 
notifyInputDevicesChanged(const std::vector<InputDeviceInfo> & inputDevices)283     virtual void notifyInputDevicesChanged(const std::vector<InputDeviceInfo>& inputDevices) {
284         mInputDevices = inputDevices;
285     }
286 
getKeyboardLayoutOverlay(const InputDeviceIdentifier &)287     virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const InputDeviceIdentifier&) {
288         return nullptr;
289     }
290 
getDeviceAlias(const InputDeviceIdentifier &)291     virtual std::string getDeviceAlias(const InputDeviceIdentifier&) {
292         return "";
293     }
294 };
295 
296 // --- FakeEventHub ---
297 
298 class FakeEventHub : public EventHubInterface {
299     struct KeyInfo {
300         int32_t keyCode;
301         uint32_t flags;
302     };
303 
304     struct Device {
305         InputDeviceIdentifier identifier;
306         uint32_t classes;
307         PropertyMap configuration;
308         KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
309         KeyedVector<int, bool> relativeAxes;
310         KeyedVector<int32_t, int32_t> keyCodeStates;
311         KeyedVector<int32_t, int32_t> scanCodeStates;
312         KeyedVector<int32_t, int32_t> switchStates;
313         KeyedVector<int32_t, int32_t> absoluteAxisValue;
314         KeyedVector<int32_t, KeyInfo> keysByScanCode;
315         KeyedVector<int32_t, KeyInfo> keysByUsageCode;
316         KeyedVector<int32_t, bool> leds;
317         std::vector<VirtualKeyDefinition> virtualKeys;
318         bool enabled;
319 
enableandroid::FakeEventHub::Device320         status_t enable() {
321             enabled = true;
322             return OK;
323         }
324 
disableandroid::FakeEventHub::Device325         status_t disable() {
326             enabled = false;
327             return OK;
328         }
329 
Deviceandroid::FakeEventHub::Device330         explicit Device(uint32_t classes) :
331                 classes(classes), enabled(true) {
332         }
333     };
334 
335     KeyedVector<int32_t, Device*> mDevices;
336     std::vector<std::string> mExcludedDevices;
337     List<RawEvent> mEvents;
338     std::unordered_map<int32_t /*deviceId*/, std::vector<TouchVideoFrame>> mVideoFrames;
339 
340 protected:
~FakeEventHub()341     virtual ~FakeEventHub() {
342         for (size_t i = 0; i < mDevices.size(); i++) {
343             delete mDevices.valueAt(i);
344         }
345     }
346 
347 public:
FakeEventHub()348     FakeEventHub() { }
349 
addDevice(int32_t deviceId,const std::string & name,uint32_t classes)350     void addDevice(int32_t deviceId, const std::string& name, uint32_t classes) {
351         Device* device = new Device(classes);
352         device->identifier.name = name;
353         mDevices.add(deviceId, device);
354 
355         enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
356     }
357 
removeDevice(int32_t deviceId)358     void removeDevice(int32_t deviceId) {
359         delete mDevices.valueFor(deviceId);
360         mDevices.removeItem(deviceId);
361 
362         enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
363     }
364 
isDeviceEnabled(int32_t deviceId)365     bool isDeviceEnabled(int32_t deviceId) {
366         Device* device = getDevice(deviceId);
367         if (device == nullptr) {
368             ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
369             return false;
370         }
371         return device->enabled;
372     }
373 
enableDevice(int32_t deviceId)374     status_t enableDevice(int32_t deviceId) {
375         status_t result;
376         Device* device = getDevice(deviceId);
377         if (device == nullptr) {
378             ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
379             return BAD_VALUE;
380         }
381         if (device->enabled) {
382             ALOGW("Duplicate call to %s, device %" PRId32 " already enabled", __func__, deviceId);
383             return OK;
384         }
385         result = device->enable();
386         return result;
387     }
388 
disableDevice(int32_t deviceId)389     status_t disableDevice(int32_t deviceId) {
390         Device* device = getDevice(deviceId);
391         if (device == nullptr) {
392             ALOGE("Incorrect device id=%" PRId32 " provided to %s", deviceId, __func__);
393             return BAD_VALUE;
394         }
395         if (!device->enabled) {
396             ALOGW("Duplicate call to %s, device %" PRId32 " already disabled", __func__, deviceId);
397             return OK;
398         }
399         return device->disable();
400     }
401 
finishDeviceScan()402     void finishDeviceScan() {
403         enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
404     }
405 
addConfigurationProperty(int32_t deviceId,const String8 & key,const String8 & value)406     void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
407         Device* device = getDevice(deviceId);
408         device->configuration.addProperty(key, value);
409     }
410 
addConfigurationMap(int32_t deviceId,const PropertyMap * configuration)411     void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
412         Device* device = getDevice(deviceId);
413         device->configuration.addAll(configuration);
414     }
415 
addAbsoluteAxis(int32_t deviceId,int axis,int32_t minValue,int32_t maxValue,int flat,int fuzz,int resolution=0)416     void addAbsoluteAxis(int32_t deviceId, int axis,
417             int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
418         Device* device = getDevice(deviceId);
419 
420         RawAbsoluteAxisInfo info;
421         info.valid = true;
422         info.minValue = minValue;
423         info.maxValue = maxValue;
424         info.flat = flat;
425         info.fuzz = fuzz;
426         info.resolution = resolution;
427         device->absoluteAxes.add(axis, info);
428     }
429 
addRelativeAxis(int32_t deviceId,int32_t axis)430     void addRelativeAxis(int32_t deviceId, int32_t axis) {
431         Device* device = getDevice(deviceId);
432         device->relativeAxes.add(axis, true);
433     }
434 
setKeyCodeState(int32_t deviceId,int32_t keyCode,int32_t state)435     void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
436         Device* device = getDevice(deviceId);
437         device->keyCodeStates.replaceValueFor(keyCode, state);
438     }
439 
setScanCodeState(int32_t deviceId,int32_t scanCode,int32_t state)440     void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
441         Device* device = getDevice(deviceId);
442         device->scanCodeStates.replaceValueFor(scanCode, state);
443     }
444 
setSwitchState(int32_t deviceId,int32_t switchCode,int32_t state)445     void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
446         Device* device = getDevice(deviceId);
447         device->switchStates.replaceValueFor(switchCode, state);
448     }
449 
setAbsoluteAxisValue(int32_t deviceId,int32_t axis,int32_t value)450     void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
451         Device* device = getDevice(deviceId);
452         device->absoluteAxisValue.replaceValueFor(axis, value);
453     }
454 
addKey(int32_t deviceId,int32_t scanCode,int32_t usageCode,int32_t keyCode,uint32_t flags)455     void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
456             int32_t keyCode, uint32_t flags) {
457         Device* device = getDevice(deviceId);
458         KeyInfo info;
459         info.keyCode = keyCode;
460         info.flags = flags;
461         if (scanCode) {
462             device->keysByScanCode.add(scanCode, info);
463         }
464         if (usageCode) {
465             device->keysByUsageCode.add(usageCode, info);
466         }
467     }
468 
addLed(int32_t deviceId,int32_t led,bool initialState)469     void addLed(int32_t deviceId, int32_t led, bool initialState) {
470         Device* device = getDevice(deviceId);
471         device->leds.add(led, initialState);
472     }
473 
getLedState(int32_t deviceId,int32_t led)474     bool getLedState(int32_t deviceId, int32_t led) {
475         Device* device = getDevice(deviceId);
476         return device->leds.valueFor(led);
477     }
478 
getExcludedDevices()479     std::vector<std::string>& getExcludedDevices() {
480         return mExcludedDevices;
481     }
482 
addVirtualKeyDefinition(int32_t deviceId,const VirtualKeyDefinition & definition)483     void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
484         Device* device = getDevice(deviceId);
485         device->virtualKeys.push_back(definition);
486     }
487 
enqueueEvent(nsecs_t when,int32_t deviceId,int32_t type,int32_t code,int32_t value)488     void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
489             int32_t code, int32_t value) {
490         RawEvent event;
491         event.when = when;
492         event.deviceId = deviceId;
493         event.type = type;
494         event.code = code;
495         event.value = value;
496         mEvents.push_back(event);
497 
498         if (type == EV_ABS) {
499             setAbsoluteAxisValue(deviceId, code, value);
500         }
501     }
502 
setVideoFrames(std::unordered_map<int32_t,std::vector<TouchVideoFrame>> videoFrames)503     void setVideoFrames(std::unordered_map<int32_t /*deviceId*/,
504             std::vector<TouchVideoFrame>> videoFrames) {
505         mVideoFrames = std::move(videoFrames);
506     }
507 
assertQueueIsEmpty()508     void assertQueueIsEmpty() {
509         ASSERT_EQ(size_t(0), mEvents.size())
510                 << "Expected the event queue to be empty (fully consumed).";
511     }
512 
513 private:
getDevice(int32_t deviceId) const514     Device* getDevice(int32_t deviceId) const {
515         ssize_t index = mDevices.indexOfKey(deviceId);
516         return index >= 0 ? mDevices.valueAt(index) : nullptr;
517     }
518 
getDeviceClasses(int32_t deviceId) const519     virtual uint32_t getDeviceClasses(int32_t deviceId) const {
520         Device* device = getDevice(deviceId);
521         return device ? device->classes : 0;
522     }
523 
getDeviceIdentifier(int32_t deviceId) const524     virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
525         Device* device = getDevice(deviceId);
526         return device ? device->identifier : InputDeviceIdentifier();
527     }
528 
getDeviceControllerNumber(int32_t) const529     virtual int32_t getDeviceControllerNumber(int32_t) const {
530         return 0;
531     }
532 
getConfiguration(int32_t deviceId,PropertyMap * outConfiguration) const533     virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
534         Device* device = getDevice(deviceId);
535         if (device) {
536             *outConfiguration = device->configuration;
537         }
538     }
539 
getAbsoluteAxisInfo(int32_t deviceId,int axis,RawAbsoluteAxisInfo * outAxisInfo) const540     virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
541             RawAbsoluteAxisInfo* outAxisInfo) const {
542         Device* device = getDevice(deviceId);
543         if (device) {
544             ssize_t index = device->absoluteAxes.indexOfKey(axis);
545             if (index >= 0) {
546                 *outAxisInfo = device->absoluteAxes.valueAt(index);
547                 return OK;
548             }
549         }
550         outAxisInfo->clear();
551         return -1;
552     }
553 
hasRelativeAxis(int32_t deviceId,int axis) const554     virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
555         Device* device = getDevice(deviceId);
556         if (device) {
557             return device->relativeAxes.indexOfKey(axis) >= 0;
558         }
559         return false;
560     }
561 
hasInputProperty(int32_t,int) const562     virtual bool hasInputProperty(int32_t, int) const {
563         return false;
564     }
565 
mapKey(int32_t deviceId,int32_t scanCode,int32_t usageCode,int32_t metaState,int32_t * outKeycode,int32_t * outMetaState,uint32_t * outFlags) const566     virtual status_t mapKey(int32_t deviceId,
567             int32_t scanCode, int32_t usageCode, int32_t metaState,
568             int32_t* outKeycode, int32_t *outMetaState, uint32_t* outFlags) const {
569         Device* device = getDevice(deviceId);
570         if (device) {
571             const KeyInfo* key = getKey(device, scanCode, usageCode);
572             if (key) {
573                 if (outKeycode) {
574                     *outKeycode = key->keyCode;
575                 }
576                 if (outFlags) {
577                     *outFlags = key->flags;
578                 }
579                 if (outMetaState) {
580                     *outMetaState = metaState;
581                 }
582                 return OK;
583             }
584         }
585         return NAME_NOT_FOUND;
586     }
587 
getKey(Device * device,int32_t scanCode,int32_t usageCode) const588     const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
589         if (usageCode) {
590             ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
591             if (index >= 0) {
592                 return &device->keysByUsageCode.valueAt(index);
593             }
594         }
595         if (scanCode) {
596             ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
597             if (index >= 0) {
598                 return &device->keysByScanCode.valueAt(index);
599             }
600         }
601         return nullptr;
602     }
603 
mapAxis(int32_t,int32_t,AxisInfo *) const604     virtual status_t mapAxis(int32_t, int32_t, AxisInfo*) const {
605         return NAME_NOT_FOUND;
606     }
607 
setExcludedDevices(const std::vector<std::string> & devices)608     virtual void setExcludedDevices(const std::vector<std::string>& devices) {
609         mExcludedDevices = devices;
610     }
611 
getEvents(int,RawEvent * buffer,size_t)612     virtual size_t getEvents(int, RawEvent* buffer, size_t) {
613         if (mEvents.empty()) {
614             return 0;
615         }
616 
617         *buffer = *mEvents.begin();
618         mEvents.erase(mEvents.begin());
619         return 1;
620     }
621 
getVideoFrames(int32_t deviceId)622     virtual std::vector<TouchVideoFrame> getVideoFrames(int32_t deviceId) {
623         auto it = mVideoFrames.find(deviceId);
624         if (it != mVideoFrames.end()) {
625             std::vector<TouchVideoFrame> frames = std::move(it->second);
626             mVideoFrames.erase(deviceId);
627             return frames;
628         }
629         return {};
630     }
631 
getScanCodeState(int32_t deviceId,int32_t scanCode) const632     virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
633         Device* device = getDevice(deviceId);
634         if (device) {
635             ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
636             if (index >= 0) {
637                 return device->scanCodeStates.valueAt(index);
638             }
639         }
640         return AKEY_STATE_UNKNOWN;
641     }
642 
getKeyCodeState(int32_t deviceId,int32_t keyCode) const643     virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
644         Device* device = getDevice(deviceId);
645         if (device) {
646             ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
647             if (index >= 0) {
648                 return device->keyCodeStates.valueAt(index);
649             }
650         }
651         return AKEY_STATE_UNKNOWN;
652     }
653 
getSwitchState(int32_t deviceId,int32_t sw) const654     virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
655         Device* device = getDevice(deviceId);
656         if (device) {
657             ssize_t index = device->switchStates.indexOfKey(sw);
658             if (index >= 0) {
659                 return device->switchStates.valueAt(index);
660             }
661         }
662         return AKEY_STATE_UNKNOWN;
663     }
664 
getAbsoluteAxisValue(int32_t deviceId,int32_t axis,int32_t * outValue) const665     virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
666             int32_t* outValue) const {
667         Device* device = getDevice(deviceId);
668         if (device) {
669             ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
670             if (index >= 0) {
671                 *outValue = device->absoluteAxisValue.valueAt(index);
672                 return OK;
673             }
674         }
675         *outValue = 0;
676         return -1;
677     }
678 
markSupportedKeyCodes(int32_t deviceId,size_t numCodes,const int32_t * keyCodes,uint8_t * outFlags) const679     virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
680             uint8_t* outFlags) const {
681         bool result = false;
682         Device* device = getDevice(deviceId);
683         if (device) {
684             for (size_t i = 0; i < numCodes; i++) {
685                 for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
686                     if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
687                         outFlags[i] = 1;
688                         result = true;
689                     }
690                 }
691                 for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
692                     if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
693                         outFlags[i] = 1;
694                         result = true;
695                     }
696                 }
697             }
698         }
699         return result;
700     }
701 
hasScanCode(int32_t deviceId,int32_t scanCode) const702     virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
703         Device* device = getDevice(deviceId);
704         if (device) {
705             ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
706             return index >= 0;
707         }
708         return false;
709     }
710 
hasLed(int32_t deviceId,int32_t led) const711     virtual bool hasLed(int32_t deviceId, int32_t led) const {
712         Device* device = getDevice(deviceId);
713         return device && device->leds.indexOfKey(led) >= 0;
714     }
715 
setLedState(int32_t deviceId,int32_t led,bool on)716     virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
717         Device* device = getDevice(deviceId);
718         if (device) {
719             ssize_t index = device->leds.indexOfKey(led);
720             if (index >= 0) {
721                 device->leds.replaceValueAt(led, on);
722             } else {
723                 ADD_FAILURE()
724                         << "Attempted to set the state of an LED that the EventHub declared "
725                         "was not present.  led=" << led;
726             }
727         }
728     }
729 
getVirtualKeyDefinitions(int32_t deviceId,std::vector<VirtualKeyDefinition> & outVirtualKeys) const730     virtual void getVirtualKeyDefinitions(int32_t deviceId,
731             std::vector<VirtualKeyDefinition>& outVirtualKeys) const {
732         outVirtualKeys.clear();
733 
734         Device* device = getDevice(deviceId);
735         if (device) {
736             outVirtualKeys = device->virtualKeys;
737         }
738     }
739 
getKeyCharacterMap(int32_t) const740     virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t) const {
741         return nullptr;
742     }
743 
setKeyboardLayoutOverlay(int32_t,const sp<KeyCharacterMap> &)744     virtual bool setKeyboardLayoutOverlay(int32_t, const sp<KeyCharacterMap>&) {
745         return false;
746     }
747 
vibrate(int32_t,nsecs_t)748     virtual void vibrate(int32_t, nsecs_t) {
749     }
750 
cancelVibrate(int32_t)751     virtual void cancelVibrate(int32_t) {
752     }
753 
isExternal(int32_t) const754     virtual bool isExternal(int32_t) const {
755         return false;
756     }
757 
dump(std::string &)758     virtual void dump(std::string&) {
759     }
760 
monitor()761     virtual void monitor() {
762     }
763 
requestReopenDevices()764     virtual void requestReopenDevices() {
765     }
766 
wake()767     virtual void wake() {
768     }
769 };
770 
771 
772 // --- FakeInputReaderContext ---
773 
774 class FakeInputReaderContext : public InputReaderContext {
775     sp<EventHubInterface> mEventHub;
776     sp<InputReaderPolicyInterface> mPolicy;
777     sp<InputListenerInterface> mListener;
778     int32_t mGlobalMetaState;
779     bool mUpdateGlobalMetaStateWasCalled;
780     int32_t mGeneration;
781     uint32_t mNextSequenceNum;
782 
783 public:
FakeInputReaderContext(const sp<EventHubInterface> & eventHub,const sp<InputReaderPolicyInterface> & policy,const sp<InputListenerInterface> & listener)784     FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
785             const sp<InputReaderPolicyInterface>& policy,
786             const sp<InputListenerInterface>& listener) :
787             mEventHub(eventHub), mPolicy(policy), mListener(listener),
788             mGlobalMetaState(0), mNextSequenceNum(1) {
789     }
790 
~FakeInputReaderContext()791     virtual ~FakeInputReaderContext() { }
792 
assertUpdateGlobalMetaStateWasCalled()793     void assertUpdateGlobalMetaStateWasCalled() {
794         ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
795                 << "Expected updateGlobalMetaState() to have been called.";
796         mUpdateGlobalMetaStateWasCalled = false;
797     }
798 
setGlobalMetaState(int32_t state)799     void setGlobalMetaState(int32_t state) {
800         mGlobalMetaState = state;
801     }
802 
getGeneration()803     uint32_t getGeneration() {
804         return mGeneration;
805     }
806 
807 private:
updateGlobalMetaState()808     virtual void updateGlobalMetaState() {
809         mUpdateGlobalMetaStateWasCalled = true;
810     }
811 
getGlobalMetaState()812     virtual int32_t getGlobalMetaState() {
813         return mGlobalMetaState;
814     }
815 
getEventHub()816     virtual EventHubInterface* getEventHub() {
817         return mEventHub.get();
818     }
819 
getPolicy()820     virtual InputReaderPolicyInterface* getPolicy() {
821         return mPolicy.get();
822     }
823 
getListener()824     virtual InputListenerInterface* getListener() {
825         return mListener.get();
826     }
827 
disableVirtualKeysUntil(nsecs_t)828     virtual void disableVirtualKeysUntil(nsecs_t) {
829     }
830 
shouldDropVirtualKey(nsecs_t,InputDevice *,int32_t,int32_t)831     virtual bool shouldDropVirtualKey(nsecs_t, InputDevice*, int32_t, int32_t) {
832         return false;
833     }
834 
fadePointer()835     virtual void fadePointer() {
836     }
837 
requestTimeoutAtTime(nsecs_t)838     virtual void requestTimeoutAtTime(nsecs_t) {
839     }
840 
bumpGeneration()841     virtual int32_t bumpGeneration() {
842         return ++mGeneration;
843     }
844 
getExternalStylusDevices(std::vector<InputDeviceInfo> & outDevices)845     virtual void getExternalStylusDevices(std::vector<InputDeviceInfo>& outDevices) {
846 
847     }
848 
dispatchExternalStylusState(const StylusState &)849     virtual void dispatchExternalStylusState(const StylusState&) {
850 
851     }
852 
getNextSequenceNum()853     virtual uint32_t getNextSequenceNum() {
854         return mNextSequenceNum++;
855     }
856 };
857 
858 
859 // --- FakeInputMapper ---
860 
861 class FakeInputMapper : public InputMapper {
862     uint32_t mSources;
863     int32_t mKeyboardType;
864     int32_t mMetaState;
865     KeyedVector<int32_t, int32_t> mKeyCodeStates;
866     KeyedVector<int32_t, int32_t> mScanCodeStates;
867     KeyedVector<int32_t, int32_t> mSwitchStates;
868     std::vector<int32_t> mSupportedKeyCodes;
869     RawEvent mLastEvent;
870 
871     bool mConfigureWasCalled;
872     bool mResetWasCalled;
873     bool mProcessWasCalled;
874 
875     std::optional<DisplayViewport> mViewport;
876 public:
FakeInputMapper(InputDevice * device,uint32_t sources)877     FakeInputMapper(InputDevice* device, uint32_t sources) :
878             InputMapper(device),
879             mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
880             mMetaState(0),
881             mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
882     }
883 
~FakeInputMapper()884     virtual ~FakeInputMapper() { }
885 
setKeyboardType(int32_t keyboardType)886     void setKeyboardType(int32_t keyboardType) {
887         mKeyboardType = keyboardType;
888     }
889 
setMetaState(int32_t metaState)890     void setMetaState(int32_t metaState) {
891         mMetaState = metaState;
892     }
893 
assertConfigureWasCalled()894     void assertConfigureWasCalled() {
895         ASSERT_TRUE(mConfigureWasCalled)
896                 << "Expected configure() to have been called.";
897         mConfigureWasCalled = false;
898     }
899 
assertResetWasCalled()900     void assertResetWasCalled() {
901         ASSERT_TRUE(mResetWasCalled)
902                 << "Expected reset() to have been called.";
903         mResetWasCalled = false;
904     }
905 
assertProcessWasCalled(RawEvent * outLastEvent=nullptr)906     void assertProcessWasCalled(RawEvent* outLastEvent = nullptr) {
907         ASSERT_TRUE(mProcessWasCalled)
908                 << "Expected process() to have been called.";
909         if (outLastEvent) {
910             *outLastEvent = mLastEvent;
911         }
912         mProcessWasCalled = false;
913     }
914 
setKeyCodeState(int32_t keyCode,int32_t state)915     void setKeyCodeState(int32_t keyCode, int32_t state) {
916         mKeyCodeStates.replaceValueFor(keyCode, state);
917     }
918 
setScanCodeState(int32_t scanCode,int32_t state)919     void setScanCodeState(int32_t scanCode, int32_t state) {
920         mScanCodeStates.replaceValueFor(scanCode, state);
921     }
922 
setSwitchState(int32_t switchCode,int32_t state)923     void setSwitchState(int32_t switchCode, int32_t state) {
924         mSwitchStates.replaceValueFor(switchCode, state);
925     }
926 
addSupportedKeyCode(int32_t keyCode)927     void addSupportedKeyCode(int32_t keyCode) {
928         mSupportedKeyCodes.push_back(keyCode);
929     }
930 
931 private:
getSources()932     virtual uint32_t getSources() {
933         return mSources;
934     }
935 
populateDeviceInfo(InputDeviceInfo * deviceInfo)936     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
937         InputMapper::populateDeviceInfo(deviceInfo);
938 
939         if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
940             deviceInfo->setKeyboardType(mKeyboardType);
941         }
942     }
943 
configure(nsecs_t,const InputReaderConfiguration * config,uint32_t changes)944     virtual void configure(nsecs_t, const InputReaderConfiguration* config, uint32_t changes) {
945         mConfigureWasCalled = true;
946 
947         // Find the associated viewport if exist.
948         const std::optional<uint8_t> displayPort = mDevice->getAssociatedDisplayPort();
949         if (displayPort && (changes & InputReaderConfiguration::CHANGE_DISPLAY_INFO)) {
950             mViewport = config->getDisplayViewportByPort(*displayPort);
951         }
952     }
953 
reset(nsecs_t)954     virtual void reset(nsecs_t) {
955         mResetWasCalled = true;
956     }
957 
process(const RawEvent * rawEvent)958     virtual void process(const RawEvent* rawEvent) {
959         mLastEvent = *rawEvent;
960         mProcessWasCalled = true;
961     }
962 
getKeyCodeState(uint32_t,int32_t keyCode)963     virtual int32_t getKeyCodeState(uint32_t, int32_t keyCode) {
964         ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
965         return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
966     }
967 
getScanCodeState(uint32_t,int32_t scanCode)968     virtual int32_t getScanCodeState(uint32_t, int32_t scanCode) {
969         ssize_t index = mScanCodeStates.indexOfKey(scanCode);
970         return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
971     }
972 
getSwitchState(uint32_t,int32_t switchCode)973     virtual int32_t getSwitchState(uint32_t, int32_t switchCode) {
974         ssize_t index = mSwitchStates.indexOfKey(switchCode);
975         return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
976     }
977 
markSupportedKeyCodes(uint32_t,size_t numCodes,const int32_t * keyCodes,uint8_t * outFlags)978     virtual bool markSupportedKeyCodes(uint32_t, size_t numCodes,
979             const int32_t* keyCodes, uint8_t* outFlags) {
980         bool result = false;
981         for (size_t i = 0; i < numCodes; i++) {
982             for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
983                 if (keyCodes[i] == mSupportedKeyCodes[j]) {
984                     outFlags[i] = 1;
985                     result = true;
986                 }
987             }
988         }
989         return result;
990     }
991 
getMetaState()992     virtual int32_t getMetaState() {
993         return mMetaState;
994     }
995 
fadePointer()996     virtual void fadePointer() {
997     }
998 
getAssociatedDisplay()999     virtual std::optional<int32_t> getAssociatedDisplay() {
1000         if (mViewport) {
1001             return std::make_optional(mViewport->displayId);
1002         }
1003         return std::nullopt;
1004     }
1005 };
1006 
1007 
1008 // --- InstrumentedInputReader ---
1009 
1010 class InstrumentedInputReader : public InputReader {
1011     InputDevice* mNextDevice;
1012 
1013 public:
InstrumentedInputReader(const sp<EventHubInterface> & eventHub,const sp<InputReaderPolicyInterface> & policy,const sp<InputListenerInterface> & listener)1014     InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
1015             const sp<InputReaderPolicyInterface>& policy,
1016             const sp<InputListenerInterface>& listener) :
1017             InputReader(eventHub, policy, listener),
1018             mNextDevice(nullptr) {
1019     }
1020 
~InstrumentedInputReader()1021     virtual ~InstrumentedInputReader() {
1022         if (mNextDevice) {
1023             delete mNextDevice;
1024         }
1025     }
1026 
setNextDevice(InputDevice * device)1027     void setNextDevice(InputDevice* device) {
1028         mNextDevice = device;
1029     }
1030 
newDevice(int32_t deviceId,int32_t controllerNumber,const std::string & name,uint32_t classes,const std::string & location="")1031     InputDevice* newDevice(int32_t deviceId, int32_t controllerNumber, const std::string& name,
1032             uint32_t classes, const std::string& location = "") {
1033         InputDeviceIdentifier identifier;
1034         identifier.name = name;
1035         identifier.location = location;
1036         int32_t generation = deviceId + 1;
1037         return new InputDevice(&mContext, deviceId, generation, controllerNumber, identifier,
1038                 classes);
1039     }
1040 
1041 protected:
createDeviceLocked(int32_t deviceId,int32_t controllerNumber,const InputDeviceIdentifier & identifier,uint32_t classes)1042     virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
1043             const InputDeviceIdentifier& identifier, uint32_t classes) {
1044         if (mNextDevice) {
1045             InputDevice* device = mNextDevice;
1046             mNextDevice = nullptr;
1047             return device;
1048         }
1049         return InputReader::createDeviceLocked(deviceId, controllerNumber, identifier, classes);
1050     }
1051 
1052     friend class InputReaderTest;
1053 };
1054 
1055 // --- InputReaderPolicyTest ---
1056 class InputReaderPolicyTest : public testing::Test {
1057 protected:
1058     sp<FakeInputReaderPolicy> mFakePolicy;
1059 
SetUp()1060     virtual void SetUp() {
1061         mFakePolicy = new FakeInputReaderPolicy();
1062     }
TearDown()1063     virtual void TearDown() {
1064         mFakePolicy.clear();
1065     }
1066 };
1067 
1068 /**
1069  * Check that empty set of viewports is an acceptable configuration.
1070  * Also try to get internal viewport two different ways - by type and by uniqueId.
1071  *
1072  * There will be confusion if two viewports with empty uniqueId and identical type are present.
1073  * Such configuration is not currently allowed.
1074  */
TEST_F(InputReaderPolicyTest,Viewports_GetCleared)1075 TEST_F(InputReaderPolicyTest, Viewports_GetCleared) {
1076     static const std::string uniqueId = "local:0";
1077 
1078     // We didn't add any viewports yet, so there shouldn't be any.
1079     std::optional<DisplayViewport> internalViewport =
1080             mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
1081     ASSERT_FALSE(internalViewport);
1082 
1083     // Add an internal viewport, then clear it
1084     mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1085             DISPLAY_ORIENTATION_0, uniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
1086 
1087     // Check matching by uniqueId
1088     internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
1089     ASSERT_TRUE(internalViewport);
1090     ASSERT_EQ(ViewportType::VIEWPORT_INTERNAL, internalViewport->type);
1091 
1092     // Check matching by viewport type
1093     internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
1094     ASSERT_TRUE(internalViewport);
1095     ASSERT_EQ(uniqueId, internalViewport->uniqueId);
1096 
1097     mFakePolicy->clearViewports();
1098     // Make sure nothing is found after clear
1099     internalViewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId);
1100     ASSERT_FALSE(internalViewport);
1101     internalViewport = mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
1102     ASSERT_FALSE(internalViewport);
1103 }
1104 
TEST_F(InputReaderPolicyTest,Viewports_GetByType)1105 TEST_F(InputReaderPolicyTest, Viewports_GetByType) {
1106     const std::string internalUniqueId = "local:0";
1107     const std::string externalUniqueId = "local:1";
1108     const std::string virtualUniqueId1 = "virtual:2";
1109     const std::string virtualUniqueId2 = "virtual:3";
1110     constexpr int32_t virtualDisplayId1 = 2;
1111     constexpr int32_t virtualDisplayId2 = 3;
1112 
1113     // Add an internal viewport
1114     mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1115             DISPLAY_ORIENTATION_0, internalUniqueId, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
1116     // Add an external viewport
1117     mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1118             DISPLAY_ORIENTATION_0, externalUniqueId, NO_PORT, ViewportType::VIEWPORT_EXTERNAL);
1119     // Add an virtual viewport
1120     mFakePolicy->addDisplayViewport(virtualDisplayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1121             DISPLAY_ORIENTATION_0, virtualUniqueId1, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
1122     // Add another virtual viewport
1123     mFakePolicy->addDisplayViewport(virtualDisplayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1124             DISPLAY_ORIENTATION_0, virtualUniqueId2, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
1125 
1126     // Check matching by type for internal
1127     std::optional<DisplayViewport> internalViewport =
1128             mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_INTERNAL);
1129     ASSERT_TRUE(internalViewport);
1130     ASSERT_EQ(internalUniqueId, internalViewport->uniqueId);
1131 
1132     // Check matching by type for external
1133     std::optional<DisplayViewport> externalViewport =
1134             mFakePolicy->getDisplayViewportByType(ViewportType::VIEWPORT_EXTERNAL);
1135     ASSERT_TRUE(externalViewport);
1136     ASSERT_EQ(externalUniqueId, externalViewport->uniqueId);
1137 
1138     // Check matching by uniqueId for virtual viewport #1
1139     std::optional<DisplayViewport> virtualViewport1 =
1140             mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId1);
1141     ASSERT_TRUE(virtualViewport1);
1142     ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport1->type);
1143     ASSERT_EQ(virtualUniqueId1, virtualViewport1->uniqueId);
1144     ASSERT_EQ(virtualDisplayId1, virtualViewport1->displayId);
1145 
1146     // Check matching by uniqueId for virtual viewport #2
1147     std::optional<DisplayViewport> virtualViewport2 =
1148             mFakePolicy->getDisplayViewportByUniqueId(virtualUniqueId2);
1149     ASSERT_TRUE(virtualViewport2);
1150     ASSERT_EQ(ViewportType::VIEWPORT_VIRTUAL, virtualViewport2->type);
1151     ASSERT_EQ(virtualUniqueId2, virtualViewport2->uniqueId);
1152     ASSERT_EQ(virtualDisplayId2, virtualViewport2->displayId);
1153 }
1154 
1155 
1156 /**
1157  * We can have 2 viewports of the same kind. We can distinguish them by uniqueId, and confirm
1158  * that lookup works by checking display id.
1159  * Check that 2 viewports of each kind is possible, for all existing viewport types.
1160  */
TEST_F(InputReaderPolicyTest,Viewports_TwoOfSameType)1161 TEST_F(InputReaderPolicyTest, Viewports_TwoOfSameType) {
1162     const std::string uniqueId1 = "uniqueId1";
1163     const std::string uniqueId2 = "uniqueId2";
1164     constexpr int32_t displayId1 = 2;
1165     constexpr int32_t displayId2 = 3;
1166 
1167     std::vector<ViewportType> types = {ViewportType::VIEWPORT_INTERNAL,
1168             ViewportType::VIEWPORT_EXTERNAL, ViewportType::VIEWPORT_VIRTUAL};
1169     for (const ViewportType& type : types) {
1170         mFakePolicy->clearViewports();
1171         // Add a viewport
1172         mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1173             DISPLAY_ORIENTATION_0, uniqueId1, NO_PORT, type);
1174         // Add another viewport
1175         mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1176             DISPLAY_ORIENTATION_0, uniqueId2, NO_PORT, type);
1177 
1178         // Check that correct display viewport was returned by comparing the display IDs.
1179         std::optional<DisplayViewport> viewport1 =
1180                 mFakePolicy->getDisplayViewportByUniqueId(uniqueId1);
1181         ASSERT_TRUE(viewport1);
1182         ASSERT_EQ(displayId1, viewport1->displayId);
1183         ASSERT_EQ(type, viewport1->type);
1184 
1185         std::optional<DisplayViewport> viewport2 =
1186                 mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
1187         ASSERT_TRUE(viewport2);
1188         ASSERT_EQ(displayId2, viewport2->displayId);
1189         ASSERT_EQ(type, viewport2->type);
1190 
1191         // When there are multiple viewports of the same kind, and uniqueId is not specified
1192         // in the call to getDisplayViewport, then that situation is not supported.
1193         // The viewports can be stored in any order, so we cannot rely on the order, since that
1194         // is just implementation detail.
1195         // However, we can check that it still returns *a* viewport, we just cannot assert
1196         // which one specifically is returned.
1197         std::optional<DisplayViewport> someViewport = mFakePolicy->getDisplayViewportByType(type);
1198         ASSERT_TRUE(someViewport);
1199     }
1200 }
1201 
1202 /**
1203  * Check getDisplayViewportByPort
1204  */
TEST_F(InputReaderPolicyTest,Viewports_GetByPort)1205 TEST_F(InputReaderPolicyTest, Viewports_GetByPort) {
1206     constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
1207     const std::string uniqueId1 = "uniqueId1";
1208     const std::string uniqueId2 = "uniqueId2";
1209     constexpr int32_t displayId1 = 1;
1210     constexpr int32_t displayId2 = 2;
1211     const uint8_t hdmi1 = 0;
1212     const uint8_t hdmi2 = 1;
1213     const uint8_t hdmi3 = 2;
1214 
1215     mFakePolicy->clearViewports();
1216     // Add a viewport that's associated with some display port that's not of interest.
1217     mFakePolicy->addDisplayViewport(displayId1, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1218             DISPLAY_ORIENTATION_0, uniqueId1, hdmi3, type);
1219     // Add another viewport, connected to HDMI1 port
1220     mFakePolicy->addDisplayViewport(displayId2, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1221             DISPLAY_ORIENTATION_0, uniqueId2, hdmi1, type);
1222 
1223     // Check that correct display viewport was returned by comparing the display ports.
1224     std::optional<DisplayViewport> hdmi1Viewport = mFakePolicy->getDisplayViewportByPort(hdmi1);
1225     ASSERT_TRUE(hdmi1Viewport);
1226     ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1227     ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1228 
1229     // Check that we can still get the same viewport using the uniqueId
1230     hdmi1Viewport = mFakePolicy->getDisplayViewportByUniqueId(uniqueId2);
1231     ASSERT_TRUE(hdmi1Viewport);
1232     ASSERT_EQ(displayId2, hdmi1Viewport->displayId);
1233     ASSERT_EQ(uniqueId2, hdmi1Viewport->uniqueId);
1234     ASSERT_EQ(type, hdmi1Viewport->type);
1235 
1236     // Check that we cannot find a port with "HDMI2", because we never added one
1237     std::optional<DisplayViewport> hdmi2Viewport = mFakePolicy->getDisplayViewportByPort(hdmi2);
1238     ASSERT_FALSE(hdmi2Viewport);
1239 }
1240 
1241 // --- InputReaderTest ---
1242 
1243 class InputReaderTest : public testing::Test {
1244 protected:
1245     sp<TestInputListener> mFakeListener;
1246     sp<FakeInputReaderPolicy> mFakePolicy;
1247     sp<FakeEventHub> mFakeEventHub;
1248     sp<InstrumentedInputReader> mReader;
1249 
SetUp()1250     virtual void SetUp() {
1251         mFakeEventHub = new FakeEventHub();
1252         mFakePolicy = new FakeInputReaderPolicy();
1253         mFakeListener = new TestInputListener();
1254 
1255         mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
1256     }
1257 
TearDown()1258     virtual void TearDown() {
1259         mReader.clear();
1260 
1261         mFakeListener.clear();
1262         mFakePolicy.clear();
1263         mFakeEventHub.clear();
1264     }
1265 
addDevice(int32_t deviceId,const std::string & name,uint32_t classes,const PropertyMap * configuration)1266     void addDevice(int32_t deviceId, const std::string& name, uint32_t classes,
1267             const PropertyMap* configuration) {
1268         mFakeEventHub->addDevice(deviceId, name, classes);
1269 
1270         if (configuration) {
1271             mFakeEventHub->addConfigurationMap(deviceId, configuration);
1272         }
1273         mFakeEventHub->finishDeviceScan();
1274         mReader->loopOnce();
1275         mReader->loopOnce();
1276         mFakeEventHub->assertQueueIsEmpty();
1277     }
1278 
disableDevice(int32_t deviceId,InputDevice * device)1279     void disableDevice(int32_t deviceId, InputDevice* device) {
1280         mFakePolicy->addDisabledDevice(deviceId);
1281         configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1282     }
1283 
enableDevice(int32_t deviceId,InputDevice * device)1284     void enableDevice(int32_t deviceId, InputDevice* device) {
1285         mFakePolicy->removeDisabledDevice(deviceId);
1286         configureDevice(InputReaderConfiguration::CHANGE_ENABLED_STATE, device);
1287     }
1288 
configureDevice(uint32_t changes,InputDevice * device)1289     void configureDevice(uint32_t changes, InputDevice* device) {
1290         device->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1291     }
1292 
addDeviceWithFakeInputMapper(int32_t deviceId,int32_t controllerNumber,const std::string & name,uint32_t classes,uint32_t sources,const PropertyMap * configuration)1293     FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, int32_t controllerNumber,
1294             const std::string& name, uint32_t classes, uint32_t sources,
1295             const PropertyMap* configuration) {
1296         InputDevice* device = mReader->newDevice(deviceId, controllerNumber, name, classes);
1297         FakeInputMapper* mapper = new FakeInputMapper(device, sources);
1298         device->addMapper(mapper);
1299         mReader->setNextDevice(device);
1300         addDevice(deviceId, name, classes, configuration);
1301         return mapper;
1302     }
1303 };
1304 
TEST_F(InputReaderTest,GetInputDevices)1305 TEST_F(InputReaderTest, GetInputDevices) {
1306     ASSERT_NO_FATAL_FAILURE(addDevice(1, "keyboard",
1307             INPUT_DEVICE_CLASS_KEYBOARD, nullptr));
1308     ASSERT_NO_FATAL_FAILURE(addDevice(2, "ignored",
1309             0, nullptr)); // no classes so device will be ignored
1310 
1311 
1312     std::vector<InputDeviceInfo> inputDevices;
1313     mReader->getInputDevices(inputDevices);
1314 
1315     ASSERT_EQ(1U, inputDevices.size());
1316     ASSERT_EQ(1, inputDevices[0].getId());
1317     ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
1318     ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1319     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1320     ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1321 
1322     // Should also have received a notification describing the new input devices.
1323     inputDevices = mFakePolicy->getInputDevices();
1324     ASSERT_EQ(1U, inputDevices.size());
1325     ASSERT_EQ(1, inputDevices[0].getId());
1326     ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.c_str());
1327     ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1328     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1329     ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1330 }
1331 
TEST_F(InputReaderTest,WhenEnabledChanges_SendsDeviceResetNotification)1332 TEST_F(InputReaderTest, WhenEnabledChanges_SendsDeviceResetNotification) {
1333     constexpr int32_t deviceId = 1;
1334     constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
1335     InputDevice* device = mReader->newDevice(deviceId, 0 /*controllerNumber*/, "fake", deviceClass);
1336     // Must add at least one mapper or the device will be ignored!
1337     FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1338     device->addMapper(mapper);
1339     mReader->setNextDevice(device);
1340     addDevice(deviceId, "fake", deviceClass, nullptr);
1341 
1342     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(nullptr));
1343 
1344     NotifyDeviceResetArgs resetArgs;
1345     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1346     ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1347     ASSERT_EQ(deviceId, resetArgs.deviceId);
1348 
1349     ASSERT_EQ(device->isEnabled(), true);
1350     disableDevice(deviceId, device);
1351     mReader->loopOnce();
1352 
1353     mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1354     ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1355     ASSERT_EQ(deviceId, resetArgs.deviceId);
1356     ASSERT_EQ(device->isEnabled(), false);
1357 
1358     disableDevice(deviceId, device);
1359     mReader->loopOnce();
1360     mFakeListener->assertNotifyDeviceResetWasNotCalled();
1361     mFakeListener->assertNotifyConfigurationChangedWasNotCalled();
1362     ASSERT_EQ(device->isEnabled(), false);
1363 
1364     enableDevice(deviceId, device);
1365     mReader->loopOnce();
1366     mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1367     ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1368     ASSERT_EQ(deviceId, resetArgs.deviceId);
1369     ASSERT_EQ(device->isEnabled(), true);
1370 }
1371 
TEST_F(InputReaderTest,GetKeyCodeState_ForwardsRequestsToMappers)1372 TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
1373     FakeInputMapper* mapper = nullptr;
1374     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
1375             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
1376     mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1377 
1378     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1379             AINPUT_SOURCE_ANY, AKEYCODE_A))
1380             << "Should return unknown when the device id is >= 0 but unknown.";
1381 
1382     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1383             AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1384             << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1385 
1386     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1387             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1388             << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1389 
1390     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1391             AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1392             << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1393 
1394     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1395             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1396             << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1397 }
1398 
TEST_F(InputReaderTest,GetScanCodeState_ForwardsRequestsToMappers)1399 TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
1400     FakeInputMapper* mapper = nullptr;
1401     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
1402             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
1403     mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1404 
1405     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1406             AINPUT_SOURCE_ANY, KEY_A))
1407             << "Should return unknown when the device id is >= 0 but unknown.";
1408 
1409     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1410             AINPUT_SOURCE_TRACKBALL, KEY_A))
1411             << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1412 
1413     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1414             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1415             << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1416 
1417     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1418             AINPUT_SOURCE_TRACKBALL, KEY_A))
1419             << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1420 
1421     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1422             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1423             << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1424 }
1425 
TEST_F(InputReaderTest,GetSwitchState_ForwardsRequestsToMappers)1426 TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
1427     FakeInputMapper* mapper = nullptr;
1428     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
1429             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
1430     mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1431 
1432     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1433             AINPUT_SOURCE_ANY, SW_LID))
1434             << "Should return unknown when the device id is >= 0 but unknown.";
1435 
1436     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1437             AINPUT_SOURCE_TRACKBALL, SW_LID))
1438             << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1439 
1440     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1441             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1442             << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1443 
1444     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1445             AINPUT_SOURCE_TRACKBALL, SW_LID))
1446             << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1447 
1448     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1449             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1450             << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1451 }
1452 
TEST_F(InputReaderTest,MarkSupportedKeyCodes_ForwardsRequestsToMappers)1453 TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
1454     FakeInputMapper* mapper = nullptr;
1455     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
1456             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
1457 
1458     mapper->addSupportedKeyCode(AKEYCODE_A);
1459     mapper->addSupportedKeyCode(AKEYCODE_B);
1460 
1461     const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1462     uint8_t flags[4] = { 0, 0, 0, 1 };
1463 
1464     ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1465             << "Should return false when device id is >= 0 but unknown.";
1466     ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1467 
1468     flags[3] = 1;
1469     ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1470             << "Should return false when device id is valid but the sources are not supported by the device.";
1471     ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1472 
1473     flags[3] = 1;
1474     ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1475             << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1476     ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1477 
1478     flags[3] = 1;
1479     ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1480             << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1481     ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1482 
1483     flags[3] = 1;
1484     ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1485             << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1486     ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1487 }
1488 
TEST_F(InputReaderTest,LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged)1489 TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
1490     addDevice(1, "ignored", INPUT_DEVICE_CLASS_KEYBOARD, nullptr);
1491 
1492     NotifyConfigurationChangedArgs args;
1493 
1494     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1495     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1496 }
1497 
TEST_F(InputReaderTest,LoopOnce_ForwardsRawEventsToMappers)1498 TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
1499     FakeInputMapper* mapper = nullptr;
1500     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, 0, "fake",
1501             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, nullptr));
1502 
1503     mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1504     mReader->loopOnce();
1505     ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1506 
1507     RawEvent event;
1508     ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1509     ASSERT_EQ(0, event.when);
1510     ASSERT_EQ(1, event.deviceId);
1511     ASSERT_EQ(EV_KEY, event.type);
1512     ASSERT_EQ(KEY_A, event.code);
1513     ASSERT_EQ(1, event.value);
1514 }
1515 
TEST_F(InputReaderTest,DeviceReset_IncrementsSequenceNumber)1516 TEST_F(InputReaderTest, DeviceReset_IncrementsSequenceNumber) {
1517     constexpr int32_t deviceId = 1;
1518     constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
1519     InputDevice* device = mReader->newDevice(deviceId, 0 /*controllerNumber*/, "fake", deviceClass);
1520     // Must add at least one mapper or the device will be ignored!
1521     FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_KEYBOARD);
1522     device->addMapper(mapper);
1523     mReader->setNextDevice(device);
1524     addDevice(deviceId, "fake", deviceClass, nullptr);
1525 
1526     NotifyDeviceResetArgs resetArgs;
1527     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1528     uint32_t prevSequenceNum = resetArgs.sequenceNum;
1529 
1530     disableDevice(deviceId, device);
1531     mReader->loopOnce();
1532     mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1533     ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1534     prevSequenceNum = resetArgs.sequenceNum;
1535 
1536     enableDevice(deviceId, device);
1537     mReader->loopOnce();
1538     mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1539     ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1540     prevSequenceNum = resetArgs.sequenceNum;
1541 
1542     disableDevice(deviceId, device);
1543     mReader->loopOnce();
1544     mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs);
1545     ASSERT_TRUE(prevSequenceNum < resetArgs.sequenceNum);
1546     prevSequenceNum = resetArgs.sequenceNum;
1547 }
1548 
TEST_F(InputReaderTest,Device_CanDispatchToDisplay)1549 TEST_F(InputReaderTest, Device_CanDispatchToDisplay) {
1550     constexpr int32_t deviceId = 1;
1551     constexpr uint32_t deviceClass = INPUT_DEVICE_CLASS_KEYBOARD;
1552     const char* DEVICE_LOCATION = "USB1";
1553     InputDevice* device = mReader->newDevice(deviceId, 0 /*controllerNumber*/, "fake", deviceClass,
1554             DEVICE_LOCATION);
1555     FakeInputMapper* mapper = new FakeInputMapper(device, AINPUT_SOURCE_TOUCHSCREEN);
1556     device->addMapper(mapper);
1557     mReader->setNextDevice(device);
1558     addDevice(deviceId, "fake", deviceClass, nullptr);
1559 
1560     const uint8_t hdmi1 = 1;
1561 
1562     // Associated touch screen with second display.
1563     mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
1564 
1565     // Add default and second display.
1566     mFakePolicy->addDisplayViewport(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1567             DISPLAY_ORIENTATION_0, "local:0", NO_PORT, ViewportType::VIEWPORT_INTERNAL);
1568     mFakePolicy->addDisplayViewport(SECONDARY_DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1569             DISPLAY_ORIENTATION_0, "local:1", hdmi1, ViewportType::VIEWPORT_EXTERNAL);
1570     mReader->requestRefreshConfiguration(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1571     mReader->loopOnce();
1572 
1573     // Check device.
1574     ASSERT_EQ(deviceId, device->getId());
1575     ASSERT_FALSE(mReader->canDispatchToDisplay(deviceId, DISPLAY_ID));
1576     ASSERT_TRUE(mReader->canDispatchToDisplay(deviceId, SECONDARY_DISPLAY_ID));
1577 }
1578 
1579 
1580 // --- InputDeviceTest ---
1581 
1582 class InputDeviceTest : public testing::Test {
1583 protected:
1584     static const char* DEVICE_NAME;
1585     static const int32_t DEVICE_ID;
1586     static const int32_t DEVICE_GENERATION;
1587     static const int32_t DEVICE_CONTROLLER_NUMBER;
1588     static const uint32_t DEVICE_CLASSES;
1589 
1590     sp<FakeEventHub> mFakeEventHub;
1591     sp<FakeInputReaderPolicy> mFakePolicy;
1592     sp<TestInputListener> mFakeListener;
1593     FakeInputReaderContext* mFakeContext;
1594 
1595     InputDevice* mDevice;
1596 
SetUp()1597     virtual void SetUp() {
1598         mFakeEventHub = new FakeEventHub();
1599         mFakePolicy = new FakeInputReaderPolicy();
1600         mFakeListener = new TestInputListener();
1601         mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1602 
1603         mFakeEventHub->addDevice(DEVICE_ID, DEVICE_NAME, 0);
1604         InputDeviceIdentifier identifier;
1605         identifier.name = DEVICE_NAME;
1606         mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1607                 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1608     }
1609 
TearDown()1610     virtual void TearDown() {
1611         delete mDevice;
1612 
1613         delete mFakeContext;
1614         mFakeListener.clear();
1615         mFakePolicy.clear();
1616         mFakeEventHub.clear();
1617     }
1618 };
1619 
1620 const char* InputDeviceTest::DEVICE_NAME = "device";
1621 const int32_t InputDeviceTest::DEVICE_ID = 1;
1622 const int32_t InputDeviceTest::DEVICE_GENERATION = 2;
1623 const int32_t InputDeviceTest::DEVICE_CONTROLLER_NUMBER = 0;
1624 const uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
1625         | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1626 
TEST_F(InputDeviceTest,ImmutableProperties)1627 TEST_F(InputDeviceTest, ImmutableProperties) {
1628     ASSERT_EQ(DEVICE_ID, mDevice->getId());
1629     ASSERT_STREQ(DEVICE_NAME, mDevice->getName().c_str());
1630     ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1631 }
1632 
TEST_F(InputDeviceTest,WhenDeviceCreated_EnabledIsTrue)1633 TEST_F(InputDeviceTest, WhenDeviceCreated_EnabledIsTrue) {
1634     ASSERT_EQ(mDevice->isEnabled(), true);
1635 }
1636 
TEST_F(InputDeviceTest,WhenNoMappersAreRegistered_DeviceIsIgnored)1637 TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1638     // Configuration.
1639     InputReaderConfiguration config;
1640     mDevice->configure(ARBITRARY_TIME, &config, 0);
1641 
1642     // Reset.
1643     mDevice->reset(ARBITRARY_TIME);
1644 
1645     NotifyDeviceResetArgs resetArgs;
1646     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1647     ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1648     ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1649 
1650     // Metadata.
1651     ASSERT_TRUE(mDevice->isIgnored());
1652     ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1653 
1654     InputDeviceInfo info;
1655     mDevice->getDeviceInfo(&info);
1656     ASSERT_EQ(DEVICE_ID, info.getId());
1657     ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
1658     ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1659     ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1660 
1661     // State queries.
1662     ASSERT_EQ(0, mDevice->getMetaState());
1663 
1664     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1665             << "Ignored device should return unknown key code state.";
1666     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1667             << "Ignored device should return unknown scan code state.";
1668     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1669             << "Ignored device should return unknown switch state.";
1670 
1671     const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1672     uint8_t flags[2] = { 0, 1 };
1673     ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1674             << "Ignored device should never mark any key codes.";
1675     ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1676     ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1677 }
1678 
TEST_F(InputDeviceTest,WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers)1679 TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1680     // Configuration.
1681     mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1682 
1683     FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1684     mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1685     mapper1->setMetaState(AMETA_ALT_ON);
1686     mapper1->addSupportedKeyCode(AKEYCODE_A);
1687     mapper1->addSupportedKeyCode(AKEYCODE_B);
1688     mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1689     mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1690     mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1691     mapper1->setScanCodeState(3, AKEY_STATE_UP);
1692     mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1693     mDevice->addMapper(mapper1);
1694 
1695     FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1696     mapper2->setMetaState(AMETA_SHIFT_ON);
1697     mDevice->addMapper(mapper2);
1698 
1699     InputReaderConfiguration config;
1700     mDevice->configure(ARBITRARY_TIME, &config, 0);
1701 
1702     String8 propertyValue;
1703     ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
1704             << "Device should have read configuration during configuration phase.";
1705     ASSERT_STREQ("value", propertyValue.string());
1706 
1707     ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1708     ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1709 
1710     // Reset
1711     mDevice->reset(ARBITRARY_TIME);
1712     ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
1713     ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
1714 
1715     NotifyDeviceResetArgs resetArgs;
1716     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
1717     ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
1718     ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1719 
1720     // Metadata.
1721     ASSERT_FALSE(mDevice->isIgnored());
1722     ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1723 
1724     InputDeviceInfo info;
1725     mDevice->getDeviceInfo(&info);
1726     ASSERT_EQ(DEVICE_ID, info.getId());
1727     ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.c_str());
1728     ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1729     ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1730 
1731     // State queries.
1732     ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1733             << "Should query mappers and combine meta states.";
1734 
1735     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1736             << "Should return unknown key code state when source not supported.";
1737     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1738             << "Should return unknown scan code state when source not supported.";
1739     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1740             << "Should return unknown switch state when source not supported.";
1741 
1742     ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1743             << "Should query mapper when source is supported.";
1744     ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1745             << "Should query mapper when source is supported.";
1746     ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1747             << "Should query mapper when source is supported.";
1748 
1749     const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1750     uint8_t flags[4] = { 0, 0, 0, 1 };
1751     ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1752             << "Should do nothing when source is unsupported.";
1753     ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1754     ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1755     ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1756     ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1757 
1758     ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1759             << "Should query mapper when source is supported.";
1760     ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1761     ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1762     ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1763     ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1764 
1765     // Event handling.
1766     RawEvent event;
1767     mDevice->process(&event, 1);
1768 
1769     ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1770     ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1771 }
1772 
1773 
1774 // --- InputMapperTest ---
1775 
1776 class InputMapperTest : public testing::Test {
1777 protected:
1778     static const char* DEVICE_NAME;
1779     static const char* DEVICE_LOCATION;
1780     static const int32_t DEVICE_ID;
1781     static const int32_t DEVICE_GENERATION;
1782     static const int32_t DEVICE_CONTROLLER_NUMBER;
1783     static const uint32_t DEVICE_CLASSES;
1784 
1785     sp<FakeEventHub> mFakeEventHub;
1786     sp<FakeInputReaderPolicy> mFakePolicy;
1787     sp<TestInputListener> mFakeListener;
1788     FakeInputReaderContext* mFakeContext;
1789     InputDevice* mDevice;
1790 
SetUp()1791     virtual void SetUp() {
1792         mFakeEventHub = new FakeEventHub();
1793         mFakePolicy = new FakeInputReaderPolicy();
1794         mFakeListener = new TestInputListener();
1795         mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1796         InputDeviceIdentifier identifier;
1797         identifier.name = DEVICE_NAME;
1798         identifier.location = DEVICE_LOCATION;
1799         mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1800                 DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
1801 
1802         mFakeEventHub->addDevice(mDevice->getId(), DEVICE_NAME, 0);
1803     }
1804 
TearDown()1805     virtual void TearDown() {
1806         delete mDevice;
1807         delete mFakeContext;
1808         mFakeListener.clear();
1809         mFakePolicy.clear();
1810         mFakeEventHub.clear();
1811     }
1812 
addConfigurationProperty(const char * key,const char * value)1813     void addConfigurationProperty(const char* key, const char* value) {
1814         mFakeEventHub->addConfigurationProperty(mDevice->getId(), String8(key), String8(value));
1815     }
1816 
configureDevice(uint32_t changes)1817     void configureDevice(uint32_t changes) {
1818         mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), changes);
1819     }
1820 
addMapperAndConfigure(InputMapper * mapper)1821     void addMapperAndConfigure(InputMapper* mapper) {
1822         mDevice->addMapper(mapper);
1823         configureDevice(0);
1824         mDevice->reset(ARBITRARY_TIME);
1825     }
1826 
setDisplayInfoAndReconfigure(int32_t displayId,int32_t width,int32_t height,int32_t orientation,const std::string & uniqueId,std::optional<uint8_t> physicalPort,ViewportType viewportType)1827     void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
1828             int32_t orientation, const std::string& uniqueId,
1829             std::optional<uint8_t> physicalPort, ViewportType viewportType) {
1830         mFakePolicy->addDisplayViewport(
1831                 displayId, width, height, orientation, uniqueId, physicalPort, viewportType);
1832         configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1833     }
1834 
clearViewports()1835     void clearViewports() {
1836         mFakePolicy->clearViewports();
1837     }
1838 
process(InputMapper * mapper,nsecs_t when,int32_t type,int32_t code,int32_t value)1839     static void process(InputMapper* mapper, nsecs_t when, int32_t type,
1840             int32_t code, int32_t value) {
1841         RawEvent event;
1842         event.when = when;
1843         event.deviceId = mapper->getDeviceId();
1844         event.type = type;
1845         event.code = code;
1846         event.value = value;
1847         mapper->process(&event);
1848     }
1849 
assertMotionRange(const InputDeviceInfo & info,int32_t axis,uint32_t source,float min,float max,float flat,float fuzz)1850     static void assertMotionRange(const InputDeviceInfo& info,
1851             int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1852         const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
1853         ASSERT_TRUE(range != nullptr) << "Axis: " << axis << " Source: " << source;
1854         ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1855         ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1856         ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1857         ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1858         ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1859         ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1860     }
1861 
assertPointerCoords(const PointerCoords & coords,float x,float y,float pressure,float size,float touchMajor,float touchMinor,float toolMajor,float toolMinor,float orientation,float distance)1862     static void assertPointerCoords(const PointerCoords& coords,
1863             float x, float y, float pressure, float size,
1864             float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1865             float orientation, float distance) {
1866         ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1867         ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1868         ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1869         ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1870         ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1871         ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1872         ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1873         ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1874         ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1875         ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1876     }
1877 
assertPosition(const sp<FakePointerController> & controller,float x,float y)1878     static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1879         float actualX, actualY;
1880         controller->getPosition(&actualX, &actualY);
1881         ASSERT_NEAR(x, actualX, 1);
1882         ASSERT_NEAR(y, actualY, 1);
1883     }
1884 };
1885 
1886 const char* InputMapperTest::DEVICE_NAME = "device";
1887 const char* InputMapperTest::DEVICE_LOCATION = "USB1";
1888 const int32_t InputMapperTest::DEVICE_ID = 1;
1889 const int32_t InputMapperTest::DEVICE_GENERATION = 2;
1890 const int32_t InputMapperTest::DEVICE_CONTROLLER_NUMBER = 0;
1891 const uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1892 
1893 
1894 // --- SwitchInputMapperTest ---
1895 
1896 class SwitchInputMapperTest : public InputMapperTest {
1897 protected:
1898 };
1899 
TEST_F(SwitchInputMapperTest,GetSources)1900 TEST_F(SwitchInputMapperTest, GetSources) {
1901     SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1902     addMapperAndConfigure(mapper);
1903 
1904     ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1905 }
1906 
TEST_F(SwitchInputMapperTest,GetSwitchState)1907 TEST_F(SwitchInputMapperTest, GetSwitchState) {
1908     SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1909     addMapperAndConfigure(mapper);
1910 
1911     mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1912     ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1913 
1914     mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1915     ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1916 }
1917 
TEST_F(SwitchInputMapperTest,Process)1918 TEST_F(SwitchInputMapperTest, Process) {
1919     SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1920     addMapperAndConfigure(mapper);
1921 
1922     process(mapper, ARBITRARY_TIME, EV_SW, SW_LID, 1);
1923     process(mapper, ARBITRARY_TIME, EV_SW, SW_JACK_PHYSICAL_INSERT, 1);
1924     process(mapper, ARBITRARY_TIME, EV_SW, SW_HEADPHONE_INSERT, 0);
1925     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
1926 
1927     NotifySwitchArgs args;
1928     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1929     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1930     ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT), args.switchValues);
1931     ASSERT_EQ((1U << SW_LID) | (1U << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT),
1932             args.switchMask);
1933     ASSERT_EQ(uint32_t(0), args.policyFlags);
1934 }
1935 
1936 
1937 // --- KeyboardInputMapperTest ---
1938 
1939 class KeyboardInputMapperTest : public InputMapperTest {
1940 protected:
1941     const std::string UNIQUE_ID = "local:0";
1942 
1943     void prepareDisplay(int32_t orientation);
1944 
1945     void testDPadKeyRotation(KeyboardInputMapper* mapper,
1946             int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1947 };
1948 
1949 /* Similar to setDisplayInfoAndReconfigure, but pre-populates all parameters except for the
1950  * orientation.
1951  */
prepareDisplay(int32_t orientation)1952 void KeyboardInputMapperTest::prepareDisplay(int32_t orientation) {
1953     setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
1954             orientation, UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
1955 }
1956 
testDPadKeyRotation(KeyboardInputMapper * mapper,int32_t originalScanCode,int32_t originalKeyCode,int32_t rotatedKeyCode)1957 void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
1958         int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) {
1959     NotifyKeyArgs args;
1960 
1961     process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 1);
1962     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1963     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1964     ASSERT_EQ(originalScanCode, args.scanCode);
1965     ASSERT_EQ(rotatedKeyCode, args.keyCode);
1966 
1967     process(mapper, ARBITRARY_TIME, EV_KEY, originalScanCode, 0);
1968     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1969     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1970     ASSERT_EQ(originalScanCode, args.scanCode);
1971     ASSERT_EQ(rotatedKeyCode, args.keyCode);
1972 }
1973 
1974 
TEST_F(KeyboardInputMapperTest,GetSources)1975 TEST_F(KeyboardInputMapperTest, GetSources) {
1976     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1977             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1978     addMapperAndConfigure(mapper);
1979 
1980     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
1981 }
1982 
TEST_F(KeyboardInputMapperTest,Process_SimpleKeyPress)1983 TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
1984     const int32_t USAGE_A = 0x070004;
1985     const int32_t USAGE_UNKNOWN = 0x07ffff;
1986     mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
1987     mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
1988 
1989     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1990             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1991     addMapperAndConfigure(mapper);
1992 
1993     // Key down by scan code.
1994     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_HOME, 1);
1995     NotifyKeyArgs args;
1996     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1997     ASSERT_EQ(DEVICE_ID, args.deviceId);
1998     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1999     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2000     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2001     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2002     ASSERT_EQ(KEY_HOME, args.scanCode);
2003     ASSERT_EQ(AMETA_NONE, args.metaState);
2004     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2005     ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2006     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2007 
2008     // Key up by scan code.
2009     process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_HOME, 0);
2010     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2011     ASSERT_EQ(DEVICE_ID, args.deviceId);
2012     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2013     ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2014     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2015     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2016     ASSERT_EQ(KEY_HOME, args.scanCode);
2017     ASSERT_EQ(AMETA_NONE, args.metaState);
2018     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2019     ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2020     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2021 
2022     // Key down by usage code.
2023     process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2024     process(mapper, ARBITRARY_TIME, EV_KEY, 0, 1);
2025     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2026     ASSERT_EQ(DEVICE_ID, args.deviceId);
2027     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2028     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2029     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2030     ASSERT_EQ(AKEYCODE_A, args.keyCode);
2031     ASSERT_EQ(0, args.scanCode);
2032     ASSERT_EQ(AMETA_NONE, args.metaState);
2033     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2034     ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2035     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2036 
2037     // Key up by usage code.
2038     process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_A);
2039     process(mapper, ARBITRARY_TIME + 1, EV_KEY, 0, 0);
2040     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2041     ASSERT_EQ(DEVICE_ID, args.deviceId);
2042     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2043     ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2044     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2045     ASSERT_EQ(AKEYCODE_A, args.keyCode);
2046     ASSERT_EQ(0, args.scanCode);
2047     ASSERT_EQ(AMETA_NONE, args.metaState);
2048     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2049     ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
2050     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2051 
2052     // Key down with unknown scan code or usage code.
2053     process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2054     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UNKNOWN, 1);
2055     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2056     ASSERT_EQ(DEVICE_ID, args.deviceId);
2057     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2058     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2059     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2060     ASSERT_EQ(0, args.keyCode);
2061     ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2062     ASSERT_EQ(AMETA_NONE, args.metaState);
2063     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2064     ASSERT_EQ(0U, args.policyFlags);
2065     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2066 
2067     // Key up with unknown scan code or usage code.
2068     process(mapper, ARBITRARY_TIME, EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
2069     process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_UNKNOWN, 0);
2070     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2071     ASSERT_EQ(DEVICE_ID, args.deviceId);
2072     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2073     ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2074     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2075     ASSERT_EQ(0, args.keyCode);
2076     ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
2077     ASSERT_EQ(AMETA_NONE, args.metaState);
2078     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
2079     ASSERT_EQ(0U, args.policyFlags);
2080     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2081 }
2082 
TEST_F(KeyboardInputMapperTest,Process_ShouldUpdateMetaState)2083 TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
2084     mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
2085     mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2086 
2087     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2088             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2089     addMapperAndConfigure(mapper);
2090 
2091     // Initial metastate.
2092     ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2093 
2094     // Metakey down.
2095     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_LEFTSHIFT, 1);
2096     NotifyKeyArgs args;
2097     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2098     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2099     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2100     ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2101 
2102     // Key down.
2103     process(mapper, ARBITRARY_TIME + 1, EV_KEY, KEY_A, 1);
2104     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2105     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2106     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2107 
2108     // Key up.
2109     process(mapper, ARBITRARY_TIME + 2, EV_KEY, KEY_A, 0);
2110     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2111     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2112     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
2113 
2114     // Metakey up.
2115     process(mapper, ARBITRARY_TIME + 3, EV_KEY, KEY_LEFTSHIFT, 0);
2116     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2117     ASSERT_EQ(AMETA_NONE, args.metaState);
2118     ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2119     ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
2120 }
2121 
TEST_F(KeyboardInputMapperTest,Process_WhenNotOrientationAware_ShouldNotRotateDPad)2122 TEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
2123     mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2124     mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2125     mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2126     mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2127 
2128     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2129             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2130     addMapperAndConfigure(mapper);
2131 
2132     prepareDisplay(DISPLAY_ORIENTATION_90);
2133     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2134             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2135     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2136             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2137     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2138             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2139     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2140             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2141 }
2142 
TEST_F(KeyboardInputMapperTest,Process_WhenOrientationAware_ShouldRotateDPad)2143 TEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
2144     mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2145     mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
2146     mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
2147     mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
2148 
2149     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2150             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2151     addConfigurationProperty("keyboard.orientationAware", "1");
2152     addMapperAndConfigure(mapper);
2153 
2154     prepareDisplay(DISPLAY_ORIENTATION_0);
2155     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2156             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
2157     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2158             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
2159     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2160             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
2161     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2162             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
2163 
2164     clearViewports();
2165     prepareDisplay(DISPLAY_ORIENTATION_90);
2166     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2167             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
2168     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2169             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
2170     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2171             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
2172     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2173             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
2174 
2175     clearViewports();
2176     prepareDisplay(DISPLAY_ORIENTATION_180);
2177     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2178             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
2179     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2180             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
2181     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2182             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
2183     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2184             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
2185 
2186     clearViewports();
2187     prepareDisplay(DISPLAY_ORIENTATION_270);
2188     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2189             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
2190     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2191             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
2192     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2193             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
2194     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
2195             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
2196 
2197     // Special case: if orientation changes while key is down, we still emit the same keycode
2198     // in the key up as we did in the key down.
2199     NotifyKeyArgs args;
2200     clearViewports();
2201     prepareDisplay(DISPLAY_ORIENTATION_270);
2202     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
2203     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2204     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2205     ASSERT_EQ(KEY_UP, args.scanCode);
2206     ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2207 
2208     clearViewports();
2209     prepareDisplay(DISPLAY_ORIENTATION_180);
2210     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
2211     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2212     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2213     ASSERT_EQ(KEY_UP, args.scanCode);
2214     ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
2215 }
2216 
TEST_F(KeyboardInputMapperTest,DisplayIdConfigurationChange_NotOrientationAware)2217 TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_NotOrientationAware) {
2218     // If the keyboard is not orientation aware,
2219     // key events should not be associated with a specific display id
2220     mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2221 
2222     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2223             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2224     addMapperAndConfigure(mapper);
2225     NotifyKeyArgs args;
2226 
2227     // Display id should be ADISPLAY_ID_NONE without any display configuration.
2228     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
2229     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2230     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
2231     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2232     ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2233 
2234     prepareDisplay(DISPLAY_ORIENTATION_0);
2235     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
2236     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2237     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
2238     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2239     ASSERT_EQ(ADISPLAY_ID_NONE, args.displayId);
2240 }
2241 
TEST_F(KeyboardInputMapperTest,DisplayIdConfigurationChange_OrientationAware)2242 TEST_F(KeyboardInputMapperTest, DisplayIdConfigurationChange_OrientationAware) {
2243     // If the keyboard is orientation aware,
2244     // key events should be associated with the internal viewport
2245     mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
2246 
2247     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2248             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2249     addConfigurationProperty("keyboard.orientationAware", "1");
2250     addMapperAndConfigure(mapper);
2251     NotifyKeyArgs args;
2252 
2253     // Display id should be ADISPLAY_ID_NONE without any display configuration.
2254     // ^--- already checked by the previous test
2255 
2256     setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
2257             UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
2258     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
2259     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2260     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
2261     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2262     ASSERT_EQ(DISPLAY_ID, args.displayId);
2263 
2264     constexpr int32_t newDisplayId = 2;
2265     clearViewports();
2266     setDisplayInfoAndReconfigure(newDisplayId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0,
2267             UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_INTERNAL);
2268     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 1);
2269     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2270     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_UP, 0);
2271     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2272     ASSERT_EQ(newDisplayId, args.displayId);
2273 }
2274 
TEST_F(KeyboardInputMapperTest,GetKeyCodeState)2275 TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
2276     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2277             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2278     addMapperAndConfigure(mapper);
2279 
2280     mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
2281     ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2282 
2283     mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
2284     ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2285 }
2286 
TEST_F(KeyboardInputMapperTest,GetScanCodeState)2287 TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
2288     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2289             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2290     addMapperAndConfigure(mapper);
2291 
2292     mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
2293     ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2294 
2295     mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
2296     ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2297 }
2298 
TEST_F(KeyboardInputMapperTest,MarkSupportedKeyCodes)2299 TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
2300     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2301             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2302     addMapperAndConfigure(mapper);
2303 
2304     mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
2305 
2306     const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
2307     uint8_t flags[2] = { 0, 0 };
2308     ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
2309     ASSERT_TRUE(flags[0]);
2310     ASSERT_FALSE(flags[1]);
2311 }
2312 
TEST_F(KeyboardInputMapperTest,Process_LockedKeysShouldToggleMetaStateAndLeds)2313 TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
2314     mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
2315     mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
2316     mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
2317     mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
2318     mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
2319     mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
2320 
2321     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
2322             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
2323     addMapperAndConfigure(mapper);
2324 
2325     // Initialization should have turned all of the lights off.
2326     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2327     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2328     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2329 
2330     // Toggle caps lock on.
2331     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2332     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
2333     ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2334     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2335     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2336     ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
2337 
2338     // Toggle num lock on.
2339     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2340     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
2341     ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2342     ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2343     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2344     ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
2345 
2346     // Toggle caps lock off.
2347     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 1);
2348     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_CAPSLOCK, 0);
2349     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2350     ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2351     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2352     ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
2353 
2354     // Toggle scroll lock on.
2355     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2356     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
2357     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2358     ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2359     ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2360     ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2361 
2362     // Toggle num lock off.
2363     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 1);
2364     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_NUMLOCK, 0);
2365     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2366     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2367     ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2368     ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
2369 
2370     // Toggle scroll lock off.
2371     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 1);
2372     process(mapper, ARBITRARY_TIME, EV_KEY, KEY_SCROLLLOCK, 0);
2373     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
2374     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
2375     ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
2376     ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
2377 }
2378 
2379 
2380 // --- CursorInputMapperTest ---
2381 
2382 class CursorInputMapperTest : public InputMapperTest {
2383 protected:
2384     static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
2385 
2386     sp<FakePointerController> mFakePointerController;
2387 
SetUp()2388     virtual void SetUp() {
2389         InputMapperTest::SetUp();
2390 
2391         mFakePointerController = new FakePointerController();
2392         mFakePolicy->setPointerController(mDevice->getId(), mFakePointerController);
2393     }
2394 
2395     void testMotionRotation(CursorInputMapper* mapper,
2396             int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
2397 
prepareDisplay(int32_t orientation)2398     void prepareDisplay(int32_t orientation) {
2399         const std::string uniqueId = "local:0";
2400         const ViewportType viewportType = ViewportType::VIEWPORT_INTERNAL;
2401         setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
2402                 orientation, uniqueId, NO_PORT, viewportType);
2403     }
2404 };
2405 
2406 const int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
2407 
testMotionRotation(CursorInputMapper * mapper,int32_t originalX,int32_t originalY,int32_t rotatedX,int32_t rotatedY)2408 void CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
2409         int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
2410     NotifyMotionArgs args;
2411 
2412     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, originalX);
2413     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, originalY);
2414     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2415     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2416     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2417     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2418             float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
2419             float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
2420             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2421 }
2422 
TEST_F(CursorInputMapperTest,WhenModeIsPointer_GetSources_ReturnsMouse)2423 TEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
2424     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2425     addConfigurationProperty("cursor.mode", "pointer");
2426     addMapperAndConfigure(mapper);
2427 
2428     ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2429 }
2430 
TEST_F(CursorInputMapperTest,WhenModeIsNavigation_GetSources_ReturnsTrackball)2431 TEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
2432     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2433     addConfigurationProperty("cursor.mode", "navigation");
2434     addMapperAndConfigure(mapper);
2435 
2436     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
2437 }
2438 
TEST_F(CursorInputMapperTest,WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController)2439 TEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
2440     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2441     addConfigurationProperty("cursor.mode", "pointer");
2442     addMapperAndConfigure(mapper);
2443 
2444     InputDeviceInfo info;
2445     mapper->populateDeviceInfo(&info);
2446 
2447     // Initially there may not be a valid motion range.
2448     ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
2449     ASSERT_EQ(nullptr, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
2450     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2451             AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
2452 
2453     // When the bounds are set, then there should be a valid motion range.
2454     mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
2455 
2456     InputDeviceInfo info2;
2457     mapper->populateDeviceInfo(&info2);
2458 
2459     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2460             AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
2461             1, 800 - 1, 0.0f, 0.0f));
2462     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2463             AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
2464             2, 480 - 1, 0.0f, 0.0f));
2465     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2466             AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
2467             0.0f, 1.0f, 0.0f, 0.0f));
2468 }
2469 
TEST_F(CursorInputMapperTest,WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange)2470 TEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
2471     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2472     addConfigurationProperty("cursor.mode", "navigation");
2473     addMapperAndConfigure(mapper);
2474 
2475     InputDeviceInfo info;
2476     mapper->populateDeviceInfo(&info);
2477 
2478     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2479             AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
2480             -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2481     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2482             AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
2483             -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2484     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2485             AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2486             0.0f, 1.0f, 0.0f, 0.0f));
2487 }
2488 
TEST_F(CursorInputMapperTest,Process_ShouldSetAllFieldsAndIncludeGlobalMetaState)2489 TEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
2490     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2491     addConfigurationProperty("cursor.mode", "navigation");
2492     addMapperAndConfigure(mapper);
2493 
2494     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2495 
2496     NotifyMotionArgs args;
2497 
2498     // Button press.
2499     // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
2500     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2501     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2502     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2503     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2504     ASSERT_EQ(DEVICE_ID, args.deviceId);
2505     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2506     ASSERT_EQ(uint32_t(0), args.policyFlags);
2507     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2508     ASSERT_EQ(0, args.flags);
2509     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2510     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2511     ASSERT_EQ(0, args.edgeFlags);
2512     ASSERT_EQ(uint32_t(1), args.pointerCount);
2513     ASSERT_EQ(0, args.pointerProperties[0].id);
2514     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2515     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2516             0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2517     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2518     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2519     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2520 
2521     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2522     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2523     ASSERT_EQ(DEVICE_ID, args.deviceId);
2524     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2525     ASSERT_EQ(uint32_t(0), args.policyFlags);
2526     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2527     ASSERT_EQ(0, args.flags);
2528     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2529     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2530     ASSERT_EQ(0, args.edgeFlags);
2531     ASSERT_EQ(uint32_t(1), args.pointerCount);
2532     ASSERT_EQ(0, args.pointerProperties[0].id);
2533     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2534     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2535             0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2536     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2537     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2538     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2539 
2540     // Button release.  Should have same down time.
2541     process(mapper, ARBITRARY_TIME + 1, EV_KEY, BTN_MOUSE, 0);
2542     process(mapper, ARBITRARY_TIME + 1, EV_SYN, SYN_REPORT, 0);
2543     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2544     ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2545     ASSERT_EQ(DEVICE_ID, args.deviceId);
2546     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2547     ASSERT_EQ(uint32_t(0), args.policyFlags);
2548     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2549     ASSERT_EQ(0, args.flags);
2550     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2551     ASSERT_EQ(0, args.buttonState);
2552     ASSERT_EQ(0, args.edgeFlags);
2553     ASSERT_EQ(uint32_t(1), args.pointerCount);
2554     ASSERT_EQ(0, args.pointerProperties[0].id);
2555     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2556     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2557             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2558     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2559     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2560     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2561 
2562     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2563     ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2564     ASSERT_EQ(DEVICE_ID, args.deviceId);
2565     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2566     ASSERT_EQ(uint32_t(0), args.policyFlags);
2567     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2568     ASSERT_EQ(0, args.flags);
2569     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2570     ASSERT_EQ(0, args.buttonState);
2571     ASSERT_EQ(0, args.edgeFlags);
2572     ASSERT_EQ(uint32_t(1), args.pointerCount);
2573     ASSERT_EQ(0, args.pointerProperties[0].id);
2574     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2575     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2576             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2577     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2578     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2579     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2580 }
2581 
TEST_F(CursorInputMapperTest,Process_ShouldHandleIndependentXYUpdates)2582 TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
2583     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2584     addConfigurationProperty("cursor.mode", "navigation");
2585     addMapperAndConfigure(mapper);
2586 
2587     NotifyMotionArgs args;
2588 
2589     // Motion in X but not Y.
2590     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2591     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2592     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2593     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2594     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2595             1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2596 
2597     // Motion in Y but not X.
2598     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2599     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2600     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2601     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2602     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2603             0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2604 }
2605 
TEST_F(CursorInputMapperTest,Process_ShouldHandleIndependentButtonUpdates)2606 TEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
2607     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2608     addConfigurationProperty("cursor.mode", "navigation");
2609     addMapperAndConfigure(mapper);
2610 
2611     NotifyMotionArgs args;
2612 
2613     // Button press.
2614     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2615     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2616     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2617     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2618     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2619             0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2620 
2621     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2622     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2623     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2624             0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2625 
2626     // Button release.
2627     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2628     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2629     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2630     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2631     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2632             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2633 
2634     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2635     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2636     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2637             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2638 }
2639 
TEST_F(CursorInputMapperTest,Process_ShouldHandleCombinedXYAndButtonUpdates)2640 TEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
2641     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2642     addConfigurationProperty("cursor.mode", "navigation");
2643     addMapperAndConfigure(mapper);
2644 
2645     NotifyMotionArgs args;
2646 
2647     // Combined X, Y and Button.
2648     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 1);
2649     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, -2);
2650     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
2651     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2652     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2653     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2654     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2655             1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2656             1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2657 
2658     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2659     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
2660     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2661             1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2662             1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2663 
2664     // Move X, Y a bit while pressed.
2665     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 2);
2666     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 1);
2667     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2668     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2669     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2670     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2671             2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2672             1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2673 
2674     // Release Button.
2675     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 0);
2676     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2677     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2678     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
2679     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2680             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2681 
2682     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2683     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2684     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2685             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2686 }
2687 
TEST_F(CursorInputMapperTest,Process_WhenNotOrientationAware_ShouldNotRotateMotions)2688 TEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
2689     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2690     addConfigurationProperty("cursor.mode", "navigation");
2691     addMapperAndConfigure(mapper);
2692 
2693     prepareDisplay(DISPLAY_ORIENTATION_90);
2694     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0,  1));
2695     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1,  1));
2696     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  1,  0));
2697     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1, -1));
2698     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0, -1));
2699     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2700     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0, -1,  0));
2701     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1,  1));
2702 }
2703 
TEST_F(CursorInputMapperTest,Process_WhenOrientationAware_ShouldRotateMotions)2704 TEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
2705     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2706     addConfigurationProperty("cursor.mode", "navigation");
2707     addConfigurationProperty("cursor.orientationAware", "1");
2708     addMapperAndConfigure(mapper);
2709 
2710     prepareDisplay(DISPLAY_ORIENTATION_0);
2711     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0,  1));
2712     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1,  1));
2713     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  1,  0));
2714     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1, -1));
2715     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0, -1));
2716     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2717     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0, -1,  0));
2718     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1,  1));
2719 
2720     prepareDisplay(DISPLAY_ORIENTATION_90);
2721     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  1,  0));
2722     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1, -1));
2723     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  0, -1));
2724     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1, -1, -1));
2725     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1, -1,  0));
2726     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1,  1));
2727     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  0,  1));
2728     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1,  1,  1));
2729 
2730     prepareDisplay(DISPLAY_ORIENTATION_180);
2731     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0, -1));
2732     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1, -1, -1));
2733     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0, -1,  0));
2734     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1, -1,  1));
2735     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0,  1));
2736     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1,  1,  1));
2737     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  1,  0));
2738     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1,  1, -1));
2739 
2740     prepareDisplay(DISPLAY_ORIENTATION_270);
2741     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1, -1,  0));
2742     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1, -1,  1));
2743     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  0,  1));
2744     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1,  1));
2745     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  1,  0));
2746     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1,  1, -1));
2747     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  0, -1));
2748     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1, -1));
2749 }
2750 
TEST_F(CursorInputMapperTest,Process_ShouldHandleAllButtons)2751 TEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2752     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2753     addConfigurationProperty("cursor.mode", "pointer");
2754     addMapperAndConfigure(mapper);
2755 
2756     mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2757     mFakePointerController->setPosition(100, 200);
2758     mFakePointerController->setButtonState(0);
2759 
2760     NotifyMotionArgs motionArgs;
2761     NotifyKeyArgs keyArgs;
2762 
2763     // press BTN_LEFT, release BTN_LEFT
2764     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 1);
2765     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2766     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2767     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2768     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2769     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2770     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2771             100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2772 
2773     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2774     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2775     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2776     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2777     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2778             100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2779 
2780     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_LEFT, 0);
2781     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2782     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2783     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2784     ASSERT_EQ(0, motionArgs.buttonState);
2785     ASSERT_EQ(0, mFakePointerController->getButtonState());
2786     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2787             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2788 
2789     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2790     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2791     ASSERT_EQ(0, motionArgs.buttonState);
2792     ASSERT_EQ(0, mFakePointerController->getButtonState());
2793     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2794             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2795 
2796     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2797     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2798     ASSERT_EQ(0, motionArgs.buttonState);
2799     ASSERT_EQ(0, mFakePointerController->getButtonState());
2800     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2801             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2802 
2803     // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
2804     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 1);
2805     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 1);
2806     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2807     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2808     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2809     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2810             motionArgs.buttonState);
2811     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2812             mFakePointerController->getButtonState());
2813     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2814             100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2815 
2816     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2817     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2818     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2819     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2820             mFakePointerController->getButtonState());
2821     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2822             100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2823 
2824     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2825     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2826     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2827             motionArgs.buttonState);
2828     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2829             mFakePointerController->getButtonState());
2830     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2831             100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2832 
2833     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_RIGHT, 0);
2834     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2835     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2836     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2837     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2838     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
2839     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2840             100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2841 
2842     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2843     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
2844     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2845     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
2846     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2847             100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2848 
2849     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2850     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2851     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2852     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2853     ASSERT_EQ(0, motionArgs.buttonState);
2854     ASSERT_EQ(0, mFakePointerController->getButtonState());
2855     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2856             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2857     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MIDDLE, 0);
2858     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2859 
2860     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2861     ASSERT_EQ(0, motionArgs.buttonState);
2862     ASSERT_EQ(0, mFakePointerController->getButtonState());
2863     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2864     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2865             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2866 
2867     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2868     ASSERT_EQ(0, motionArgs.buttonState);
2869     ASSERT_EQ(0, mFakePointerController->getButtonState());
2870     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2871     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2872             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2873 
2874     // press BTN_BACK, release BTN_BACK
2875     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 1);
2876     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2877     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2878     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2879     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2880 
2881     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2882     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2883     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2884     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2885     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2886             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2887 
2888     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2889     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2890     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2891     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2892     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2893             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2894 
2895     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_BACK, 0);
2896     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2897     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2898     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2899     ASSERT_EQ(0, motionArgs.buttonState);
2900     ASSERT_EQ(0, mFakePointerController->getButtonState());
2901     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2902             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2903 
2904     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2905     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2906     ASSERT_EQ(0, motionArgs.buttonState);
2907     ASSERT_EQ(0, mFakePointerController->getButtonState());
2908 
2909     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2910             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2911     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2912     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2913     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2914 
2915     // press BTN_SIDE, release BTN_SIDE
2916     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 1);
2917     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2918     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2919     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2920     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2921 
2922     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2923     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2924     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2925     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2926     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2927             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2928 
2929     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2930     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2931     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2932     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2933     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2934             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2935 
2936     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_SIDE, 0);
2937     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2938     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2939     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2940     ASSERT_EQ(0, motionArgs.buttonState);
2941     ASSERT_EQ(0, mFakePointerController->getButtonState());
2942     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2943             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2944 
2945     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2946     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2947     ASSERT_EQ(0, motionArgs.buttonState);
2948     ASSERT_EQ(0, mFakePointerController->getButtonState());
2949     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2950             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2951 
2952     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2953     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2954     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2955 
2956     // press BTN_FORWARD, release BTN_FORWARD
2957     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 1);
2958     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2959     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2960     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2961     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2962 
2963     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2964     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2965     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2966     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
2967     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2968             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2969 
2970     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2971     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
2972     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2973     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
2974     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2975             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2976 
2977     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_FORWARD, 0);
2978     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
2979     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2980     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
2981     ASSERT_EQ(0, motionArgs.buttonState);
2982     ASSERT_EQ(0, mFakePointerController->getButtonState());
2983     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2984             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2985 
2986     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2987     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2988     ASSERT_EQ(0, motionArgs.buttonState);
2989     ASSERT_EQ(0, mFakePointerController->getButtonState());
2990     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2991             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2992 
2993     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2994     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2995     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2996 
2997     // press BTN_EXTRA, release BTN_EXTRA
2998     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 1);
2999     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3000     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3001     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3002     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3003 
3004     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3005     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3006     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3007     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
3008     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3009             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3010 
3011     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3012     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
3013     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3014     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
3015     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3016             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3017 
3018     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_EXTRA, 0);
3019     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3020     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3021     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
3022     ASSERT_EQ(0, motionArgs.buttonState);
3023     ASSERT_EQ(0, mFakePointerController->getButtonState());
3024     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3025             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3026 
3027     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3028     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3029     ASSERT_EQ(0, motionArgs.buttonState);
3030     ASSERT_EQ(0, mFakePointerController->getButtonState());
3031     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3032             100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3033 
3034     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3035     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3036     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3037 }
3038 
TEST_F(CursorInputMapperTest,Process_WhenModeIsPointer_ShouldMoveThePointerAround)3039 TEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
3040     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3041     addConfigurationProperty("cursor.mode", "pointer");
3042     addMapperAndConfigure(mapper);
3043 
3044     mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3045     mFakePointerController->setPosition(100, 200);
3046     mFakePointerController->setButtonState(0);
3047 
3048     NotifyMotionArgs args;
3049 
3050     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3051     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3052     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3053     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3054     ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3055     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3056     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3057             110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3058     ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3059 }
3060 
TEST_F(CursorInputMapperTest,Process_PointerCapture)3061 TEST_F(CursorInputMapperTest, Process_PointerCapture) {
3062     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3063     addConfigurationProperty("cursor.mode", "pointer");
3064     mFakePolicy->setPointerCapture(true);
3065     addMapperAndConfigure(mapper);
3066 
3067     NotifyDeviceResetArgs resetArgs;
3068     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3069     ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3070     ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3071 
3072     mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3073     mFakePointerController->setPosition(100, 200);
3074     mFakePointerController->setButtonState(0);
3075 
3076     NotifyMotionArgs args;
3077 
3078     // Move.
3079     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3080     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3081     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3082     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3083     ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3084     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3085     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3086             10.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3087     ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3088 
3089     // Button press.
3090     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_MOUSE, 1);
3091     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3092     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3093     ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3094     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
3095     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3096             0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3097     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3098     ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3099     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, args.action);
3100     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3101             0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3102 
3103     // Button release.
3104     process(mapper, ARBITRARY_TIME + 2, EV_KEY, BTN_MOUSE, 0);
3105     process(mapper, ARBITRARY_TIME + 2, EV_SYN, SYN_REPORT, 0);
3106     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3107     ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3108     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, args.action);
3109     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3110             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3111     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3112     ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3113     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
3114     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3115             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3116 
3117     // Another move.
3118     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 30);
3119     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 40);
3120     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3121     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3122     ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
3123     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
3124     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3125             30.0f, 40.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3126     ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 100.0f, 200.0f));
3127 
3128     // Disable pointer capture and check that the device generation got bumped
3129     // and events are generated the usual way.
3130     const uint32_t generation = mFakeContext->getGeneration();
3131     mFakePolicy->setPointerCapture(false);
3132     configureDevice(InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
3133     ASSERT_TRUE(mFakeContext->getGeneration() != generation);
3134 
3135     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
3136     ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
3137     ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
3138 
3139     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3140     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3141     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3142     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3143     ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3144     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3145     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3146             110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3147     ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3148 }
3149 
TEST_F(CursorInputMapperTest,Process_ShouldHandleDisplayId)3150 TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) {
3151     CursorInputMapper* mapper = new CursorInputMapper(mDevice);
3152     addMapperAndConfigure(mapper);
3153 
3154     // Setup PointerController for second display.
3155     constexpr int32_t SECOND_DISPLAY_ID = 1;
3156     mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
3157     mFakePointerController->setPosition(100, 200);
3158     mFakePointerController->setButtonState(0);
3159     mFakePointerController->setDisplayId(SECOND_DISPLAY_ID);
3160 
3161     NotifyMotionArgs args;
3162     process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10);
3163     process(mapper, ARBITRARY_TIME, EV_REL, REL_Y, 20);
3164     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3165     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3166     ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
3167     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
3168     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
3169             110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
3170     ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
3171     ASSERT_EQ(SECOND_DISPLAY_ID, args.displayId);
3172 }
3173 
3174 
3175 // --- TouchInputMapperTest ---
3176 
3177 class TouchInputMapperTest : public InputMapperTest {
3178 protected:
3179     static const int32_t RAW_X_MIN;
3180     static const int32_t RAW_X_MAX;
3181     static const int32_t RAW_Y_MIN;
3182     static const int32_t RAW_Y_MAX;
3183     static const int32_t RAW_TOUCH_MIN;
3184     static const int32_t RAW_TOUCH_MAX;
3185     static const int32_t RAW_TOOL_MIN;
3186     static const int32_t RAW_TOOL_MAX;
3187     static const int32_t RAW_PRESSURE_MIN;
3188     static const int32_t RAW_PRESSURE_MAX;
3189     static const int32_t RAW_ORIENTATION_MIN;
3190     static const int32_t RAW_ORIENTATION_MAX;
3191     static const int32_t RAW_DISTANCE_MIN;
3192     static const int32_t RAW_DISTANCE_MAX;
3193     static const int32_t RAW_TILT_MIN;
3194     static const int32_t RAW_TILT_MAX;
3195     static const int32_t RAW_ID_MIN;
3196     static const int32_t RAW_ID_MAX;
3197     static const int32_t RAW_SLOT_MIN;
3198     static const int32_t RAW_SLOT_MAX;
3199     static const float X_PRECISION;
3200     static const float Y_PRECISION;
3201     static const float X_PRECISION_VIRTUAL;
3202     static const float Y_PRECISION_VIRTUAL;
3203 
3204     static const float GEOMETRIC_SCALE;
3205     static const TouchAffineTransformation AFFINE_TRANSFORM;
3206 
3207     static const VirtualKeyDefinition VIRTUAL_KEYS[2];
3208 
3209     const std::string UNIQUE_ID = "local:0";
3210     const std::string SECONDARY_UNIQUE_ID = "local:1";
3211 
3212     enum Axes {
3213         POSITION = 1 << 0,
3214         TOUCH = 1 << 1,
3215         TOOL = 1 << 2,
3216         PRESSURE = 1 << 3,
3217         ORIENTATION = 1 << 4,
3218         MINOR = 1 << 5,
3219         ID = 1 << 6,
3220         DISTANCE = 1 << 7,
3221         TILT = 1 << 8,
3222         SLOT = 1 << 9,
3223         TOOL_TYPE = 1 << 10,
3224     };
3225 
3226     void prepareDisplay(int32_t orientation, std::optional<uint8_t> port = NO_PORT);
3227     void prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port = NO_PORT);
3228     void prepareVirtualDisplay(int32_t orientation);
3229     void prepareVirtualKeys();
3230     void prepareLocationCalibration();
3231     int32_t toRawX(float displayX);
3232     int32_t toRawY(float displayY);
3233     float toCookedX(float rawX, float rawY);
3234     float toCookedY(float rawX, float rawY);
3235     float toDisplayX(int32_t rawX);
3236     float toDisplayX(int32_t rawX, int32_t displayWidth);
3237     float toDisplayY(int32_t rawY);
3238     float toDisplayY(int32_t rawY, int32_t displayHeight);
3239 
3240 };
3241 
3242 const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
3243 const int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
3244 const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
3245 const int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
3246 const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
3247 const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
3248 const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
3249 const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
3250 const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = 0;
3251 const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = 255;
3252 const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
3253 const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
3254 const int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
3255 const int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
3256 const int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
3257 const int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
3258 const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
3259 const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
3260 const int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
3261 const int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
3262 const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
3263 const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
3264 const float TouchInputMapperTest::X_PRECISION_VIRTUAL =
3265         float(RAW_X_MAX - RAW_X_MIN + 1) / VIRTUAL_DISPLAY_WIDTH;
3266 const float TouchInputMapperTest::Y_PRECISION_VIRTUAL =
3267         float(RAW_Y_MAX - RAW_Y_MIN + 1) / VIRTUAL_DISPLAY_HEIGHT;
3268 const TouchAffineTransformation TouchInputMapperTest::AFFINE_TRANSFORM =
3269         TouchAffineTransformation(1, -2, 3, -4, 5, -6);
3270 
3271 const float TouchInputMapperTest::GEOMETRIC_SCALE =
3272         avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
3273                 float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
3274 
3275 const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
3276         { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
3277         { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
3278 };
3279 
prepareDisplay(int32_t orientation,std::optional<uint8_t> port)3280 void TouchInputMapperTest::prepareDisplay(int32_t orientation, std::optional<uint8_t> port) {
3281     setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation,
3282             UNIQUE_ID, port, ViewportType::VIEWPORT_INTERNAL);
3283 }
3284 
prepareSecondaryDisplay(ViewportType type,std::optional<uint8_t> port)3285 void TouchInputMapperTest::prepareSecondaryDisplay(ViewportType type, std::optional<uint8_t> port) {
3286     setDisplayInfoAndReconfigure(SECONDARY_DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT,
3287             DISPLAY_ORIENTATION_0, SECONDARY_UNIQUE_ID, port, type);
3288 }
3289 
prepareVirtualDisplay(int32_t orientation)3290 void TouchInputMapperTest::prepareVirtualDisplay(int32_t orientation) {
3291     setDisplayInfoAndReconfigure(VIRTUAL_DISPLAY_ID, VIRTUAL_DISPLAY_WIDTH,
3292         VIRTUAL_DISPLAY_HEIGHT, orientation,
3293         VIRTUAL_DISPLAY_UNIQUE_ID, NO_PORT, ViewportType::VIEWPORT_VIRTUAL);
3294 }
3295 
prepareVirtualKeys()3296 void TouchInputMapperTest::prepareVirtualKeys() {
3297     mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
3298     mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
3299     mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
3300     mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
3301 }
3302 
prepareLocationCalibration()3303 void TouchInputMapperTest::prepareLocationCalibration() {
3304     mFakePolicy->setTouchAffineTransformation(AFFINE_TRANSFORM);
3305 }
3306 
toRawX(float displayX)3307 int32_t TouchInputMapperTest::toRawX(float displayX) {
3308     return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
3309 }
3310 
toRawY(float displayY)3311 int32_t TouchInputMapperTest::toRawY(float displayY) {
3312     return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
3313 }
3314 
toCookedX(float rawX,float rawY)3315 float TouchInputMapperTest::toCookedX(float rawX, float rawY) {
3316     AFFINE_TRANSFORM.applyTo(rawX, rawY);
3317     return rawX;
3318 }
3319 
toCookedY(float rawX,float rawY)3320 float TouchInputMapperTest::toCookedY(float rawX, float rawY) {
3321     AFFINE_TRANSFORM.applyTo(rawX, rawY);
3322     return rawY;
3323 }
3324 
toDisplayX(int32_t rawX)3325 float TouchInputMapperTest::toDisplayX(int32_t rawX) {
3326     return toDisplayX(rawX, DISPLAY_WIDTH);
3327 }
3328 
toDisplayX(int32_t rawX,int32_t displayWidth)3329 float TouchInputMapperTest::toDisplayX(int32_t rawX, int32_t displayWidth) {
3330     return float(rawX - RAW_X_MIN) * displayWidth / (RAW_X_MAX - RAW_X_MIN + 1);
3331 }
3332 
toDisplayY(int32_t rawY)3333 float TouchInputMapperTest::toDisplayY(int32_t rawY) {
3334     return toDisplayY(rawY, DISPLAY_HEIGHT);
3335 }
3336 
toDisplayY(int32_t rawY,int32_t displayHeight)3337 float TouchInputMapperTest::toDisplayY(int32_t rawY, int32_t displayHeight) {
3338     return float(rawY - RAW_Y_MIN) * displayHeight / (RAW_Y_MAX - RAW_Y_MIN + 1);
3339 }
3340 
3341 
3342 // --- SingleTouchInputMapperTest ---
3343 
3344 class SingleTouchInputMapperTest : public TouchInputMapperTest {
3345 protected:
3346     void prepareButtons();
3347     void prepareAxes(int axes);
3348 
3349     void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3350     void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
3351     void processUp(SingleTouchInputMapper* mappery);
3352     void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
3353     void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
3354     void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
3355     void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
3356     void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
3357     void processSync(SingleTouchInputMapper* mapper);
3358 };
3359 
prepareButtons()3360 void SingleTouchInputMapperTest::prepareButtons() {
3361     mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
3362 }
3363 
prepareAxes(int axes)3364 void SingleTouchInputMapperTest::prepareAxes(int axes) {
3365     if (axes & POSITION) {
3366         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
3367                 RAW_X_MIN, RAW_X_MAX, 0, 0);
3368         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
3369                 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3370     }
3371     if (axes & PRESSURE) {
3372         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
3373                 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3374     }
3375     if (axes & TOOL) {
3376         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
3377                 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3378     }
3379     if (axes & DISTANCE) {
3380         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
3381                 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3382     }
3383     if (axes & TILT) {
3384         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
3385                 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3386         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
3387                 RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
3388     }
3389 }
3390 
processDown(SingleTouchInputMapper * mapper,int32_t x,int32_t y)3391 void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
3392     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 1);
3393     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3394     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
3395 }
3396 
processMove(SingleTouchInputMapper * mapper,int32_t x,int32_t y)3397 void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
3398     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_X, x);
3399     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_Y, y);
3400 }
3401 
processUp(SingleTouchInputMapper * mapper)3402 void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
3403     process(mapper, ARBITRARY_TIME, EV_KEY, BTN_TOUCH, 0);
3404 }
3405 
processPressure(SingleTouchInputMapper * mapper,int32_t pressure)3406 void SingleTouchInputMapperTest::processPressure(
3407         SingleTouchInputMapper* mapper, int32_t pressure) {
3408     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_PRESSURE, pressure);
3409 }
3410 
processToolMajor(SingleTouchInputMapper * mapper,int32_t toolMajor)3411 void SingleTouchInputMapperTest::processToolMajor(
3412         SingleTouchInputMapper* mapper, int32_t toolMajor) {
3413     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
3414 }
3415 
processDistance(SingleTouchInputMapper * mapper,int32_t distance)3416 void SingleTouchInputMapperTest::processDistance(
3417         SingleTouchInputMapper* mapper, int32_t distance) {
3418     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_DISTANCE, distance);
3419 }
3420 
processTilt(SingleTouchInputMapper * mapper,int32_t tiltX,int32_t tiltY)3421 void SingleTouchInputMapperTest::processTilt(
3422         SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
3423     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_X, tiltX);
3424     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_TILT_Y, tiltY);
3425 }
3426 
processKey(SingleTouchInputMapper * mapper,int32_t code,int32_t value)3427 void SingleTouchInputMapperTest::processKey(
3428         SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
3429     process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
3430 }
3431 
processSync(SingleTouchInputMapper * mapper)3432 void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
3433     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
3434 }
3435 
3436 
TEST_F(SingleTouchInputMapperTest,GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer)3437 TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
3438     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3439     prepareButtons();
3440     prepareAxes(POSITION);
3441     addMapperAndConfigure(mapper);
3442 
3443     ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
3444 }
3445 
TEST_F(SingleTouchInputMapperTest,GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad)3446 TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
3447     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3448     mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
3449     mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
3450     prepareButtons();
3451     prepareAxes(POSITION);
3452     addMapperAndConfigure(mapper);
3453 
3454     ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3455 }
3456 
TEST_F(SingleTouchInputMapperTest,GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad)3457 TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
3458     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3459     prepareButtons();
3460     prepareAxes(POSITION);
3461     addConfigurationProperty("touch.deviceType", "touchPad");
3462     addMapperAndConfigure(mapper);
3463 
3464     ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
3465 }
3466 
TEST_F(SingleTouchInputMapperTest,GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen)3467 TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
3468     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3469     prepareButtons();
3470     prepareAxes(POSITION);
3471     addConfigurationProperty("touch.deviceType", "touchScreen");
3472     addMapperAndConfigure(mapper);
3473 
3474     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
3475 }
3476 
TEST_F(SingleTouchInputMapperTest,GetKeyCodeState)3477 TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
3478     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3479     addConfigurationProperty("touch.deviceType", "touchScreen");
3480     prepareDisplay(DISPLAY_ORIENTATION_0);
3481     prepareButtons();
3482     prepareAxes(POSITION);
3483     prepareVirtualKeys();
3484     addMapperAndConfigure(mapper);
3485 
3486     // Unknown key.
3487     ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
3488 
3489     // Virtual key is down.
3490     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3491     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3492     processDown(mapper, x, y);
3493     processSync(mapper);
3494     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3495 
3496     ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3497 
3498     // Virtual key is up.
3499     processUp(mapper);
3500     processSync(mapper);
3501     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3502 
3503     ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
3504 }
3505 
TEST_F(SingleTouchInputMapperTest,GetScanCodeState)3506 TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
3507     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3508     addConfigurationProperty("touch.deviceType", "touchScreen");
3509     prepareDisplay(DISPLAY_ORIENTATION_0);
3510     prepareButtons();
3511     prepareAxes(POSITION);
3512     prepareVirtualKeys();
3513     addMapperAndConfigure(mapper);
3514 
3515     // Unknown key.
3516     ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
3517 
3518     // Virtual key is down.
3519     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3520     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3521     processDown(mapper, x, y);
3522     processSync(mapper);
3523     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3524 
3525     ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3526 
3527     // Virtual key is up.
3528     processUp(mapper);
3529     processSync(mapper);
3530     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
3531 
3532     ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
3533 }
3534 
TEST_F(SingleTouchInputMapperTest,MarkSupportedKeyCodes)3535 TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
3536     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3537     addConfigurationProperty("touch.deviceType", "touchScreen");
3538     prepareDisplay(DISPLAY_ORIENTATION_0);
3539     prepareButtons();
3540     prepareAxes(POSITION);
3541     prepareVirtualKeys();
3542     addMapperAndConfigure(mapper);
3543 
3544     const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
3545     uint8_t flags[2] = { 0, 0 };
3546     ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
3547     ASSERT_TRUE(flags[0]);
3548     ASSERT_FALSE(flags[1]);
3549 }
3550 
TEST_F(SingleTouchInputMapperTest,Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp)3551 TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
3552     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3553     addConfigurationProperty("touch.deviceType", "touchScreen");
3554     prepareDisplay(DISPLAY_ORIENTATION_0);
3555     prepareButtons();
3556     prepareAxes(POSITION);
3557     prepareVirtualKeys();
3558     addMapperAndConfigure(mapper);
3559 
3560     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3561 
3562     NotifyKeyArgs args;
3563 
3564     // Press virtual key.
3565     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3566     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3567     processDown(mapper, x, y);
3568     processSync(mapper);
3569 
3570     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3571     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3572     ASSERT_EQ(DEVICE_ID, args.deviceId);
3573     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3574     ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3575     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
3576     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3577     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3578     ASSERT_EQ(KEY_HOME, args.scanCode);
3579     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3580     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3581 
3582     // Release virtual key.
3583     processUp(mapper);
3584     processSync(mapper);
3585 
3586     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
3587     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
3588     ASSERT_EQ(DEVICE_ID, args.deviceId);
3589     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
3590     ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
3591     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
3592     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
3593     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
3594     ASSERT_EQ(KEY_HOME, args.scanCode);
3595     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
3596     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
3597 
3598     // Should not have sent any motions.
3599     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3600 }
3601 
TEST_F(SingleTouchInputMapperTest,Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel)3602 TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
3603     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3604     addConfigurationProperty("touch.deviceType", "touchScreen");
3605     prepareDisplay(DISPLAY_ORIENTATION_0);
3606     prepareButtons();
3607     prepareAxes(POSITION);
3608     prepareVirtualKeys();
3609     addMapperAndConfigure(mapper);
3610 
3611     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3612 
3613     NotifyKeyArgs keyArgs;
3614 
3615     // Press virtual key.
3616     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
3617     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
3618     processDown(mapper, x, y);
3619     processSync(mapper);
3620 
3621     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3622     ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3623     ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3624     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3625     ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3626     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3627     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
3628     ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3629     ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3630     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3631     ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3632 
3633     // Move out of bounds.  This should generate a cancel and a pointer down since we moved
3634     // into the display area.
3635     y -= 100;
3636     processMove(mapper, x, y);
3637     processSync(mapper);
3638 
3639     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3640     ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
3641     ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
3642     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
3643     ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
3644     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3645     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
3646             | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
3647     ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
3648     ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
3649     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
3650     ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
3651 
3652     NotifyMotionArgs motionArgs;
3653     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3654     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3655     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3656     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3657     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3658     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3659     ASSERT_EQ(0, motionArgs.flags);
3660     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3661     ASSERT_EQ(0, motionArgs.buttonState);
3662     ASSERT_EQ(0, motionArgs.edgeFlags);
3663     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3664     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3665     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3666     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3667             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3668     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3669     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3670     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3671 
3672     // Keep moving out of bounds.  Should generate a pointer move.
3673     y -= 50;
3674     processMove(mapper, x, y);
3675     processSync(mapper);
3676 
3677     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3678     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3679     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3680     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3681     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3682     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3683     ASSERT_EQ(0, motionArgs.flags);
3684     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3685     ASSERT_EQ(0, motionArgs.buttonState);
3686     ASSERT_EQ(0, motionArgs.edgeFlags);
3687     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3688     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3689     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3690     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3691             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3692     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3693     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3694     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3695 
3696     // Release out of bounds.  Should generate a pointer up.
3697     processUp(mapper);
3698     processSync(mapper);
3699 
3700     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3701     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3702     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3703     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3704     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3705     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3706     ASSERT_EQ(0, motionArgs.flags);
3707     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3708     ASSERT_EQ(0, motionArgs.buttonState);
3709     ASSERT_EQ(0, motionArgs.edgeFlags);
3710     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3711     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3712     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3713     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3714             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3715     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3716     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3717     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3718 
3719     // Should not have sent any more keys or motions.
3720     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3721     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3722 }
3723 
TEST_F(SingleTouchInputMapperTest,Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay)3724 TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
3725     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3726     addConfigurationProperty("touch.deviceType", "touchScreen");
3727     prepareDisplay(DISPLAY_ORIENTATION_0);
3728     prepareButtons();
3729     prepareAxes(POSITION);
3730     prepareVirtualKeys();
3731     addMapperAndConfigure(mapper);
3732 
3733     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3734 
3735     NotifyMotionArgs motionArgs;
3736 
3737     // Initially go down out of bounds.
3738     int32_t x = -10;
3739     int32_t y = -10;
3740     processDown(mapper, x, y);
3741     processSync(mapper);
3742 
3743     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3744 
3745     // Move into the display area.  Should generate a pointer down.
3746     x = 50;
3747     y = 75;
3748     processMove(mapper, x, y);
3749     processSync(mapper);
3750 
3751     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3752     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3753     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3754     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3755     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3756     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3757     ASSERT_EQ(0, motionArgs.flags);
3758     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3759     ASSERT_EQ(0, motionArgs.buttonState);
3760     ASSERT_EQ(0, motionArgs.edgeFlags);
3761     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3762     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3763     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3764     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3765             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3766     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3767     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3768     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3769 
3770     // Release.  Should generate a pointer up.
3771     processUp(mapper);
3772     processSync(mapper);
3773 
3774     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3775     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3776     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3777     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3778     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3779     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3780     ASSERT_EQ(0, motionArgs.flags);
3781     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3782     ASSERT_EQ(0, motionArgs.buttonState);
3783     ASSERT_EQ(0, motionArgs.edgeFlags);
3784     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3785     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3786     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3787     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3788             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3789     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3790     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3791     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3792 
3793     // Should not have sent any more keys or motions.
3794     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3795     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3796 }
3797 
TEST_F(SingleTouchInputMapperTest,Process_NormalSingleTouchGesture_VirtualDisplay)3798 TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture_VirtualDisplay) {
3799     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3800     addConfigurationProperty("touch.deviceType", "touchScreen");
3801     addConfigurationProperty("touch.displayId", VIRTUAL_DISPLAY_UNIQUE_ID);
3802 
3803     prepareVirtualDisplay(DISPLAY_ORIENTATION_0);
3804     prepareButtons();
3805     prepareAxes(POSITION);
3806     prepareVirtualKeys();
3807     addMapperAndConfigure(mapper);
3808 
3809     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3810 
3811     NotifyMotionArgs motionArgs;
3812 
3813     // Down.
3814     int32_t x = 100;
3815     int32_t y = 125;
3816     processDown(mapper, x, y);
3817     processSync(mapper);
3818 
3819     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3820     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3821     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3822     ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3823     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3824     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3825     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3826     ASSERT_EQ(0, motionArgs.flags);
3827     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3828     ASSERT_EQ(0, motionArgs.buttonState);
3829     ASSERT_EQ(0, motionArgs.edgeFlags);
3830     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3831     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3832     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3833     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3834             toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3835             1, 0, 0, 0, 0, 0, 0, 0));
3836     ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3837     ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3838     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3839 
3840     // Move.
3841     x += 50;
3842     y += 75;
3843     processMove(mapper, x, y);
3844     processSync(mapper);
3845 
3846     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3847     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3848     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3849     ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3850     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3851     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3852     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3853     ASSERT_EQ(0, motionArgs.flags);
3854     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3855     ASSERT_EQ(0, motionArgs.buttonState);
3856     ASSERT_EQ(0, motionArgs.edgeFlags);
3857     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3858     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3859     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3860     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3861             toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3862             1, 0, 0, 0, 0, 0, 0, 0));
3863     ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3864     ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3865     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3866 
3867     // Up.
3868     processUp(mapper);
3869     processSync(mapper);
3870 
3871     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3872     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3873     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3874     ASSERT_EQ(VIRTUAL_DISPLAY_ID, motionArgs.displayId);
3875     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3876     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3877     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3878     ASSERT_EQ(0, motionArgs.flags);
3879     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3880     ASSERT_EQ(0, motionArgs.buttonState);
3881     ASSERT_EQ(0, motionArgs.edgeFlags);
3882     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3883     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3884     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3885     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3886             toDisplayX(x, VIRTUAL_DISPLAY_WIDTH), toDisplayY(y, VIRTUAL_DISPLAY_HEIGHT),
3887             1, 0, 0, 0, 0, 0, 0, 0));
3888     ASSERT_NEAR(X_PRECISION_VIRTUAL, motionArgs.xPrecision, EPSILON);
3889     ASSERT_NEAR(Y_PRECISION_VIRTUAL, motionArgs.yPrecision, EPSILON);
3890     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3891 
3892     // Should not have sent any more keys or motions.
3893     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3894     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3895 }
3896 
TEST_F(SingleTouchInputMapperTest,Process_NormalSingleTouchGesture)3897 TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
3898     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3899     addConfigurationProperty("touch.deviceType", "touchScreen");
3900     prepareDisplay(DISPLAY_ORIENTATION_0);
3901     prepareButtons();
3902     prepareAxes(POSITION);
3903     prepareVirtualKeys();
3904     addMapperAndConfigure(mapper);
3905 
3906     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3907 
3908     NotifyMotionArgs motionArgs;
3909 
3910     // Down.
3911     int32_t x = 100;
3912     int32_t y = 125;
3913     processDown(mapper, x, y);
3914     processSync(mapper);
3915 
3916     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3917     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3918     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3919     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3920     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3921     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3922     ASSERT_EQ(0, motionArgs.flags);
3923     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3924     ASSERT_EQ(0, motionArgs.buttonState);
3925     ASSERT_EQ(0, motionArgs.edgeFlags);
3926     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3927     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3928     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3929     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3930             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3931     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3932     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3933     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3934 
3935     // Move.
3936     x += 50;
3937     y += 75;
3938     processMove(mapper, x, y);
3939     processSync(mapper);
3940 
3941     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3942     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3943     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3944     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3945     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3946     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3947     ASSERT_EQ(0, motionArgs.flags);
3948     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3949     ASSERT_EQ(0, motionArgs.buttonState);
3950     ASSERT_EQ(0, motionArgs.edgeFlags);
3951     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3952     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3953     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3954     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3955             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3956     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3957     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3958     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3959 
3960     // Up.
3961     processUp(mapper);
3962     processSync(mapper);
3963 
3964     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3965     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3966     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3967     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3968     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3969     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3970     ASSERT_EQ(0, motionArgs.flags);
3971     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3972     ASSERT_EQ(0, motionArgs.buttonState);
3973     ASSERT_EQ(0, motionArgs.edgeFlags);
3974     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3975     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3976     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3977     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3978             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3979     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3980     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3981     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3982 
3983     // Should not have sent any more keys or motions.
3984     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3985     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3986 }
3987 
TEST_F(SingleTouchInputMapperTest,Process_WhenNotOrientationAware_DoesNotRotateMotions)3988 TEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
3989     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3990     addConfigurationProperty("touch.deviceType", "touchScreen");
3991     prepareButtons();
3992     prepareAxes(POSITION);
3993     addConfigurationProperty("touch.orientationAware", "0");
3994     addMapperAndConfigure(mapper);
3995 
3996     NotifyMotionArgs args;
3997 
3998     // Rotation 90.
3999     prepareDisplay(DISPLAY_ORIENTATION_90);
4000     processDown(mapper, toRawX(50), toRawY(75));
4001     processSync(mapper);
4002 
4003     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4004     ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4005     ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4006 
4007     processUp(mapper);
4008     processSync(mapper);
4009     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4010 }
4011 
TEST_F(SingleTouchInputMapperTest,Process_WhenOrientationAware_RotatesMotions)4012 TEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
4013     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4014     addConfigurationProperty("touch.deviceType", "touchScreen");
4015     prepareButtons();
4016     prepareAxes(POSITION);
4017     addMapperAndConfigure(mapper);
4018 
4019     NotifyMotionArgs args;
4020 
4021     // Rotation 0.
4022     clearViewports();
4023     prepareDisplay(DISPLAY_ORIENTATION_0);
4024     processDown(mapper, toRawX(50), toRawY(75));
4025     processSync(mapper);
4026 
4027     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4028     ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4029     ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4030 
4031     processUp(mapper);
4032     processSync(mapper);
4033     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4034 
4035     // Rotation 90.
4036     clearViewports();
4037     prepareDisplay(DISPLAY_ORIENTATION_90);
4038     processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
4039     processSync(mapper);
4040 
4041     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4042     ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4043     ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4044 
4045     processUp(mapper);
4046     processSync(mapper);
4047     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4048 
4049     // Rotation 180.
4050     clearViewports();
4051     prepareDisplay(DISPLAY_ORIENTATION_180);
4052     processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
4053     processSync(mapper);
4054 
4055     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4056     ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4057     ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4058 
4059     processUp(mapper);
4060     processSync(mapper);
4061     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4062 
4063     // Rotation 270.
4064     clearViewports();
4065     prepareDisplay(DISPLAY_ORIENTATION_270);
4066     processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
4067     processSync(mapper);
4068 
4069     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4070     ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
4071     ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
4072 
4073     processUp(mapper);
4074     processSync(mapper);
4075     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
4076 }
4077 
TEST_F(SingleTouchInputMapperTest,Process_AllAxes_DefaultCalibration)4078 TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
4079     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4080     addConfigurationProperty("touch.deviceType", "touchScreen");
4081     prepareDisplay(DISPLAY_ORIENTATION_0);
4082     prepareButtons();
4083     prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
4084     addMapperAndConfigure(mapper);
4085 
4086     // These calculations are based on the input device calibration documentation.
4087     int32_t rawX = 100;
4088     int32_t rawY = 200;
4089     int32_t rawPressure = 10;
4090     int32_t rawToolMajor = 12;
4091     int32_t rawDistance = 2;
4092     int32_t rawTiltX = 30;
4093     int32_t rawTiltY = 110;
4094 
4095     float x = toDisplayX(rawX);
4096     float y = toDisplayY(rawY);
4097     float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
4098     float size = float(rawToolMajor) / RAW_TOOL_MAX;
4099     float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
4100     float distance = float(rawDistance);
4101 
4102     float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
4103     float tiltScale = M_PI / 180;
4104     float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
4105     float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
4106     float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
4107     float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
4108 
4109     processDown(mapper, rawX, rawY);
4110     processPressure(mapper, rawPressure);
4111     processToolMajor(mapper, rawToolMajor);
4112     processDistance(mapper, rawDistance);
4113     processTilt(mapper, rawTiltX, rawTiltY);
4114     processSync(mapper);
4115 
4116     NotifyMotionArgs args;
4117     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4118     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4119             x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
4120     ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
4121 }
4122 
TEST_F(SingleTouchInputMapperTest,Process_XYAxes_AffineCalibration)4123 TEST_F(SingleTouchInputMapperTest, Process_XYAxes_AffineCalibration) {
4124     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4125     addConfigurationProperty("touch.deviceType", "touchScreen");
4126     prepareDisplay(DISPLAY_ORIENTATION_0);
4127     prepareLocationCalibration();
4128     prepareButtons();
4129     prepareAxes(POSITION);
4130     addMapperAndConfigure(mapper);
4131 
4132     int32_t rawX = 100;
4133     int32_t rawY = 200;
4134 
4135     float x = toDisplayX(toCookedX(rawX, rawY));
4136     float y = toDisplayY(toCookedY(rawX, rawY));
4137 
4138     processDown(mapper, rawX, rawY);
4139     processSync(mapper);
4140 
4141     NotifyMotionArgs args;
4142     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4143     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4144             x, y, 1, 0, 0, 0, 0, 0, 0, 0));
4145 }
4146 
TEST_F(SingleTouchInputMapperTest,Process_ShouldHandleAllButtons)4147 TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
4148     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4149     addConfigurationProperty("touch.deviceType", "touchScreen");
4150     prepareDisplay(DISPLAY_ORIENTATION_0);
4151     prepareButtons();
4152     prepareAxes(POSITION);
4153     addMapperAndConfigure(mapper);
4154 
4155     NotifyMotionArgs motionArgs;
4156     NotifyKeyArgs keyArgs;
4157 
4158     processDown(mapper, 100, 200);
4159     processSync(mapper);
4160     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4161     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4162     ASSERT_EQ(0, motionArgs.buttonState);
4163 
4164     // press BTN_LEFT, release BTN_LEFT
4165     processKey(mapper, BTN_LEFT, 1);
4166     processSync(mapper);
4167     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4168     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4169     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4170 
4171     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4172     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4173     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4174 
4175     processKey(mapper, BTN_LEFT, 0);
4176     processSync(mapper);
4177     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4178     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4179     ASSERT_EQ(0, motionArgs.buttonState);
4180 
4181     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4182     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4183     ASSERT_EQ(0, motionArgs.buttonState);
4184 
4185     // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
4186     processKey(mapper, BTN_RIGHT, 1);
4187     processKey(mapper, BTN_MIDDLE, 1);
4188     processSync(mapper);
4189     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4190     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4191     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4192             motionArgs.buttonState);
4193 
4194     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4195     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4196     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4197 
4198     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4199     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4200     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4201             motionArgs.buttonState);
4202 
4203     processKey(mapper, BTN_RIGHT, 0);
4204     processSync(mapper);
4205     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4206     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4207     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4208 
4209     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4210     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4211     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4212 
4213     processKey(mapper, BTN_MIDDLE, 0);
4214     processSync(mapper);
4215     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4216     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4217     ASSERT_EQ(0, motionArgs.buttonState);
4218 
4219     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4220     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4221     ASSERT_EQ(0, motionArgs.buttonState);
4222 
4223     // press BTN_BACK, release BTN_BACK
4224     processKey(mapper, BTN_BACK, 1);
4225     processSync(mapper);
4226     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4227     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4228     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4229 
4230     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4231     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4232     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4233 
4234     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4235     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4236     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4237 
4238     processKey(mapper, BTN_BACK, 0);
4239     processSync(mapper);
4240     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4241     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4242     ASSERT_EQ(0, motionArgs.buttonState);
4243 
4244     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4245     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4246     ASSERT_EQ(0, motionArgs.buttonState);
4247 
4248     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4249     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4250     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4251 
4252     // press BTN_SIDE, release BTN_SIDE
4253     processKey(mapper, BTN_SIDE, 1);
4254     processSync(mapper);
4255     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4256     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4257     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4258 
4259     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4260     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4261     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4262 
4263     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4264     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4265     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4266 
4267     processKey(mapper, BTN_SIDE, 0);
4268     processSync(mapper);
4269     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4270     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4271     ASSERT_EQ(0, motionArgs.buttonState);
4272 
4273     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4274     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4275     ASSERT_EQ(0, motionArgs.buttonState);
4276 
4277     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4278     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4279     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4280 
4281     // press BTN_FORWARD, release BTN_FORWARD
4282     processKey(mapper, BTN_FORWARD, 1);
4283     processSync(mapper);
4284     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4285     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4286     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4287 
4288     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4289     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4290     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4291 
4292     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4293     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4294     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4295 
4296     processKey(mapper, BTN_FORWARD, 0);
4297     processSync(mapper);
4298     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4299     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4300     ASSERT_EQ(0, motionArgs.buttonState);
4301 
4302     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4303     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4304     ASSERT_EQ(0, motionArgs.buttonState);
4305 
4306     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4307     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4308     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4309 
4310     // press BTN_EXTRA, release BTN_EXTRA
4311     processKey(mapper, BTN_EXTRA, 1);
4312     processSync(mapper);
4313     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4314     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4315     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4316 
4317     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4318     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4319     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4320 
4321     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4322     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4323     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4324 
4325     processKey(mapper, BTN_EXTRA, 0);
4326     processSync(mapper);
4327     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4328     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4329     ASSERT_EQ(0, motionArgs.buttonState);
4330 
4331     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4332     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4333     ASSERT_EQ(0, motionArgs.buttonState);
4334 
4335     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4336     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4337     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4338 
4339     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4340 
4341     // press BTN_STYLUS, release BTN_STYLUS
4342     processKey(mapper, BTN_STYLUS, 1);
4343     processSync(mapper);
4344     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4345     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4346     ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
4347 
4348     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4349     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4350     ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
4351 
4352     processKey(mapper, BTN_STYLUS, 0);
4353     processSync(mapper);
4354     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4355     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4356     ASSERT_EQ(0, motionArgs.buttonState);
4357 
4358     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4359     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4360     ASSERT_EQ(0, motionArgs.buttonState);
4361 
4362     // press BTN_STYLUS2, release BTN_STYLUS2
4363     processKey(mapper, BTN_STYLUS2, 1);
4364     processSync(mapper);
4365     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4366     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4367     ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
4368 
4369     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4370     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
4371     ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
4372 
4373     processKey(mapper, BTN_STYLUS2, 0);
4374     processSync(mapper);
4375     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4376     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
4377     ASSERT_EQ(0, motionArgs.buttonState);
4378 
4379     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4380     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4381     ASSERT_EQ(0, motionArgs.buttonState);
4382 
4383     // release touch
4384     processUp(mapper);
4385     processSync(mapper);
4386     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4387     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4388     ASSERT_EQ(0, motionArgs.buttonState);
4389 }
4390 
TEST_F(SingleTouchInputMapperTest,Process_ShouldHandleAllToolTypes)4391 TEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4392     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4393     addConfigurationProperty("touch.deviceType", "touchScreen");
4394     prepareDisplay(DISPLAY_ORIENTATION_0);
4395     prepareButtons();
4396     prepareAxes(POSITION);
4397     addMapperAndConfigure(mapper);
4398 
4399     NotifyMotionArgs motionArgs;
4400 
4401     // default tool type is finger
4402     processDown(mapper, 100, 200);
4403     processSync(mapper);
4404     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4405     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4406     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4407 
4408     // eraser
4409     processKey(mapper, BTN_TOOL_RUBBER, 1);
4410     processSync(mapper);
4411     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4412     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4413     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4414 
4415     // stylus
4416     processKey(mapper, BTN_TOOL_RUBBER, 0);
4417     processKey(mapper, BTN_TOOL_PEN, 1);
4418     processSync(mapper);
4419     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4420     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4421     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4422 
4423     // brush
4424     processKey(mapper, BTN_TOOL_PEN, 0);
4425     processKey(mapper, BTN_TOOL_BRUSH, 1);
4426     processSync(mapper);
4427     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4428     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4429     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4430 
4431     // pencil
4432     processKey(mapper, BTN_TOOL_BRUSH, 0);
4433     processKey(mapper, BTN_TOOL_PENCIL, 1);
4434     processSync(mapper);
4435     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4436     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4437     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4438 
4439     // air-brush
4440     processKey(mapper, BTN_TOOL_PENCIL, 0);
4441     processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
4442     processSync(mapper);
4443     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4444     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4445     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4446 
4447     // mouse
4448     processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
4449     processKey(mapper, BTN_TOOL_MOUSE, 1);
4450     processSync(mapper);
4451     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4452     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4453     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4454 
4455     // lens
4456     processKey(mapper, BTN_TOOL_MOUSE, 0);
4457     processKey(mapper, BTN_TOOL_LENS, 1);
4458     processSync(mapper);
4459     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4460     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4461     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4462 
4463     // double-tap
4464     processKey(mapper, BTN_TOOL_LENS, 0);
4465     processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4466     processSync(mapper);
4467     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4468     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4469     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4470 
4471     // triple-tap
4472     processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4473     processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4474     processSync(mapper);
4475     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4476     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4477     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4478 
4479     // quad-tap
4480     processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4481     processKey(mapper, BTN_TOOL_QUADTAP, 1);
4482     processSync(mapper);
4483     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4484     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4485     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4486 
4487     // finger
4488     processKey(mapper, BTN_TOOL_QUADTAP, 0);
4489     processKey(mapper, BTN_TOOL_FINGER, 1);
4490     processSync(mapper);
4491     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4492     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4493     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4494 
4495     // stylus trumps finger
4496     processKey(mapper, BTN_TOOL_PEN, 1);
4497     processSync(mapper);
4498     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4499     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4500     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4501 
4502     // eraser trumps stylus
4503     processKey(mapper, BTN_TOOL_RUBBER, 1);
4504     processSync(mapper);
4505     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4506     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4507     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4508 
4509     // mouse trumps eraser
4510     processKey(mapper, BTN_TOOL_MOUSE, 1);
4511     processSync(mapper);
4512     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4513     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4514     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
4515 
4516     // back to default tool type
4517     processKey(mapper, BTN_TOOL_MOUSE, 0);
4518     processKey(mapper, BTN_TOOL_RUBBER, 0);
4519     processKey(mapper, BTN_TOOL_PEN, 0);
4520     processKey(mapper, BTN_TOOL_FINGER, 0);
4521     processSync(mapper);
4522     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4523     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4524     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4525 }
4526 
TEST_F(SingleTouchInputMapperTest,Process_WhenBtnTouchPresent_HoversIfItsValueIsZero)4527 TEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
4528     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4529     addConfigurationProperty("touch.deviceType", "touchScreen");
4530     prepareDisplay(DISPLAY_ORIENTATION_0);
4531     prepareButtons();
4532     prepareAxes(POSITION);
4533     mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
4534     addMapperAndConfigure(mapper);
4535 
4536     NotifyMotionArgs motionArgs;
4537 
4538     // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
4539     processKey(mapper, BTN_TOOL_FINGER, 1);
4540     processMove(mapper, 100, 200);
4541     processSync(mapper);
4542     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4543     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4544     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4545             toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4546 
4547     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4548     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4549     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4550             toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4551 
4552     // move a little
4553     processMove(mapper, 150, 250);
4554     processSync(mapper);
4555     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4556     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4557     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4558             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4559 
4560     // down when BTN_TOUCH is pressed, pressure defaults to 1
4561     processKey(mapper, BTN_TOUCH, 1);
4562     processSync(mapper);
4563     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4564     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4565     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4566             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4567 
4568     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4569     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4570     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4571             toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4572 
4573     // up when BTN_TOUCH is released, hover restored
4574     processKey(mapper, BTN_TOUCH, 0);
4575     processSync(mapper);
4576     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4577     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4578     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4579             toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4580 
4581     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4582     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4583     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4584             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4585 
4586     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4587     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4588     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4589             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4590 
4591     // exit hover when pointer goes away
4592     processKey(mapper, BTN_TOOL_FINGER, 0);
4593     processSync(mapper);
4594     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4595     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4596     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4597             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4598 }
4599 
TEST_F(SingleTouchInputMapperTest,Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero)4600 TEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
4601     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
4602     addConfigurationProperty("touch.deviceType", "touchScreen");
4603     prepareDisplay(DISPLAY_ORIENTATION_0);
4604     prepareButtons();
4605     prepareAxes(POSITION | PRESSURE);
4606     addMapperAndConfigure(mapper);
4607 
4608     NotifyMotionArgs motionArgs;
4609 
4610     // initially hovering because pressure is 0
4611     processDown(mapper, 100, 200);
4612     processPressure(mapper, 0);
4613     processSync(mapper);
4614     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4615     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4616     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4617             toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4618 
4619     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4620     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4621     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4622             toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
4623 
4624     // move a little
4625     processMove(mapper, 150, 250);
4626     processSync(mapper);
4627     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4628     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4629     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4630             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4631 
4632     // down when pressure is non-zero
4633     processPressure(mapper, RAW_PRESSURE_MAX);
4634     processSync(mapper);
4635     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4636     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4637     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4638             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4639 
4640     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4641     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4642     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4643             toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4644 
4645     // up when pressure becomes 0, hover restored
4646     processPressure(mapper, 0);
4647     processSync(mapper);
4648     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4649     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4650     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4651             toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
4652 
4653     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4654     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
4655     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4656             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4657 
4658     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4659     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
4660     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4661             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4662 
4663     // exit hover when pointer goes away
4664     processUp(mapper);
4665     processSync(mapper);
4666     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4667     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
4668     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4669             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
4670 }
4671 
4672 
4673 // --- MultiTouchInputMapperTest ---
4674 
4675 class MultiTouchInputMapperTest : public TouchInputMapperTest {
4676 protected:
4677     void prepareAxes(int axes);
4678 
4679     void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
4680     void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
4681     void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
4682     void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
4683     void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
4684     void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
4685     void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
4686     void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
4687     void processId(MultiTouchInputMapper* mapper, int32_t id);
4688     void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
4689     void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
4690     void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
4691     void processTimestamp(MultiTouchInputMapper* mapper, uint32_t value);
4692     void processMTSync(MultiTouchInputMapper* mapper);
4693     void processSync(MultiTouchInputMapper* mapper);
4694 };
4695 
prepareAxes(int axes)4696 void MultiTouchInputMapperTest::prepareAxes(int axes) {
4697     if (axes & POSITION) {
4698         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
4699                 RAW_X_MIN, RAW_X_MAX, 0, 0);
4700         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
4701                 RAW_Y_MIN, RAW_Y_MAX, 0, 0);
4702     }
4703     if (axes & TOUCH) {
4704         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
4705                 RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4706         if (axes & MINOR) {
4707             mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
4708                     RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
4709         }
4710     }
4711     if (axes & TOOL) {
4712         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
4713                 RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
4714         if (axes & MINOR) {
4715             mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
4716                     RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
4717         }
4718     }
4719     if (axes & ORIENTATION) {
4720         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
4721                 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
4722     }
4723     if (axes & PRESSURE) {
4724         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
4725                 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
4726     }
4727     if (axes & DISTANCE) {
4728         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
4729                 RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
4730     }
4731     if (axes & ID) {
4732         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
4733                 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
4734     }
4735     if (axes & SLOT) {
4736         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
4737                 RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
4738         mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
4739     }
4740     if (axes & TOOL_TYPE) {
4741         mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
4742                 0, MT_TOOL_MAX, 0, 0);
4743     }
4744 }
4745 
processPosition(MultiTouchInputMapper * mapper,int32_t x,int32_t y)4746 void MultiTouchInputMapperTest::processPosition(
4747         MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
4748     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_X, x);
4749     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_POSITION_Y, y);
4750 }
4751 
processTouchMajor(MultiTouchInputMapper * mapper,int32_t touchMajor)4752 void MultiTouchInputMapperTest::processTouchMajor(
4753         MultiTouchInputMapper* mapper, int32_t touchMajor) {
4754     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
4755 }
4756 
processTouchMinor(MultiTouchInputMapper * mapper,int32_t touchMinor)4757 void MultiTouchInputMapperTest::processTouchMinor(
4758         MultiTouchInputMapper* mapper, int32_t touchMinor) {
4759     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
4760 }
4761 
processToolMajor(MultiTouchInputMapper * mapper,int32_t toolMajor)4762 void MultiTouchInputMapperTest::processToolMajor(
4763         MultiTouchInputMapper* mapper, int32_t toolMajor) {
4764     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
4765 }
4766 
processToolMinor(MultiTouchInputMapper * mapper,int32_t toolMinor)4767 void MultiTouchInputMapperTest::processToolMinor(
4768         MultiTouchInputMapper* mapper, int32_t toolMinor) {
4769     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
4770 }
4771 
processOrientation(MultiTouchInputMapper * mapper,int32_t orientation)4772 void MultiTouchInputMapperTest::processOrientation(
4773         MultiTouchInputMapper* mapper, int32_t orientation) {
4774     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_ORIENTATION, orientation);
4775 }
4776 
processPressure(MultiTouchInputMapper * mapper,int32_t pressure)4777 void MultiTouchInputMapperTest::processPressure(
4778         MultiTouchInputMapper* mapper, int32_t pressure) {
4779     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_PRESSURE, pressure);
4780 }
4781 
processDistance(MultiTouchInputMapper * mapper,int32_t distance)4782 void MultiTouchInputMapperTest::processDistance(
4783         MultiTouchInputMapper* mapper, int32_t distance) {
4784     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_DISTANCE, distance);
4785 }
4786 
processId(MultiTouchInputMapper * mapper,int32_t id)4787 void MultiTouchInputMapperTest::processId(
4788         MultiTouchInputMapper* mapper, int32_t id) {
4789     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TRACKING_ID, id);
4790 }
4791 
processSlot(MultiTouchInputMapper * mapper,int32_t slot)4792 void MultiTouchInputMapperTest::processSlot(
4793         MultiTouchInputMapper* mapper, int32_t slot) {
4794     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_SLOT, slot);
4795 }
4796 
processToolType(MultiTouchInputMapper * mapper,int32_t toolType)4797 void MultiTouchInputMapperTest::processToolType(
4798         MultiTouchInputMapper* mapper, int32_t toolType) {
4799     process(mapper, ARBITRARY_TIME, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
4800 }
4801 
processKey(MultiTouchInputMapper * mapper,int32_t code,int32_t value)4802 void MultiTouchInputMapperTest::processKey(
4803         MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
4804     process(mapper, ARBITRARY_TIME, EV_KEY, code, value);
4805 }
4806 
processTimestamp(MultiTouchInputMapper * mapper,uint32_t value)4807 void MultiTouchInputMapperTest::processTimestamp(MultiTouchInputMapper* mapper, uint32_t value) {
4808     process(mapper, ARBITRARY_TIME, EV_MSC, MSC_TIMESTAMP, value);
4809 }
4810 
processMTSync(MultiTouchInputMapper * mapper)4811 void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
4812     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_MT_REPORT, 0);
4813 }
4814 
processSync(MultiTouchInputMapper * mapper)4815 void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
4816     process(mapper, ARBITRARY_TIME, EV_SYN, SYN_REPORT, 0);
4817 }
4818 
4819 
TEST_F(MultiTouchInputMapperTest,Process_NormalMultiTouchGesture_WithoutTrackingIds)4820 TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
4821     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4822     addConfigurationProperty("touch.deviceType", "touchScreen");
4823     prepareDisplay(DISPLAY_ORIENTATION_0);
4824     prepareAxes(POSITION);
4825     prepareVirtualKeys();
4826     addMapperAndConfigure(mapper);
4827 
4828     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4829 
4830     NotifyMotionArgs motionArgs;
4831 
4832     // Two fingers down at once.
4833     int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4834     processPosition(mapper, x1, y1);
4835     processMTSync(mapper);
4836     processPosition(mapper, x2, y2);
4837     processMTSync(mapper);
4838     processSync(mapper);
4839 
4840     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4841     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4842     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4843     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4844     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4845     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4846     ASSERT_EQ(0, motionArgs.flags);
4847     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4848     ASSERT_EQ(0, motionArgs.buttonState);
4849     ASSERT_EQ(0, motionArgs.edgeFlags);
4850     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4851     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4852     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4853     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4854             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4855     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4856     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4857     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4858 
4859     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4860     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4861     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4862     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4863     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4864     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4865             motionArgs.action);
4866     ASSERT_EQ(0, motionArgs.flags);
4867     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4868     ASSERT_EQ(0, motionArgs.buttonState);
4869     ASSERT_EQ(0, motionArgs.edgeFlags);
4870     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4871     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4872     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4873     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4874     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4875     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4876             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4877     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4878             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4879     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4880     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4881     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4882 
4883     // Move.
4884     x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4885     processPosition(mapper, x1, y1);
4886     processMTSync(mapper);
4887     processPosition(mapper, x2, y2);
4888     processMTSync(mapper);
4889     processSync(mapper);
4890 
4891     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4892     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4893     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4894     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4895     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4896     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4897     ASSERT_EQ(0, motionArgs.flags);
4898     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4899     ASSERT_EQ(0, motionArgs.buttonState);
4900     ASSERT_EQ(0, motionArgs.edgeFlags);
4901     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4902     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4903     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4904     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4905     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4906     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4907             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4908     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4909             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4910     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4911     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4912     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4913 
4914     // First finger up.
4915     x2 += 15; y2 -= 20;
4916     processPosition(mapper, x2, y2);
4917     processMTSync(mapper);
4918     processSync(mapper);
4919 
4920     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4921     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4922     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4923     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4924     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4925     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4926             motionArgs.action);
4927     ASSERT_EQ(0, motionArgs.flags);
4928     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4929     ASSERT_EQ(0, motionArgs.buttonState);
4930     ASSERT_EQ(0, motionArgs.edgeFlags);
4931     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4932     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4933     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4934     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4935     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4936     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4937             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4938     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4939             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4940     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4941     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4942     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4943 
4944     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4945     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4946     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4947     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4948     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4949     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4950     ASSERT_EQ(0, motionArgs.flags);
4951     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4952     ASSERT_EQ(0, motionArgs.buttonState);
4953     ASSERT_EQ(0, motionArgs.edgeFlags);
4954     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4955     ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4956     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4957     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4958             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4959     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4960     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4961     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4962 
4963     // Move.
4964     x2 += 20; y2 -= 25;
4965     processPosition(mapper, x2, y2);
4966     processMTSync(mapper);
4967     processSync(mapper);
4968 
4969     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4970     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4971     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4972     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4973     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4974     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4975     ASSERT_EQ(0, motionArgs.flags);
4976     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4977     ASSERT_EQ(0, motionArgs.buttonState);
4978     ASSERT_EQ(0, motionArgs.edgeFlags);
4979     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4980     ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4981     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4982     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4983             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4984     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4985     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4986     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4987 
4988     // New finger down.
4989     int32_t x3 = 700, y3 = 300;
4990     processPosition(mapper, x2, y2);
4991     processMTSync(mapper);
4992     processPosition(mapper, x3, y3);
4993     processMTSync(mapper);
4994     processSync(mapper);
4995 
4996     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4997     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4998     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4999     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5000     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5001     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5002             motionArgs.action);
5003     ASSERT_EQ(0, motionArgs.flags);
5004     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5005     ASSERT_EQ(0, motionArgs.buttonState);
5006     ASSERT_EQ(0, motionArgs.edgeFlags);
5007     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5008     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5009     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5010     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5011     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5012     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5013             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5014     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5015             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5016     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5017     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5018     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5019 
5020     // Second finger up.
5021     x3 += 30; y3 -= 20;
5022     processPosition(mapper, x3, y3);
5023     processMTSync(mapper);
5024     processSync(mapper);
5025 
5026     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5027     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5028     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5029     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5030     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5031     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5032             motionArgs.action);
5033     ASSERT_EQ(0, motionArgs.flags);
5034     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5035     ASSERT_EQ(0, motionArgs.buttonState);
5036     ASSERT_EQ(0, motionArgs.edgeFlags);
5037     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5038     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5039     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5040     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5041     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5042     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5043             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5044     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5045             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5046     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5047     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5048     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5049 
5050     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5051     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5052     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5053     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5054     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5055     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5056     ASSERT_EQ(0, motionArgs.flags);
5057     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5058     ASSERT_EQ(0, motionArgs.buttonState);
5059     ASSERT_EQ(0, motionArgs.edgeFlags);
5060     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5061     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5062     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5063     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5064             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5065     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5066     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5067     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5068 
5069     // Last finger up.
5070     processMTSync(mapper);
5071     processSync(mapper);
5072 
5073     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5074     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
5075     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
5076     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
5077     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
5078     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5079     ASSERT_EQ(0, motionArgs.flags);
5080     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
5081     ASSERT_EQ(0, motionArgs.buttonState);
5082     ASSERT_EQ(0, motionArgs.edgeFlags);
5083     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5084     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5085     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5086     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5087             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5088     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
5089     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
5090     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
5091 
5092     // Should not have sent any more keys or motions.
5093     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5094     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5095 }
5096 
TEST_F(MultiTouchInputMapperTest,Process_NormalMultiTouchGesture_WithTrackingIds)5097 TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
5098     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5099     addConfigurationProperty("touch.deviceType", "touchScreen");
5100     prepareDisplay(DISPLAY_ORIENTATION_0);
5101     prepareAxes(POSITION | ID);
5102     prepareVirtualKeys();
5103     addMapperAndConfigure(mapper);
5104 
5105     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5106 
5107     NotifyMotionArgs motionArgs;
5108 
5109     // Two fingers down at once.
5110     int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5111     processPosition(mapper, x1, y1);
5112     processId(mapper, 1);
5113     processMTSync(mapper);
5114     processPosition(mapper, x2, y2);
5115     processId(mapper, 2);
5116     processMTSync(mapper);
5117     processSync(mapper);
5118 
5119     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5120     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5121     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5122     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5123     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5124     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5125             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5126 
5127     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5128     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5129             motionArgs.action);
5130     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5131     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5132     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5133     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5134     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5135     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5136             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5137     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5138             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5139 
5140     // Move.
5141     x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5142     processPosition(mapper, x1, y1);
5143     processId(mapper, 1);
5144     processMTSync(mapper);
5145     processPosition(mapper, x2, y2);
5146     processId(mapper, 2);
5147     processMTSync(mapper);
5148     processSync(mapper);
5149 
5150     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5151     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5152     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5153     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5154     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5155     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5156     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5157     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5158             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5159     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5160             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5161 
5162     // First finger up.
5163     x2 += 15; y2 -= 20;
5164     processPosition(mapper, x2, y2);
5165     processId(mapper, 2);
5166     processMTSync(mapper);
5167     processSync(mapper);
5168 
5169     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5170     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5171             motionArgs.action);
5172     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5173     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5174     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5175     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5176     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5177     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5178             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5179     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5180             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5181 
5182     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5183     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5184     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5185     ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5186     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5187     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5188             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5189 
5190     // Move.
5191     x2 += 20; y2 -= 25;
5192     processPosition(mapper, x2, y2);
5193     processId(mapper, 2);
5194     processMTSync(mapper);
5195     processSync(mapper);
5196 
5197     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5198     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5199     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5200     ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5201     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5202     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5203             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5204 
5205     // New finger down.
5206     int32_t x3 = 700, y3 = 300;
5207     processPosition(mapper, x2, y2);
5208     processId(mapper, 2);
5209     processMTSync(mapper);
5210     processPosition(mapper, x3, y3);
5211     processId(mapper, 3);
5212     processMTSync(mapper);
5213     processSync(mapper);
5214 
5215     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5216     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5217             motionArgs.action);
5218     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5219     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5220     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5221     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5222     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5223     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5224             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5225     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5226             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5227 
5228     // Second finger up.
5229     x3 += 30; y3 -= 20;
5230     processPosition(mapper, x3, y3);
5231     processId(mapper, 3);
5232     processMTSync(mapper);
5233     processSync(mapper);
5234 
5235     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5236     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5237             motionArgs.action);
5238     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5239     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5240     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5241     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5242     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5243     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5244             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5245     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5246             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5247 
5248     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5249     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5250     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5251     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5252     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5253     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5254             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5255 
5256     // Last finger up.
5257     processMTSync(mapper);
5258     processSync(mapper);
5259 
5260     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5261     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5262     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5263     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5264     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5265     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5266             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5267 
5268     // Should not have sent any more keys or motions.
5269     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5270     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5271 }
5272 
TEST_F(MultiTouchInputMapperTest,Process_NormalMultiTouchGesture_WithSlots)5273 TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
5274     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5275     addConfigurationProperty("touch.deviceType", "touchScreen");
5276     prepareDisplay(DISPLAY_ORIENTATION_0);
5277     prepareAxes(POSITION | ID | SLOT);
5278     prepareVirtualKeys();
5279     addMapperAndConfigure(mapper);
5280 
5281     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
5282 
5283     NotifyMotionArgs motionArgs;
5284 
5285     // Two fingers down at once.
5286     int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
5287     processPosition(mapper, x1, y1);
5288     processId(mapper, 1);
5289     processSlot(mapper, 1);
5290     processPosition(mapper, x2, y2);
5291     processId(mapper, 2);
5292     processSync(mapper);
5293 
5294     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5295     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5296     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5297     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5298     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5299     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5300             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5301 
5302     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5303     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5304             motionArgs.action);
5305     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5306     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5307     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5308     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5309     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5310     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5311             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5312     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5313             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5314 
5315     // Move.
5316     x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
5317     processSlot(mapper, 0);
5318     processPosition(mapper, x1, y1);
5319     processSlot(mapper, 1);
5320     processPosition(mapper, x2, y2);
5321     processSync(mapper);
5322 
5323     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5324     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5325     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5326     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5327     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5328     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5329     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5330     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5331             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5332     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5333             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5334 
5335     // First finger up.
5336     x2 += 15; y2 -= 20;
5337     processSlot(mapper, 0);
5338     processId(mapper, -1);
5339     processSlot(mapper, 1);
5340     processPosition(mapper, x2, y2);
5341     processSync(mapper);
5342 
5343     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5344     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5345             motionArgs.action);
5346     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5347     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5348     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5349     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5350     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5351     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5352             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
5353     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5354             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5355 
5356     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5357     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5358     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5359     ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5360     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5361     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5362             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5363 
5364     // Move.
5365     x2 += 20; y2 -= 25;
5366     processPosition(mapper, x2, y2);
5367     processSync(mapper);
5368 
5369     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5370     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5371     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5372     ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
5373     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5374     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5375             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5376 
5377     // New finger down.
5378     int32_t x3 = 700, y3 = 300;
5379     processPosition(mapper, x2, y2);
5380     processSlot(mapper, 0);
5381     processId(mapper, 3);
5382     processPosition(mapper, x3, y3);
5383     processSync(mapper);
5384 
5385     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5386     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5387             motionArgs.action);
5388     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5389     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5390     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5391     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5392     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5393     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5394             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5395     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5396             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5397 
5398     // Second finger up.
5399     x3 += 30; y3 -= 20;
5400     processSlot(mapper, 1);
5401     processId(mapper, -1);
5402     processSlot(mapper, 0);
5403     processPosition(mapper, x3, y3);
5404     processSync(mapper);
5405 
5406     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5407     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5408             motionArgs.action);
5409     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
5410     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5411     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5412     ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
5413     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
5414     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5415             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5416     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
5417             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
5418 
5419     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5420     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5421     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5422     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5423     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5424     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5425             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5426 
5427     // Last finger up.
5428     processId(mapper, -1);
5429     processSync(mapper);
5430 
5431     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5432     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5433     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
5434     ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
5435     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5436     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5437             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
5438 
5439     // Should not have sent any more keys or motions.
5440     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5441     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
5442 }
5443 
TEST_F(MultiTouchInputMapperTest,Process_AllAxes_WithDefaultCalibration)5444 TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
5445     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5446     addConfigurationProperty("touch.deviceType", "touchScreen");
5447     prepareDisplay(DISPLAY_ORIENTATION_0);
5448     prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
5449     addMapperAndConfigure(mapper);
5450 
5451     // These calculations are based on the input device calibration documentation.
5452     int32_t rawX = 100;
5453     int32_t rawY = 200;
5454     int32_t rawTouchMajor = 7;
5455     int32_t rawTouchMinor = 6;
5456     int32_t rawToolMajor = 9;
5457     int32_t rawToolMinor = 8;
5458     int32_t rawPressure = 11;
5459     int32_t rawDistance = 0;
5460     int32_t rawOrientation = 3;
5461     int32_t id = 5;
5462 
5463     float x = toDisplayX(rawX);
5464     float y = toDisplayY(rawY);
5465     float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
5466     float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5467     float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5468     float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5469     float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5470     float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5471     float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
5472     float distance = float(rawDistance);
5473 
5474     processPosition(mapper, rawX, rawY);
5475     processTouchMajor(mapper, rawTouchMajor);
5476     processTouchMinor(mapper, rawTouchMinor);
5477     processToolMajor(mapper, rawToolMajor);
5478     processToolMinor(mapper, rawToolMinor);
5479     processPressure(mapper, rawPressure);
5480     processOrientation(mapper, rawOrientation);
5481     processDistance(mapper, rawDistance);
5482     processId(mapper, id);
5483     processMTSync(mapper);
5484     processSync(mapper);
5485 
5486     NotifyMotionArgs args;
5487     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5488     ASSERT_EQ(0, args.pointerProperties[0].id);
5489     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5490             x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
5491             orientation, distance));
5492 }
5493 
TEST_F(MultiTouchInputMapperTest,Process_TouchAndToolAxes_GeometricCalibration)5494 TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
5495     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5496     addConfigurationProperty("touch.deviceType", "touchScreen");
5497     prepareDisplay(DISPLAY_ORIENTATION_0);
5498     prepareAxes(POSITION | TOUCH | TOOL | MINOR);
5499     addConfigurationProperty("touch.size.calibration", "geometric");
5500     addMapperAndConfigure(mapper);
5501 
5502     // These calculations are based on the input device calibration documentation.
5503     int32_t rawX = 100;
5504     int32_t rawY = 200;
5505     int32_t rawTouchMajor = 140;
5506     int32_t rawTouchMinor = 120;
5507     int32_t rawToolMajor = 180;
5508     int32_t rawToolMinor = 160;
5509 
5510     float x = toDisplayX(rawX);
5511     float y = toDisplayY(rawY);
5512     float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
5513     float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
5514     float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
5515     float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
5516     float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
5517 
5518     processPosition(mapper, rawX, rawY);
5519     processTouchMajor(mapper, rawTouchMajor);
5520     processTouchMinor(mapper, rawTouchMinor);
5521     processToolMajor(mapper, rawToolMajor);
5522     processToolMinor(mapper, rawToolMinor);
5523     processMTSync(mapper);
5524     processSync(mapper);
5525 
5526     NotifyMotionArgs args;
5527     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5528     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5529             x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
5530 }
5531 
TEST_F(MultiTouchInputMapperTest,Process_TouchAndToolAxes_SummedLinearCalibration)5532 TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
5533     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5534     addConfigurationProperty("touch.deviceType", "touchScreen");
5535     prepareDisplay(DISPLAY_ORIENTATION_0);
5536     prepareAxes(POSITION | TOUCH | TOOL);
5537     addConfigurationProperty("touch.size.calibration", "diameter");
5538     addConfigurationProperty("touch.size.scale", "10");
5539     addConfigurationProperty("touch.size.bias", "160");
5540     addConfigurationProperty("touch.size.isSummed", "1");
5541     addMapperAndConfigure(mapper);
5542 
5543     // These calculations are based on the input device calibration documentation.
5544     // Note: We only provide a single common touch/tool value because the device is assumed
5545     //       not to emit separate values for each pointer (isSummed = 1).
5546     int32_t rawX = 100;
5547     int32_t rawY = 200;
5548     int32_t rawX2 = 150;
5549     int32_t rawY2 = 250;
5550     int32_t rawTouchMajor = 5;
5551     int32_t rawToolMajor = 8;
5552 
5553     float x = toDisplayX(rawX);
5554     float y = toDisplayY(rawY);
5555     float x2 = toDisplayX(rawX2);
5556     float y2 = toDisplayY(rawY2);
5557     float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
5558     float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
5559     float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
5560 
5561     processPosition(mapper, rawX, rawY);
5562     processTouchMajor(mapper, rawTouchMajor);
5563     processToolMajor(mapper, rawToolMajor);
5564     processMTSync(mapper);
5565     processPosition(mapper, rawX2, rawY2);
5566     processTouchMajor(mapper, rawTouchMajor);
5567     processToolMajor(mapper, rawToolMajor);
5568     processMTSync(mapper);
5569     processSync(mapper);
5570 
5571     NotifyMotionArgs args;
5572     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5573     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
5574 
5575     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5576     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
5577             args.action);
5578     ASSERT_EQ(size_t(2), args.pointerCount);
5579     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5580             x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5581     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
5582             x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
5583 }
5584 
TEST_F(MultiTouchInputMapperTest,Process_TouchAndToolAxes_AreaCalibration)5585 TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
5586     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5587     addConfigurationProperty("touch.deviceType", "touchScreen");
5588     prepareDisplay(DISPLAY_ORIENTATION_0);
5589     prepareAxes(POSITION | TOUCH | TOOL);
5590     addConfigurationProperty("touch.size.calibration", "area");
5591     addConfigurationProperty("touch.size.scale", "43");
5592     addConfigurationProperty("touch.size.bias", "3");
5593     addMapperAndConfigure(mapper);
5594 
5595     // These calculations are based on the input device calibration documentation.
5596     int32_t rawX = 100;
5597     int32_t rawY = 200;
5598     int32_t rawTouchMajor = 5;
5599     int32_t rawToolMajor = 8;
5600 
5601     float x = toDisplayX(rawX);
5602     float y = toDisplayY(rawY);
5603     float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
5604     float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
5605     float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
5606 
5607     processPosition(mapper, rawX, rawY);
5608     processTouchMajor(mapper, rawTouchMajor);
5609     processToolMajor(mapper, rawToolMajor);
5610     processMTSync(mapper);
5611     processSync(mapper);
5612 
5613     NotifyMotionArgs args;
5614     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5615     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5616             x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
5617 }
5618 
TEST_F(MultiTouchInputMapperTest,Process_PressureAxis_AmplitudeCalibration)5619 TEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
5620     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5621     addConfigurationProperty("touch.deviceType", "touchScreen");
5622     prepareDisplay(DISPLAY_ORIENTATION_0);
5623     prepareAxes(POSITION | PRESSURE);
5624     addConfigurationProperty("touch.pressure.calibration", "amplitude");
5625     addConfigurationProperty("touch.pressure.scale", "0.01");
5626     addMapperAndConfigure(mapper);
5627 
5628     InputDeviceInfo info;
5629     mapper->populateDeviceInfo(&info);
5630     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
5631             AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TOUCHSCREEN,
5632             0.0f, RAW_PRESSURE_MAX * 0.01, 0.0f, 0.0f));
5633 
5634     // These calculations are based on the input device calibration documentation.
5635     int32_t rawX = 100;
5636     int32_t rawY = 200;
5637     int32_t rawPressure = 60;
5638 
5639     float x = toDisplayX(rawX);
5640     float y = toDisplayY(rawY);
5641     float pressure = float(rawPressure) * 0.01f;
5642 
5643     processPosition(mapper, rawX, rawY);
5644     processPressure(mapper, rawPressure);
5645     processMTSync(mapper);
5646     processSync(mapper);
5647 
5648     NotifyMotionArgs args;
5649     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
5650     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
5651             x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
5652 }
5653 
TEST_F(MultiTouchInputMapperTest,Process_ShouldHandleAllButtons)5654 TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
5655     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5656     addConfigurationProperty("touch.deviceType", "touchScreen");
5657     prepareDisplay(DISPLAY_ORIENTATION_0);
5658     prepareAxes(POSITION | ID | SLOT);
5659     addMapperAndConfigure(mapper);
5660 
5661     NotifyMotionArgs motionArgs;
5662     NotifyKeyArgs keyArgs;
5663 
5664     processId(mapper, 1);
5665     processPosition(mapper, 100, 200);
5666     processSync(mapper);
5667     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5668     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5669     ASSERT_EQ(0, motionArgs.buttonState);
5670 
5671     // press BTN_LEFT, release BTN_LEFT
5672     processKey(mapper, BTN_LEFT, 1);
5673     processSync(mapper);
5674     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5675     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5676     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5677 
5678     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5679     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5680     ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
5681 
5682     processKey(mapper, BTN_LEFT, 0);
5683     processSync(mapper);
5684     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5685     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5686     ASSERT_EQ(0, motionArgs.buttonState);
5687 
5688     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5689     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5690     ASSERT_EQ(0, motionArgs.buttonState);
5691 
5692     // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
5693     processKey(mapper, BTN_RIGHT, 1);
5694     processKey(mapper, BTN_MIDDLE, 1);
5695     processSync(mapper);
5696     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5697     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5698     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5699             motionArgs.buttonState);
5700 
5701     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5702     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5703     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
5704 
5705     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5706     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5707     ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
5708             motionArgs.buttonState);
5709 
5710     processKey(mapper, BTN_RIGHT, 0);
5711     processSync(mapper);
5712     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5713     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5714     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
5715 
5716     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5717     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5718     ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
5719 
5720     processKey(mapper, BTN_MIDDLE, 0);
5721     processSync(mapper);
5722     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5723     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5724     ASSERT_EQ(0, motionArgs.buttonState);
5725 
5726     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5727     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5728     ASSERT_EQ(0, motionArgs.buttonState);
5729 
5730     // press BTN_BACK, release BTN_BACK
5731     processKey(mapper, BTN_BACK, 1);
5732     processSync(mapper);
5733     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5734     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5735     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5736 
5737     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5738     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5739     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5740 
5741     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5742     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5743     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5744 
5745     processKey(mapper, BTN_BACK, 0);
5746     processSync(mapper);
5747     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5748     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5749     ASSERT_EQ(0, motionArgs.buttonState);
5750 
5751     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5752     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5753     ASSERT_EQ(0, motionArgs.buttonState);
5754 
5755     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5756     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5757     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5758 
5759     // press BTN_SIDE, release BTN_SIDE
5760     processKey(mapper, BTN_SIDE, 1);
5761     processSync(mapper);
5762     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5763     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5764     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5765 
5766     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5767     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5768     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5769 
5770     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5771     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5772     ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
5773 
5774     processKey(mapper, BTN_SIDE, 0);
5775     processSync(mapper);
5776     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5777     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5778     ASSERT_EQ(0, motionArgs.buttonState);
5779 
5780     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5781     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5782     ASSERT_EQ(0, motionArgs.buttonState);
5783 
5784     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5785     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5786     ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
5787 
5788     // press BTN_FORWARD, release BTN_FORWARD
5789     processKey(mapper, BTN_FORWARD, 1);
5790     processSync(mapper);
5791     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5792     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5793     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5794 
5795     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5796     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5797     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5798 
5799     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5800     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5801     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5802 
5803     processKey(mapper, BTN_FORWARD, 0);
5804     processSync(mapper);
5805     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5806     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5807     ASSERT_EQ(0, motionArgs.buttonState);
5808 
5809     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5810     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5811     ASSERT_EQ(0, motionArgs.buttonState);
5812 
5813     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5814     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5815     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5816 
5817     // press BTN_EXTRA, release BTN_EXTRA
5818     processKey(mapper, BTN_EXTRA, 1);
5819     processSync(mapper);
5820     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5821     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
5822     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5823 
5824     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5825     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5826     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5827 
5828     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5829     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5830     ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
5831 
5832     processKey(mapper, BTN_EXTRA, 0);
5833     processSync(mapper);
5834     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5835     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5836     ASSERT_EQ(0, motionArgs.buttonState);
5837 
5838     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5839     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5840     ASSERT_EQ(0, motionArgs.buttonState);
5841 
5842     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
5843     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
5844     ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
5845 
5846     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
5847 
5848     // press BTN_STYLUS, release BTN_STYLUS
5849     processKey(mapper, BTN_STYLUS, 1);
5850     processSync(mapper);
5851     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5852     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5853     ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
5854 
5855     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5856     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5857     ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_PRIMARY, motionArgs.buttonState);
5858 
5859     processKey(mapper, BTN_STYLUS, 0);
5860     processSync(mapper);
5861     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5862     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5863     ASSERT_EQ(0, motionArgs.buttonState);
5864 
5865     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5866     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5867     ASSERT_EQ(0, motionArgs.buttonState);
5868 
5869     // press BTN_STYLUS2, release BTN_STYLUS2
5870     processKey(mapper, BTN_STYLUS2, 1);
5871     processSync(mapper);
5872     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5873     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5874     ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
5875 
5876     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5877     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_PRESS, motionArgs.action);
5878     ASSERT_EQ(AMOTION_EVENT_BUTTON_STYLUS_SECONDARY, motionArgs.buttonState);
5879 
5880     processKey(mapper, BTN_STYLUS2, 0);
5881     processSync(mapper);
5882     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5883     ASSERT_EQ(AMOTION_EVENT_ACTION_BUTTON_RELEASE, motionArgs.action);
5884     ASSERT_EQ(0, motionArgs.buttonState);
5885 
5886     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5887     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5888     ASSERT_EQ(0, motionArgs.buttonState);
5889 
5890     // release touch
5891     processId(mapper, -1);
5892     processSync(mapper);
5893     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5894     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5895     ASSERT_EQ(0, motionArgs.buttonState);
5896 }
5897 
TEST_F(MultiTouchInputMapperTest,Process_ShouldHandleAllToolTypes)5898 TEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
5899     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5900     addConfigurationProperty("touch.deviceType", "touchScreen");
5901     prepareDisplay(DISPLAY_ORIENTATION_0);
5902     prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
5903     addMapperAndConfigure(mapper);
5904 
5905     NotifyMotionArgs motionArgs;
5906 
5907     // default tool type is finger
5908     processId(mapper, 1);
5909     processPosition(mapper, 100, 200);
5910     processSync(mapper);
5911     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5912     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5913     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5914 
5915     // eraser
5916     processKey(mapper, BTN_TOOL_RUBBER, 1);
5917     processSync(mapper);
5918     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5919     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5920     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
5921 
5922     // stylus
5923     processKey(mapper, BTN_TOOL_RUBBER, 0);
5924     processKey(mapper, BTN_TOOL_PEN, 1);
5925     processSync(mapper);
5926     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5927     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5928     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5929 
5930     // brush
5931     processKey(mapper, BTN_TOOL_PEN, 0);
5932     processKey(mapper, BTN_TOOL_BRUSH, 1);
5933     processSync(mapper);
5934     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5935     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5936     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5937 
5938     // pencil
5939     processKey(mapper, BTN_TOOL_BRUSH, 0);
5940     processKey(mapper, BTN_TOOL_PENCIL, 1);
5941     processSync(mapper);
5942     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5943     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5944     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5945 
5946     // air-brush
5947     processKey(mapper, BTN_TOOL_PENCIL, 0);
5948     processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
5949     processSync(mapper);
5950     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5951     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5952     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
5953 
5954     // mouse
5955     processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
5956     processKey(mapper, BTN_TOOL_MOUSE, 1);
5957     processSync(mapper);
5958     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5959     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5960     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5961 
5962     // lens
5963     processKey(mapper, BTN_TOOL_MOUSE, 0);
5964     processKey(mapper, BTN_TOOL_LENS, 1);
5965     processSync(mapper);
5966     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5967     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5968     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
5969 
5970     // double-tap
5971     processKey(mapper, BTN_TOOL_LENS, 0);
5972     processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
5973     processSync(mapper);
5974     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5975     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5976     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5977 
5978     // triple-tap
5979     processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
5980     processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
5981     processSync(mapper);
5982     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5983     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5984     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5985 
5986     // quad-tap
5987     processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
5988     processKey(mapper, BTN_TOOL_QUADTAP, 1);
5989     processSync(mapper);
5990     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5991     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5992     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5993 
5994     // finger
5995     processKey(mapper, BTN_TOOL_QUADTAP, 0);
5996     processKey(mapper, BTN_TOOL_FINGER, 1);
5997     processSync(mapper);
5998     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5999     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6000     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6001 
6002     // stylus trumps finger
6003     processKey(mapper, BTN_TOOL_PEN, 1);
6004     processSync(mapper);
6005     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6006     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6007     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
6008 
6009     // eraser trumps stylus
6010     processKey(mapper, BTN_TOOL_RUBBER, 1);
6011     processSync(mapper);
6012     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6013     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6014     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
6015 
6016     // mouse trumps eraser
6017     processKey(mapper, BTN_TOOL_MOUSE, 1);
6018     processSync(mapper);
6019     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6020     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6021     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
6022 
6023     // MT tool type trumps BTN tool types: MT_TOOL_FINGER
6024     processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
6025     processSync(mapper);
6026     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6027     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6028     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6029 
6030     // MT tool type trumps BTN tool types: MT_TOOL_PEN
6031     processToolType(mapper, MT_TOOL_PEN);
6032     processSync(mapper);
6033     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6034     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6035     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
6036 
6037     // back to default tool type
6038     processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
6039     processKey(mapper, BTN_TOOL_MOUSE, 0);
6040     processKey(mapper, BTN_TOOL_RUBBER, 0);
6041     processKey(mapper, BTN_TOOL_PEN, 0);
6042     processKey(mapper, BTN_TOOL_FINGER, 0);
6043     processSync(mapper);
6044     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6045     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
6046     ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
6047 }
6048 
TEST_F(MultiTouchInputMapperTest,Process_WhenBtnTouchPresent_HoversIfItsValueIsZero)6049 TEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
6050     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6051     addConfigurationProperty("touch.deviceType", "touchScreen");
6052     prepareDisplay(DISPLAY_ORIENTATION_0);
6053     prepareAxes(POSITION | ID | SLOT);
6054     mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
6055     addMapperAndConfigure(mapper);
6056 
6057     NotifyMotionArgs motionArgs;
6058 
6059     // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
6060     processId(mapper, 1);
6061     processPosition(mapper, 100, 200);
6062     processSync(mapper);
6063     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6064     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6065     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6066             toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6067 
6068     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6069     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6070     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6071             toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6072 
6073     // move a little
6074     processPosition(mapper, 150, 250);
6075     processSync(mapper);
6076     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6077     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6078     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6079             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6080 
6081     // down when BTN_TOUCH is pressed, pressure defaults to 1
6082     processKey(mapper, BTN_TOUCH, 1);
6083     processSync(mapper);
6084     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6085     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6086     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6087             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6088 
6089     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6090     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6091     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6092             toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6093 
6094     // up when BTN_TOUCH is released, hover restored
6095     processKey(mapper, BTN_TOUCH, 0);
6096     processSync(mapper);
6097     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6098     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6099     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6100             toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6101 
6102     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6103     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6104     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6105             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6106 
6107     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6108     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6109     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6110             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6111 
6112     // exit hover when pointer goes away
6113     processId(mapper, -1);
6114     processSync(mapper);
6115     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6116     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6117     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6118             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6119 }
6120 
TEST_F(MultiTouchInputMapperTest,Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero)6121 TEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
6122     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6123     addConfigurationProperty("touch.deviceType", "touchScreen");
6124     prepareDisplay(DISPLAY_ORIENTATION_0);
6125     prepareAxes(POSITION | ID | SLOT | PRESSURE);
6126     addMapperAndConfigure(mapper);
6127 
6128     NotifyMotionArgs motionArgs;
6129 
6130     // initially hovering because pressure is 0
6131     processId(mapper, 1);
6132     processPosition(mapper, 100, 200);
6133     processPressure(mapper, 0);
6134     processSync(mapper);
6135     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6136     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6137     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6138             toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6139 
6140     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6141     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6142     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6143             toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
6144 
6145     // move a little
6146     processPosition(mapper, 150, 250);
6147     processSync(mapper);
6148     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6149     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6150     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6151             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6152 
6153     // down when pressure becomes non-zero
6154     processPressure(mapper, RAW_PRESSURE_MAX);
6155     processSync(mapper);
6156     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6157     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6158     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6159             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6160 
6161     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6162     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
6163     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6164             toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6165 
6166     // up when pressure becomes 0, hover restored
6167     processPressure(mapper, 0);
6168     processSync(mapper);
6169     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6170     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
6171     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6172             toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
6173 
6174     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6175     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
6176     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6177             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6178 
6179     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6180     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6181     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6182             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6183 
6184     // exit hover when pointer goes away
6185     processId(mapper, -1);
6186     processSync(mapper);
6187     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6188     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
6189     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
6190             toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
6191 }
6192 
TEST_F(MultiTouchInputMapperTest,Process_HandlesTimestamp)6193 TEST_F(MultiTouchInputMapperTest, Process_HandlesTimestamp) {
6194     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6195 
6196     addConfigurationProperty("touch.deviceType", "touchScreen");
6197     prepareDisplay(DISPLAY_ORIENTATION_0);
6198     prepareAxes(POSITION);
6199     addMapperAndConfigure(mapper);
6200     NotifyMotionArgs args;
6201 
6202     // By default, deviceTimestamp should be zero
6203     processPosition(mapper, 100, 100);
6204     processMTSync(mapper);
6205     processSync(mapper);
6206     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6207     ASSERT_EQ(0U, args.deviceTimestamp);
6208 
6209     // Now the timestamp of 1000 is reported by evdev and should appear in MotionArgs
6210     processPosition(mapper, 0, 0);
6211     processTimestamp(mapper, 1000);
6212     processMTSync(mapper);
6213     processSync(mapper);
6214     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6215     ASSERT_EQ(1000U, args.deviceTimestamp);
6216 }
6217 
TEST_F(MultiTouchInputMapperTest,WhenMapperIsReset_TimestampIsCleared)6218 TEST_F(MultiTouchInputMapperTest, WhenMapperIsReset_TimestampIsCleared) {
6219     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6220 
6221     addConfigurationProperty("touch.deviceType", "touchScreen");
6222     prepareDisplay(DISPLAY_ORIENTATION_0);
6223     prepareAxes(POSITION);
6224     addMapperAndConfigure(mapper);
6225     NotifyMotionArgs args;
6226 
6227     // Send a touch event with a timestamp
6228     processPosition(mapper, 100, 100);
6229     processTimestamp(mapper, 1);
6230     processMTSync(mapper);
6231     processSync(mapper);
6232     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6233     ASSERT_EQ(1U, args.deviceTimestamp);
6234 
6235     // Since the data accumulates, and new timestamp has not arrived, deviceTimestamp won't change
6236     processPosition(mapper, 100, 200);
6237     processMTSync(mapper);
6238     processSync(mapper);
6239     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6240     ASSERT_EQ(1U, args.deviceTimestamp);
6241 
6242     mapper->reset(/* when */ 0);
6243     // After the mapper is reset, deviceTimestamp should become zero again
6244     processPosition(mapper, 100, 300);
6245     processMTSync(mapper);
6246     processSync(mapper);
6247     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6248     ASSERT_EQ(0U, args.deviceTimestamp);
6249 }
6250 
6251 /**
6252  * Set the input device port <--> display port associations, and check that the
6253  * events are routed to the display that matches the display port.
6254  * This can be checked by looking at the displayId of the resulting NotifyMotionArgs.
6255  */
TEST_F(MultiTouchInputMapperTest,Configure_AssignsDisplayPort)6256 TEST_F(MultiTouchInputMapperTest, Configure_AssignsDisplayPort) {
6257     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6258     const std::string usb2 = "USB2";
6259     const uint8_t hdmi1 = 0;
6260     const uint8_t hdmi2 = 1;
6261     const std::string secondaryUniqueId = "uniqueId2";
6262     constexpr ViewportType type = ViewportType::VIEWPORT_EXTERNAL;
6263 
6264     addConfigurationProperty("touch.deviceType", "touchScreen");
6265     prepareAxes(POSITION);
6266     addMapperAndConfigure(mapper);
6267 
6268     mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
6269     mFakePolicy->addInputPortAssociation(usb2, hdmi2);
6270 
6271     // We are intentionally not adding the viewport for display 1 yet. Since the port association
6272     // for this input device is specified, and the matching viewport is not present,
6273     // the input device should be disabled (at the mapper level).
6274 
6275     // Add viewport for display 2 on hdmi2
6276     prepareSecondaryDisplay(type, hdmi2);
6277     // Send a touch event
6278     processPosition(mapper, 100, 100);
6279     processSync(mapper);
6280     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
6281 
6282     // Add viewport for display 1 on hdmi1
6283     prepareDisplay(DISPLAY_ORIENTATION_0, hdmi1);
6284     // Send a touch event again
6285     processPosition(mapper, 100, 100);
6286     processSync(mapper);
6287 
6288     NotifyMotionArgs args;
6289     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
6290     ASSERT_EQ(DISPLAY_ID, args.displayId);
6291 }
6292 
6293 /**
6294  * Expect fallback to internal viewport if device is external and external viewport is not present.
6295  */
TEST_F(MultiTouchInputMapperTest,Viewports_Fallback)6296 TEST_F(MultiTouchInputMapperTest, Viewports_Fallback) {
6297     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6298     prepareAxes(POSITION);
6299     addConfigurationProperty("touch.deviceType", "touchScreen");
6300     prepareDisplay(DISPLAY_ORIENTATION_0);
6301     mDevice->setExternal(true);
6302     addMapperAndConfigure(mapper);
6303 
6304     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
6305 
6306     NotifyMotionArgs motionArgs;
6307 
6308     // Expect the event to be sent to the internal viewport,
6309     // because an external viewport is not present.
6310     processPosition(mapper, 100, 100);
6311     processSync(mapper);
6312     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6313     ASSERT_EQ(ADISPLAY_ID_DEFAULT, motionArgs.displayId);
6314 
6315     // Expect the event to be sent to the external viewport if it is present.
6316     prepareSecondaryDisplay(ViewportType::VIEWPORT_EXTERNAL);
6317     processPosition(mapper, 100, 100);
6318     processSync(mapper);
6319     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6320     ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId);
6321 }
6322 
TEST_F(MultiTouchInputMapperTest,Process_Pointer_ShouldHandleDisplayId)6323 TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) {
6324     // Setup PointerController for second display.
6325     sp<FakePointerController> fakePointerController = new FakePointerController();
6326     fakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
6327     fakePointerController->setPosition(100, 200);
6328     fakePointerController->setButtonState(0);
6329     fakePointerController->setDisplayId(SECONDARY_DISPLAY_ID);
6330     mFakePolicy->setPointerController(mDevice->getId(), fakePointerController);
6331 
6332     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6333     prepareDisplay(DISPLAY_ORIENTATION_0);
6334     prepareAxes(POSITION);
6335     addMapperAndConfigure(mapper);
6336 
6337     // Check source is mouse that would obtain the PointerController.
6338     ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
6339 
6340     NotifyMotionArgs motionArgs;
6341     processPosition(mapper, 100, 100);
6342     processSync(mapper);
6343 
6344     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6345     ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
6346     ASSERT_EQ(SECONDARY_DISPLAY_ID, motionArgs.displayId);
6347 }
6348 
TEST_F(MultiTouchInputMapperTest,Process_Pointer_ShowTouches)6349 TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShowTouches) {
6350     // Setup the first touch screen device.
6351     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6352     prepareAxes(POSITION | ID | SLOT);
6353     addConfigurationProperty("touch.deviceType", "touchScreen");
6354     addMapperAndConfigure(mapper);
6355 
6356     // Create the second touch screen device, and enable multi fingers.
6357     const std::string USB2 = "USB2";
6358     const int32_t SECOND_DEVICE_ID = 2;
6359     InputDeviceIdentifier identifier;
6360     identifier.name = DEVICE_NAME;
6361     identifier.location = USB2;
6362     InputDevice* device2 = new InputDevice(mFakeContext, SECOND_DEVICE_ID, DEVICE_GENERATION,
6363             DEVICE_CONTROLLER_NUMBER, identifier, DEVICE_CLASSES);
6364     mFakeEventHub->addDevice(SECOND_DEVICE_ID, DEVICE_NAME, 0 /*classes*/);
6365     mFakeEventHub->addAbsoluteAxis(SECOND_DEVICE_ID, ABS_MT_POSITION_X, RAW_X_MIN, RAW_X_MAX,
6366             0 /*flat*/, 0 /*fuzz*/);
6367     mFakeEventHub->addAbsoluteAxis(SECOND_DEVICE_ID, ABS_MT_POSITION_Y, RAW_Y_MIN, RAW_Y_MAX,
6368             0 /*flat*/, 0 /*fuzz*/);
6369     mFakeEventHub->addAbsoluteAxis(SECOND_DEVICE_ID, ABS_MT_TRACKING_ID, RAW_ID_MIN, RAW_ID_MAX,
6370             0 /*flat*/, 0 /*fuzz*/);
6371     mFakeEventHub->addAbsoluteAxis(SECOND_DEVICE_ID, ABS_MT_SLOT, RAW_SLOT_MIN, RAW_SLOT_MAX,
6372             0 /*flat*/, 0 /*fuzz*/);
6373     mFakeEventHub->setAbsoluteAxisValue(SECOND_DEVICE_ID, ABS_MT_SLOT, 0 /*value*/);
6374     mFakeEventHub->addConfigurationProperty(SECOND_DEVICE_ID, String8("touch.deviceType"),
6375             String8("touchScreen"));
6376 
6377     // Setup the second touch screen device.
6378     MultiTouchInputMapper* mapper2 = new MultiTouchInputMapper(device2);
6379     device2->addMapper(mapper2);
6380     device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 0 /*changes*/);
6381     device2->reset(ARBITRARY_TIME);
6382 
6383     // Setup PointerController.
6384     sp<FakePointerController> fakePointerController = new FakePointerController();
6385     mFakePolicy->setPointerController(mDevice->getId(), fakePointerController);
6386     mFakePolicy->setPointerController(SECOND_DEVICE_ID, fakePointerController);
6387 
6388     // Setup policy for associated displays and show touches.
6389     const uint8_t hdmi1 = 0;
6390     const uint8_t hdmi2 = 1;
6391     mFakePolicy->addInputPortAssociation(DEVICE_LOCATION, hdmi1);
6392     mFakePolicy->addInputPortAssociation(USB2, hdmi2);
6393     mFakePolicy->setShowTouches(true);
6394 
6395     // Create displays.
6396     prepareDisplay(DISPLAY_ORIENTATION_0, hdmi1);
6397     prepareSecondaryDisplay(ViewportType::VIEWPORT_EXTERNAL, hdmi2);
6398 
6399     // Default device will reconfigure above, need additional reconfiguration for another device.
6400     device2->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
6401             InputReaderConfiguration::CHANGE_DISPLAY_INFO);
6402 
6403     // Two fingers down at default display.
6404     int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
6405     processPosition(mapper, x1, y1);
6406     processId(mapper, 1);
6407     processSlot(mapper, 1);
6408     processPosition(mapper, x2, y2);
6409     processId(mapper, 2);
6410     processSync(mapper);
6411 
6412     std::map<int32_t, std::vector<int32_t>>::const_iterator iter =
6413             fakePointerController->getSpots().find(DISPLAY_ID);
6414     ASSERT_TRUE(iter != fakePointerController->getSpots().end());
6415     ASSERT_EQ(size_t(2), iter->second.size());
6416 
6417     // Two fingers down at second display.
6418     processPosition(mapper2, x1, y1);
6419     processId(mapper2, 1);
6420     processSlot(mapper2, 1);
6421     processPosition(mapper2, x2, y2);
6422     processId(mapper2, 2);
6423     processSync(mapper2);
6424 
6425     iter = fakePointerController->getSpots().find(SECONDARY_DISPLAY_ID);
6426     ASSERT_TRUE(iter != fakePointerController->getSpots().end());
6427     ASSERT_EQ(size_t(2), iter->second.size());
6428 }
6429 
TEST_F(MultiTouchInputMapperTest,VideoFrames_ReceivedByListener)6430 TEST_F(MultiTouchInputMapperTest, VideoFrames_ReceivedByListener) {
6431     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6432     prepareAxes(POSITION);
6433     addConfigurationProperty("touch.deviceType", "touchScreen");
6434     prepareDisplay(DISPLAY_ORIENTATION_0);
6435     addMapperAndConfigure(mapper);
6436 
6437     NotifyMotionArgs motionArgs;
6438     // Unrotated video frame
6439     TouchVideoFrame frame(3, 2, {1, 2, 3, 4, 5, 6}, {1, 2});
6440     std::vector<TouchVideoFrame> frames{frame};
6441     mFakeEventHub->setVideoFrames({{mDevice->getId(), frames}});
6442     processPosition(mapper, 100, 200);
6443     processSync(mapper);
6444     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6445     ASSERT_EQ(frames, motionArgs.videoFrames);
6446 
6447     // Subsequent touch events should not have any videoframes
6448     // This is implemented separately in FakeEventHub,
6449     // but that should match the behaviour of TouchVideoDevice.
6450     processPosition(mapper, 200, 200);
6451     processSync(mapper);
6452     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6453     ASSERT_EQ(std::vector<TouchVideoFrame>(), motionArgs.videoFrames);
6454 }
6455 
TEST_F(MultiTouchInputMapperTest,VideoFrames_AreRotated)6456 TEST_F(MultiTouchInputMapperTest, VideoFrames_AreRotated) {
6457     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6458     prepareAxes(POSITION);
6459     addConfigurationProperty("touch.deviceType", "touchScreen");
6460     addMapperAndConfigure(mapper);
6461     // Unrotated video frame
6462     TouchVideoFrame frame(3, 2, {1, 2, 3, 4, 5, 6}, {1, 2});
6463     NotifyMotionArgs motionArgs;
6464 
6465     // Test all 4 orientations
6466     for (int32_t orientation : {DISPLAY_ORIENTATION_0, DISPLAY_ORIENTATION_90,
6467              DISPLAY_ORIENTATION_180, DISPLAY_ORIENTATION_270}) {
6468         SCOPED_TRACE("Orientation " + StringPrintf("%i", orientation));
6469         clearViewports();
6470         prepareDisplay(orientation);
6471         std::vector<TouchVideoFrame> frames{frame};
6472         mFakeEventHub->setVideoFrames({{mDevice->getId(), frames}});
6473         processPosition(mapper, 100, 200);
6474         processSync(mapper);
6475         ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6476         frames[0].rotate(orientation);
6477         ASSERT_EQ(frames, motionArgs.videoFrames);
6478     }
6479 }
6480 
TEST_F(MultiTouchInputMapperTest,VideoFrames_MultipleFramesAreRotated)6481 TEST_F(MultiTouchInputMapperTest, VideoFrames_MultipleFramesAreRotated) {
6482     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
6483     prepareAxes(POSITION);
6484     addConfigurationProperty("touch.deviceType", "touchScreen");
6485     addMapperAndConfigure(mapper);
6486     // Unrotated video frames. There's no rule that they must all have the same dimensions,
6487     // so mix these.
6488     TouchVideoFrame frame1(3, 2, {1, 2, 3, 4, 5, 6}, {1, 2});
6489     TouchVideoFrame frame2(3, 3, {0, 1, 2, 3, 4, 5, 6, 7, 8}, {1, 3});
6490     TouchVideoFrame frame3(2, 2, {10, 20, 10, 0}, {1, 4});
6491     std::vector<TouchVideoFrame> frames{frame1, frame2, frame3};
6492     NotifyMotionArgs motionArgs;
6493 
6494     prepareDisplay(DISPLAY_ORIENTATION_90);
6495     mFakeEventHub->setVideoFrames({{mDevice->getId(), frames}});
6496     processPosition(mapper, 100, 200);
6497     processSync(mapper);
6498     ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
6499     std::for_each(frames.begin(), frames.end(),
6500             [](TouchVideoFrame& frame) { frame.rotate(DISPLAY_ORIENTATION_90); });
6501     ASSERT_EQ(frames, motionArgs.videoFrames);
6502 }
6503 
6504 } // namespace android
6505