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