Home | History | Annotate | Download | only in tests
      1 //
      2 // Copyright 2010 The Android Open Source Project
      3 //
      4 
      5 #include <ui/InputReader.h>
      6 #include <utils/List.h>
      7 #include <gtest/gtest.h>
      8 #include <math.h>
      9 
     10 namespace android {
     11 
     12 // An arbitrary time value.
     13 static const nsecs_t ARBITRARY_TIME = 1234;
     14 
     15 // Arbitrary display properties.
     16 static const int32_t DISPLAY_ID = 0;
     17 static const int32_t DISPLAY_WIDTH = 480;
     18 static const int32_t DISPLAY_HEIGHT = 800;
     19 
     20 // Error tolerance for floating point assertions.
     21 static const float EPSILON = 0.001f;
     22 
     23 template<typename T>
     24 static inline T min(T a, T b) {
     25     return a < b ? a : b;
     26 }
     27 
     28 static inline float avg(float x, float y) {
     29     return (x + y) / 2;
     30 }
     31 
     32 
     33 // --- FakeInputReaderPolicy ---
     34 
     35 class FakeInputReaderPolicy : public InputReaderPolicyInterface {
     36     struct DisplayInfo {
     37         int32_t width;
     38         int32_t height;
     39         int32_t orientation;
     40     };
     41 
     42     KeyedVector<int32_t, DisplayInfo> mDisplayInfos;
     43     bool mFilterTouchEvents;
     44     bool mFilterJumpyTouchEvents;
     45     KeyedVector<String8, Vector<VirtualKeyDefinition> > mVirtualKeyDefinitions;
     46     KeyedVector<String8, InputDeviceCalibration> mInputDeviceCalibrations;
     47     Vector<String8> mExcludedDeviceNames;
     48 
     49 protected:
     50     virtual ~FakeInputReaderPolicy() { }
     51 
     52 public:
     53     FakeInputReaderPolicy() :
     54             mFilterTouchEvents(false), mFilterJumpyTouchEvents(false) {
     55     }
     56 
     57     void removeDisplayInfo(int32_t displayId) {
     58         mDisplayInfos.removeItem(displayId);
     59     }
     60 
     61     void setDisplayInfo(int32_t displayId, int32_t width, int32_t height, int32_t orientation) {
     62         removeDisplayInfo(displayId);
     63 
     64         DisplayInfo info;
     65         info.width = width;
     66         info.height = height;
     67         info.orientation = orientation;
     68         mDisplayInfos.add(displayId, info);
     69     }
     70 
     71     void setFilterTouchEvents(bool enabled) {
     72         mFilterTouchEvents = enabled;
     73     }
     74 
     75     void setFilterJumpyTouchEvents(bool enabled) {
     76         mFilterJumpyTouchEvents = enabled;
     77     }
     78 
     79     void addInputDeviceCalibration(const String8& deviceName,
     80             const InputDeviceCalibration& calibration) {
     81         mInputDeviceCalibrations.add(deviceName, calibration);
     82     }
     83 
     84     void addInputDeviceCalibrationProperty(const String8& deviceName,
     85             const String8& key, const String8& value) {
     86         ssize_t index = mInputDeviceCalibrations.indexOfKey(deviceName);
     87         if (index < 0) {
     88             index = mInputDeviceCalibrations.add(deviceName, InputDeviceCalibration());
     89         }
     90         mInputDeviceCalibrations.editValueAt(index).addProperty(key, value);
     91     }
     92 
     93     void addVirtualKeyDefinition(const String8& deviceName,
     94             const VirtualKeyDefinition& definition) {
     95         if (mVirtualKeyDefinitions.indexOfKey(deviceName) < 0) {
     96             mVirtualKeyDefinitions.add(deviceName, Vector<VirtualKeyDefinition>());
     97         }
     98 
     99         mVirtualKeyDefinitions.editValueFor(deviceName).push(definition);
    100     }
    101 
    102     void addExcludedDeviceName(const String8& deviceName) {
    103         mExcludedDeviceNames.push(deviceName);
    104     }
    105 
    106 private:
    107     virtual bool getDisplayInfo(int32_t displayId,
    108             int32_t* width, int32_t* height, int32_t* orientation) {
    109         ssize_t index = mDisplayInfos.indexOfKey(displayId);
    110         if (index >= 0) {
    111             const DisplayInfo& info = mDisplayInfos.valueAt(index);
    112             if (width) {
    113                 *width = info.width;
    114             }
    115             if (height) {
    116                 *height = info.height;
    117             }
    118             if (orientation) {
    119                 *orientation = info.orientation;
    120             }
    121             return true;
    122         }
    123         return false;
    124     }
    125 
    126     virtual bool filterTouchEvents() {
    127         return mFilterTouchEvents;
    128     }
    129 
    130     virtual bool filterJumpyTouchEvents() {
    131         return mFilterJumpyTouchEvents;
    132     }
    133 
    134     virtual nsecs_t getVirtualKeyQuietTime() {
    135         return 0;
    136     }
    137 
    138     virtual void getVirtualKeyDefinitions(const String8& deviceName,
    139             Vector<VirtualKeyDefinition>& outVirtualKeyDefinitions) {
    140         ssize_t index = mVirtualKeyDefinitions.indexOfKey(deviceName);
    141         if (index >= 0) {
    142             outVirtualKeyDefinitions.appendVector(mVirtualKeyDefinitions.valueAt(index));
    143         }
    144     }
    145 
    146     virtual void getInputDeviceCalibration(const String8& deviceName,
    147             InputDeviceCalibration& outCalibration) {
    148         ssize_t index = mInputDeviceCalibrations.indexOfKey(deviceName);
    149         if (index >= 0) {
    150             outCalibration = mInputDeviceCalibrations.valueAt(index);
    151         }
    152     }
    153 
    154     virtual void getExcludedDeviceNames(Vector<String8>& outExcludedDeviceNames) {
    155         outExcludedDeviceNames.appendVector(mExcludedDeviceNames);
    156     }
    157 };
    158 
    159 
    160 // --- FakeInputDispatcher ---
    161 
    162 class FakeInputDispatcher : public InputDispatcherInterface {
    163 public:
    164     struct NotifyConfigurationChangedArgs {
    165         nsecs_t eventTime;
    166     };
    167 
    168     struct NotifyKeyArgs {
    169         nsecs_t eventTime;
    170         int32_t deviceId;
    171         int32_t source;
    172         uint32_t policyFlags;
    173         int32_t action;
    174         int32_t flags;
    175         int32_t keyCode;
    176         int32_t scanCode;
    177         int32_t metaState;
    178         nsecs_t downTime;
    179     };
    180 
    181     struct NotifyMotionArgs {
    182         nsecs_t eventTime;
    183         int32_t deviceId;
    184         int32_t source;
    185         uint32_t policyFlags;
    186         int32_t action;
    187         int32_t flags;
    188         int32_t metaState;
    189         int32_t edgeFlags;
    190         uint32_t pointerCount;
    191         Vector<int32_t> pointerIds;
    192         Vector<PointerCoords> pointerCoords;
    193         float xPrecision;
    194         float yPrecision;
    195         nsecs_t downTime;
    196     };
    197 
    198     struct NotifySwitchArgs {
    199         nsecs_t when;
    200         int32_t switchCode;
    201         int32_t switchValue;
    202         uint32_t policyFlags;
    203     };
    204 
    205 private:
    206     List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgs;
    207     List<NotifyKeyArgs> mNotifyKeyArgs;
    208     List<NotifyMotionArgs> mNotifyMotionArgs;
    209     List<NotifySwitchArgs> mNotifySwitchArgs;
    210 
    211 protected:
    212     virtual ~FakeInputDispatcher() { }
    213 
    214 public:
    215     FakeInputDispatcher() {
    216     }
    217 
    218     void assertNotifyConfigurationChangedWasCalled(NotifyConfigurationChangedArgs* outArgs = NULL) {
    219         ASSERT_FALSE(mNotifyConfigurationChangedArgs.empty())
    220                 << "Expected notifyConfigurationChanged() to have been called.";
    221         if (outArgs) {
    222             *outArgs = *mNotifyConfigurationChangedArgs.begin();
    223         }
    224         mNotifyConfigurationChangedArgs.erase(mNotifyConfigurationChangedArgs.begin());
    225     }
    226 
    227     void assertNotifyKeyWasCalled(NotifyKeyArgs* outArgs = NULL) {
    228         ASSERT_FALSE(mNotifyKeyArgs.empty())
    229                 << "Expected notifyKey() to have been called.";
    230         if (outArgs) {
    231             *outArgs = *mNotifyKeyArgs.begin();
    232         }
    233         mNotifyKeyArgs.erase(mNotifyKeyArgs.begin());
    234     }
    235 
    236     void assertNotifyKeyWasNotCalled() {
    237         ASSERT_TRUE(mNotifyKeyArgs.empty())
    238                 << "Expected notifyKey() to not have been called.";
    239     }
    240 
    241     void assertNotifyMotionWasCalled(NotifyMotionArgs* outArgs = NULL) {
    242         ASSERT_FALSE(mNotifyMotionArgs.empty())
    243                 << "Expected notifyMotion() to have been called.";
    244         if (outArgs) {
    245             *outArgs = *mNotifyMotionArgs.begin();
    246         }
    247         mNotifyMotionArgs.erase(mNotifyMotionArgs.begin());
    248     }
    249 
    250     void assertNotifyMotionWasNotCalled() {
    251         ASSERT_TRUE(mNotifyMotionArgs.empty())
    252                 << "Expected notifyMotion() to not have been called.";
    253     }
    254 
    255     void assertNotifySwitchWasCalled(NotifySwitchArgs* outArgs = NULL) {
    256         ASSERT_FALSE(mNotifySwitchArgs.empty())
    257                 << "Expected notifySwitch() to have been called.";
    258         if (outArgs) {
    259             *outArgs = *mNotifySwitchArgs.begin();
    260         }
    261         mNotifySwitchArgs.erase(mNotifySwitchArgs.begin());
    262     }
    263 
    264 private:
    265     virtual void notifyConfigurationChanged(nsecs_t eventTime) {
    266         NotifyConfigurationChangedArgs args;
    267         args.eventTime = eventTime;
    268         mNotifyConfigurationChangedArgs.push_back(args);
    269     }
    270 
    271     virtual void notifyKey(nsecs_t eventTime, int32_t deviceId, int32_t source,
    272             uint32_t policyFlags, int32_t action, int32_t flags, int32_t keyCode,
    273             int32_t scanCode, int32_t metaState, nsecs_t downTime) {
    274         NotifyKeyArgs args;
    275         args.eventTime = eventTime;
    276         args.deviceId = deviceId;
    277         args.source = source;
    278         args.policyFlags = policyFlags;
    279         args.action = action;
    280         args.flags = flags;
    281         args.keyCode = keyCode;
    282         args.scanCode = scanCode;
    283         args.metaState = metaState;
    284         args.downTime = downTime;
    285         mNotifyKeyArgs.push_back(args);
    286     }
    287 
    288     virtual void notifyMotion(nsecs_t eventTime, int32_t deviceId, int32_t source,
    289             uint32_t policyFlags, int32_t action, int32_t flags,
    290             int32_t metaState, int32_t edgeFlags,
    291             uint32_t pointerCount, const int32_t* pointerIds, const PointerCoords* pointerCoords,
    292             float xPrecision, float yPrecision, nsecs_t downTime) {
    293         NotifyMotionArgs args;
    294         args.eventTime = eventTime;
    295         args.deviceId = deviceId;
    296         args.source = source;
    297         args.policyFlags = policyFlags;
    298         args.action = action;
    299         args.flags = flags;
    300         args.metaState = metaState;
    301         args.edgeFlags = edgeFlags;
    302         args.pointerCount = pointerCount;
    303         args.pointerIds.clear();
    304         args.pointerIds.appendArray(pointerIds, pointerCount);
    305         args.pointerCoords.clear();
    306         args.pointerCoords.appendArray(pointerCoords, pointerCount);
    307         args.xPrecision = xPrecision;
    308         args.yPrecision = yPrecision;
    309         args.downTime = downTime;
    310         mNotifyMotionArgs.push_back(args);
    311     }
    312 
    313     virtual void notifySwitch(nsecs_t when,
    314             int32_t switchCode, int32_t switchValue, uint32_t policyFlags) {
    315         NotifySwitchArgs args;
    316         args.when = when;
    317         args.switchCode = switchCode;
    318         args.switchValue = switchValue;
    319         args.policyFlags = policyFlags;
    320         mNotifySwitchArgs.push_back(args);
    321     }
    322 
    323     virtual void dump(String8& dump) {
    324         ADD_FAILURE() << "Should never be called by input reader.";
    325     }
    326 
    327     virtual void dispatchOnce() {
    328         ADD_FAILURE() << "Should never be called by input reader.";
    329     }
    330 
    331     virtual int32_t injectInputEvent(const InputEvent* event,
    332             int32_t injectorPid, int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis) {
    333         ADD_FAILURE() << "Should never be called by input reader.";
    334         return INPUT_EVENT_INJECTION_FAILED;
    335     }
    336 
    337     virtual void setInputWindows(const Vector<InputWindow>& inputWindows) {
    338         ADD_FAILURE() << "Should never be called by input reader.";
    339     }
    340 
    341     virtual void setFocusedApplication(const InputApplication* inputApplication) {
    342         ADD_FAILURE() << "Should never be called by input reader.";
    343     }
    344 
    345     virtual void setInputDispatchMode(bool enabled, bool frozen) {
    346         ADD_FAILURE() << "Should never be called by input reader.";
    347     }
    348 
    349     virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel, bool monitor) {
    350         ADD_FAILURE() << "Should never be called by input reader.";
    351         return 0;
    352     }
    353 
    354     virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel) {
    355         ADD_FAILURE() << "Should never be called by input reader.";
    356         return 0;
    357     }
    358 };
    359 
    360 
    361 // --- FakeEventHub ---
    362 
    363 class FakeEventHub : public EventHubInterface {
    364     struct KeyInfo {
    365         int32_t keyCode;
    366         uint32_t flags;
    367     };
    368 
    369     struct Device {
    370         String8 name;
    371         uint32_t classes;
    372         KeyedVector<int, RawAbsoluteAxisInfo> axes;
    373         KeyedVector<int32_t, int32_t> keyCodeStates;
    374         KeyedVector<int32_t, int32_t> scanCodeStates;
    375         KeyedVector<int32_t, int32_t> switchStates;
    376         KeyedVector<int32_t, KeyInfo> keys;
    377 
    378         Device(const String8& name, uint32_t classes) :
    379                 name(name), classes(classes) {
    380         }
    381     };
    382 
    383     KeyedVector<int32_t, Device*> mDevices;
    384     Vector<String8> mExcludedDevices;
    385     List<RawEvent> mEvents;
    386 
    387 protected:
    388     virtual ~FakeEventHub() {
    389         for (size_t i = 0; i < mDevices.size(); i++) {
    390             delete mDevices.valueAt(i);
    391         }
    392     }
    393 
    394 public:
    395     FakeEventHub() { }
    396 
    397     void addDevice(int32_t deviceId, const String8& name, uint32_t classes) {
    398         Device* device = new Device(name, classes);
    399         mDevices.add(deviceId, device);
    400 
    401         enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0, 0, 0);
    402     }
    403 
    404     void removeDevice(int32_t deviceId) {
    405         delete mDevices.valueFor(deviceId);
    406         mDevices.removeItem(deviceId);
    407 
    408         enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0, 0, 0);
    409     }
    410 
    411     void finishDeviceScan() {
    412         enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0, 0, 0);
    413     }
    414 
    415     void addAxis(int32_t deviceId, int axis,
    416             int32_t minValue, int32_t maxValue, int flat, int fuzz) {
    417         Device* device = getDevice(deviceId);
    418 
    419         RawAbsoluteAxisInfo info;
    420         info.valid = true;
    421         info.minValue = minValue;
    422         info.maxValue = maxValue;
    423         info.flat = flat;
    424         info.fuzz = fuzz;
    425         device->axes.add(axis, info);
    426     }
    427 
    428     void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
    429         Device* device = getDevice(deviceId);
    430         device->keyCodeStates.replaceValueFor(keyCode, state);
    431     }
    432 
    433     void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
    434         Device* device = getDevice(deviceId);
    435         device->scanCodeStates.replaceValueFor(scanCode, state);
    436     }
    437 
    438     void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
    439         Device* device = getDevice(deviceId);
    440         device->switchStates.replaceValueFor(switchCode, state);
    441     }
    442 
    443     void addKey(int32_t deviceId, int32_t scanCode, int32_t keyCode, uint32_t flags) {
    444         Device* device = getDevice(deviceId);
    445         KeyInfo info;
    446         info.keyCode = keyCode;
    447         info.flags = flags;
    448         device->keys.add(scanCode, info);
    449     }
    450 
    451     Vector<String8>& getExcludedDevices() {
    452         return mExcludedDevices;
    453     }
    454 
    455     void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
    456             int32_t scanCode, int32_t keyCode, int32_t value, uint32_t flags) {
    457         RawEvent event;
    458         event.when = when;
    459         event.deviceId = deviceId;
    460         event.type = type;
    461         event.scanCode = scanCode;
    462         event.keyCode = keyCode;
    463         event.value = value;
    464         event.flags = flags;
    465         mEvents.push_back(event);
    466     }
    467 
    468     void assertQueueIsEmpty() {
    469         ASSERT_EQ(size_t(0), mEvents.size())
    470                 << "Expected the event queue to be empty (fully consumed).";
    471     }
    472 
    473 private:
    474     Device* getDevice(int32_t deviceId) const {
    475         ssize_t index = mDevices.indexOfKey(deviceId);
    476         return index >= 0 ? mDevices.valueAt(index) : NULL;
    477     }
    478 
    479     virtual uint32_t getDeviceClasses(int32_t deviceId) const {
    480         Device* device = getDevice(deviceId);
    481         return device ? device->classes : 0;
    482     }
    483 
    484     virtual String8 getDeviceName(int32_t deviceId) const {
    485         Device* device = getDevice(deviceId);
    486         return device ? device->name : String8("unknown");
    487     }
    488 
    489     virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
    490             RawAbsoluteAxisInfo* outAxisInfo) const {
    491         Device* device = getDevice(deviceId);
    492         if (device) {
    493             ssize_t index = device->axes.indexOfKey(axis);
    494             if (index >= 0) {
    495                 *outAxisInfo = device->axes.valueAt(index);
    496                 return OK;
    497             }
    498         }
    499         return -1;
    500     }
    501 
    502     virtual status_t scancodeToKeycode(int32_t deviceId, int scancode,
    503             int32_t* outKeycode, uint32_t* outFlags) const {
    504         Device* device = getDevice(deviceId);
    505         if (device) {
    506             ssize_t index = device->keys.indexOfKey(scancode);
    507             if (index >= 0) {
    508                 if (outKeycode) {
    509                     *outKeycode = device->keys.valueAt(index).keyCode;
    510                 }
    511                 if (outFlags) {
    512                     *outFlags = device->keys.valueAt(index).flags;
    513                 }
    514                 return OK;
    515             }
    516         }
    517         return NAME_NOT_FOUND;
    518     }
    519 
    520     virtual void addExcludedDevice(const char* deviceName) {
    521         mExcludedDevices.add(String8(deviceName));
    522     }
    523 
    524     virtual bool getEvent(RawEvent* outEvent) {
    525         if (mEvents.empty()) {
    526             return false;
    527         }
    528 
    529         *outEvent = *mEvents.begin();
    530         mEvents.erase(mEvents.begin());
    531         return true;
    532     }
    533 
    534     virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
    535         Device* device = getDevice(deviceId);
    536         if (device) {
    537             ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
    538             if (index >= 0) {
    539                 return device->scanCodeStates.valueAt(index);
    540             }
    541         }
    542         return AKEY_STATE_UNKNOWN;
    543     }
    544 
    545     virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
    546         Device* device = getDevice(deviceId);
    547         if (device) {
    548             ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
    549             if (index >= 0) {
    550                 return device->keyCodeStates.valueAt(index);
    551             }
    552         }
    553         return AKEY_STATE_UNKNOWN;
    554     }
    555 
    556     virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
    557         Device* device = getDevice(deviceId);
    558         if (device) {
    559             ssize_t index = device->switchStates.indexOfKey(sw);
    560             if (index >= 0) {
    561                 return device->switchStates.valueAt(index);
    562             }
    563         }
    564         return AKEY_STATE_UNKNOWN;
    565     }
    566 
    567     virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
    568             uint8_t* outFlags) const {
    569         bool result = false;
    570         Device* device = getDevice(deviceId);
    571         if (device) {
    572             for (size_t i = 0; i < numCodes; i++) {
    573                 for (size_t j = 0; j < device->keys.size(); j++) {
    574                     if (keyCodes[i] == device->keys.valueAt(j).keyCode) {
    575                         outFlags[i] = 1;
    576                         result = true;
    577                     }
    578                 }
    579             }
    580         }
    581         return result;
    582     }
    583 
    584     virtual void dump(String8& dump) {
    585     }
    586 };
    587 
    588 
    589 // --- FakeInputReaderContext ---
    590 
    591 class FakeInputReaderContext : public InputReaderContext {
    592     sp<EventHubInterface> mEventHub;
    593     sp<InputReaderPolicyInterface> mPolicy;
    594     sp<InputDispatcherInterface> mDispatcher;
    595     int32_t mGlobalMetaState;
    596     bool mUpdateGlobalMetaStateWasCalled;
    597 
    598 public:
    599     FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
    600             const sp<InputReaderPolicyInterface>& policy,
    601             const sp<InputDispatcherInterface>& dispatcher) :
    602             mEventHub(eventHub), mPolicy(policy), mDispatcher(dispatcher),
    603             mGlobalMetaState(0) {
    604     }
    605 
    606     virtual ~FakeInputReaderContext() { }
    607 
    608     void assertUpdateGlobalMetaStateWasCalled() {
    609         ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
    610                 << "Expected updateGlobalMetaState() to have been called.";
    611         mUpdateGlobalMetaStateWasCalled = false;
    612     }
    613 
    614     void setGlobalMetaState(int32_t state) {
    615         mGlobalMetaState = state;
    616     }
    617 
    618 private:
    619     virtual void updateGlobalMetaState() {
    620         mUpdateGlobalMetaStateWasCalled = true;
    621     }
    622 
    623     virtual int32_t getGlobalMetaState() {
    624         return mGlobalMetaState;
    625     }
    626 
    627     virtual EventHubInterface* getEventHub() {
    628         return mEventHub.get();
    629     }
    630 
    631     virtual InputReaderPolicyInterface* getPolicy() {
    632         return mPolicy.get();
    633     }
    634 
    635     virtual InputDispatcherInterface* getDispatcher() {
    636         return mDispatcher.get();
    637     }
    638 
    639     virtual void disableVirtualKeysUntil(nsecs_t time) {
    640     }
    641 
    642     virtual bool shouldDropVirtualKey(nsecs_t now,
    643             InputDevice* device, int32_t keyCode, int32_t scanCode) {
    644         return false;
    645     }
    646 };
    647 
    648 
    649 // --- FakeInputMapper ---
    650 
    651 class FakeInputMapper : public InputMapper {
    652     uint32_t mSources;
    653     int32_t mKeyboardType;
    654     int32_t mMetaState;
    655     KeyedVector<int32_t, int32_t> mKeyCodeStates;
    656     KeyedVector<int32_t, int32_t> mScanCodeStates;
    657     KeyedVector<int32_t, int32_t> mSwitchStates;
    658     Vector<int32_t> mSupportedKeyCodes;
    659     RawEvent mLastEvent;
    660 
    661     bool mConfigureWasCalled;
    662     bool mResetWasCalled;
    663     bool mProcessWasCalled;
    664 
    665 public:
    666     FakeInputMapper(InputDevice* device, uint32_t sources) :
    667             InputMapper(device),
    668             mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
    669             mMetaState(0),
    670             mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
    671     }
    672 
    673     virtual ~FakeInputMapper() { }
    674 
    675     void setKeyboardType(int32_t keyboardType) {
    676         mKeyboardType = keyboardType;
    677     }
    678 
    679     void setMetaState(int32_t metaState) {
    680         mMetaState = metaState;
    681     }
    682 
    683     void assertConfigureWasCalled() {
    684         ASSERT_TRUE(mConfigureWasCalled)
    685                 << "Expected configure() to have been called.";
    686         mConfigureWasCalled = false;
    687     }
    688 
    689     void assertResetWasCalled() {
    690         ASSERT_TRUE(mResetWasCalled)
    691                 << "Expected reset() to have been called.";
    692         mResetWasCalled = false;
    693     }
    694 
    695     void assertProcessWasCalled(RawEvent* outLastEvent = NULL) {
    696         ASSERT_TRUE(mProcessWasCalled)
    697                 << "Expected process() to have been called.";
    698         if (outLastEvent) {
    699             *outLastEvent = mLastEvent;
    700         }
    701         mProcessWasCalled = false;
    702     }
    703 
    704     void setKeyCodeState(int32_t keyCode, int32_t state) {
    705         mKeyCodeStates.replaceValueFor(keyCode, state);
    706     }
    707 
    708     void setScanCodeState(int32_t scanCode, int32_t state) {
    709         mScanCodeStates.replaceValueFor(scanCode, state);
    710     }
    711 
    712     void setSwitchState(int32_t switchCode, int32_t state) {
    713         mSwitchStates.replaceValueFor(switchCode, state);
    714     }
    715 
    716     void addSupportedKeyCode(int32_t keyCode) {
    717         mSupportedKeyCodes.add(keyCode);
    718     }
    719 
    720 private:
    721     virtual uint32_t getSources() {
    722         return mSources;
    723     }
    724 
    725     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
    726         InputMapper::populateDeviceInfo(deviceInfo);
    727 
    728         if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
    729             deviceInfo->setKeyboardType(mKeyboardType);
    730         }
    731     }
    732 
    733     virtual void configure() {
    734         mConfigureWasCalled = true;
    735     }
    736 
    737     virtual void reset() {
    738         mResetWasCalled = true;
    739     }
    740 
    741     virtual void process(const RawEvent* rawEvent) {
    742         mLastEvent = *rawEvent;
    743         mProcessWasCalled = true;
    744     }
    745 
    746     virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) {
    747         ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
    748         return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
    749     }
    750 
    751     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) {
    752         ssize_t index = mScanCodeStates.indexOfKey(scanCode);
    753         return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
    754     }
    755 
    756     virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode) {
    757         ssize_t index = mSwitchStates.indexOfKey(switchCode);
    758         return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
    759     }
    760 
    761     virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
    762             const int32_t* keyCodes, uint8_t* outFlags) {
    763         bool result = false;
    764         for (size_t i = 0; i < numCodes; i++) {
    765             for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
    766                 if (keyCodes[i] == mSupportedKeyCodes[j]) {
    767                     outFlags[i] = 1;
    768                     result = true;
    769                 }
    770             }
    771         }
    772         return result;
    773     }
    774 
    775     virtual int32_t getMetaState() {
    776         return mMetaState;
    777     }
    778 };
    779 
    780 
    781 // --- InstrumentedInputReader ---
    782 
    783 class InstrumentedInputReader : public InputReader {
    784     InputDevice* mNextDevice;
    785 
    786 public:
    787     InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
    788             const sp<InputReaderPolicyInterface>& policy,
    789             const sp<InputDispatcherInterface>& dispatcher) :
    790             InputReader(eventHub, policy, dispatcher) {
    791     }
    792 
    793     virtual ~InstrumentedInputReader() {
    794         if (mNextDevice) {
    795             delete mNextDevice;
    796         }
    797     }
    798 
    799     void setNextDevice(InputDevice* device) {
    800         mNextDevice = device;
    801     }
    802 
    803 protected:
    804     virtual InputDevice* createDevice(int32_t deviceId, const String8& name, uint32_t classes) {
    805         if (mNextDevice) {
    806             InputDevice* device = mNextDevice;
    807             mNextDevice = NULL;
    808             return device;
    809         }
    810         return InputReader::createDevice(deviceId, name, classes);
    811     }
    812 
    813     friend class InputReaderTest;
    814 };
    815 
    816 
    817 // --- InputReaderTest ---
    818 
    819 class InputReaderTest : public testing::Test {
    820 protected:
    821     sp<FakeInputDispatcher> mFakeDispatcher;
    822     sp<FakeInputReaderPolicy> mFakePolicy;
    823     sp<FakeEventHub> mFakeEventHub;
    824     sp<InstrumentedInputReader> mReader;
    825 
    826     virtual void SetUp() {
    827         mFakeEventHub = new FakeEventHub();
    828         mFakePolicy = new FakeInputReaderPolicy();
    829         mFakeDispatcher = new FakeInputDispatcher();
    830 
    831         mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeDispatcher);
    832     }
    833 
    834     virtual void TearDown() {
    835         mReader.clear();
    836 
    837         mFakeDispatcher.clear();
    838         mFakePolicy.clear();
    839         mFakeEventHub.clear();
    840     }
    841 
    842     void addDevice(int32_t deviceId, const String8& name, uint32_t classes) {
    843         mFakeEventHub->addDevice(deviceId, name, classes);
    844         mFakeEventHub->finishDeviceScan();
    845         mReader->loopOnce();
    846         mReader->loopOnce();
    847         mFakeEventHub->assertQueueIsEmpty();
    848     }
    849 
    850     FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId,
    851             const String8& name, uint32_t classes, uint32_t sources) {
    852         InputDevice* device = new InputDevice(mReader.get(), deviceId, name);
    853         FakeInputMapper* mapper = new FakeInputMapper(device, sources);
    854         device->addMapper(mapper);
    855         mReader->setNextDevice(device);
    856         addDevice(deviceId, name, classes);
    857         return mapper;
    858     }
    859 };
    860 
    861 TEST_F(InputReaderTest, GetInputConfiguration_WhenNoDevices_ReturnsDefaults) {
    862     InputConfiguration config;
    863     mReader->getInputConfiguration(&config);
    864 
    865     ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
    866     ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
    867     ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
    868 }
    869 
    870 TEST_F(InputReaderTest, GetInputConfiguration_WhenAlphabeticKeyboardPresent_ReturnsQwertyKeyboard) {
    871     ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("keyboard"),
    872             INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY));
    873 
    874     InputConfiguration config;
    875     mReader->getInputConfiguration(&config);
    876 
    877     ASSERT_EQ(InputConfiguration::KEYBOARD_QWERTY, config.keyboard);
    878     ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
    879     ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
    880 }
    881 
    882 TEST_F(InputReaderTest, GetInputConfiguration_WhenTouchScreenPresent_ReturnsFingerTouchScreen) {
    883     ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("touchscreen"),
    884             INPUT_DEVICE_CLASS_TOUCHSCREEN));
    885 
    886     InputConfiguration config;
    887     mReader->getInputConfiguration(&config);
    888 
    889     ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
    890     ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
    891     ASSERT_EQ(InputConfiguration::TOUCHSCREEN_FINGER, config.touchScreen);
    892 }
    893 
    894 TEST_F(InputReaderTest, GetInputConfiguration_WhenTrackballPresent_ReturnsTrackballNavigation) {
    895     ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("trackball"),
    896             INPUT_DEVICE_CLASS_TRACKBALL));
    897 
    898     InputConfiguration config;
    899     mReader->getInputConfiguration(&config);
    900 
    901     ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
    902     ASSERT_EQ(InputConfiguration::NAVIGATION_TRACKBALL, config.navigation);
    903     ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
    904 }
    905 
    906 TEST_F(InputReaderTest, GetInputConfiguration_WhenDPadPresent_ReturnsDPadNavigation) {
    907     ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("dpad"),
    908             INPUT_DEVICE_CLASS_DPAD));
    909 
    910     InputConfiguration config;
    911     mReader->getInputConfiguration(&config);
    912 
    913     ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
    914     ASSERT_EQ(InputConfiguration::NAVIGATION_DPAD, config.navigation);
    915     ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
    916 }
    917 
    918 TEST_F(InputReaderTest, GetInputDeviceInfo_WhenDeviceIdIsValid) {
    919     ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"),
    920             INPUT_DEVICE_CLASS_KEYBOARD));
    921 
    922     InputDeviceInfo info;
    923     status_t result = mReader->getInputDeviceInfo(1, &info);
    924 
    925     ASSERT_EQ(OK, result);
    926     ASSERT_EQ(1, info.getId());
    927     ASSERT_STREQ("keyboard", info.getName().string());
    928     ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, info.getKeyboardType());
    929     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, info.getSources());
    930     ASSERT_EQ(size_t(0), info.getMotionRanges().size());
    931 }
    932 
    933 TEST_F(InputReaderTest, GetInputDeviceInfo_WhenDeviceIdIsInvalid) {
    934     InputDeviceInfo info;
    935     status_t result = mReader->getInputDeviceInfo(-1, &info);
    936 
    937     ASSERT_EQ(NAME_NOT_FOUND, result);
    938 }
    939 
    940 TEST_F(InputReaderTest, GetInputDeviceInfo_WhenDeviceIdIsIgnored) {
    941     addDevice(1, String8("ignored"), 0); // no classes so device will be ignored
    942 
    943     InputDeviceInfo info;
    944     status_t result = mReader->getInputDeviceInfo(1, &info);
    945 
    946     ASSERT_EQ(NAME_NOT_FOUND, result);
    947 }
    948 
    949 TEST_F(InputReaderTest, GetInputDeviceIds) {
    950     ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"),
    951             INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY));
    952     ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("trackball"),
    953             INPUT_DEVICE_CLASS_TRACKBALL));
    954 
    955     Vector<int32_t> ids;
    956     mReader->getInputDeviceIds(ids);
    957 
    958     ASSERT_EQ(size_t(2), ids.size());
    959     ASSERT_EQ(1, ids[0]);
    960     ASSERT_EQ(2, ids[1]);
    961 }
    962 
    963 TEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
    964     FakeInputMapper* mapper = NULL;
    965     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
    966             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
    967     mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
    968 
    969     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
    970             AINPUT_SOURCE_ANY, AKEYCODE_A))
    971             << "Should return unknown when the device id is >= 0 but unknown.";
    972 
    973     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
    974             AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
    975             << "Should return unknown when the device id is valid but the sources are not supported by the device.";
    976 
    977     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
    978             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
    979             << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
    980 
    981     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
    982             AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
    983             << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
    984 
    985     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
    986             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
    987             << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
    988 }
    989 
    990 TEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
    991     FakeInputMapper* mapper = NULL;
    992     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
    993             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
    994     mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
    995 
    996     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
    997             AINPUT_SOURCE_ANY, KEY_A))
    998             << "Should return unknown when the device id is >= 0 but unknown.";
    999 
   1000     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
   1001             AINPUT_SOURCE_TRACKBALL, KEY_A))
   1002             << "Should return unknown when the device id is valid but the sources are not supported by the device.";
   1003 
   1004     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
   1005             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
   1006             << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
   1007 
   1008     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
   1009             AINPUT_SOURCE_TRACKBALL, KEY_A))
   1010             << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
   1011 
   1012     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
   1013             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
   1014             << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
   1015 }
   1016 
   1017 TEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
   1018     FakeInputMapper* mapper = NULL;
   1019     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
   1020             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
   1021     mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
   1022 
   1023     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
   1024             AINPUT_SOURCE_ANY, SW_LID))
   1025             << "Should return unknown when the device id is >= 0 but unknown.";
   1026 
   1027     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
   1028             AINPUT_SOURCE_TRACKBALL, SW_LID))
   1029             << "Should return unknown when the device id is valid but the sources are not supported by the device.";
   1030 
   1031     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
   1032             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
   1033             << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
   1034 
   1035     ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
   1036             AINPUT_SOURCE_TRACKBALL, SW_LID))
   1037             << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
   1038 
   1039     ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
   1040             AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
   1041             << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
   1042 }
   1043 
   1044 TEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
   1045     FakeInputMapper* mapper = NULL;
   1046     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
   1047             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
   1048     mapper->addSupportedKeyCode(AKEYCODE_A);
   1049     mapper->addSupportedKeyCode(AKEYCODE_B);
   1050 
   1051     const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
   1052     uint8_t flags[4] = { 0, 0, 0, 1 };
   1053 
   1054     ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
   1055             << "Should return false when device id is >= 0 but unknown.";
   1056     ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
   1057 
   1058     flags[3] = 1;
   1059     ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
   1060             << "Should return false when device id is valid but the sources are not supported by the device.";
   1061     ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
   1062 
   1063     flags[3] = 1;
   1064     ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
   1065             << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
   1066     ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
   1067 
   1068     flags[3] = 1;
   1069     ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
   1070             << "Should return false when the device id is < 0 but the sources are not supported by any device.";
   1071     ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
   1072 
   1073     flags[3] = 1;
   1074     ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
   1075             << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
   1076     ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
   1077 }
   1078 
   1079 TEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
   1080     addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD);
   1081 
   1082     FakeInputDispatcher::NotifyConfigurationChangedArgs args;
   1083     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyConfigurationChangedWasCalled(&args));
   1084     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
   1085 }
   1086 
   1087 TEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
   1088     FakeInputMapper* mapper = NULL;
   1089     ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
   1090             INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD));
   1091 
   1092     mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, AKEYCODE_A, 1, POLICY_FLAG_WAKE);
   1093     mReader->loopOnce();
   1094     ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
   1095 
   1096     RawEvent event;
   1097     ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
   1098     ASSERT_EQ(0, event.when);
   1099     ASSERT_EQ(1, event.deviceId);
   1100     ASSERT_EQ(EV_KEY, event.type);
   1101     ASSERT_EQ(KEY_A, event.scanCode);
   1102     ASSERT_EQ(AKEYCODE_A, event.keyCode);
   1103     ASSERT_EQ(1, event.value);
   1104     ASSERT_EQ(POLICY_FLAG_WAKE, event.flags);
   1105 }
   1106 
   1107 
   1108 // --- InputDeviceTest ---
   1109 
   1110 class InputDeviceTest : public testing::Test {
   1111 protected:
   1112     static const char* DEVICE_NAME;
   1113     static const int32_t DEVICE_ID;
   1114 
   1115     sp<FakeEventHub> mFakeEventHub;
   1116     sp<FakeInputReaderPolicy> mFakePolicy;
   1117     sp<FakeInputDispatcher> mFakeDispatcher;
   1118     FakeInputReaderContext* mFakeContext;
   1119 
   1120     InputDevice* mDevice;
   1121 
   1122     virtual void SetUp() {
   1123         mFakeEventHub = new FakeEventHub();
   1124         mFakePolicy = new FakeInputReaderPolicy();
   1125         mFakeDispatcher = new FakeInputDispatcher();
   1126         mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeDispatcher);
   1127 
   1128         mDevice = new InputDevice(mFakeContext, DEVICE_ID, String8(DEVICE_NAME));
   1129     }
   1130 
   1131     virtual void TearDown() {
   1132         delete mDevice;
   1133 
   1134         delete mFakeContext;
   1135         mFakeDispatcher.clear();
   1136         mFakePolicy.clear();
   1137         mFakeEventHub.clear();
   1138     }
   1139 };
   1140 
   1141 const char* InputDeviceTest::DEVICE_NAME = "device";
   1142 const int32_t InputDeviceTest::DEVICE_ID = 1;
   1143 
   1144 TEST_F(InputDeviceTest, ImmutableProperties) {
   1145     ASSERT_EQ(DEVICE_ID, mDevice->getId());
   1146     ASSERT_STREQ(DEVICE_NAME, mDevice->getName());
   1147 }
   1148 
   1149 TEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
   1150     // Configuration.
   1151     mDevice->configure();
   1152 
   1153     // Metadata.
   1154     ASSERT_TRUE(mDevice->isIgnored());
   1155     ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
   1156 
   1157     InputDeviceInfo info;
   1158     mDevice->getDeviceInfo(&info);
   1159     ASSERT_EQ(DEVICE_ID, info.getId());
   1160     ASSERT_STREQ(DEVICE_NAME, info.getName().string());
   1161     ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
   1162     ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
   1163 
   1164     // State queries.
   1165     ASSERT_EQ(0, mDevice->getMetaState());
   1166 
   1167     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
   1168             << "Ignored device should return unknown key code state.";
   1169     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
   1170             << "Ignored device should return unknown scan code state.";
   1171     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
   1172             << "Ignored device should return unknown switch state.";
   1173 
   1174     const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
   1175     uint8_t flags[2] = { 0, 1 };
   1176     ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
   1177             << "Ignored device should never mark any key codes.";
   1178     ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
   1179     ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
   1180 
   1181     // Reset.
   1182     mDevice->reset();
   1183 }
   1184 
   1185 TEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
   1186     // Configuration.
   1187     InputDeviceCalibration calibration;
   1188     calibration.addProperty(String8("key"), String8("value"));
   1189     mFakePolicy->addInputDeviceCalibration(String8(DEVICE_NAME), calibration);
   1190 
   1191     FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
   1192     mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1193     mapper1->setMetaState(AMETA_ALT_ON);
   1194     mapper1->addSupportedKeyCode(AKEYCODE_A);
   1195     mapper1->addSupportedKeyCode(AKEYCODE_B);
   1196     mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
   1197     mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
   1198     mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
   1199     mapper1->setScanCodeState(3, AKEY_STATE_UP);
   1200     mapper1->setSwitchState(4, AKEY_STATE_DOWN);
   1201     mDevice->addMapper(mapper1);
   1202 
   1203     FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
   1204     mapper2->setMetaState(AMETA_SHIFT_ON);
   1205     mDevice->addMapper(mapper2);
   1206 
   1207     mDevice->configure();
   1208 
   1209     String8 propertyValue;
   1210     ASSERT_TRUE(mDevice->getCalibration().tryGetProperty(String8("key"), propertyValue))
   1211             << "Device should have read calibration during configuration phase.";
   1212     ASSERT_STREQ("value", propertyValue.string());
   1213 
   1214     ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
   1215     ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
   1216 
   1217     // Metadata.
   1218     ASSERT_FALSE(mDevice->isIgnored());
   1219     ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
   1220 
   1221     InputDeviceInfo info;
   1222     mDevice->getDeviceInfo(&info);
   1223     ASSERT_EQ(DEVICE_ID, info.getId());
   1224     ASSERT_STREQ(DEVICE_NAME, info.getName().string());
   1225     ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
   1226     ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
   1227 
   1228     // State queries.
   1229     ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
   1230             << "Should query mappers and combine meta states.";
   1231 
   1232     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
   1233             << "Should return unknown key code state when source not supported.";
   1234     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
   1235             << "Should return unknown scan code state when source not supported.";
   1236     ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
   1237             << "Should return unknown switch state when source not supported.";
   1238 
   1239     ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
   1240             << "Should query mapper when source is supported.";
   1241     ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
   1242             << "Should query mapper when source is supported.";
   1243     ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
   1244             << "Should query mapper when source is supported.";
   1245 
   1246     const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
   1247     uint8_t flags[4] = { 0, 0, 0, 1 };
   1248     ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
   1249             << "Should do nothing when source is unsupported.";
   1250     ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
   1251     ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
   1252     ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
   1253     ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
   1254 
   1255     ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
   1256             << "Should query mapper when source is supported.";
   1257     ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
   1258     ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
   1259     ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
   1260     ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
   1261 
   1262     // Event handling.
   1263     RawEvent event;
   1264     mDevice->process(&event);
   1265 
   1266     ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
   1267     ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
   1268 
   1269     // Reset.
   1270     mDevice->reset();
   1271 
   1272     ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
   1273     ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
   1274 }
   1275 
   1276 
   1277 // --- InputMapperTest ---
   1278 
   1279 class InputMapperTest : public testing::Test {
   1280 protected:
   1281     static const char* DEVICE_NAME;
   1282     static const int32_t DEVICE_ID;
   1283 
   1284     sp<FakeEventHub> mFakeEventHub;
   1285     sp<FakeInputReaderPolicy> mFakePolicy;
   1286     sp<FakeInputDispatcher> mFakeDispatcher;
   1287     FakeInputReaderContext* mFakeContext;
   1288     InputDevice* mDevice;
   1289 
   1290     virtual void SetUp() {
   1291         mFakeEventHub = new FakeEventHub();
   1292         mFakePolicy = new FakeInputReaderPolicy();
   1293         mFakeDispatcher = new FakeInputDispatcher();
   1294         mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeDispatcher);
   1295         mDevice = new InputDevice(mFakeContext, DEVICE_ID, String8(DEVICE_NAME));
   1296 
   1297         mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
   1298     }
   1299 
   1300     virtual void TearDown() {
   1301         delete mDevice;
   1302         delete mFakeContext;
   1303         mFakeDispatcher.clear();
   1304         mFakePolicy.clear();
   1305         mFakeEventHub.clear();
   1306     }
   1307 
   1308     void prepareCalibration(const char* key, const char* value) {
   1309         mFakePolicy->addInputDeviceCalibrationProperty(String8(DEVICE_NAME),
   1310                 String8(key), String8(value));
   1311     }
   1312 
   1313     void addMapperAndConfigure(InputMapper* mapper) {
   1314         mDevice->addMapper(mapper);
   1315         mDevice->configure();
   1316     }
   1317 
   1318     static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type,
   1319             int32_t scanCode, int32_t keyCode, int32_t value, uint32_t flags) {
   1320         RawEvent event;
   1321         event.when = when;
   1322         event.deviceId = deviceId;
   1323         event.type = type;
   1324         event.scanCode = scanCode;
   1325         event.keyCode = keyCode;
   1326         event.value = value;
   1327         event.flags = flags;
   1328         mapper->process(&event);
   1329     }
   1330 
   1331     static void assertMotionRange(const InputDeviceInfo& info,
   1332             int32_t rangeType, float min, float max, float flat, float fuzz) {
   1333         const InputDeviceInfo::MotionRange* range = info.getMotionRange(rangeType);
   1334         ASSERT_TRUE(range != NULL) << "Range: " << rangeType;
   1335         ASSERT_NEAR(min, range->min, EPSILON) << "Range: " << rangeType;
   1336         ASSERT_NEAR(max, range->max, EPSILON) << "Range: " << rangeType;
   1337         ASSERT_NEAR(flat, range->flat, EPSILON) << "Range: " << rangeType;
   1338         ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Range: " << rangeType;
   1339     }
   1340 
   1341     static void assertPointerCoords(const PointerCoords& coords,
   1342             float x, float y, float pressure, float size,
   1343             float touchMajor, float touchMinor, float toolMajor, float toolMinor,
   1344             float orientation) {
   1345         ASSERT_NEAR(x, coords.x, 1);
   1346         ASSERT_NEAR(y, coords.y, 1);
   1347         ASSERT_NEAR(pressure, coords.pressure, EPSILON);
   1348         ASSERT_NEAR(size, coords.size, EPSILON);
   1349         ASSERT_NEAR(touchMajor, coords.touchMajor, 1);
   1350         ASSERT_NEAR(touchMinor, coords.touchMinor, 1);
   1351         ASSERT_NEAR(toolMajor, coords.toolMajor, 1);
   1352         ASSERT_NEAR(toolMinor, coords.toolMinor, 1);
   1353         ASSERT_NEAR(orientation, coords.orientation, EPSILON);
   1354     }
   1355 };
   1356 
   1357 const char* InputMapperTest::DEVICE_NAME = "device";
   1358 const int32_t InputMapperTest::DEVICE_ID = 1;
   1359 
   1360 
   1361 // --- SwitchInputMapperTest ---
   1362 
   1363 class SwitchInputMapperTest : public InputMapperTest {
   1364 protected:
   1365 };
   1366 
   1367 TEST_F(SwitchInputMapperTest, GetSources) {
   1368     SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
   1369     addMapperAndConfigure(mapper);
   1370 
   1371     ASSERT_EQ(uint32_t(0), mapper->getSources());
   1372 }
   1373 
   1374 TEST_F(SwitchInputMapperTest, GetSwitchState) {
   1375     SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
   1376     addMapperAndConfigure(mapper);
   1377 
   1378     mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
   1379     ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
   1380 
   1381     mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
   1382     ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
   1383 }
   1384 
   1385 TEST_F(SwitchInputMapperTest, Process) {
   1386     SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
   1387     addMapperAndConfigure(mapper);
   1388 
   1389     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 0, 1, 0);
   1390 
   1391     FakeInputDispatcher::NotifySwitchArgs args;
   1392     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifySwitchWasCalled(&args));
   1393     ASSERT_EQ(ARBITRARY_TIME, args.when);
   1394     ASSERT_EQ(SW_LID, args.switchCode);
   1395     ASSERT_EQ(1, args.switchValue);
   1396     ASSERT_EQ(uint32_t(0), args.policyFlags);
   1397 }
   1398 
   1399 
   1400 // --- KeyboardInputMapperTest ---
   1401 
   1402 class KeyboardInputMapperTest : public InputMapperTest {
   1403 protected:
   1404     void testDPadKeyRotation(KeyboardInputMapper* mapper,
   1405             int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
   1406 };
   1407 
   1408 void KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
   1409         int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) {
   1410     FakeInputDispatcher::NotifyKeyArgs args;
   1411 
   1412     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, originalKeyCode, 1, 0);
   1413     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1414     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
   1415     ASSERT_EQ(originalScanCode, args.scanCode);
   1416     ASSERT_EQ(rotatedKeyCode, args.keyCode);
   1417 
   1418     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, originalKeyCode, 0, 0);
   1419     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1420     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
   1421     ASSERT_EQ(originalScanCode, args.scanCode);
   1422     ASSERT_EQ(rotatedKeyCode, args.keyCode);
   1423 }
   1424 
   1425 
   1426 TEST_F(KeyboardInputMapperTest, GetSources) {
   1427     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1428             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1429     addMapperAndConfigure(mapper);
   1430 
   1431     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
   1432 }
   1433 
   1434 TEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
   1435     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1436             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1437     addMapperAndConfigure(mapper);
   1438 
   1439     // Key down.
   1440     process(mapper, ARBITRARY_TIME, DEVICE_ID,
   1441             EV_KEY, KEY_HOME, AKEYCODE_HOME, 1, POLICY_FLAG_WAKE);
   1442     FakeInputDispatcher::NotifyKeyArgs args;
   1443     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1444     ASSERT_EQ(DEVICE_ID, args.deviceId);
   1445     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
   1446     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
   1447     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
   1448     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
   1449     ASSERT_EQ(KEY_HOME, args.scanCode);
   1450     ASSERT_EQ(AMETA_NONE, args.metaState);
   1451     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
   1452     ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
   1453     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
   1454 
   1455     // Key up.
   1456     process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
   1457             EV_KEY, KEY_HOME, AKEYCODE_HOME, 0, POLICY_FLAG_WAKE);
   1458     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1459     ASSERT_EQ(DEVICE_ID, args.deviceId);
   1460     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
   1461     ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
   1462     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
   1463     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
   1464     ASSERT_EQ(KEY_HOME, args.scanCode);
   1465     ASSERT_EQ(AMETA_NONE, args.metaState);
   1466     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
   1467     ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
   1468     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
   1469 }
   1470 
   1471 TEST_F(KeyboardInputMapperTest, Reset_WhenKeysAreNotDown_DoesNotSynthesizeKeyUp) {
   1472     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1473             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1474     addMapperAndConfigure(mapper);
   1475 
   1476     // Key down.
   1477     process(mapper, ARBITRARY_TIME, DEVICE_ID,
   1478             EV_KEY, KEY_HOME, AKEYCODE_HOME, 1, POLICY_FLAG_WAKE);
   1479     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   1480 
   1481     // Key up.
   1482     process(mapper, ARBITRARY_TIME, DEVICE_ID,
   1483             EV_KEY, KEY_HOME, AKEYCODE_HOME, 0, POLICY_FLAG_WAKE);
   1484     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   1485 
   1486     // Reset.  Since no keys still down, should not synthesize any key ups.
   1487     mapper->reset();
   1488     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   1489 }
   1490 
   1491 TEST_F(KeyboardInputMapperTest, Reset_WhenKeysAreDown_SynthesizesKeyUps) {
   1492     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1493             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1494     addMapperAndConfigure(mapper);
   1495 
   1496     // Metakey down.
   1497     process(mapper, ARBITRARY_TIME, DEVICE_ID,
   1498             EV_KEY, KEY_LEFTSHIFT, AKEYCODE_SHIFT_LEFT, 1, 0);
   1499     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   1500 
   1501     // Key down.
   1502     process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
   1503             EV_KEY, KEY_A, AKEYCODE_A, 1, 0);
   1504     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   1505 
   1506     // Reset.  Since two keys are still down, should synthesize two key ups in reverse order.
   1507     mapper->reset();
   1508 
   1509     FakeInputDispatcher::NotifyKeyArgs args;
   1510     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1511     ASSERT_EQ(DEVICE_ID, args.deviceId);
   1512     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
   1513     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
   1514     ASSERT_EQ(AKEYCODE_A, args.keyCode);
   1515     ASSERT_EQ(KEY_A, args.scanCode);
   1516     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   1517     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
   1518     ASSERT_EQ(uint32_t(0), args.policyFlags);
   1519     ASSERT_EQ(ARBITRARY_TIME + 1, args.downTime);
   1520 
   1521     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1522     ASSERT_EQ(DEVICE_ID, args.deviceId);
   1523     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
   1524     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
   1525     ASSERT_EQ(AKEYCODE_SHIFT_LEFT, args.keyCode);
   1526     ASSERT_EQ(KEY_LEFTSHIFT, args.scanCode);
   1527     ASSERT_EQ(AMETA_NONE, args.metaState);
   1528     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
   1529     ASSERT_EQ(uint32_t(0), args.policyFlags);
   1530     ASSERT_EQ(ARBITRARY_TIME + 1, args.downTime);
   1531 
   1532     // And that's it.
   1533     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   1534 }
   1535 
   1536 TEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
   1537     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1538             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1539     addMapperAndConfigure(mapper);
   1540 
   1541     // Initial metastate.
   1542     ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
   1543 
   1544     // Metakey down.
   1545     process(mapper, ARBITRARY_TIME, DEVICE_ID,
   1546             EV_KEY, KEY_LEFTSHIFT, AKEYCODE_SHIFT_LEFT, 1, 0);
   1547     FakeInputDispatcher::NotifyKeyArgs args;
   1548     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1549     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   1550     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
   1551     ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
   1552 
   1553     // Key down.
   1554     process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
   1555             EV_KEY, KEY_A, AKEYCODE_A, 1, 0);
   1556     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1557     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   1558     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
   1559 
   1560     // Key up.
   1561     process(mapper, ARBITRARY_TIME + 2, DEVICE_ID,
   1562             EV_KEY, KEY_A, AKEYCODE_A, 0, 0);
   1563     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1564     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   1565     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
   1566 
   1567     // Metakey up.
   1568     process(mapper, ARBITRARY_TIME + 3, DEVICE_ID,
   1569             EV_KEY, KEY_LEFTSHIFT, AKEYCODE_SHIFT_LEFT, 0, 0);
   1570     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1571     ASSERT_EQ(AMETA_NONE, args.metaState);
   1572     ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
   1573     ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
   1574 }
   1575 
   1576 TEST_F(KeyboardInputMapperTest, Process_WhenNotAttachedToDisplay_ShouldNotRotateDPad) {
   1577     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1578             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1579     addMapperAndConfigure(mapper);
   1580 
   1581     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1582             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
   1583     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1584             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
   1585     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1586             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
   1587     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1588             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
   1589 }
   1590 
   1591 TEST_F(KeyboardInputMapperTest, Process_WhenAttachedToDisplay_ShouldRotateDPad) {
   1592     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, DISPLAY_ID,
   1593             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1594     addMapperAndConfigure(mapper);
   1595 
   1596     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1597             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1598             InputReaderPolicyInterface::ROTATION_0);
   1599     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1600             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
   1601     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1602             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
   1603     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1604             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
   1605     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1606             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
   1607 
   1608     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1609             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1610             InputReaderPolicyInterface::ROTATION_90);
   1611     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1612             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
   1613     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1614             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
   1615     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1616             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
   1617     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1618             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
   1619 
   1620     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1621             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1622             InputReaderPolicyInterface::ROTATION_180);
   1623     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1624             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
   1625     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1626             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
   1627     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1628             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
   1629     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1630             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
   1631 
   1632     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1633             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1634             InputReaderPolicyInterface::ROTATION_270);
   1635     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1636             KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
   1637     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1638             KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
   1639     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1640             KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
   1641     ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
   1642             KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
   1643 
   1644     // Special case: if orientation changes while key is down, we still emit the same keycode
   1645     // in the key up as we did in the key down.
   1646     FakeInputDispatcher::NotifyKeyArgs args;
   1647 
   1648     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1649             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1650             InputReaderPolicyInterface::ROTATION_270);
   1651     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, AKEYCODE_DPAD_UP, 1, 0);
   1652     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1653     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
   1654     ASSERT_EQ(KEY_UP, args.scanCode);
   1655     ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
   1656 
   1657     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1658             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1659             InputReaderPolicyInterface::ROTATION_180);
   1660     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, AKEYCODE_DPAD_UP, 0, 0);
   1661     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   1662     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
   1663     ASSERT_EQ(KEY_UP, args.scanCode);
   1664     ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
   1665 }
   1666 
   1667 TEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
   1668     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1669             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1670     addMapperAndConfigure(mapper);
   1671 
   1672     mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
   1673     ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
   1674 
   1675     mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
   1676     ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
   1677 }
   1678 
   1679 TEST_F(KeyboardInputMapperTest, GetScanCodeState) {
   1680     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1681             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1682     addMapperAndConfigure(mapper);
   1683 
   1684     mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
   1685     ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
   1686 
   1687     mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
   1688     ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
   1689 }
   1690 
   1691 TEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
   1692     KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, -1,
   1693             AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
   1694     addMapperAndConfigure(mapper);
   1695 
   1696     mFakeEventHub->addKey(DEVICE_ID, KEY_A, AKEYCODE_A, 0);
   1697 
   1698     const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
   1699     uint8_t flags[2] = { 0, 0 };
   1700     ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
   1701     ASSERT_TRUE(flags[0]);
   1702     ASSERT_FALSE(flags[1]);
   1703 }
   1704 
   1705 
   1706 // --- TrackballInputMapperTest ---
   1707 
   1708 class TrackballInputMapperTest : public InputMapperTest {
   1709 protected:
   1710     static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
   1711 
   1712     void testMotionRotation(TrackballInputMapper* mapper,
   1713             int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
   1714 };
   1715 
   1716 const int32_t TrackballInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
   1717 
   1718 void TrackballInputMapperTest::testMotionRotation(TrackballInputMapper* mapper,
   1719         int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
   1720     FakeInputDispatcher::NotifyMotionArgs args;
   1721 
   1722     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 0, originalX, 0);
   1723     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 0, originalY, 0);
   1724     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0, 0, 0);
   1725     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1726     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
   1727     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1728             float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
   1729             float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
   1730             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1731 }
   1732 
   1733 TEST_F(TrackballInputMapperTest, GetSources) {
   1734     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1735     addMapperAndConfigure(mapper);
   1736 
   1737     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
   1738 }
   1739 
   1740 TEST_F(TrackballInputMapperTest, PopulateDeviceInfo) {
   1741     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1742     addMapperAndConfigure(mapper);
   1743 
   1744     InputDeviceInfo info;
   1745     mapper->populateDeviceInfo(&info);
   1746 
   1747     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, AINPUT_MOTION_RANGE_X,
   1748             -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
   1749     ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, AINPUT_MOTION_RANGE_Y,
   1750             -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
   1751 }
   1752 
   1753 TEST_F(TrackballInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
   1754     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1755     addMapperAndConfigure(mapper);
   1756 
   1757     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
   1758 
   1759     FakeInputDispatcher::NotifyMotionArgs args;
   1760 
   1761     // Button press.
   1762     // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
   1763     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 1, 0);
   1764     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1765     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
   1766     ASSERT_EQ(DEVICE_ID, args.deviceId);
   1767     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
   1768     ASSERT_EQ(uint32_t(0), args.policyFlags);
   1769     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
   1770     ASSERT_EQ(0, args.flags);
   1771     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   1772     ASSERT_EQ(0, args.edgeFlags);
   1773     ASSERT_EQ(uint32_t(1), args.pointerCount);
   1774     ASSERT_EQ(0, args.pointerIds[0]);
   1775     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1776             0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1777     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
   1778     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
   1779     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
   1780 
   1781     // Button release.  Should have same down time.
   1782     process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 0, 0);
   1783     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1784     ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
   1785     ASSERT_EQ(DEVICE_ID, args.deviceId);
   1786     ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
   1787     ASSERT_EQ(uint32_t(0), args.policyFlags);
   1788     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
   1789     ASSERT_EQ(0, args.flags);
   1790     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   1791     ASSERT_EQ(0, args.edgeFlags);
   1792     ASSERT_EQ(uint32_t(1), args.pointerCount);
   1793     ASSERT_EQ(0, args.pointerIds[0]);
   1794     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1795             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1796     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
   1797     ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
   1798     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
   1799 }
   1800 
   1801 TEST_F(TrackballInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
   1802     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1803     addMapperAndConfigure(mapper);
   1804 
   1805     FakeInputDispatcher::NotifyMotionArgs args;
   1806 
   1807     // Motion in X but not Y.
   1808     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 0, 1, 0);
   1809     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0, 0, 0);
   1810     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1811     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
   1812     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1813             1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1814 
   1815     // Motion in Y but not X.
   1816     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 0, -2, 0);
   1817     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0, 0, 0);
   1818     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1819     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
   1820     ASSERT_NEAR(0.0f, args.pointerCoords[0].x, EPSILON);
   1821     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1822             0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1823 }
   1824 
   1825 TEST_F(TrackballInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
   1826     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1827     addMapperAndConfigure(mapper);
   1828 
   1829     FakeInputDispatcher::NotifyMotionArgs args;
   1830 
   1831     // Button press without following sync.
   1832     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 1, 0);
   1833     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1834     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
   1835     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1836             0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1837 
   1838     // Button release without following sync.
   1839     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 0, 0);
   1840     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1841     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
   1842     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1843             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1844 }
   1845 
   1846 TEST_F(TrackballInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
   1847     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1848     addMapperAndConfigure(mapper);
   1849 
   1850     FakeInputDispatcher::NotifyMotionArgs args;
   1851 
   1852     // Combined X, Y and Button.
   1853     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 0, 1, 0);
   1854     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 0, -2, 0);
   1855     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 1, 0);
   1856     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0, 0, 0);
   1857     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1858     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
   1859     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1860             1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
   1861             1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1862 
   1863     // Move X, Y a bit while pressed.
   1864     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 0, 2, 0);
   1865     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 0, 1, 0);
   1866     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0, 0, 0);
   1867     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1868     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
   1869     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1870             2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
   1871             1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1872 
   1873     // Release Button.
   1874     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 0, 0);
   1875     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1876     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
   1877     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1878             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1879 }
   1880 
   1881 TEST_F(TrackballInputMapperTest, Reset_WhenButtonIsNotDown_ShouldNotSynthesizeButtonUp) {
   1882     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1883     addMapperAndConfigure(mapper);
   1884 
   1885     FakeInputDispatcher::NotifyMotionArgs args;
   1886 
   1887     // Button press.
   1888     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 1, 0);
   1889     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1890 
   1891     // Button release.
   1892     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 0, 0);
   1893     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1894 
   1895     // Reset.  Should not synthesize button up since button is not pressed.
   1896     mapper->reset();
   1897 
   1898     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
   1899 }
   1900 
   1901 TEST_F(TrackballInputMapperTest, Reset_WhenButtonIsDown_ShouldSynthesizeButtonUp) {
   1902     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1903     addMapperAndConfigure(mapper);
   1904 
   1905     FakeInputDispatcher::NotifyMotionArgs args;
   1906 
   1907     // Button press.
   1908     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0, 1, 0);
   1909     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1910 
   1911     // Reset.  Should synthesize button up.
   1912     mapper->reset();
   1913 
   1914     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   1915     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
   1916     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   1917             0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
   1918 }
   1919 
   1920 TEST_F(TrackballInputMapperTest, Process_WhenNotAttachedToDisplay_ShouldNotRotateMotions) {
   1921     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, -1);
   1922     addMapperAndConfigure(mapper);
   1923 
   1924     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0,  1));
   1925     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1,  1));
   1926     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  1,  0));
   1927     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1, -1));
   1928     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0, -1));
   1929     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
   1930     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0, -1,  0));
   1931     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1,  1));
   1932 }
   1933 
   1934 TEST_F(TrackballInputMapperTest, Process_WhenAttachedToDisplay_ShouldRotateMotions) {
   1935     TrackballInputMapper* mapper = new TrackballInputMapper(mDevice, DISPLAY_ID);
   1936     addMapperAndConfigure(mapper);
   1937 
   1938     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1939             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1940             InputReaderPolicyInterface::ROTATION_0);
   1941     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0,  1));
   1942     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1,  1));
   1943     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  1,  0));
   1944     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1, -1));
   1945     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0, -1));
   1946     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
   1947     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0, -1,  0));
   1948     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1,  1));
   1949 
   1950     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1951             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1952             InputReaderPolicyInterface::ROTATION_90);
   1953     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  1,  0));
   1954     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1, -1));
   1955     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  0, -1));
   1956     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1, -1, -1));
   1957     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1, -1,  0));
   1958     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1,  1));
   1959     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  0,  1));
   1960     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1,  1,  1));
   1961 
   1962     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1963             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1964             InputReaderPolicyInterface::ROTATION_180);
   1965     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0, -1));
   1966     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1, -1, -1));
   1967     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0, -1,  0));
   1968     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1, -1,  1));
   1969     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0,  1));
   1970     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1,  1,  1));
   1971     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  1,  0));
   1972     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1,  1, -1));
   1973 
   1974     mFakePolicy->setDisplayInfo(DISPLAY_ID,
   1975             DISPLAY_WIDTH, DISPLAY_HEIGHT,
   1976             InputReaderPolicyInterface::ROTATION_270);
   1977     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1, -1,  0));
   1978     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1, -1,  1));
   1979     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  0,  1));
   1980     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1,  1));
   1981     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  1,  0));
   1982     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1,  1, -1));
   1983     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  0, -1));
   1984     ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1, -1));
   1985 }
   1986 
   1987 
   1988 // --- TouchInputMapperTest ---
   1989 
   1990 class TouchInputMapperTest : public InputMapperTest {
   1991 protected:
   1992     static const int32_t RAW_X_MIN;
   1993     static const int32_t RAW_X_MAX;
   1994     static const int32_t RAW_Y_MIN;
   1995     static const int32_t RAW_Y_MAX;
   1996     static const int32_t RAW_TOUCH_MIN;
   1997     static const int32_t RAW_TOUCH_MAX;
   1998     static const int32_t RAW_TOOL_MIN;
   1999     static const int32_t RAW_TOOL_MAX;
   2000     static const int32_t RAW_PRESSURE_MIN;
   2001     static const int32_t RAW_PRESSURE_MAX;
   2002     static const int32_t RAW_ORIENTATION_MIN;
   2003     static const int32_t RAW_ORIENTATION_MAX;
   2004     static const int32_t RAW_ID_MIN;
   2005     static const int32_t RAW_ID_MAX;
   2006     static const float X_PRECISION;
   2007     static const float Y_PRECISION;
   2008 
   2009     static const VirtualKeyDefinition VIRTUAL_KEYS[2];
   2010 
   2011     enum Axes {
   2012         POSITION = 1 << 0,
   2013         TOUCH = 1 << 1,
   2014         TOOL = 1 << 2,
   2015         PRESSURE = 1 << 3,
   2016         ORIENTATION = 1 << 4,
   2017         MINOR = 1 << 5,
   2018         ID = 1 << 6,
   2019     };
   2020 
   2021     void prepareDisplay(int32_t orientation);
   2022     void prepareVirtualKeys();
   2023     int32_t toRawX(float displayX);
   2024     int32_t toRawY(float displayY);
   2025     float toDisplayX(int32_t rawX);
   2026     float toDisplayY(int32_t rawY);
   2027 };
   2028 
   2029 const int32_t TouchInputMapperTest::RAW_X_MIN = 25;
   2030 const int32_t TouchInputMapperTest::RAW_X_MAX = 1020;
   2031 const int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
   2032 const int32_t TouchInputMapperTest::RAW_Y_MAX = 1010;
   2033 const int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
   2034 const int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
   2035 const int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
   2036 const int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
   2037 const int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = RAW_TOUCH_MIN;
   2038 const int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = RAW_TOUCH_MAX;
   2039 const int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
   2040 const int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
   2041 const int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
   2042 const int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
   2043 const float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN) / DISPLAY_WIDTH;
   2044 const float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN) / DISPLAY_HEIGHT;
   2045 
   2046 const VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
   2047         { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
   2048         { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
   2049 };
   2050 
   2051 void TouchInputMapperTest::prepareDisplay(int32_t orientation) {
   2052     mFakePolicy->setDisplayInfo(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation);
   2053 }
   2054 
   2055 void TouchInputMapperTest::prepareVirtualKeys() {
   2056     mFakePolicy->addVirtualKeyDefinition(String8(DEVICE_NAME), VIRTUAL_KEYS[0]);
   2057     mFakePolicy->addVirtualKeyDefinition(String8(DEVICE_NAME), VIRTUAL_KEYS[1]);
   2058     mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, AKEYCODE_HOME, POLICY_FLAG_WAKE);
   2059     mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, AKEYCODE_MENU, POLICY_FLAG_WAKE);
   2060 }
   2061 
   2062 int32_t TouchInputMapperTest::toRawX(float displayX) {
   2063     return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN) / DISPLAY_WIDTH + RAW_X_MIN);
   2064 }
   2065 
   2066 int32_t TouchInputMapperTest::toRawY(float displayY) {
   2067     return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN) / DISPLAY_HEIGHT + RAW_Y_MIN);
   2068 }
   2069 
   2070 float TouchInputMapperTest::toDisplayX(int32_t rawX) {
   2071     return float(rawX - RAW_X_MIN) * DISPLAY_WIDTH / (RAW_X_MAX - RAW_X_MIN);
   2072 }
   2073 
   2074 float TouchInputMapperTest::toDisplayY(int32_t rawY) {
   2075     return float(rawY - RAW_Y_MIN) * DISPLAY_HEIGHT / (RAW_Y_MAX - RAW_Y_MIN);
   2076 }
   2077 
   2078 
   2079 // --- SingleTouchInputMapperTest ---
   2080 
   2081 class SingleTouchInputMapperTest : public TouchInputMapperTest {
   2082 protected:
   2083     void prepareAxes(int axes);
   2084 
   2085     void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
   2086     void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
   2087     void processUp(SingleTouchInputMapper* mappery);
   2088     void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
   2089     void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
   2090     void processSync(SingleTouchInputMapper* mapper);
   2091 };
   2092 
   2093 void SingleTouchInputMapperTest::prepareAxes(int axes) {
   2094     if (axes & POSITION) {
   2095         mFakeEventHub->addAxis(DEVICE_ID, ABS_X, RAW_X_MIN, RAW_X_MAX, 0, 0);
   2096         mFakeEventHub->addAxis(DEVICE_ID, ABS_Y, RAW_Y_MIN, RAW_Y_MAX, 0, 0);
   2097     }
   2098     if (axes & PRESSURE) {
   2099         mFakeEventHub->addAxis(DEVICE_ID, ABS_PRESSURE, RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
   2100     }
   2101     if (axes & TOOL) {
   2102         mFakeEventHub->addAxis(DEVICE_ID, ABS_TOOL_WIDTH, RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
   2103     }
   2104 }
   2105 
   2106 void SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
   2107     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0, 1, 0);
   2108     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, 0, x, 0);
   2109     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, 0, y, 0);
   2110 }
   2111 
   2112 void SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
   2113     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, 0, x, 0);
   2114     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, 0, y, 0);
   2115 }
   2116 
   2117 void SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
   2118     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0, 0, 0);
   2119 }
   2120 
   2121 void SingleTouchInputMapperTest::processPressure(
   2122         SingleTouchInputMapper* mapper, int32_t pressure) {
   2123     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, 0, pressure, 0);
   2124 }
   2125 
   2126 void SingleTouchInputMapperTest::processToolMajor(
   2127         SingleTouchInputMapper* mapper, int32_t toolMajor) {
   2128     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, 0, toolMajor, 0);
   2129 }
   2130 
   2131 void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
   2132     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0, 0, 0);
   2133 }
   2134 
   2135 
   2136 TEST_F(SingleTouchInputMapperTest, GetSources_WhenNotAttachedToADisplay_ReturnsTouchPad) {
   2137     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, -1);
   2138     prepareAxes(POSITION);
   2139     addMapperAndConfigure(mapper);
   2140 
   2141     ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
   2142 }
   2143 
   2144 TEST_F(SingleTouchInputMapperTest, GetSources_WhenAttachedToADisplay_ReturnsTouchScreen) {
   2145     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2146     prepareAxes(POSITION);
   2147     addMapperAndConfigure(mapper);
   2148 
   2149     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
   2150 }
   2151 
   2152 TEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
   2153     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2154     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2155     prepareAxes(POSITION);
   2156     prepareVirtualKeys();
   2157     addMapperAndConfigure(mapper);
   2158 
   2159     // Unknown key.
   2160     ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
   2161 
   2162     // Virtual key is down.
   2163     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
   2164     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
   2165     processDown(mapper, x, y);
   2166     processSync(mapper);
   2167     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   2168 
   2169     ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
   2170 
   2171     // Virtual key is up.
   2172     processUp(mapper);
   2173     processSync(mapper);
   2174     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   2175 
   2176     ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
   2177 }
   2178 
   2179 TEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
   2180     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2181     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2182     prepareAxes(POSITION);
   2183     prepareVirtualKeys();
   2184     addMapperAndConfigure(mapper);
   2185 
   2186     // Unknown key.
   2187     ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
   2188 
   2189     // Virtual key is down.
   2190     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
   2191     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
   2192     processDown(mapper, x, y);
   2193     processSync(mapper);
   2194     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   2195 
   2196     ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
   2197 
   2198     // Virtual key is up.
   2199     processUp(mapper);
   2200     processSync(mapper);
   2201     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   2202 
   2203     ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
   2204 }
   2205 
   2206 TEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
   2207     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2208     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2209     prepareAxes(POSITION);
   2210     prepareVirtualKeys();
   2211     addMapperAndConfigure(mapper);
   2212 
   2213     const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
   2214     uint8_t flags[2] = { 0, 0 };
   2215     ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
   2216     ASSERT_TRUE(flags[0]);
   2217     ASSERT_FALSE(flags[1]);
   2218 }
   2219 
   2220 TEST_F(SingleTouchInputMapperTest, Reset_WhenVirtualKeysAreDown_SendsUp) {
   2221     // Note: Ideally we should send cancels but the implementation is more straightforward
   2222     // with up and this will only happen if a device is forcibly removed.
   2223     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2224     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2225     prepareAxes(POSITION);
   2226     prepareVirtualKeys();
   2227     addMapperAndConfigure(mapper);
   2228 
   2229     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
   2230 
   2231     // Press virtual key.
   2232     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
   2233     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
   2234     processDown(mapper, x, y);
   2235     processSync(mapper);
   2236     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   2237 
   2238     // Reset.  Since key is down, synthesize key up.
   2239     mapper->reset();
   2240 
   2241     FakeInputDispatcher::NotifyKeyArgs args;
   2242     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   2243     //ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
   2244     ASSERT_EQ(DEVICE_ID, args.deviceId);
   2245     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
   2246     ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
   2247     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
   2248     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
   2249     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
   2250     ASSERT_EQ(KEY_HOME, args.scanCode);
   2251     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   2252     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
   2253 }
   2254 
   2255 TEST_F(SingleTouchInputMapperTest, Reset_WhenNothingIsPressed_NothingMuchHappens) {
   2256     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2257     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2258     prepareAxes(POSITION);
   2259     prepareVirtualKeys();
   2260     addMapperAndConfigure(mapper);
   2261 
   2262     // Press virtual key.
   2263     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
   2264     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
   2265     processDown(mapper, x, y);
   2266     processSync(mapper);
   2267     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   2268 
   2269     // Release virtual key.
   2270     processUp(mapper);
   2271     processSync(mapper);
   2272     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled());
   2273 
   2274     // Reset.  Since no key is down, nothing happens.
   2275     mapper->reset();
   2276 
   2277     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   2278     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
   2279 }
   2280 
   2281 TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
   2282     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2283     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2284     prepareAxes(POSITION);
   2285     prepareVirtualKeys();
   2286     addMapperAndConfigure(mapper);
   2287 
   2288     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
   2289 
   2290     FakeInputDispatcher::NotifyKeyArgs args;
   2291 
   2292     // Press virtual key.
   2293     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
   2294     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
   2295     processDown(mapper, x, y);
   2296     processSync(mapper);
   2297 
   2298     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   2299     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
   2300     ASSERT_EQ(DEVICE_ID, args.deviceId);
   2301     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
   2302     ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
   2303     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
   2304     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
   2305     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
   2306     ASSERT_EQ(KEY_HOME, args.scanCode);
   2307     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   2308     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
   2309 
   2310     // Release virtual key.
   2311     processUp(mapper);
   2312     processSync(mapper);
   2313 
   2314     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&args));
   2315     ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
   2316     ASSERT_EQ(DEVICE_ID, args.deviceId);
   2317     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
   2318     ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
   2319     ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
   2320     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
   2321     ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
   2322     ASSERT_EQ(KEY_HOME, args.scanCode);
   2323     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
   2324     ASSERT_EQ(ARBITRARY_TIME, args.downTime);
   2325 
   2326     // Should not have sent any motions.
   2327     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   2328 }
   2329 
   2330 TEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
   2331     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2332     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2333     prepareAxes(POSITION);
   2334     prepareVirtualKeys();
   2335     addMapperAndConfigure(mapper);
   2336 
   2337     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
   2338 
   2339     FakeInputDispatcher::NotifyKeyArgs keyArgs;
   2340 
   2341     // Press virtual key.
   2342     int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
   2343     int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
   2344     processDown(mapper, x, y);
   2345     processSync(mapper);
   2346 
   2347     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&keyArgs));
   2348     ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
   2349     ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
   2350     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
   2351     ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
   2352     ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
   2353     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
   2354     ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
   2355     ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
   2356     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
   2357     ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
   2358 
   2359     // Move out of bounds.  This should generate a cancel and a pointer down since we moved
   2360     // into the display area.
   2361     y -= 100;
   2362     processMove(mapper, x, y);
   2363     processSync(mapper);
   2364 
   2365     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasCalled(&keyArgs));
   2366     ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
   2367     ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
   2368     ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
   2369     ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
   2370     ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
   2371     ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
   2372             | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
   2373     ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
   2374     ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
   2375     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
   2376     ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
   2377 
   2378     FakeInputDispatcher::NotifyMotionArgs motionArgs;
   2379     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2380     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2381     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2382     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2383     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2384     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
   2385     ASSERT_EQ(0, motionArgs.flags);
   2386     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2387     ASSERT_EQ(0, motionArgs.edgeFlags);
   2388     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2389     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2390     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2391             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0));
   2392     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2393     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2394     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2395 
   2396     // Keep moving out of bounds.  Should generate a pointer move.
   2397     y -= 50;
   2398     processMove(mapper, x, y);
   2399     processSync(mapper);
   2400 
   2401     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2402     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2403     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2404     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2405     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2406     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   2407     ASSERT_EQ(0, motionArgs.flags);
   2408     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2409     ASSERT_EQ(0, motionArgs.edgeFlags);
   2410     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2411     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2412     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2413             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0));
   2414     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2415     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2416     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2417 
   2418     // Release out of bounds.  Should generate a pointer up.
   2419     processUp(mapper);
   2420     processSync(mapper);
   2421 
   2422     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2423     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2424     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2425     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2426     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2427     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
   2428     ASSERT_EQ(0, motionArgs.flags);
   2429     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2430     ASSERT_EQ(0, motionArgs.edgeFlags);
   2431     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2432     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2433     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2434             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0));
   2435     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2436     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2437     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2438 
   2439     // Should not have sent any more keys or motions.
   2440     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   2441     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
   2442 }
   2443 
   2444 TEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
   2445     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2446     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2447     prepareAxes(POSITION);
   2448     prepareVirtualKeys();
   2449     addMapperAndConfigure(mapper);
   2450 
   2451     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
   2452 
   2453     FakeInputDispatcher::NotifyMotionArgs motionArgs;
   2454 
   2455     // Initially go down out of bounds.
   2456     int32_t x = -10;
   2457     int32_t y = -10;
   2458     processDown(mapper, x, y);
   2459     processSync(mapper);
   2460 
   2461     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
   2462 
   2463     // Move into the display area.  Should generate a pointer down.
   2464     x = 50;
   2465     y = 75;
   2466     processMove(mapper, x, y);
   2467     processSync(mapper);
   2468 
   2469     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2470     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2471     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2472     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2473     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2474     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
   2475     ASSERT_EQ(0, motionArgs.flags);
   2476     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2477     ASSERT_EQ(0, motionArgs.edgeFlags);
   2478     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2479     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2480     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2481             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0));
   2482     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2483     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2484     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2485 
   2486     // Release.  Should generate a pointer up.
   2487     processUp(mapper);
   2488     processSync(mapper);
   2489 
   2490     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2491     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2492     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2493     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2494     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2495     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
   2496     ASSERT_EQ(0, motionArgs.flags);
   2497     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2498     ASSERT_EQ(0, motionArgs.edgeFlags);
   2499     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2500     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2501     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2502             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0));
   2503     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2504     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2505     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2506 
   2507     // Should not have sent any more keys or motions.
   2508     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   2509     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
   2510 }
   2511 
   2512 TEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
   2513     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2514     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2515     prepareAxes(POSITION);
   2516     prepareVirtualKeys();
   2517     addMapperAndConfigure(mapper);
   2518 
   2519     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
   2520 
   2521     FakeInputDispatcher::NotifyMotionArgs motionArgs;
   2522 
   2523     // Down.
   2524     int32_t x = 100;
   2525     int32_t y = 125;
   2526     processDown(mapper, x, y);
   2527     processSync(mapper);
   2528 
   2529     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2530     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2531     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2532     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2533     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2534     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
   2535     ASSERT_EQ(0, motionArgs.flags);
   2536     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2537     ASSERT_EQ(0, motionArgs.edgeFlags);
   2538     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2539     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2540     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2541             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0));
   2542     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2543     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2544     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2545 
   2546     // Move.
   2547     x += 50;
   2548     y += 75;
   2549     processMove(mapper, x, y);
   2550     processSync(mapper);
   2551 
   2552     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2553     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2554     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2555     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2556     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2557     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   2558     ASSERT_EQ(0, motionArgs.flags);
   2559     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2560     ASSERT_EQ(0, motionArgs.edgeFlags);
   2561     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2562     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2563     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2564             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0));
   2565     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2566     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2567     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2568 
   2569     // Up.
   2570     processUp(mapper);
   2571     processSync(mapper);
   2572 
   2573     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2574     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2575     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2576     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2577     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2578     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
   2579     ASSERT_EQ(0, motionArgs.flags);
   2580     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2581     ASSERT_EQ(0, motionArgs.edgeFlags);
   2582     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2583     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2584     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2585             toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0));
   2586     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2587     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2588     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2589 
   2590     // Should not have sent any more keys or motions.
   2591     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   2592     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
   2593 }
   2594 
   2595 TEST_F(SingleTouchInputMapperTest, Process_Rotation) {
   2596     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2597     prepareAxes(POSITION);
   2598     addMapperAndConfigure(mapper);
   2599 
   2600     FakeInputDispatcher::NotifyMotionArgs args;
   2601 
   2602     // Rotation 0.
   2603     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2604     processDown(mapper, toRawX(50), toRawY(75));
   2605     processSync(mapper);
   2606 
   2607     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   2608     ASSERT_NEAR(50, args.pointerCoords[0].x, 1);
   2609     ASSERT_NEAR(75, args.pointerCoords[0].y, 1);
   2610 
   2611     processUp(mapper);
   2612     processSync(mapper);
   2613     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled());
   2614 
   2615     // Rotation 90.
   2616     prepareDisplay(InputReaderPolicyInterface::ROTATION_90);
   2617     processDown(mapper, toRawX(50), toRawY(75));
   2618     processSync(mapper);
   2619 
   2620     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   2621     ASSERT_NEAR(75, args.pointerCoords[0].x, 1);
   2622     ASSERT_NEAR(DISPLAY_WIDTH - 50, args.pointerCoords[0].y, 1);
   2623 
   2624     processUp(mapper);
   2625     processSync(mapper);
   2626     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled());
   2627 
   2628     // Rotation 180.
   2629     prepareDisplay(InputReaderPolicyInterface::ROTATION_180);
   2630     processDown(mapper, toRawX(50), toRawY(75));
   2631     processSync(mapper);
   2632 
   2633     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   2634     ASSERT_NEAR(DISPLAY_WIDTH - 50, args.pointerCoords[0].x, 1);
   2635     ASSERT_NEAR(DISPLAY_HEIGHT - 75, args.pointerCoords[0].y, 1);
   2636 
   2637     processUp(mapper);
   2638     processSync(mapper);
   2639     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled());
   2640 
   2641     // Rotation 270.
   2642     prepareDisplay(InputReaderPolicyInterface::ROTATION_270);
   2643     processDown(mapper, toRawX(50), toRawY(75));
   2644     processSync(mapper);
   2645 
   2646     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   2647     ASSERT_NEAR(DISPLAY_HEIGHT - 75, args.pointerCoords[0].x, 1);
   2648     ASSERT_NEAR(50, args.pointerCoords[0].y, 1);
   2649 
   2650     processUp(mapper);
   2651     processSync(mapper);
   2652     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled());
   2653 }
   2654 
   2655 TEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
   2656     SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice, DISPLAY_ID);
   2657     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2658     prepareAxes(POSITION | PRESSURE | TOOL);
   2659     addMapperAndConfigure(mapper);
   2660 
   2661     // These calculations are based on the input device calibration documentation.
   2662     int32_t rawX = 100;
   2663     int32_t rawY = 200;
   2664     int32_t rawPressure = 10;
   2665     int32_t rawToolMajor = 12;
   2666 
   2667     float x = toDisplayX(rawX);
   2668     float y = toDisplayY(rawY);
   2669     float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
   2670     float size = float(rawToolMajor) / RAW_TOOL_MAX;
   2671     float tool = min(DISPLAY_WIDTH, DISPLAY_HEIGHT) * size;
   2672     float touch = min(tool * pressure, tool);
   2673 
   2674     processDown(mapper, rawX, rawY);
   2675     processPressure(mapper, rawPressure);
   2676     processToolMajor(mapper, rawToolMajor);
   2677     processSync(mapper);
   2678 
   2679     FakeInputDispatcher::NotifyMotionArgs args;
   2680     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   2681     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   2682             x, y, pressure, size, touch, touch, tool, tool, 0));
   2683 }
   2684 
   2685 
   2686 // --- MultiTouchInputMapperTest ---
   2687 
   2688 class MultiTouchInputMapperTest : public TouchInputMapperTest {
   2689 protected:
   2690     void prepareAxes(int axes);
   2691 
   2692     void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
   2693     void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
   2694     void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
   2695     void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
   2696     void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
   2697     void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
   2698     void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
   2699     void processId(MultiTouchInputMapper* mapper, int32_t id);
   2700     void processMTSync(MultiTouchInputMapper* mapper);
   2701     void processSync(MultiTouchInputMapper* mapper);
   2702 };
   2703 
   2704 void MultiTouchInputMapperTest::prepareAxes(int axes) {
   2705     if (axes & POSITION) {
   2706         mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_POSITION_X, RAW_X_MIN, RAW_X_MAX, 0, 0);
   2707         mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_POSITION_Y, RAW_Y_MIN, RAW_Y_MAX, 0, 0);
   2708     }
   2709     if (axes & TOUCH) {
   2710         mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR, RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
   2711         if (axes & MINOR) {
   2712             mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
   2713                     RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
   2714         }
   2715     }
   2716     if (axes & TOOL) {
   2717         mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR, RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
   2718         if (axes & MINOR) {
   2719             mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
   2720                     RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
   2721         }
   2722     }
   2723     if (axes & ORIENTATION) {
   2724         mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_ORIENTATION,
   2725                 RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
   2726     }
   2727     if (axes & PRESSURE) {
   2728         mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_PRESSURE,
   2729                 RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
   2730     }
   2731     if (axes & ID) {
   2732         mFakeEventHub->addAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
   2733                 RAW_ID_MIN, RAW_ID_MAX, 0, 0);
   2734     }
   2735 }
   2736 
   2737 void MultiTouchInputMapperTest::processPosition(
   2738         MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
   2739     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, 0, x, 0);
   2740     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, 0, y, 0);
   2741 }
   2742 
   2743 void MultiTouchInputMapperTest::processTouchMajor(
   2744         MultiTouchInputMapper* mapper, int32_t touchMajor) {
   2745     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, 0, touchMajor, 0);
   2746 }
   2747 
   2748 void MultiTouchInputMapperTest::processTouchMinor(
   2749         MultiTouchInputMapper* mapper, int32_t touchMinor) {
   2750     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, 0, touchMinor, 0);
   2751 }
   2752 
   2753 void MultiTouchInputMapperTest::processToolMajor(
   2754         MultiTouchInputMapper* mapper, int32_t toolMajor) {
   2755     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, 0, toolMajor, 0);
   2756 }
   2757 
   2758 void MultiTouchInputMapperTest::processToolMinor(
   2759         MultiTouchInputMapper* mapper, int32_t toolMinor) {
   2760     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, 0, toolMinor, 0);
   2761 }
   2762 
   2763 void MultiTouchInputMapperTest::processOrientation(
   2764         MultiTouchInputMapper* mapper, int32_t orientation) {
   2765     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, 0, orientation, 0);
   2766 }
   2767 
   2768 void MultiTouchInputMapperTest::processPressure(
   2769         MultiTouchInputMapper* mapper, int32_t pressure) {
   2770     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, 0, pressure, 0);
   2771 }
   2772 
   2773 void MultiTouchInputMapperTest::processId(
   2774         MultiTouchInputMapper* mapper, int32_t id) {
   2775     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, 0, id, 0);
   2776 }
   2777 
   2778 void MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
   2779     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0, 0, 0);
   2780 }
   2781 
   2782 void MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
   2783     process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0, 0, 0);
   2784 }
   2785 
   2786 
   2787 TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
   2788     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice, DISPLAY_ID);
   2789     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   2790     prepareAxes(POSITION);
   2791     prepareVirtualKeys();
   2792     addMapperAndConfigure(mapper);
   2793 
   2794     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
   2795 
   2796     FakeInputDispatcher::NotifyMotionArgs motionArgs;
   2797 
   2798     // Two fingers down at once.
   2799     int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
   2800     processPosition(mapper, x1, y1);
   2801     processMTSync(mapper);
   2802     processPosition(mapper, x2, y2);
   2803     processMTSync(mapper);
   2804     processSync(mapper);
   2805 
   2806     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2807     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2808     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2809     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2810     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2811     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
   2812     ASSERT_EQ(0, motionArgs.flags);
   2813     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2814     ASSERT_EQ(0, motionArgs.edgeFlags);
   2815     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2816     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2817     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2818             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0));
   2819     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2820     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2821     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2822 
   2823     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2824     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2825     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2826     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2827     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2828     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   2829             motionArgs.action);
   2830     ASSERT_EQ(0, motionArgs.flags);
   2831     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2832     ASSERT_EQ(0, motionArgs.edgeFlags);
   2833     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   2834     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2835     ASSERT_EQ(1, motionArgs.pointerIds[1]);
   2836     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2837             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0));
   2838     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   2839             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   2840     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2841     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2842     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2843 
   2844     // Move.
   2845     x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
   2846     processPosition(mapper, x1, y1);
   2847     processMTSync(mapper);
   2848     processPosition(mapper, x2, y2);
   2849     processMTSync(mapper);
   2850     processSync(mapper);
   2851 
   2852     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2853     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2854     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2855     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2856     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2857     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   2858     ASSERT_EQ(0, motionArgs.flags);
   2859     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2860     ASSERT_EQ(0, motionArgs.edgeFlags);
   2861     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   2862     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2863     ASSERT_EQ(1, motionArgs.pointerIds[1]);
   2864     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2865             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0));
   2866     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   2867             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   2868     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2869     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2870     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2871 
   2872     // First finger up.
   2873     x2 += 15; y2 -= 20;
   2874     processPosition(mapper, x2, y2);
   2875     processMTSync(mapper);
   2876     processSync(mapper);
   2877 
   2878     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2879     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2880     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2881     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2882     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2883     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   2884             motionArgs.action);
   2885     ASSERT_EQ(0, motionArgs.flags);
   2886     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2887     ASSERT_EQ(0, motionArgs.edgeFlags);
   2888     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   2889     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2890     ASSERT_EQ(1, motionArgs.pointerIds[1]);
   2891     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2892             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0));
   2893     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   2894             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   2895     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2896     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2897     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2898 
   2899     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2900     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2901     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2902     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2903     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2904     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   2905     ASSERT_EQ(0, motionArgs.flags);
   2906     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2907     ASSERT_EQ(0, motionArgs.edgeFlags);
   2908     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2909     ASSERT_EQ(1, motionArgs.pointerIds[0]);
   2910     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2911             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   2912     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2913     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2914     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2915 
   2916     // Move.
   2917     x2 += 20; y2 -= 25;
   2918     processPosition(mapper, x2, y2);
   2919     processMTSync(mapper);
   2920     processSync(mapper);
   2921 
   2922     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2923     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2924     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2925     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2926     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2927     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   2928     ASSERT_EQ(0, motionArgs.flags);
   2929     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2930     ASSERT_EQ(0, motionArgs.edgeFlags);
   2931     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   2932     ASSERT_EQ(1, motionArgs.pointerIds[0]);
   2933     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2934             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   2935     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2936     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2937     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2938 
   2939     // New finger down.
   2940     int32_t x3 = 700, y3 = 300;
   2941     processPosition(mapper, x2, y2);
   2942     processMTSync(mapper);
   2943     processPosition(mapper, x3, y3);
   2944     processMTSync(mapper);
   2945     processSync(mapper);
   2946 
   2947     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2948     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2949     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2950     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2951     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2952     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   2953             motionArgs.action);
   2954     ASSERT_EQ(0, motionArgs.flags);
   2955     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2956     ASSERT_EQ(0, motionArgs.edgeFlags);
   2957     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   2958     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2959     ASSERT_EQ(1, motionArgs.pointerIds[1]);
   2960     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2961             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0));
   2962     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   2963             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   2964     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2965     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2966     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2967 
   2968     // Second finger up.
   2969     x3 += 30; y3 -= 20;
   2970     processPosition(mapper, x3, y3);
   2971     processMTSync(mapper);
   2972     processSync(mapper);
   2973 
   2974     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2975     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2976     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2977     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2978     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   2979     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   2980             motionArgs.action);
   2981     ASSERT_EQ(0, motionArgs.flags);
   2982     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   2983     ASSERT_EQ(0, motionArgs.edgeFlags);
   2984     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   2985     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   2986     ASSERT_EQ(1, motionArgs.pointerIds[1]);
   2987     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   2988             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0));
   2989     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   2990             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   2991     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   2992     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   2993     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   2994 
   2995     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   2996     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   2997     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   2998     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   2999     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   3000     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   3001     ASSERT_EQ(0, motionArgs.flags);
   3002     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   3003     ASSERT_EQ(0, motionArgs.edgeFlags);
   3004     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   3005     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   3006     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3007             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0));
   3008     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   3009     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   3010     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   3011 
   3012     // Last finger up.
   3013     processMTSync(mapper);
   3014     processSync(mapper);
   3015 
   3016     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3017     ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
   3018     ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
   3019     ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
   3020     ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
   3021     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
   3022     ASSERT_EQ(0, motionArgs.flags);
   3023     ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
   3024     ASSERT_EQ(0, motionArgs.edgeFlags);
   3025     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   3026     ASSERT_EQ(0, motionArgs.pointerIds[0]);
   3027     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3028             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0));
   3029     ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
   3030     ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
   3031     ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
   3032 
   3033     // Should not have sent any more keys or motions.
   3034     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   3035     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
   3036 }
   3037 
   3038 TEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
   3039     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice, DISPLAY_ID);
   3040     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   3041     prepareAxes(POSITION | ID);
   3042     prepareVirtualKeys();
   3043     addMapperAndConfigure(mapper);
   3044 
   3045     mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
   3046 
   3047     FakeInputDispatcher::NotifyMotionArgs motionArgs;
   3048 
   3049     // Two fingers down at once.
   3050     int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
   3051     processPosition(mapper, x1, y1);
   3052     processId(mapper, 1);
   3053     processMTSync(mapper);
   3054     processPosition(mapper, x2, y2);
   3055     processId(mapper, 2);
   3056     processMTSync(mapper);
   3057     processSync(mapper);
   3058 
   3059     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3060     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
   3061     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   3062     ASSERT_EQ(1, motionArgs.pointerIds[0]);
   3063     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3064             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0));
   3065 
   3066     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3067     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   3068             motionArgs.action);
   3069     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   3070     ASSERT_EQ(1, motionArgs.pointerIds[0]);
   3071     ASSERT_EQ(2, motionArgs.pointerIds[1]);
   3072     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3073             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0));
   3074     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   3075             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   3076 
   3077     // Move.
   3078     x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
   3079     processPosition(mapper, x1, y1);
   3080     processId(mapper, 1);
   3081     processMTSync(mapper);
   3082     processPosition(mapper, x2, y2);
   3083     processId(mapper, 2);
   3084     processMTSync(mapper);
   3085     processSync(mapper);
   3086 
   3087     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3088     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   3089     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   3090     ASSERT_EQ(1, motionArgs.pointerIds[0]);
   3091     ASSERT_EQ(2, motionArgs.pointerIds[1]);
   3092     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3093             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0));
   3094     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   3095             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   3096 
   3097     // First finger up.
   3098     x2 += 15; y2 -= 20;
   3099     processPosition(mapper, x2, y2);
   3100     processId(mapper, 2);
   3101     processMTSync(mapper);
   3102     processSync(mapper);
   3103 
   3104     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3105     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   3106             motionArgs.action);
   3107     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   3108     ASSERT_EQ(1, motionArgs.pointerIds[0]);
   3109     ASSERT_EQ(2, motionArgs.pointerIds[1]);
   3110     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3111             toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0));
   3112     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   3113             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   3114 
   3115     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3116     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   3117     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   3118     ASSERT_EQ(2, motionArgs.pointerIds[0]);
   3119     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3120             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   3121 
   3122     // Move.
   3123     x2 += 20; y2 -= 25;
   3124     processPosition(mapper, x2, y2);
   3125     processId(mapper, 2);
   3126     processMTSync(mapper);
   3127     processSync(mapper);
   3128 
   3129     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3130     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   3131     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   3132     ASSERT_EQ(2, motionArgs.pointerIds[0]);
   3133     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3134             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   3135 
   3136     // New finger down.
   3137     int32_t x3 = 700, y3 = 300;
   3138     processPosition(mapper, x2, y2);
   3139     processId(mapper, 2);
   3140     processMTSync(mapper);
   3141     processPosition(mapper, x3, y3);
   3142     processId(mapper, 3);
   3143     processMTSync(mapper);
   3144     processSync(mapper);
   3145 
   3146     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3147     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   3148             motionArgs.action);
   3149     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   3150     ASSERT_EQ(2, motionArgs.pointerIds[0]);
   3151     ASSERT_EQ(3, motionArgs.pointerIds[1]);
   3152     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3153             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   3154     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   3155             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0));
   3156 
   3157     // Second finger up.
   3158     x3 += 30; y3 -= 20;
   3159     processPosition(mapper, x3, y3);
   3160     processId(mapper, 3);
   3161     processMTSync(mapper);
   3162     processSync(mapper);
   3163 
   3164     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3165     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   3166             motionArgs.action);
   3167     ASSERT_EQ(size_t(2), motionArgs.pointerCount);
   3168     ASSERT_EQ(2, motionArgs.pointerIds[0]);
   3169     ASSERT_EQ(3, motionArgs.pointerIds[1]);
   3170     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3171             toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0));
   3172     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
   3173             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0));
   3174 
   3175     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3176     ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
   3177     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   3178     ASSERT_EQ(3, motionArgs.pointerIds[0]);
   3179     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3180             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0));
   3181 
   3182     // Last finger up.
   3183     processMTSync(mapper);
   3184     processSync(mapper);
   3185 
   3186     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&motionArgs));
   3187     ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
   3188     ASSERT_EQ(size_t(1), motionArgs.pointerCount);
   3189     ASSERT_EQ(3, motionArgs.pointerIds[0]);
   3190     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
   3191             toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0));
   3192 
   3193     // Should not have sent any more keys or motions.
   3194     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyKeyWasNotCalled());
   3195     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasNotCalled());
   3196 }
   3197 
   3198 TEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
   3199     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice, DISPLAY_ID);
   3200     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   3201     prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR);
   3202     addMapperAndConfigure(mapper);
   3203 
   3204     // These calculations are based on the input device calibration documentation.
   3205     int32_t rawX = 100;
   3206     int32_t rawY = 200;
   3207     int32_t rawTouchMajor = 7;
   3208     int32_t rawTouchMinor = 6;
   3209     int32_t rawToolMajor = 9;
   3210     int32_t rawToolMinor = 8;
   3211     int32_t rawPressure = 11;
   3212     int32_t rawOrientation = 3;
   3213     int32_t id = 5;
   3214 
   3215     float x = toDisplayX(rawX);
   3216     float y = toDisplayY(rawY);
   3217     float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
   3218     float size = avg(rawToolMajor, rawToolMinor) / RAW_TOOL_MAX;
   3219     float toolMajor = float(min(DISPLAY_WIDTH, DISPLAY_HEIGHT)) * rawToolMajor / RAW_TOOL_MAX;
   3220     float toolMinor = float(min(DISPLAY_WIDTH, DISPLAY_HEIGHT)) * rawToolMinor / RAW_TOOL_MAX;
   3221     float touchMajor = min(toolMajor * pressure, toolMajor);
   3222     float touchMinor = min(toolMinor * pressure, toolMinor);
   3223     float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
   3224 
   3225     processPosition(mapper, rawX, rawY);
   3226     processTouchMajor(mapper, rawTouchMajor);
   3227     processTouchMinor(mapper, rawTouchMinor);
   3228     processToolMajor(mapper, rawToolMajor);
   3229     processToolMinor(mapper, rawToolMinor);
   3230     processPressure(mapper, rawPressure);
   3231     processOrientation(mapper, rawOrientation);
   3232     processId(mapper, id);
   3233     processMTSync(mapper);
   3234     processSync(mapper);
   3235 
   3236     FakeInputDispatcher::NotifyMotionArgs args;
   3237     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   3238     ASSERT_EQ(id, args.pointerIds[0]);
   3239     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   3240             x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor, orientation));
   3241 }
   3242 
   3243 TEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
   3244     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice, DISPLAY_ID);
   3245     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   3246     prepareAxes(POSITION | TOUCH | TOOL | MINOR);
   3247     prepareCalibration("touch.touchSize.calibration", "geometric");
   3248     prepareCalibration("touch.toolSize.calibration", "geometric");
   3249     addMapperAndConfigure(mapper);
   3250 
   3251     // These calculations are based on the input device calibration documentation.
   3252     int32_t rawX = 100;
   3253     int32_t rawY = 200;
   3254     int32_t rawTouchMajor = 140;
   3255     int32_t rawTouchMinor = 120;
   3256     int32_t rawToolMajor = 180;
   3257     int32_t rawToolMinor = 160;
   3258 
   3259     float x = toDisplayX(rawX);
   3260     float y = toDisplayY(rawY);
   3261     float pressure = float(rawTouchMajor) / RAW_TOUCH_MAX;
   3262     float size = avg(rawToolMajor, rawToolMinor) / RAW_TOOL_MAX;
   3263     float scale = avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN),
   3264             float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN));
   3265     float toolMajor = float(rawToolMajor) * scale;
   3266     float toolMinor = float(rawToolMinor) * scale;
   3267     float touchMajor = min(float(rawTouchMajor) * scale, toolMajor);
   3268     float touchMinor = min(float(rawTouchMinor) * scale, toolMinor);
   3269 
   3270     processPosition(mapper, rawX, rawY);
   3271     processTouchMajor(mapper, rawTouchMajor);
   3272     processTouchMinor(mapper, rawTouchMinor);
   3273     processToolMajor(mapper, rawToolMajor);
   3274     processToolMinor(mapper, rawToolMinor);
   3275     processMTSync(mapper);
   3276     processSync(mapper);
   3277 
   3278     FakeInputDispatcher::NotifyMotionArgs args;
   3279     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   3280     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   3281             x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor, 0));
   3282 }
   3283 
   3284 TEST_F(MultiTouchInputMapperTest, Process_TouchToolPressureSizeAxes_SummedLinearCalibration) {
   3285     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice, DISPLAY_ID);
   3286     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   3287     prepareAxes(POSITION | TOUCH | TOOL);
   3288     prepareCalibration("touch.touchSize.calibration", "pressure");
   3289     prepareCalibration("touch.toolSize.calibration", "linear");
   3290     prepareCalibration("touch.toolSize.linearScale", "10");
   3291     prepareCalibration("touch.toolSize.linearBias", "160");
   3292     prepareCalibration("touch.toolSize.isSummed", "1");
   3293     prepareCalibration("touch.pressure.calibration", "amplitude");
   3294     prepareCalibration("touch.pressure.source", "touch");
   3295     prepareCalibration("touch.pressure.scale", "0.01");
   3296     addMapperAndConfigure(mapper);
   3297 
   3298     // These calculations are based on the input device calibration documentation.
   3299     // Note: We only provide a single common touch/tool value because the device is assumed
   3300     //       not to emit separate values for each pointer (isSummed = 1).
   3301     int32_t rawX = 100;
   3302     int32_t rawY = 200;
   3303     int32_t rawX2 = 150;
   3304     int32_t rawY2 = 250;
   3305     int32_t rawTouchMajor = 60;
   3306     int32_t rawToolMajor = 5;
   3307 
   3308     float x = toDisplayX(rawX);
   3309     float y = toDisplayY(rawY);
   3310     float x2 = toDisplayX(rawX2);
   3311     float y2 = toDisplayY(rawY2);
   3312     float pressure = float(rawTouchMajor) * 0.01f;
   3313     float size = float(rawToolMajor) / RAW_TOOL_MAX;
   3314     float tool = (float(rawToolMajor) * 10.0f + 160.0f) / 2;
   3315     float touch = min(tool * pressure, tool);
   3316 
   3317     processPosition(mapper, rawX, rawY);
   3318     processTouchMajor(mapper, rawTouchMajor);
   3319     processToolMajor(mapper, rawToolMajor);
   3320     processMTSync(mapper);
   3321     processPosition(mapper, rawX2, rawY2);
   3322     processTouchMajor(mapper, rawTouchMajor);
   3323     processToolMajor(mapper, rawToolMajor);
   3324     processMTSync(mapper);
   3325     processSync(mapper);
   3326 
   3327     FakeInputDispatcher::NotifyMotionArgs args;
   3328     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   3329     ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
   3330     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   3331     ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
   3332             args.action);
   3333     ASSERT_EQ(size_t(2), args.pointerCount);
   3334     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   3335             x, y, pressure, size, touch, touch, tool, tool, 0));
   3336     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
   3337             x2, y2, pressure, size, touch, touch, tool, tool, 0));
   3338 }
   3339 
   3340 TEST_F(MultiTouchInputMapperTest, Process_TouchToolPressureSizeAxes_AreaCalibration) {
   3341     MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice, DISPLAY_ID);
   3342     prepareDisplay(InputReaderPolicyInterface::ROTATION_0);
   3343     prepareAxes(POSITION | TOUCH | TOOL);
   3344     prepareCalibration("touch.touchSize.calibration", "pressure");
   3345     prepareCalibration("touch.toolSize.calibration", "area");
   3346     prepareCalibration("touch.toolSize.areaScale", "22");
   3347     prepareCalibration("touch.toolSize.areaBias", "1");
   3348     prepareCalibration("touch.toolSize.linearScale", "9.2");
   3349     prepareCalibration("touch.toolSize.linearBias", "3");
   3350     prepareCalibration("touch.pressure.calibration", "amplitude");
   3351     prepareCalibration("touch.pressure.source", "touch");
   3352     prepareCalibration("touch.pressure.scale", "0.01");
   3353     addMapperAndConfigure(mapper);
   3354 
   3355     // These calculations are based on the input device calibration documentation.
   3356     int32_t rawX = 100;
   3357     int32_t rawY = 200;
   3358     int32_t rawTouchMajor = 60;
   3359     int32_t rawToolMajor = 5;
   3360 
   3361     float x = toDisplayX(rawX);
   3362     float y = toDisplayY(rawY);
   3363     float pressure = float(rawTouchMajor) * 0.01f;
   3364     float size = float(rawToolMajor) / RAW_TOOL_MAX;
   3365     float tool = sqrtf(float(rawToolMajor) * 22.0f + 1.0f) * 9.2f + 3.0f;
   3366     float touch = min(tool * pressure, tool);
   3367 
   3368     processPosition(mapper, rawX, rawY);
   3369     processTouchMajor(mapper, rawTouchMajor);
   3370     processToolMajor(mapper, rawToolMajor);
   3371     processMTSync(mapper);
   3372     processSync(mapper);
   3373 
   3374     FakeInputDispatcher::NotifyMotionArgs args;
   3375     ASSERT_NO_FATAL_FAILURE(mFakeDispatcher->assertNotifyMotionWasCalled(&args));
   3376     ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
   3377             x, y, pressure, size, touch, touch, tool, tool, 0));
   3378 }
   3379 
   3380 } // namespace android
   3381