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