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