InputReader_test.cpp revision 6ec6f79e1ac1714e3b837796e99f07ff88f66601
1199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong/*
2199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * Copyright (C) 2010 The Android Open Source Project
3199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong *
4199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
5199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * you may not use this file except in compliance with the License.
6199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * You may obtain a copy of the License at
7199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong *
8199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
9199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong *
10199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * Unless required by applicable law or agreed to in writing, software
11199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
12199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * See the License for the specific language governing permissions and
14199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * limitations under the License.
15199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong */
16c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
17b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "../InputReader.h"
18b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
19c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown#include <utils/List.h>
20c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown#include <gtest/gtest.h>
21c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown#include <math.h>
22c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
23c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownnamespace android {
24c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
25c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary time value.
26c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const nsecs_t ARBITRARY_TIME = 1234;
27c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
28c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// Arbitrary display properties.
29c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t DISPLAY_ID = 0;
30c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t DISPLAY_WIDTH = 480;
31c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t DISPLAY_HEIGHT = 800;
32c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
33c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// Error tolerance for floating point assertions.
34c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const float EPSILON = 0.001f;
35c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
36c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Browntemplate<typename T>
37c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic inline T min(T a, T b) {
38c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    return a < b ? a : b;
39c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
40c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
41c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic inline float avg(float x, float y) {
42c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    return (x + y) / 2;
43c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
44c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
45c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown// --- FakePointerController ---
4783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
4883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownclass FakePointerController : public PointerControllerInterface {
4983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    bool mHaveBounds;
5083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    float mMinX, mMinY, mMaxX, mMaxY;
51be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mX, mY;
52be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t mButtonState;
5383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
5483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownprotected:
5583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    virtual ~FakePointerController() { }
5683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
5783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownpublic:
58b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    FakePointerController() :
59be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mHaveBounds(false), mMinX(0), mMinY(0), mMaxX(0), mMaxY(0), mX(0), mY(0),
60be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mButtonState(0) {
6183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
6283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
6383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    void setBounds(float minX, float minY, float maxX, float maxY) {
6483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mHaveBounds = true;
6583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mMinX = minX;
6683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mMinY = minY;
6783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mMaxX = maxX;
6883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mMaxY = maxY;
6983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
7083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
71be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void setPosition(float x, float y) {
72be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mX = x;
73be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mY = y;
7483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
7583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
76fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    virtual void setButtonState(int32_t buttonState) {
77be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mButtonState = buttonState;
7883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
7983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
80fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    virtual int32_t getButtonState() const {
81be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        return mButtonState;
8283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
8383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
84be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void getPosition(float* outX, float* outY) const {
85be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        *outX = mX;
86be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        *outY = mY;
8783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
8883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
89be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownprivate:
90be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual bool getBounds(float* outMinX, float* outMinY, float* outMaxX, float* outMaxY) const {
91be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        *outMinX = mMinX;
92be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        *outMinY = mMinY;
93be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        *outMaxX = mMaxX;
94be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        *outMaxY = mMaxY;
95be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        return mHaveBounds;
96be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
97be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
98be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void move(float deltaX, float deltaY) {
99be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mX += deltaX;
100be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (mX < mMinX) mX = mMinX;
101be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (mX > mMaxX) mX = mMaxX;
102be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mY += deltaY;
103be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (mY < mMinY) mY = mMinY;
104be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (mY > mMaxY) mY = mMaxY;
10583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
10605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
107538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    virtual void fade(Transition transition) {
10805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    }
10905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
110538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown    virtual void unfade(Transition transition) {
11105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    }
1122352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1132352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual void setPresentation(Presentation presentation) {
1142352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    }
1152352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1169181a5f40cf5ac7d413d5bc3bd6c15cc6d13705fJeff Brown    virtual void setSpots(const PointerCoords* spotCoords,
1179181a5f40cf5ac7d413d5bc3bd6c15cc6d13705fJeff Brown            const uint32_t* spotIdToIndex, BitSet32 spotIdBits) {
1182352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    }
1192352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1202352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    virtual void clearSpots() {
1212352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown    }
12283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown};
12383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
12483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputReaderPolicy ---
126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputReaderPolicy : public InputReaderPolicyInterface {
128214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    InputReaderConfiguration mConfig;
12983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    KeyedVector<int32_t, sp<FakePointerController> > mPointerControllers;
130af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    Vector<InputDeviceInfo> mInputDevices;
131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual ~FakeInputReaderPolicy() { }
134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic:
136214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    FakeInputReaderPolicy() {
137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setDisplayInfo(int32_t displayId, int32_t width, int32_t height, int32_t orientation) {
14065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        // Set the size of both the internal and external display at the same time.
14165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mConfig.setDisplayInfo(displayId, false /*external*/, width, height, orientation);
14265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mConfig.setDisplayInfo(displayId, true /*external*/, width, height, orientation);
143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void addExcludedDeviceName(const String8& deviceName) {
146214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        mConfig.excludedDeviceNames.push(deviceName);
147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
14983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) {
15083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mPointerControllers.add(deviceId, controller);
15183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
15283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
15365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    const InputReaderConfiguration* getReaderConfiguration() const {
15465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        return &mConfig;
155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
157af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    const Vector<InputDeviceInfo>& getInputDevices() const {
158af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        return mInputDevices;
159af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    }
160af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
16165fd251c3913fc921468a3dad190810db19eb9dfJeff Brownprivate:
162214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) {
163214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        *outConfig = mConfig;
164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
16583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
16683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) {
16783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        return mPointerControllers.valueFor(deviceId);
16883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
169af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
170af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) {
171af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mInputDevices = inputDevices;
172af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    }
1736ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown
1746ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    virtual sp<KeyCharacterMap> getKeyboardLayout(const String8& inputDeviceDescriptor) {
1756ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        return NULL;
1766ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    }
177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
180be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown// --- FakeInputListener ---
181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
182be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownclass FakeInputListener : public InputListenerInterface {
183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate:
184be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue;
18565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue;
186be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    List<NotifyKeyArgs> mNotifyKeyArgsQueue;
187be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    List<NotifyMotionArgs> mNotifyMotionArgsQueue;
188be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    List<NotifySwitchArgs> mNotifySwitchArgsQueue;
189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
191be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual ~FakeInputListener() { }
192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic:
194be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    FakeInputListener() {
195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
197be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void assertNotifyConfigurationChangedWasCalled(
198be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            NotifyConfigurationChangedArgs* outEventArgs = NULL) {
199be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty())
200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected notifyConfigurationChanged() to have been called.";
201be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (outEventArgs) {
202be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin();
203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
204be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin());
205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
20765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void assertNotifyDeviceResetWasCalled(
20865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            NotifyDeviceResetArgs* outEventArgs = NULL) {
20965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty())
21065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                << "Expected notifyDeviceReset() to have been called.";
21165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        if (outEventArgs) {
21265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            *outEventArgs = *mNotifyDeviceResetArgsQueue.begin();
21365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        }
21465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin());
21565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
21665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
217be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = NULL) {
218be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_FALSE(mNotifyKeyArgsQueue.empty())
219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected notifyKey() to have been called.";
220be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (outEventArgs) {
221be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            *outEventArgs = *mNotifyKeyArgsQueue.begin();
222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
223be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin());
224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void assertNotifyKeyWasNotCalled() {
227be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_TRUE(mNotifyKeyArgsQueue.empty())
228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected notifyKey() to not have been called.";
229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
231be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = NULL) {
232be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_FALSE(mNotifyMotionArgsQueue.empty())
233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected notifyMotion() to have been called.";
234be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (outEventArgs) {
235be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            *outEventArgs = *mNotifyMotionArgsQueue.begin();
236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
237be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin());
238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void assertNotifyMotionWasNotCalled() {
241be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_TRUE(mNotifyMotionArgsQueue.empty())
242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected notifyMotion() to not have been called.";
243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
245be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = NULL) {
246be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_FALSE(mNotifySwitchArgsQueue.empty())
247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected notifySwitch() to have been called.";
248be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (outEventArgs) {
249be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            *outEventArgs = *mNotifySwitchArgsQueue.begin();
250c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
251be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin());
252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
253c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
254c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate:
255be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) {
256be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mNotifyConfigurationChangedArgsQueue.push_back(*args);
2570029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    }
2580029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
25965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) {
26065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mNotifyDeviceResetArgsQueue.push_back(*args);
26165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
26265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
263be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void notifyKey(const NotifyKeyArgs* args) {
264be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mNotifyKeyArgsQueue.push_back(*args);
2657631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown    }
2667631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown
267be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void notifyMotion(const NotifyMotionArgs* args) {
268be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mNotifyMotionArgsQueue.push_back(*args);
269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
271be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void notifySwitch(const NotifySwitchArgs* args) {
272be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mNotifySwitchArgsQueue.push_back(*args);
273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
274c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
275c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
276c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
277c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeEventHub ---
278c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeEventHub : public EventHubInterface {
280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    struct KeyInfo {
281c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        int32_t keyCode;
282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        uint32_t flags;
283c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    };
284c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
285c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    struct Device {
286e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        InputDeviceIdentifier identifier;
287c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        uint32_t classes;
28847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        PropertyMap configuration;
289efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes;
290efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        KeyedVector<int, bool> relativeAxes;
291c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        KeyedVector<int32_t, int32_t> keyCodeStates;
292c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        KeyedVector<int32_t, int32_t> scanCodeStates;
293c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        KeyedVector<int32_t, int32_t> switchStates;
2942717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown        KeyedVector<int32_t, int32_t> absoluteAxisValue;
29549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        KeyedVector<int32_t, KeyInfo> keysByScanCode;
29649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        KeyedVector<int32_t, KeyInfo> keysByUsageCode;
29751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        KeyedVector<int32_t, bool> leds;
2989065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        Vector<VirtualKeyDefinition> virtualKeys;
299c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
300e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        Device(uint32_t classes) :
301e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown                classes(classes) {
302c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
303c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    };
304c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
305c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    KeyedVector<int32_t, Device*> mDevices;
306c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    Vector<String8> mExcludedDevices;
307c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    List<RawEvent> mEvents;
308c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
309c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
310c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual ~FakeEventHub() {
311c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        for (size_t i = 0; i < mDevices.size(); i++) {
312c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            delete mDevices.valueAt(i);
313c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
314c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
315c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
316c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic:
317c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeEventHub() { }
318c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
319c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void addDevice(int32_t deviceId, const String8& name, uint32_t classes) {
320e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        Device* device = new Device(classes);
321e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        device->identifier.name = name;
322c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDevices.add(deviceId, device);
323c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
32449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0);
325c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
326c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
327c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void removeDevice(int32_t deviceId) {
328c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        delete mDevices.valueFor(deviceId);
329c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDevices.removeItem(deviceId);
330c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
33149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0);
332c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
333c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
334c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void finishDeviceScan() {
33549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0);
336c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
337c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
33847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) {
33947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        Device* device = getDevice(deviceId);
34047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        device->configuration.addProperty(key, value);
34147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    }
34247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
34383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) {
34483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        Device* device = getDevice(deviceId);
34583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        device->configuration.addAll(configuration);
34683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
34783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
348efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    void addAbsoluteAxis(int32_t deviceId, int axis,
349b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown            int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) {
350c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
351c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
352c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        RawAbsoluteAxisInfo info;
353c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        info.valid = true;
354c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        info.minValue = minValue;
355c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        info.maxValue = maxValue;
356c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        info.flat = flat;
357c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        info.fuzz = fuzz;
358b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown        info.resolution = resolution;
359efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        device->absoluteAxes.add(axis, info);
360efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    }
361efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
362efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    void addRelativeAxis(int32_t deviceId, int32_t axis) {
363efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        Device* device = getDevice(deviceId);
364efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        device->relativeAxes.add(axis, true);
365c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
366c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
367c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) {
368c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
369c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        device->keyCodeStates.replaceValueFor(keyCode, state);
370c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
371c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
372c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) {
373c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
374c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        device->scanCodeStates.replaceValueFor(scanCode, state);
375c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
376c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
377c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) {
378c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
379c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        device->switchStates.replaceValueFor(switchCode, state);
380c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
381c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3822717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown    void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) {
3832717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown        Device* device = getDevice(deviceId);
3842717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown        device->absoluteAxisValue.replaceValueFor(axis, value);
3852717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown    }
3862717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown
38749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
38849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            int32_t keyCode, uint32_t flags) {
389c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
390c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        KeyInfo info;
391c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        info.keyCode = keyCode;
392c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        info.flags = flags;
39349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        if (scanCode) {
39449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            device->keysByScanCode.add(scanCode, info);
39549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        }
39649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        if (usageCode) {
39749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            device->keysByUsageCode.add(usageCode, info);
39849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        }
399c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
400c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
40151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    void addLed(int32_t deviceId, int32_t led, bool initialState) {
40251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        Device* device = getDevice(deviceId);
40351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        device->leds.add(led, initialState);
40451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    }
40551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
40651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    bool getLedState(int32_t deviceId, int32_t led) {
40751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        Device* device = getDevice(deviceId);
40851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        return device->leds.valueFor(led);
40951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    }
41051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
411c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    Vector<String8>& getExcludedDevices() {
412c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return mExcludedDevices;
413c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
414c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4159065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) {
4169065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        Device* device = getDevice(deviceId);
4179065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        device->virtualKeys.push(definition);
4189065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    }
4199065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
420c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type,
42149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            int32_t code, int32_t value) {
422c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        RawEvent event;
423c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        event.when = when;
424c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        event.deviceId = deviceId;
425c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        event.type = type;
42649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        event.code = code;
427c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        event.value = value;
428c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mEvents.push_back(event);
429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (type == EV_ABS) {
43149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            setAbsoluteAxisValue(deviceId, code, value);
432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        }
433c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
434c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
435c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void assertQueueIsEmpty() {
436c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ASSERT_EQ(size_t(0), mEvents.size())
437c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected the event queue to be empty (fully consumed).";
438c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
439c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
440c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate:
441c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    Device* getDevice(int32_t deviceId) const {
442c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ssize_t index = mDevices.indexOfKey(deviceId);
443c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return index >= 0 ? mDevices.valueAt(index) : NULL;
444c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
445c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
446c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual uint32_t getDeviceClasses(int32_t deviceId) const {
447c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
448c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return device ? device->classes : 0;
449c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
450c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
451e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown    virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const {
452c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
453e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        return device ? device->identifier : InputDeviceIdentifier();
454c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
455c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
45647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const {
45747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        Device* device = getDevice(deviceId);
45847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        if (device) {
45947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown            *outConfiguration = device->configuration;
46047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        }
46147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    }
46247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
463c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis,
464c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            RawAbsoluteAxisInfo* outAxisInfo) const {
465c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
466c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (device) {
467efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            ssize_t index = device->absoluteAxes.indexOfKey(axis);
468c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            if (index >= 0) {
469efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                *outAxisInfo = device->absoluteAxes.valueAt(index);
470c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                return OK;
471c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            }
472c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
473c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return -1;
474c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
475c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
476cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    virtual bool hasRelativeAxis(int32_t deviceId, int axis) const {
477efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        Device* device = getDevice(deviceId);
478efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        if (device) {
479efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return device->relativeAxes.indexOfKey(axis) >= 0;
480efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
481cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown        return false;
482cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown    }
483cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown
48480fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown    virtual bool hasInputProperty(int32_t deviceId, int property) const {
48580fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown        return false;
48680fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown    }
48780fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown
48849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    virtual status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode,
489c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t* outKeycode, uint32_t* outFlags) const {
490c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
491c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (device) {
492cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown            const KeyInfo* key = getKey(device, scanCode, usageCode);
49349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            if (key) {
494c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                if (outKeycode) {
49549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                    *outKeycode = key->keyCode;
496c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                }
497c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                if (outFlags) {
49849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                    *outFlags = key->flags;
499c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                }
500c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                return OK;
501c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            }
502c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
503c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return NAME_NOT_FOUND;
504c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
505c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
506cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown    const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const {
507cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown        if (usageCode) {
508cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown            ssize_t index = device->keysByUsageCode.indexOfKey(usageCode);
509cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown            if (index >= 0) {
510cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown                return &device->keysByUsageCode.valueAt(index);
511cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown            }
512cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown        }
513cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown        if (scanCode) {
514cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown            ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
515cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown            if (index >= 0) {
516cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown                return &device->keysByScanCode.valueAt(index);
517cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown            }
518cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown        }
519cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown        return NULL;
520cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown    }
521cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown
52249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    virtual status_t mapAxis(int32_t deviceId, int32_t scanCode,
5238529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            AxisInfo* outAxisInfo) const {
5246f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        return NAME_NOT_FOUND;
5256f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
5266f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
5271a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    virtual void setExcludedDevices(const Vector<String8>& devices) {
5281a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        mExcludedDevices = devices;
529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
531b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown    virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) {
532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (mEvents.empty()) {
533b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown            return 0;
534c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
535c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
536b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown        *buffer = *mEvents.begin();
537c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mEvents.erase(mEvents.begin());
538b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown        return 1;
539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const {
542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (device) {
544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ssize_t index = device->scanCodeStates.indexOfKey(scanCode);
545c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            if (index >= 0) {
546c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                return device->scanCodeStates.valueAt(index);
547c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            }
548c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
549c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return AKEY_STATE_UNKNOWN;
550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const {
553c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
554c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (device) {
555c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ssize_t index = device->keyCodeStates.indexOfKey(keyCode);
556c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            if (index >= 0) {
557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                return device->keyCodeStates.valueAt(index);
558c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            }
559c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return AKEY_STATE_UNKNOWN;
561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
562c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const {
564c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
565c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (device) {
566c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ssize_t index = device->switchStates.indexOfKey(sw);
567c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            if (index >= 0) {
568c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                return device->switchStates.valueAt(index);
569c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            }
570c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
571c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return AKEY_STATE_UNKNOWN;
572c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
573c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
5742717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown    virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis,
5752717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown            int32_t* outValue) const {
5762717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown        Device* device = getDevice(deviceId);
5772717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown        if (device) {
5782717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown            ssize_t index = device->absoluteAxisValue.indexOfKey(axis);
5792717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown            if (index >= 0) {
5802717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown                *outValue = device->absoluteAxisValue.valueAt(index);
5812717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown                return OK;
5822717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown            }
5832717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown        }
5842717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown        *outValue = 0;
5852717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown        return -1;
5862717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown    }
5872717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown
588c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes,
589c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            uint8_t* outFlags) const {
590c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        bool result = false;
591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        Device* device = getDevice(deviceId);
592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (device) {
593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            for (size_t i = 0; i < numCodes; i++) {
59449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                for (size_t j = 0; j < device->keysByScanCode.size(); j++) {
59549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                    if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) {
59649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                        outFlags[i] = 1;
59749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                        result = true;
59849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                    }
59949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                }
60049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                for (size_t j = 0; j < device->keysByUsageCode.size(); j++) {
60149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown                    if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) {
602c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                        outFlags[i] = 1;
603c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                        result = true;
604c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                    }
605c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                }
606c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            }
607c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
608c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return result;
609c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
610c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
61149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const {
61249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        Device* device = getDevice(deviceId);
61349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        if (device) {
61449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            ssize_t index = device->keysByScanCode.indexOfKey(scanCode);
61549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown            return index >= 0;
61649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        }
61749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        return false;
61849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    }
61949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
6207631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown    virtual bool hasLed(int32_t deviceId, int32_t led) const {
62151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        Device* device = getDevice(deviceId);
62251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        return device && device->leds.indexOfKey(led) >= 0;
6237631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown    }
6247631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown
6257631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown    virtual void setLedState(int32_t deviceId, int32_t led, bool on) {
62651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        Device* device = getDevice(deviceId);
62751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        if (device) {
62851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown            ssize_t index = device->leds.indexOfKey(led);
62951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown            if (index >= 0) {
63051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown                device->leds.replaceValueAt(led, on);
63151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown            } else {
63251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown                ADD_FAILURE()
63351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown                        << "Attempted to set the state of an LED that the EventHub declared "
63451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown                        "was not present.  led=" << led;
63551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown            }
63651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        }
6377631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown    }
6387631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown
6399065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    virtual void getVirtualKeyDefinitions(int32_t deviceId,
6409065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown            Vector<VirtualKeyDefinition>& outVirtualKeys) const {
6419065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        outVirtualKeys.clear();
6429065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
6439065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        Device* device = getDevice(deviceId);
6449065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        if (device) {
6459065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown            outVirtualKeys.appendVector(device->virtualKeys);
6469065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        }
6479065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    }
6489065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
6499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const {
6509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return NULL;
6511e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    }
6521e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
6536ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    virtual bool setKeyboardLayoutOverlay(int32_t deviceId, const sp<KeyCharacterMap>& map) {
6546ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        return false;
6556ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    }
6566ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown
657a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void vibrate(int32_t deviceId, nsecs_t duration) {
658a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    }
659a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
660a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void cancelVibrate(int32_t deviceId) {
661a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    }
662a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
66356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    virtual bool isExternal(int32_t deviceId) const {
66456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        return false;
66556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    }
66656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
667c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void dump(String8& dump) {
668c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
6691a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
67089ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    virtual void monitor() {
67189ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    }
67289ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown
67393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown    virtual void requestReopenDevices() {
67493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown    }
67593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown
67693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown    virtual void wake() {
6771a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    }
678c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
679c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
680c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
681c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputReaderContext ---
682c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
683c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputReaderContext : public InputReaderContext {
684c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<EventHubInterface> mEventHub;
685c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<InputReaderPolicyInterface> mPolicy;
686be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    sp<InputListenerInterface> mListener;
687c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t mGlobalMetaState;
688c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    bool mUpdateGlobalMetaStateWasCalled;
689af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    int32_t mGeneration;
690c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
691c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic:
692c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputReaderContext(const sp<EventHubInterface>& eventHub,
693c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            const sp<InputReaderPolicyInterface>& policy,
694be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            const sp<InputListenerInterface>& listener) :
695be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            mEventHub(eventHub), mPolicy(policy), mListener(listener),
696c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            mGlobalMetaState(0) {
697c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
698c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
699c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual ~FakeInputReaderContext() { }
700c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
701c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void assertUpdateGlobalMetaStateWasCalled() {
702c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
703c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected updateGlobalMetaState() to have been called.";
704c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mUpdateGlobalMetaStateWasCalled = false;
705c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
706c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
707c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setGlobalMetaState(int32_t state) {
708c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mGlobalMetaState = state;
709c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
710c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
711c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate:
712c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void updateGlobalMetaState() {
713c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mUpdateGlobalMetaStateWasCalled = true;
714c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
715c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
716c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getGlobalMetaState() {
717c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return mGlobalMetaState;
718c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
719c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
720c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual EventHubInterface* getEventHub() {
721c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return mEventHub.get();
722c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
723c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
724c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual InputReaderPolicyInterface* getPolicy() {
725c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return mPolicy.get();
726c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
728be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual InputListenerInterface* getListener() {
729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        return mListener.get();
730c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
731fe50892af3b365806a767298dfd8e86447682581Jeff Brown
732fe50892af3b365806a767298dfd8e86447682581Jeff Brown    virtual void disableVirtualKeysUntil(nsecs_t time) {
733fe50892af3b365806a767298dfd8e86447682581Jeff Brown    }
734fe50892af3b365806a767298dfd8e86447682581Jeff Brown
735fe50892af3b365806a767298dfd8e86447682581Jeff Brown    virtual bool shouldDropVirtualKey(nsecs_t now,
736fe50892af3b365806a767298dfd8e86447682581Jeff Brown            InputDevice* device, int32_t keyCode, int32_t scanCode) {
737fe50892af3b365806a767298dfd8e86447682581Jeff Brown        return false;
738fe50892af3b365806a767298dfd8e86447682581Jeff Brown    }
73905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
74005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    virtual void fadePointer() {
74105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    }
742aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown
743aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    virtual void requestTimeoutAtTime(nsecs_t when) {
744aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    }
745af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
746af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    virtual int32_t bumpGeneration() {
747af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        return ++mGeneration;
748af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    }
749c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
750c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
751c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
752c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputMapper ---
753c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
754c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputMapper : public InputMapper {
755c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    uint32_t mSources;
756c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t mKeyboardType;
757c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t mMetaState;
758c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    KeyedVector<int32_t, int32_t> mKeyCodeStates;
759c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    KeyedVector<int32_t, int32_t> mScanCodeStates;
760c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    KeyedVector<int32_t, int32_t> mSwitchStates;
761c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    Vector<int32_t> mSupportedKeyCodes;
762c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    RawEvent mLastEvent;
763c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
764c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    bool mConfigureWasCalled;
765c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    bool mResetWasCalled;
766c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    bool mProcessWasCalled;
767c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
768c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic:
769c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper(InputDevice* device, uint32_t sources) :
770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            InputMapper(device),
771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE),
772c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            mMetaState(0),
773c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) {
774c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
775c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual ~FakeInputMapper() { }
777c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setKeyboardType(int32_t keyboardType) {
779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mKeyboardType = keyboardType;
780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
781c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
782c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setMetaState(int32_t metaState) {
783c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mMetaState = metaState;
784c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
785c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
786c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void assertConfigureWasCalled() {
787c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ASSERT_TRUE(mConfigureWasCalled)
788c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected configure() to have been called.";
789c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mConfigureWasCalled = false;
790c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
791c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
792c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void assertResetWasCalled() {
793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ASSERT_TRUE(mResetWasCalled)
794c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected reset() to have been called.";
795c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mResetWasCalled = false;
796c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
798c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void assertProcessWasCalled(RawEvent* outLastEvent = NULL) {
799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ASSERT_TRUE(mProcessWasCalled)
800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                << "Expected process() to have been called.";
801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (outLastEvent) {
802c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            *outLastEvent = mLastEvent;
803c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
804c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mProcessWasCalled = false;
805c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
806c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
807c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setKeyCodeState(int32_t keyCode, int32_t state) {
808c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mKeyCodeStates.replaceValueFor(keyCode, state);
809c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setScanCodeState(int32_t scanCode, int32_t state) {
812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mScanCodeStates.replaceValueFor(scanCode, state);
813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
814c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setSwitchState(int32_t switchCode, int32_t state) {
816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mSwitchStates.replaceValueFor(switchCode, state);
817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void addSupportedKeyCode(int32_t keyCode) {
820c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mSupportedKeyCodes.add(keyCode);
821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate:
824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual uint32_t getSources() {
825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return mSources;
826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
827c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) {
829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        InputMapper::populateDeviceInfo(deviceInfo);
830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) {
832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            deviceInfo->setKeyboardType(mKeyboardType);
833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
835c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
83665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void configure(nsecs_t when,
83765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            const InputReaderConfiguration* config, uint32_t changes) {
838c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mConfigureWasCalled = true;
839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
840c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
84165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void reset(nsecs_t when) {
842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mResetWasCalled = true;
843c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void process(const RawEvent* rawEvent) {
846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mLastEvent = *rawEvent;
847c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mProcessWasCalled = true;
848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
849c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) {
851c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ssize_t index = mKeyCodeStates.indexOfKey(keyCode);
852c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
853c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
855c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) {
856c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ssize_t index = mScanCodeStates.indexOfKey(scanCode);
857c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN;
858c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
860c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode) {
861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ssize_t index = mSwitchStates.indexOfKey(switchCode);
862c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN;
863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            const int32_t* keyCodes, uint8_t* outFlags) {
867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        bool result = false;
868c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        for (size_t i = 0; i < numCodes; i++) {
869c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) {
870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                if (keyCodes[i] == mSupportedKeyCodes[j]) {
871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                    outFlags[i] = 1;
872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                    result = true;
873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown                }
874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            }
875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return result;
877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getMetaState() {
880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return mMetaState;
881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
88205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
88305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    virtual void fadePointer() {
88405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    }
885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
886c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
887c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
888c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InstrumentedInputReader ---
889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
890c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InstrumentedInputReader : public InputReader {
891c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputDevice* mNextDevice;
892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
893c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic:
894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InstrumentedInputReader(const sp<EventHubInterface>& eventHub,
895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            const sp<InputReaderPolicyInterface>& policy,
896be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            const sp<InputListenerInterface>& listener) :
897be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            InputReader(eventHub, policy, listener),
89871c86ada9f00334b2967d24d4182dc324cd97605Jeff Brown            mNextDevice(NULL) {
899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual ~InstrumentedInputReader() {
902c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (mNextDevice) {
903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            delete mNextDevice;
904c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
905c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
907c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void setNextDevice(InputDevice* device) {
908c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mNextDevice = device;
909c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
910c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
9119ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown    InputDevice* newDevice(int32_t deviceId, const String8& name, uint32_t classes) {
912e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        InputDeviceIdentifier identifier;
913e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        identifier.name = name;
914af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        int32_t generation = deviceId + 1;
915af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        return new InputDevice(&mContext, deviceId, generation, identifier, classes);
916be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
917be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
918c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
919be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual InputDevice* createDeviceLocked(int32_t deviceId,
920e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown            const InputDeviceIdentifier& identifier, uint32_t classes) {
921c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        if (mNextDevice) {
922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            InputDevice* device = mNextDevice;
923c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            mNextDevice = NULL;
924c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            return device;
925c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        }
926e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        return InputReader::createDeviceLocked(deviceId, identifier, classes);
927c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
928c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
929c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    friend class InputReaderTest;
930c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
931c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
932c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
933c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputReaderTest ---
934c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
935c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputReaderTest : public testing::Test {
936c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
937be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    sp<FakeInputListener> mFakeListener;
938c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeInputReaderPolicy> mFakePolicy;
939c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeEventHub> mFakeEventHub;
940c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<InstrumentedInputReader> mReader;
941c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
942c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void SetUp() {
943c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub = new FakeEventHub();
944c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy = new FakeInputReaderPolicy();
945be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeListener = new FakeInputListener();
946c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
947be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener);
948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
949c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
950c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void TearDown() {
951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mReader.clear();
952c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
953be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeListener.clear();
954c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy.clear();
955c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub.clear();
956c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
957c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
95883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    void addDevice(int32_t deviceId, const String8& name, uint32_t classes,
95983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            const PropertyMap* configuration) {
960c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub->addDevice(deviceId, name, classes);
96165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
96283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        if (configuration) {
96383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            mFakeEventHub->addConfigurationMap(deviceId, configuration);
96483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        }
965c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub->finishDeviceScan();
966c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mReader->loopOnce();
967c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mReader->loopOnce();
968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub->assertQueueIsEmpty();
969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
970c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId,
97283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            const String8& name, uint32_t classes, uint32_t sources,
97383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            const PropertyMap* configuration) {
9749ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown        InputDevice* device = mReader->newDevice(deviceId, name, classes);
975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        FakeInputMapper* mapper = new FakeInputMapper(device, sources);
976c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        device->addMapper(mapper);
977c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mReader->setNextDevice(device);
97883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        addDevice(deviceId, name, classes, configuration);
979c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return mapper;
980c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
981c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
982c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
983c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenNoDevices_ReturnsDefaults) {
984c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputConfiguration config;
985c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mReader->getInputConfiguration(&config);
986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
987c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
989c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
990c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
991c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
992c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenAlphabeticKeyboardPresent_ReturnsQwertyKeyboard) {
993c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("keyboard"),
99483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY, NULL));
995c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputConfiguration config;
997c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mReader->getInputConfiguration(&config);
998c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
999c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::KEYBOARD_QWERTY, config.keyboard);
1000c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
1001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
1002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1003c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenTouchScreenPresent_ReturnsFingerTouchScreen) {
100558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    PropertyMap configuration;
100658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    configuration.addProperty(String8("touch.deviceType"), String8("touchScreen"));
1007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("touchscreen"),
100858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown            INPUT_DEVICE_CLASS_TOUCH, &configuration));
1009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1010c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputConfiguration config;
1011c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mReader->getInputConfiguration(&config);
1012c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1013c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
1014c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
1015c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::TOUCHSCREEN_FINGER, config.touchScreen);
1016c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1017c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
101858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenTouchPadPresent_ReturnsFingerNoTouch) {
101958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("touchpad"),
102058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown            INPUT_DEVICE_CLASS_TOUCH, NULL));
102158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown
102258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    InputConfiguration config;
102358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    mReader->getInputConfiguration(&config);
102458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown
102558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
102658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
102758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
102858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown}
102958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown
103083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenMousePresent_ReturnsNoNavigation) {
1031b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    sp<FakePointerController> controller = new FakePointerController();
1032b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    mFakePolicy->setPointerController(0, controller);
1033b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
103483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    PropertyMap configuration;
103583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    configuration.addProperty(String8("cursor.mode"), String8("pointer"));
103683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("mouse"),
103783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_CURSOR, &configuration));
103883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
103983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    InputConfiguration config;
104083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    mReader->getInputConfiguration(&config);
104183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
104283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
104383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation);
104483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
104583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown}
104683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
1047c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenTrackballPresent_ReturnsTrackballNavigation) {
104883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    PropertyMap configuration;
104983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    configuration.addProperty(String8("cursor.mode"), String8("navigation"));
1050c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("trackball"),
105183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_CURSOR, &configuration));
1052c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1053c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputConfiguration config;
1054c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mReader->getInputConfiguration(&config);
1055c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
1057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::NAVIGATION_TRACKBALL, config.navigation);
1058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
1059c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenDPadPresent_ReturnsDPadNavigation) {
1062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("dpad"),
106383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_DPAD, NULL));
1064c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1065c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputConfiguration config;
1066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mReader->getInputConfiguration(&config);
1067c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard);
1069c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::NAVIGATION_DPAD, config.navigation);
1070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen);
1071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1073af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff BrownTEST_F(InputReaderTest, GetInputDevices) {
1074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"),
107583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_KEYBOARD, NULL));
1076af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("ignored"),
1077af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown            0, NULL)); // no classes so device will be ignored
1078af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
1079af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    Vector<InputDeviceInfo> inputDevices;
1080af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    mReader->getInputDevices(inputDevices);
1081af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
1082af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(1U, inputDevices.size());
1083af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(1, inputDevices[0].getId());
1084af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_STREQ("keyboard", inputDevices[0].getName().string());
1085af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1086af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1087af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1088af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
1089af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    // Should also have received a notification describing the new input devices.
1090af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    inputDevices = mFakePolicy->getInputDevices();
1091af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(1U, inputDevices.size());
1092af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(1, inputDevices[0].getId());
1093af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_STREQ("keyboard", inputDevices[0].getName().string());
1094af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType());
1095af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources());
1096af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size());
1097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1098c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1099c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) {
1100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper* mapper = NULL;
1101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
110283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0,
1106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_ANY, AKEYCODE_A))
1107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is >= 0 but unknown.";
1108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1,
1110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1,
1114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1,
1118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1,
1122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) {
1127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper* mapper = NULL;
1128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
112983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN);
1131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0,
1133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_ANY, KEY_A))
1134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is >= 0 but unknown.";
1135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1,
1137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_TRACKBALL, KEY_A))
1138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1,
1141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1,
1145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_TRACKBALL, KEY_A))
1146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1,
1149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A))
1150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) {
1154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper* mapper = NULL;
1155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
115683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN);
1158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0,
1160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_ANY, SW_LID))
1161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is >= 0 but unknown.";
1162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1,
1164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_TRACKBALL, SW_LID))
1165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is valid but the sources are not supported by the device.";
1166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1,
1168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1,
1172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_TRACKBALL, SW_LID))
1173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown when the device id is < 0 but the sources are not supported by any device.";
1174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1,
1176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID))
1177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) {
1181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper* mapper = NULL;
1182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
118383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper->addSupportedKeyCode(AKEYCODE_A);
1185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper->addSupportedKeyCode(AKEYCODE_B);
1186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    uint8_t flags[4] = { 0, 0, 0, 1 };
1189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags))
1191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return false when device id is >= 0 but unknown.";
1192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    flags[3] = 1;
1195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return false when device id is valid but the sources are not supported by the device.";
1197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    flags[3] = 1;
1200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return value provided by mapper when device id is valid and the device supports some of the sources.";
1202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    flags[3] = 1;
1205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return false when the device id is < 0 but the sources are not supported by any device.";
1207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]);
1208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    flags[3] = 1;
1210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources.";
1212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]);
1213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) {
121683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD, NULL);
1217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1218be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyConfigurationChangedArgs args;
1219be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
1220be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args));
1221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) {
1225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper* mapper = NULL;
1226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"),
122783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL));
1228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
122949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1);
1230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mReader->loopOnce();
1231c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty());
1232c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    RawEvent event;
1234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event));
1235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, event.when);
1236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, event.deviceId);
1237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(EV_KEY, event.type);
123849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(KEY_A, event.code);
1239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, event.value);
1240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputDeviceTest ---
1244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputDeviceTest : public testing::Test {
1246c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
1247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const char* DEVICE_NAME;
1248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t DEVICE_ID;
1249af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    static const int32_t DEVICE_GENERATION;
12509ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown    static const uint32_t DEVICE_CLASSES;
1251c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeEventHub> mFakeEventHub;
1253c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeInputReaderPolicy> mFakePolicy;
1254be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    sp<FakeInputListener> mFakeListener;
1255c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputReaderContext* mFakeContext;
1256c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1257c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputDevice* mDevice;
1258c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1259c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void SetUp() {
1260c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub = new FakeEventHub();
1261c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy = new FakeInputReaderPolicy();
1262be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeListener = new FakeInputListener();
1263be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
126549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
1266e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        InputDeviceIdentifier identifier;
1267e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        identifier.name = DEVICE_NAME;
1268af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1269af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown                identifier, DEVICE_CLASSES);
1270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1272c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void TearDown() {
1273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        delete mDevice;
1274c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1275c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        delete mFakeContext;
1276be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeListener.clear();
1277c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy.clear();
1278c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub.clear();
1279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
1281c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst char* InputDeviceTest::DEVICE_NAME = "device";
1283c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t InputDeviceTest::DEVICE_ID = 1;
1284af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brownconst int32_t InputDeviceTest::DEVICE_GENERATION = 2;
12859ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brownconst uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD
12869ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown        | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK;
1287c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1288c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, ImmutableProperties) {
1289c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, mDevice->getId());
1290c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_STREQ(DEVICE_NAME, mDevice->getName());
12919ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown    ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses());
1292c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1293c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1294c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) {
1295c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Configuration.
1296474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    InputReaderConfiguration config;
129765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    mDevice->configure(ARBITRARY_TIME, &config, 0);
129865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
129965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // Reset.
130065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    mDevice->reset(ARBITRARY_TIME);
130165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
130265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    NotifyDeviceResetArgs resetArgs;
130365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
130465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
130565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
1306c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1307c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Metadata.
1308c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(mDevice->isIgnored());
1309c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources());
1310c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1311c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputDeviceInfo info;
1312c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mDevice->getDeviceInfo(&info);
1313c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, info.getId());
1314c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_STREQ(DEVICE_NAME, info.getName().string());
1315c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType());
1316c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources());
1317c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1318c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // State queries.
1319c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, mDevice->getMetaState());
1320c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1321c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1322c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Ignored device should return unknown key code state.";
1323c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0))
1324c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Ignored device should return unknown scan code state.";
1325c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0))
1326c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Ignored device should return unknown switch state.";
1327c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1328c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1329c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    uint8_t flags[2] = { 0, 1 };
1330c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags))
1331c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Ignored device should never mark any key codes.";
1332c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged.";
1333c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged.";
1334c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1335c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1336c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) {
1337c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Configuration.
133847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value"));
1339c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1340c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD);
1341c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1342c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->setMetaState(AMETA_ALT_ON);
1343c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->addSupportedKeyCode(AKEYCODE_A);
1344c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->addSupportedKeyCode(AKEYCODE_B);
1345c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN);
1346c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP);
1347c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->setScanCodeState(2, AKEY_STATE_DOWN);
1348c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->setScanCodeState(3, AKEY_STATE_UP);
1349c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper1->setSwitchState(4, AKEY_STATE_DOWN);
1350c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mDevice->addMapper(mapper1);
1351c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1352c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN);
1353c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper2->setMetaState(AMETA_SHIFT_ON);
1354c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mDevice->addMapper(mapper2);
1355c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1356474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    InputReaderConfiguration config;
135765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    mDevice->configure(ARBITRARY_TIME, &config, 0);
1358c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1359c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    String8 propertyValue;
136047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue))
136147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown            << "Device should have read configuration during configuration phase.";
1362c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_STREQ("value", propertyValue.string());
1363c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1364c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled());
1365c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled());
1366c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
136765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // Reset
136865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    mDevice->reset(ARBITRARY_TIME);
136965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled());
137065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled());
137165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
137265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    NotifyDeviceResetArgs resetArgs;
137365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
137465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
137565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);
137665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
1377c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Metadata.
1378c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_FALSE(mDevice->isIgnored());
1379c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources());
1380c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1381c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputDeviceInfo info;
1382c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mDevice->getDeviceInfo(&info);
1383c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, info.getId());
1384c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_STREQ(DEVICE_NAME, info.getName().string());
1385c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType());
1386c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources());
1387c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1388c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // State queries.
1389c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState())
1390c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should query mappers and combine meta states.";
1391c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1392c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1393c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown key code state when source not supported.";
1394c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1395c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown scan code state when source not supported.";
1396c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A))
1397c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should return unknown switch state when source not supported.";
1398c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1399c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A))
1400c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should query mapper when source is supported.";
1401c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3))
1402c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should query mapper when source is supported.";
1403c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4))
1404c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should query mapper when source is supported.";
1405c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1406c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 };
1407c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    uint8_t flags[4] = { 0, 0, 0, 1 };
1408c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags))
1409c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should do nothing when source is unsupported.";
1410c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported.";
1411c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported.";
1412c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported.";
1413c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported.";
1414c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1415c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags))
1416c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should query mapper when source is supported.";
1417c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set.";
1418c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set.";
1419c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged.";
1420c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged.";
1421c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1422c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Event handling.
1423c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    RawEvent event;
1424b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown    mDevice->process(&event, 1);
1425c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1426c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled());
1427c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled());
1428c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1429c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1430c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1431c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputMapperTest ---
1432c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1433c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputMapperTest : public testing::Test {
1434c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
1435c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const char* DEVICE_NAME;
1436c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t DEVICE_ID;
1437af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    static const int32_t DEVICE_GENERATION;
14389ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown    static const uint32_t DEVICE_CLASSES;
1439c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1440c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeEventHub> mFakeEventHub;
1441c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeInputReaderPolicy> mFakePolicy;
1442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    sp<FakeInputListener> mFakeListener;
1443c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputReaderContext* mFakeContext;
1444c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputDevice* mDevice;
1445c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1446c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void SetUp() {
1447c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub = new FakeEventHub();
1448c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy = new FakeInputReaderPolicy();
1449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeListener = new FakeInputListener();
1450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener);
1451e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        InputDeviceIdentifier identifier;
1452e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        identifier.name = DEVICE_NAME;
1453af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION,
1454af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown                identifier, DEVICE_CLASSES);
1455c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1456c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0);
1457c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1458c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1459c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void TearDown() {
1460c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        delete mDevice;
1461c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        delete mFakeContext;
1462be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeListener.clear();
1463c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy.clear();
1464c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakeEventHub.clear();
1465c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1466c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
146747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    void addConfigurationProperty(const char* key, const char* value) {
146847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8(key), String8(value));
1469c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1470c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1471c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void addMapperAndConfigure(InputMapper* mapper) {
1472c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDevice->addMapper(mapper);
147365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 0);
147465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mDevice->reset(ARBITRARY_TIME);
147565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
147665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
147765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
147865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            int32_t orientation) {
147965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mFakePolicy->setDisplayInfo(displayId, width, height, orientation);
148065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(),
148165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                InputReaderConfiguration::CHANGE_DISPLAY_INFO);
1482c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1483c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1484c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type,
148549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            int32_t code, int32_t value) {
1486c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        RawEvent event;
1487c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        event.when = when;
1488c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        event.deviceId = deviceId;
1489c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        event.type = type;
149049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown        event.code = code;
1491c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        event.value = value;
1492c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mapper->process(&event);
1493c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1494c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1495c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static void assertMotionRange(const InputDeviceInfo& info,
1496efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) {
1497efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source);
1498efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        ASSERT_TRUE(range != NULL) << "Axis: " << axis << " Source: " << source;
1499efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source;
1500efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source;
1501efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source;
1502efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source;
1503efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source;
1504efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source;
1505c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1506c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1507c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static void assertPointerCoords(const PointerCoords& coords,
1508c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            float x, float y, float pressure, float size,
1509c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            float touchMajor, float touchMinor, float toolMajor, float toolMinor,
1510be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            float orientation, float distance) {
1511ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1);
1512ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
1513ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON);
1514ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON);
1515ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1);
1516ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1);
1517ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1);
1518ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1);
1519ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON);
1520be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON);
1521be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
1522be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
1523be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    static void assertPosition(const sp<FakePointerController>& controller, float x, float y) {
1524be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        float actualX, actualY;
1525be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        controller->getPosition(&actualX, &actualY);
1526be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_NEAR(x, actualX, 1);
1527be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ASSERT_NEAR(y, actualY, 1);
1528c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
1529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
1530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst char* InputMapperTest::DEVICE_NAME = "device";
1532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t InputMapperTest::DEVICE_ID = 1;
1533af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brownconst int32_t InputMapperTest::DEVICE_GENERATION = 2;
15349ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brownconst uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests
1535c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1536c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1537c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- SwitchInputMapperTest ---
1538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass SwitchInputMapperTest : public InputMapperTest {
1540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
1541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
1542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, GetSources) {
1544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1545c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1546c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
154789de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown    ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources());
1548c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1549c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, GetSwitchState) {
1551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1553c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1554c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1);
1555c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1556c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0);
1558c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID));
1559c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, Process) {
1562c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    SwitchInputMapper* mapper = new SwitchInputMapper(mDevice);
1563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1564c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
156549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 1);
1566c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1567be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifySwitchArgs args;
1568be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args));
1569be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1570c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(SW_LID, args.switchCode);
1571c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, args.switchValue);
1572c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), args.policyFlags);
1573c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1574c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1575c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1576c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- KeyboardInputMapperTest ---
1577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass KeyboardInputMapperTest : public InputMapperTest {
1579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
1580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void testDPadKeyRotation(KeyboardInputMapper* mapper,
1581c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode);
1582c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
1583c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1584c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper,
1585c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) {
1586be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs args;
1587c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
158849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 1);
1589be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1590c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(originalScanCode, args.scanCode);
1592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(rotatedKeyCode, args.keyCode);
1593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
159449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 0);
1595be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1596c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1597c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(originalScanCode, args.scanCode);
1598c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(rotatedKeyCode, args.keyCode);
1599c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1600c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1601c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1602c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetSources) {
160347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1604c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1605c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1606c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1607c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources());
1608c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1609c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1610c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) {
161149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    const int32_t USAGE_A = 0x070004;
161249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    const int32_t USAGE_UNKNOWN = 0x07ffff;
161349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
161449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE);
161549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
161647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1617c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1618c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1619c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
162049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    // Key down by scan code.
1621c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
162249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_HOME, 1);
1623be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs args;
1624be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1625c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
1626c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1627c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
1628c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1629c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1630c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(KEY_HOME, args.scanCode);
1631c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_NONE, args.metaState);
1632c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1633c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1634c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1635c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
163649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    // Key up by scan code.
1637c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
163849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_HOME, 0);
1639be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1640c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
1641c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
1642c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
1643c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1644c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
1645c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(KEY_HOME, args.scanCode);
1646c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_NONE, args.metaState);
1647c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
1648c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
1649c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
165049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
165149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    // Key down by usage code.
165249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
165349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_MSC, MSC_SCAN, USAGE_A);
165449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
165549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, 0, 1);
165649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
165749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
165849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
165949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
166049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
166149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEYCODE_A, args.keyCode);
166249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(0, args.scanCode);
166349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AMETA_NONE, args.metaState);
166449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
166549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
166649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
166749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
166849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    // Key up by usage code.
166949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
167049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_MSC, MSC_SCAN, USAGE_A);
167149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
167249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, 0, 0);
167349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
167449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
167549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
167649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
167749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
167849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEYCODE_A, args.keyCode);
167949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(0, args.scanCode);
168049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AMETA_NONE, args.metaState);
168149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
168249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags);
168349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
168449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
168549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    // Key down with unknown scan code or usage code.
168649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
168749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
168849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
168949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_UNKNOWN, 1);
169049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
169149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
169249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
169349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
169449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
169549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(0, args.keyCode);
169649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
169749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AMETA_NONE, args.metaState);
169849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
169949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(0U, args.policyFlags);
170049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
170149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
170249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    // Key up with unknown scan code or usage code.
170349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
170449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_MSC, MSC_SCAN, USAGE_UNKNOWN);
170549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
170649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_UNKNOWN, 0);
170749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
170849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
170949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
171049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
171149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
171249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(0, args.keyCode);
171349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(KEY_UNKNOWN, args.scanCode);
171449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AMETA_NONE, args.metaState);
171549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags);
171649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(0U, args.policyFlags);
171749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
1718c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1719c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1720c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) {
172149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0);
172249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
172349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
172447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1725c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1726c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1728c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Initial metastate.
1729c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1730c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1731c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Metakey down.
1732c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
173349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_LEFTSHIFT, 1);
1734be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs args;
1735be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1736c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1737c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1738c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1739c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1740c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Key down.
1741c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    process(mapper, ARBITRARY_TIME + 1, DEVICE_ID,
174249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_A, 1);
1743be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1744c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1745c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1746c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1747c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Key up.
1748c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    process(mapper, ARBITRARY_TIME + 2, DEVICE_ID,
174949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_A, 0);
1750be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1751c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
1752c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState());
1753c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1754c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Metakey up.
1755c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    process(mapper, ARBITRARY_TIME + 3, DEVICE_ID,
175649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_LEFTSHIFT, 0);
1757be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1758c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_NONE, args.metaState);
1759c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
1760c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled());
1761c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1762c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
176347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) {
176449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
176549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
176649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
176749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
176849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
176947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1772c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
177365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
177447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT,
1775b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_ORIENTATION_90);
1776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1777c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
1778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
1780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1781c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
1782c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1783c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
1784c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1785c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
178647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) {
178749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0);
178849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0);
178949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0);
179049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0);
179149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
179247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
179447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    addConfigurationProperty("keyboard.orientationAware", "1");
1795c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1796c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
179765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
1798c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT,
1799b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_ORIENTATION_0);
1800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP));
1802c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1803c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT));
1804c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1805c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN));
1806c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1807c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT));
1808c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
180965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
1810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT,
1811b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_ORIENTATION_90);
1812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT));
1814c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP));
1816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT));
1818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN));
1820c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
182165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
1822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT,
1823b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_ORIENTATION_180);
1824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN));
1826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1827c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT));
1828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP));
1830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT));
1832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
183365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
1834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT,
1835b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_ORIENTATION_270);
1836c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT));
1838c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN));
1840c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT));
1842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper,
1843c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP));
1844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Special case: if orientation changes while key is down, we still emit the same keycode
1846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // in the key up as we did in the key down.
1847be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs args;
1848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
184965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
1850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT,
1851b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_ORIENTATION_270);
185249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1);
1853be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
1855c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(KEY_UP, args.scanCode);
1856c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1857c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
185865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
1859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT,
1860b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_ORIENTATION_180);
186149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0);
1862be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
1863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
1864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(KEY_UP, args.scanCode);
1865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode);
1866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1868c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetKeyCodeState) {
186947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1);
1874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
1875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0);
1877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
1878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetScanCodeState) {
188147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1883c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1884c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1);
1886c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
1887c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1888c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0);
1889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
1890c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1891c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) {
189347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
1894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
1895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
1896c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
189749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0);
1898c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
1899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B };
1900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    uint8_t flags[2] = { 0, 0 };
1901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags));
1902c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(flags[0]);
1903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_FALSE(flags[1]);
1904c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
1905c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
190651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff BrownTEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) {
190751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/);
190851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/);
190951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/);
191049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0);
191149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0);
191249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0);
191351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
191447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice,
191551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown            AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC);
191651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    addMapperAndConfigure(mapper);
191751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
191851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    // Initialization should have turned all of the lights off.
191951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
192051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
192151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
192251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
192351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    // Toggle caps lock on.
192451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
192549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_CAPSLOCK, 1);
192651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
192749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_CAPSLOCK, 0);
192851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
192951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
193051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
193151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState());
193251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
193351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    // Toggle num lock on.
193451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
193549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_NUMLOCK, 1);
193651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
193749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_NUMLOCK, 0);
193851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
193951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
194051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
194151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState());
194251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
194351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    // Toggle caps lock off.
194451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
194549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_CAPSLOCK, 1);
194651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
194749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_CAPSLOCK, 0);
194851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
194951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
195051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
195151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState());
195251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
195351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    // Toggle scroll lock on.
195451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
195549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_SCROLLLOCK, 1);
195651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
195749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_SCROLLLOCK, 0);
195851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
195951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
196051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
196151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
196251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
196351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    // Toggle num lock off.
196451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
196549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_NUMLOCK, 1);
196651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
196749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_NUMLOCK, 0);
196851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
196951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
197051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
197151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState());
197251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
197351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    // Toggle scroll lock off.
197451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
197549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_SCROLLLOCK, 1);
197651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID,
197749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown            EV_KEY, KEY_SCROLLLOCK, 0);
197851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL));
197951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML));
198051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL));
198151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    ASSERT_EQ(AMETA_NONE, mapper->getMetaState());
198251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown}
198351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown
1984c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
198583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown// --- CursorInputMapperTest ---
1986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
198783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownclass CursorInputMapperTest : public InputMapperTest {
1988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
1989c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t TRACKBALL_MOVEMENT_THRESHOLD;
1990c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
199183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    sp<FakePointerController> mFakePointerController;
199283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
199383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    virtual void SetUp() {
199483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        InputMapperTest::SetUp();
199583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
199683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mFakePointerController = new FakePointerController();
199783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController);
199883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    }
199983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
200083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    void testMotionRotation(CursorInputMapper* mapper,
2001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY);
2002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
2003c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
200483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownconst int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6;
2005c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
200683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownvoid CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper,
2007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) {
2008be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
2009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
201049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, originalX);
201149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, originalY);
201249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2013be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2014c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2015c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2016c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD,
2017c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD,
2018be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2019c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2020c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
202183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) {
202283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
202383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "pointer");
202483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addMapperAndConfigure(mapper);
202583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
202683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
202783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown}
202883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
202983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) {
203083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
203183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "navigation");
2032c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2033c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2034c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources());
2035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
203783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) {
203883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
203983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "pointer");
204083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addMapperAndConfigure(mapper);
204183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
204283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    InputDeviceInfo info;
204383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    mapper->populateDeviceInfo(&info);
204483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
204583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    // Initially there may not be a valid motion range.
2046efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE));
2047efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE));
2048efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2049efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f));
205083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
205183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    // When the bounds are set, then there should be a valid motion range.
20529626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1);
205383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
205483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    InputDeviceInfo info2;
205583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    mapper->populateDeviceInfo(&info2);
205683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
2057efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2058efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE,
20599626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown            1, 800 - 1, 0.0f, 0.0f));
2060efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2061efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE,
20629626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown            2, 480 - 1, 0.0f, 0.0f));
2063efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2,
2064efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE,
2065b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            0.0f, 1.0f, 0.0f, 0.0f));
206683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown}
206783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
206883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) {
206983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
207083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "navigation");
2071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    InputDeviceInfo info;
2074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mapper->populateDeviceInfo(&info);
2075c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2076efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2077efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL,
2078c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2079efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2080efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL,
2081c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD));
2082efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertMotionRange(info,
2083efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL,
2084b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            0.0f, 1.0f, 0.0f, 0.0f));
2085c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2086c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
208783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) {
208883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
208983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "navigation");
2090c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2091c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2093c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2094be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
2095c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Button press.
2097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Mostly testing non x/y behavior here so we don't need to check again elsewhere.
209849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
209949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2100be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
2103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), args.policyFlags);
2105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, args.flags);
2107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2108fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState);
2109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, args.edgeFlags);
2110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(1), args.pointerCount);
2111fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, args.pointerProperties[0].id);
2112fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2114be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Button release.  Should have same down time.
212049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
212149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2122be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime);
2124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
2125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source);
2126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), args.policyFlags);
2127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, args.flags);
2129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2130fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, args.buttonState);
2131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, args.edgeFlags);
2132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(1), args.pointerCount);
2133fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, args.pointerProperties[0].id);
2134fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType);
2135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2136be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision);
2138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision);
2139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
214283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) {
214383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
214483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "navigation");
2145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2147be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
2148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Motion in X but not Y.
215049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
215149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2152be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2155be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Motion in Y but not X.
215849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
215949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2160be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2163be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
216683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) {
216783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
216883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "navigation");
2169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2171be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
2172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2173be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Button press.
217449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
217549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2176be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2179be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2181be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Button release.
218249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
218349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2184be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2187be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
219083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) {
219183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
219283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "navigation");
2193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2195be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
2196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Combined X, Y and Button.
219849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1);
219949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2);
220049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1);
220149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2202be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
2204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2206be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Move X, Y a bit while pressed.
220949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 2);
221049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 1);
221149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2212be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
2214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD,
2216be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Release Button.
221949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0);
222049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2221be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action);
2223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2224be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
222783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) {
222883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
222983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "navigation");
2230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2231c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
223265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
223347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT,
2234b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_ORIENTATION_90);
2235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0,  1));
2236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1,  1));
2237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  1,  0));
2238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1, -1));
2239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0, -1));
2240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0, -1,  0));
2242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1,  1));
2243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
224583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) {
224683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
224783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.mode", "navigation");
224883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    addConfigurationProperty("cursor.orientationAware", "1");
2249c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2250c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
225165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
2252b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0);
2253c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0,  1));
2254c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1,  1));
2255c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  1,  0));
2256c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1, -1));
2257c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0, -1));
2258c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1));
2259c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0, -1,  0));
2260c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1,  1));
2261c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
226265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
2263b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_90);
2264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  1,  0));
2265c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1,  1, -1));
2266c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  0, -1));
2267c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1, -1, -1));
2268c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1, -1,  0));
2269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1,  1));
2270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  0,  1));
2271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1,  1,  1));
2272c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
227365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
2274b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_180);
2275c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1,  0, -1));
2276c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1, -1, -1));
2277c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0, -1,  0));
2278c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1, -1,  1));
2279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  0,  1));
2280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1,  1,  1));
2281c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  1,  0));
2282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1,  1, -1));
2283c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
228465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID,
2285b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown            DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_270);
2286c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0,  1, -1,  0));
2287c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  1, -1,  1));
2288c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1,  0,  0,  1));
2289c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  1, -1,  1,  1));
2290c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper,  0, -1,  1,  0));
2291c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1,  1, -1));
2292c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  0,  0, -1));
2293c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1,  1, -1, -1));
2294c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2295c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2296be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) {
2297be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("cursor.mode", "pointer");
2299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
2300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2301be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2302be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mFakePointerController->setPosition(100, 200);
2303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mFakePointerController->setButtonState(0);
2304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2305be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
2306be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs keyArgs;
2307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2308be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_LEFT, release BTN_LEFT
230949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 1);
231049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2311be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2312be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2313be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
2314be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState());
2315be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2316be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2317be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
231849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 0);
231949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2320be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2321be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2322be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, mFakePointerController->getButtonState());
2323be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2324be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2325be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2326be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2329be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, mFakePointerController->getButtonState());
2330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2331be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2332be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
233549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 1);
233649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 1);
233749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            motionArgs.buttonState);
2342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
2343be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            mFakePointerController->getButtonState());
2344be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2345be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
234749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 0);
234849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2349be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
2351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState());
2352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
2353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
235649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0);
235749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, mFakePointerController->getButtonState());
2361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, mFakePointerController->getButtonState());
2367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2371be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_BACK, release BTN_BACK
237249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 1);
237349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2382be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
238449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 0);
238549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, mFakePointerController->getButtonState());
2389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_SIDE, release BTN_SIDE
239749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 1);
239849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
2404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState());
2405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
240949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 0);
241049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, mFakePointerController->getButtonState());
2414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
2420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_FORWARD, release BTN_FORWARD
242249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 1);
242349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2427be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2428be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
2430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
243449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 0);
243549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, mFakePointerController->getButtonState());
2439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2444be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2446be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_EXTRA, release BTN_EXTRA
244749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 1);
244849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2453be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
2454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState());
2455be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2456be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2457be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2458be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
245949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 0);
246049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2461be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2462be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2463be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, mFakePointerController->getButtonState());
2464be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
2465be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2466be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2467be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2468be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2469be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
2470be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
2471be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2472be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) {
2473be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    CursorInputMapper* mapper = new CursorInputMapper(mDevice);
2474be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("cursor.mode", "pointer");
2475be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
2476be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2477be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1);
2478be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mFakePointerController->setPosition(100, 200);
2479be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mFakePointerController->setButtonState(0);
2480be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2481be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
2482be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
248349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10);
248449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20);
248549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2486be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
2487be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
2488be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
2489be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
2490be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f));
2491be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
2492be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2493c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2494c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- TouchInputMapperTest ---
2495c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2496c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass TouchInputMapperTest : public InputMapperTest {
2497c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
2498c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_X_MIN;
2499c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_X_MAX;
2500c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_Y_MIN;
2501c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_Y_MAX;
2502c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_TOUCH_MIN;
2503c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_TOUCH_MAX;
2504c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_TOOL_MIN;
2505c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_TOOL_MAX;
2506c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_PRESSURE_MIN;
2507c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_PRESSURE_MAX;
2508c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_ORIENTATION_MIN;
2509c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_ORIENTATION_MAX;
2510be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    static const int32_t RAW_DISTANCE_MIN;
2511be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    static const int32_t RAW_DISTANCE_MAX;
251265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    static const int32_t RAW_TILT_MIN;
251365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    static const int32_t RAW_TILT_MAX;
2514c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_ID_MIN;
2515c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const int32_t RAW_ID_MAX;
2516be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    static const int32_t RAW_SLOT_MIN;
2517be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    static const int32_t RAW_SLOT_MAX;
2518c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const float X_PRECISION;
2519c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const float Y_PRECISION;
2520c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2521a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    static const float GEOMETRIC_SCALE;
2522a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown
2523c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    static const VirtualKeyDefinition VIRTUAL_KEYS[2];
2524c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2525c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    enum Axes {
2526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        POSITION = 1 << 0,
2527c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        TOUCH = 1 << 1,
2528c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        TOOL = 1 << 2,
2529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        PRESSURE = 1 << 3,
2530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ORIENTATION = 1 << 4,
2531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        MINOR = 1 << 5,
2532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        ID = 1 << 6,
2533be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        DISTANCE = 1 << 7,
253465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        TILT = 1 << 8,
253565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        SLOT = 1 << 9,
253665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        TOOL_TYPE = 1 << 10,
2537c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    };
2538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void prepareDisplay(int32_t orientation);
2540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void prepareVirtualKeys();
2541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t toRawX(float displayX);
2542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t toRawY(float displayY);
2543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float toDisplayX(int32_t rawX);
2544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float toDisplayY(int32_t rawY);
2545c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
2546c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2547c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_X_MIN = 25;
25489626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst int32_t TouchInputMapperTest::RAW_X_MAX = 1019;
2549c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_Y_MIN = 30;
25509626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst int32_t TouchInputMapperTest::RAW_Y_MAX = 1009;
2551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0;
2552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31;
2553c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0;
2554c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15;
2555c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = RAW_TOUCH_MIN;
2556c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = RAW_TOUCH_MAX;
2557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7;
2558c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7;
2559be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0;
2560be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7;
256165fd251c3913fc921468a3dad190810db19eb9dfJeff Brownconst int32_t TouchInputMapperTest::RAW_TILT_MIN = 0;
256265fd251c3913fc921468a3dad190810db19eb9dfJeff Brownconst int32_t TouchInputMapperTest::RAW_TILT_MAX = 150;
2563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ID_MIN = 0;
2564c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ID_MAX = 9;
2565be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0;
2566be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9;
25679626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH;
25689626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT;
2569c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2570a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brownconst float TouchInputMapperTest::GEOMETRIC_SCALE =
2571a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1),
2572a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown                float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1));
2573a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown
2574c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = {
2575c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 },
2576c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 },
2577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
2578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid TouchInputMapperTest::prepareDisplay(int32_t orientation) {
258065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation);
2581c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2582c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2583c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid TouchInputMapperTest::prepareVirtualKeys() {
25849065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]);
25859065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]);
258649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE);
258749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE);
2588c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2589c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2590c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownint32_t TouchInputMapperTest::toRawX(float displayX) {
25919626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN);
2592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2594c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownint32_t TouchInputMapperTest::toRawY(float displayY) {
25959626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN);
2596c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2597c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2598c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownfloat TouchInputMapperTest::toDisplayX(int32_t rawX) {
25999626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    return float(rawX - RAW_X_MIN) * DISPLAY_WIDTH / (RAW_X_MAX - RAW_X_MIN + 1);
2600c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2601c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2602c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownfloat TouchInputMapperTest::toDisplayY(int32_t rawY) {
26039626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    return float(rawY - RAW_Y_MIN) * DISPLAY_HEIGHT / (RAW_Y_MAX - RAW_Y_MIN + 1);
2604c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2605c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2606c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2607c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- SingleTouchInputMapperTest ---
2608c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2609c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass SingleTouchInputMapperTest : public TouchInputMapperTest {
2610c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
261149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    void prepareButtons();
2612c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void prepareAxes(int axes);
2613c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2614c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
2615c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y);
2616c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void processUp(SingleTouchInputMapper* mappery);
2617c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void processPressure(SingleTouchInputMapper* mapper, int32_t pressure);
2618c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor);
2619be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processDistance(SingleTouchInputMapper* mapper, int32_t distance);
262065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY);
2621be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value);
2622c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    void processSync(SingleTouchInputMapper* mapper);
2623c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
2624c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
262549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownvoid SingleTouchInputMapperTest::prepareButtons() {
262649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
262749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown}
262849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
2629c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::prepareAxes(int axes) {
2630c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    if (axes & POSITION) {
2631efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X,
2632efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                RAW_X_MIN, RAW_X_MAX, 0, 0);
2633efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y,
2634efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                RAW_Y_MIN, RAW_Y_MAX, 0, 0);
2635c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
2636c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    if (axes & PRESSURE) {
2637efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE,
2638efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
2639c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
2640c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    if (axes & TOOL) {
2641efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH,
2642efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
2643c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
2644be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & DISTANCE) {
2645be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE,
2646be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
2647be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
264865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    if (axes & TILT) {
264965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X,
265065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
265165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y,
265265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown                RAW_TILT_MIN, RAW_TILT_MAX, 0, 0);
265365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
2654c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2655c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2656c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
265749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 1);
265849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
265949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
2660c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2661c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2662c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) {
266349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x);
266449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y);
2665c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2666c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2667c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) {
266849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0);
2669c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2670c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2671c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processPressure(
2672c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        SingleTouchInputMapper* mapper, int32_t pressure) {
267349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, pressure);
2674c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2675c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2676c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processToolMajor(
2677c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        SingleTouchInputMapper* mapper, int32_t toolMajor) {
267849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, toolMajor);
2679c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2680c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2681be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid SingleTouchInputMapperTest::processDistance(
2682be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        SingleTouchInputMapper* mapper, int32_t distance) {
268349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_DISTANCE, distance);
2684be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
2685be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
268665fd251c3913fc921468a3dad190810db19eb9dfJeff Brownvoid SingleTouchInputMapperTest::processTilt(
268765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) {
268849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_X, tiltX);
268949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_Y, tiltY);
269065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown}
269165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
2692be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid SingleTouchInputMapperTest::processKey(
2693be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        SingleTouchInputMapper* mapper, int32_t code, int32_t value) {
269449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
2695be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
2696be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
2697c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) {
269849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
2699c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2700c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2701c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2702ace13b17866dc9136aeecf6dfaf7077f37434469Jeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) {
270358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
270449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
270558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    prepareAxes(POSITION);
270658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addMapperAndConfigure(mapper);
270758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown
270865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources());
2709ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown}
2710ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
2711ace13b17866dc9136aeecf6dfaf7077f37434469Jeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) {
2712ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
2713ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X);
2714ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y);
271549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2716ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    prepareAxes(POSITION);
2717ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    addMapperAndConfigure(mapper);
2718ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
271958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
272058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown}
272158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown
272249ed71db425c5054e3ad9526496a7e116c89556bJeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) {
272347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
272449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2725c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
272649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    addConfigurationProperty("touch.deviceType", "touchPad");
2727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2728c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2729c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources());
2730c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2731c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
273249ed71db425c5054e3ad9526496a7e116c89556bJeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) {
273347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
273449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2735c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
273649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
2737c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2738c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2739c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources());
2740c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2741c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2742c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, GetKeyCodeState) {
274347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
274458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
2745b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
274649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2747c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
2748c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
2749c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2750c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2751c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Unknown key.
2752c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A));
2753c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2754c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Virtual key is down.
2755c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2756c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2757c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processDown(mapper, x, y);
2758c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2759be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
2760c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2761c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
2762c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2763c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Virtual key is up.
2764c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
2765c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2766be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
2767c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2768c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME));
2769c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, GetScanCodeState) {
277247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
277358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
2774b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
277549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
2777c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
2778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Unknown key.
2781c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A));
2782c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2783c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Virtual key is down.
2784c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2785c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2786c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processDown(mapper, x, y);
2787c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2788be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
2789c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2790c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
2791c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2792c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Virtual key is up.
2793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
2794c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2795be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled());
2796c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME));
2798c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) {
280147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
280258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
2803b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
280449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2805c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
2806c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
2807c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2808c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2809c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A };
2810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    uint8_t flags[2] = { 0, 0 };
2811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags));
2812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_TRUE(flags[0]);
2813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_FALSE(flags[1]);
2814c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) {
281747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
281858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
2819b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
282049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
2822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
2823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2827be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs args;
2828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Press virtual key.
2830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processDown(mapper, x, y);
2833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2835be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2836c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
2838c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
2840c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action);
2841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
2842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2843c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(KEY_HOME, args.scanCode);
2844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2847c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Release virtual key.
2848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
2849c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2851be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args));
2852c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.eventTime);
2853c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, args.deviceId);
2854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source);
2855c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags);
2856c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action);
2857c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags);
2858c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEYCODE_HOME, args.keyCode);
2859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(KEY_HOME, args.scanCode);
2860c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState);
2861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, args.downTime);
2862c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Should not have sent any motions.
2864be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
2865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) {
286847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
286958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
2870b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
287149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
2873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
2874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2878be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs keyArgs;
2879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Press virtual key.
2881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x = toRawX(VIRTUAL_KEYS[0].centerX);
2882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t y = toRawY(VIRTUAL_KEYS[0].centerY);
2883c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processDown(mapper, x, y);
2884c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2886be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2887c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
2888c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
2889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
2890c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
2891c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
2892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags);
2893c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
2894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
2895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
2896c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
2897c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2898c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Move out of bounds.  This should generate a cancel and a pointer down since we moved
2899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // into the display area.
2900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    y -= 100;
2901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMove(mapper, x, y);
2902c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2904be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
2905c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime);
2906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, keyArgs.deviceId);
2907c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source);
2908c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags);
2909c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
2910c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY
2911c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags);
2912c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode);
2913c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(KEY_HOME, keyArgs.scanCode);
2914c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState);
2915c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime);
2916c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2917be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
2918be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2919c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2920c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2921c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2923c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
2924c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
2925c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
2926fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2927c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
2928c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
2929fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2930fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
2931c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2932be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
2933c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2934c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2935c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2936c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2937c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Keep moving out of bounds.  Should generate a pointer move.
2938c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    y -= 50;
2939c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMove(mapper, x, y);
2940c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2941c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2942be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2943c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2944c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2945c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2946c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2947c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
2948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
2949c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
2950fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
2952c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
2953fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2954fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
2955c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2956be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
2957c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2958c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2959c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2960c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2961c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Release out of bounds.  Should generate a pointer up.
2962c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
2963c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
2964c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2965be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
2966c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
2967c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
2968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
2969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
2970c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
2971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
2972c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
2973fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
2974c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
2975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
2976fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
2977fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
2978c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
2979be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
2980c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
2981c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
2982c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
2983c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2984c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Should not have sent any more keys or motions.
2985be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
2986be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
2987c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
2988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2989c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) {
299047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
299158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
2992b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
299349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
2994c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
2995c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
2996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
2997c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2998c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
2999c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3000be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
3001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Initially go down out of bounds.
3003c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x = -10;
3004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t y = -10;
3005c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processDown(mapper, x, y);
3006c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3008be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3010c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Move into the display area.  Should generate a pointer down.
3011c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x = 50;
3012c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    y = 75;
3013c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMove(mapper, x, y);
3014c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3015c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3016be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3017c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3018c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3019c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3020c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3021c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3022c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3023c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3024fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3025c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3026c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3027fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3028fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3029c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3030be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3031c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3032c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3033c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3034c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Release.  Should generate a pointer up.
3036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
3037c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3038c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3039be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3040c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3041c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3042c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3043c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3044c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3045c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3046c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3047fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3048c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3049c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3050fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3051fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3052c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3053be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3054c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3055c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Should not have sent any more keys or motions.
3059be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3060be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
3062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3063c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) {
306447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
306558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
3066b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
306749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
3068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
3069c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
3070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
3071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3074be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
3075c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3076c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Down.
3077c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x = 100;
3078c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t y = 125;
3079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processDown(mapper, x, y);
3080c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3081c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3082be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3083c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3084c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3085c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3086c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3087c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3088c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3089c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3090fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3091c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3093fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3094fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3095c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3096be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3098c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3099c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Move.
3102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x += 50;
3103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    y += 75;
3104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMove(mapper, x, y);
3105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3107be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3115fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3118fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3119fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3121be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Up.
3127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
3128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3130be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3138fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3141fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3142fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3144be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0));
3145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Should not have sent any more keys or motions.
3150be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
3151be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
3152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
3153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
315447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) {
315547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
315658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
315749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
315847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    prepareAxes(POSITION);
315947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    addConfigurationProperty("touch.orientationAware", "0");
316047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    addMapperAndConfigure(mapper);
316147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
3162be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
316347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
316447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    // Rotation 90.
3165b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_90);
316647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    processDown(mapper, toRawX(50), toRawY(75));
316747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    processSync(mapper);
316847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
3169be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3170ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3171ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
317247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
317347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    processUp(mapper);
317447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    processSync(mapper);
3175be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
317647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown}
317747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
317847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) {
317947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
318058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
318149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
3182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
3183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
3184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3185be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
3186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rotation 0.
3188b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
3189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processDown(mapper, toRawX(50), toRawY(75));
3190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3192be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3193ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
3194ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown    ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
3197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3198be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rotation 90.
3201b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_90);
32029626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50));
3203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3205be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
32069626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
32079626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
3210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3211be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rotation 180.
3214b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_180);
32159626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN);
3216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3218be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
32199626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
32209626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
3223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3224be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rotation 270.
3227b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_270);
32289626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN);
3229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3231be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
32329626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1);
32339626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown    ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1);
3234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processUp(mapper);
3236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3237be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled());
3238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
3239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) {
324147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
324258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
3243b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
324449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    prepareButtons();
324565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT);
3246c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
3247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // These calculations are based on the input device calibration documentation.
3249c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawX = 100;
3250c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawY = 200;
3251c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawPressure = 10;
3252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawToolMajor = 12;
325365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t rawDistance = 2;
325465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t rawTiltX = 30;
325565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t rawTiltY = 110;
3256c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3257c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float x = toDisplayX(rawX);
3258c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float y = toDisplayY(rawY);
3259c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
3260c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float size = float(rawToolMajor) / RAW_TOOL_MAX;
3261a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float tool = float(rawToolMajor) * GEOMETRIC_SCALE;
3262be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float distance = float(rawDistance);
3263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
326465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f;
326565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float tiltScale = M_PI / 180;
326665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale;
326765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale;
326865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle));
326965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle));
327065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
3271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processDown(mapper, rawX, rawY);
3272c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPressure(mapper, rawPressure);
3273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processToolMajor(mapper, rawToolMajor);
3274be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processDistance(mapper, rawDistance);
327565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processTilt(mapper, rawTiltX, rawTiltY);
3276c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3277c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3278be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
3279be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
3280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
328165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            x, y, pressure, size, tool, tool, tool, tool, orientation, distance));
328265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT));
3283c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
3284c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3285be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) {
3286be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3287be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
3288be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
3289be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareButtons();
3290be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareAxes(POSITION);
3291be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
3292c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3293be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
3294be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs keyArgs;
3295c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3296be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processDown(mapper, 100, 200);
3297be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3301c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3302be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_LEFT, release BTN_LEFT
3303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_LEFT, 1);
3304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3305be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3306be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
3308c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3309be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_LEFT, 0);
3310be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3311be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3312be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3313be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3314c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3315be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
3316be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_RIGHT, 1);
3317be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_MIDDLE, 1);
3318be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3319be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3320be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3321be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
3322be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            motionArgs.buttonState);
3323c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3324be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_RIGHT, 0);
3325be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3326be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
3328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3329c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_MIDDLE, 0);
3331be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3332be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3335c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3336be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_BACK, release BTN_BACK
3337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_BACK, 1);
3338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3343be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3344be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3345c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_BACK, 0);
3347be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3348be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3349be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_SIDE, release BTN_SIDE
3356be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_SIDE, 1);
3357be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
3363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_SIDE, 0);
3366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3371be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
3373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_FORWARD, release BTN_FORWARD
3375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_FORWARD, 1);
3376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3382be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_FORWARD, 0);
3385be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_EXTRA, release BTN_EXTRA
3394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_EXTRA, 1);
3395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
3398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
3401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_EXTRA, 0);
3404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
3409be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
3410be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
3411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_STYLUS, release BTN_STYLUS
3413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_STYLUS, 1);
3414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState);
3418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_STYLUS, 0);
3420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3422be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_STYLUS2, release BTN_STYLUS2
3426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_STYLUS2, 1);
3427be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3428be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
3431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_STYLUS2, 0);
3433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3434be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3435be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // release touch
3439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processUp(mapper);
3440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3444be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3446be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
3447be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3448be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
3449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
3450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareButtons();
3451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareAxes(POSITION);
3452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
3453be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
3455be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3456be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // default tool type is finger
3457be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processDown(mapper, 100, 200);
3458be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3459be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3460be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3461be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3462be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3463be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // eraser
3464be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_RUBBER, 1);
3465be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3466be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3467be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3468be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
3469be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3470be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // stylus
3471be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_RUBBER, 0);
3472be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_PEN, 1);
3473be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3474be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3475be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3476be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3477be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
347865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // brush
3479be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_PEN, 0);
348065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_BRUSH, 1);
348165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
348265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
348365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
348465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
348565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
348665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // pencil
348765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_BRUSH, 0);
348865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_PENCIL, 1);
348965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
349065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
349165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
349265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
349365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
349465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // airbrush
349565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_PENCIL, 0);
349665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
349765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
349865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
349965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
350065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
350165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
350265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // mouse
350365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
350465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_MOUSE, 1);
350565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
350665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
350765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
350865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
350965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
351065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // lens
351165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_MOUSE, 0);
351265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_LENS, 1);
351365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
351465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
351565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
351665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
351765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
3518ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    // double-tap
351965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_LENS, 0);
3520ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
3521ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processSync(mapper);
3522ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3523ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3524ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3525ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown
3526ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    // triple-tap
3527ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
3528ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
3529ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processSync(mapper);
3530ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3531ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3532ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3533ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown
3534ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    // quad-tap
3535ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
3536ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_QUADTAP, 1);
3537ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processSync(mapper);
3538ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3539ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3540ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3541ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown
3542ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    // finger
3543ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_QUADTAP, 0);
3544be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_FINGER, 1);
3545be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3546be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3547be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3548be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3549be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3550be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // stylus trumps finger
3551be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_PEN, 1);
3552be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3553be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3554be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3555be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
3556be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3557be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // eraser trumps stylus
3558be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_RUBBER, 1);
3559be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3560be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3561be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3562be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
3563be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
356465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // mouse trumps eraser
356565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_MOUSE, 1);
356665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
356765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
356865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
356965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
357065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
3571be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // back to default tool type
357265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_MOUSE, 0);
3573be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_RUBBER, 0);
3574be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_PEN, 0);
3575be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_FINGER, 0);
3576be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3577be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3578be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3579be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3580be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3581be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3582be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
3583be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3584be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
3585be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
3586be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareButtons();
3587be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareAxes(POSITION);
358849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0);
3589be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
3590be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3591be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
3592be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3593be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
3594be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_FINGER, 1);
3595be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processMove(mapper, 100, 200);
3596be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3597be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3598be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3599be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3600be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3601be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3602be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3603be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3604be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3605be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3606be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3607be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // move a little
3608be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processMove(mapper, 150, 250);
3609be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3610be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3611be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3612be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3613be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3614be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3615be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // down when BTN_TOUCH is pressed, pressure defaults to 1
3616be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOUCH, 1);
3617be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3618be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3619be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3620be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3621be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3622be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3623be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3624be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3625be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3626be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3627be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3628be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // up when BTN_TOUCH is released, hover restored
3629be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOUCH, 0);
3630be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3631be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3632be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3633be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3634be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3635be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3636be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3637be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3638be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3639be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3640be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3641be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3642be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3643be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3644be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3645be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3646be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // exit hover when pointer goes away
3647be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_FINGER, 0);
3648be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3649be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3650be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3651be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3652be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3653be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3654be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
365565fd251c3913fc921468a3dad190810db19eb9dfJeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) {
3656be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice);
3657be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
3658be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
3659be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareButtons();
366065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    prepareAxes(POSITION | PRESSURE);
3661be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
3662be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3663be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
3664be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
366565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // initially hovering because pressure is 0
3666be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processDown(mapper, 100, 200);
366765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processPressure(mapper, 0);
3668be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3669be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3670be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3671be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
367265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3673be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3674be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3675be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3676be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
367765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
3678be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3679be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // move a little
3680be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processMove(mapper, 150, 250);
3681be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3682be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3683be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3684be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
368565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3686be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
368765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // down when pressure is non-zero
368865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processPressure(mapper, RAW_PRESSURE_MAX);
3689be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3690be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3691be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3692be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
369365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3694be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3695be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3696be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3697be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3698be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3699be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
370065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // up when pressure becomes 0, hover restored
370165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processPressure(mapper, 0);
3702be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3703be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3704be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
3705be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3706be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
3707be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3708be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3709be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
3710be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
371165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3712be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3713be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3714be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
3715be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
371665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3717be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3718be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // exit hover when pointer goes away
3719be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processUp(mapper);
3720be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
3721be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3722be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
3723be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
372465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
3725be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3726be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3727be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3728be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown// --- MultiTouchInputMapperTest ---
3729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3730be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownclass MultiTouchInputMapperTest : public TouchInputMapperTest {
3731be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownprotected:
3732be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void prepareAxes(int axes);
3733be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3734be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y);
3735be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor);
3736be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor);
3737be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor);
3738be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor);
3739be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation);
3740be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processPressure(MultiTouchInputMapper* mapper, int32_t pressure);
3741be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processDistance(MultiTouchInputMapper* mapper, int32_t distance);
3742be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processId(MultiTouchInputMapper* mapper, int32_t id);
3743be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processSlot(MultiTouchInputMapper* mapper, int32_t slot);
3744be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processToolType(MultiTouchInputMapper* mapper, int32_t toolType);
3745be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value);
3746be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processMTSync(MultiTouchInputMapper* mapper);
3747be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processSync(MultiTouchInputMapper* mapper);
3748be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown};
3749be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3750be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::prepareAxes(int axes) {
3751be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & POSITION) {
3752be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X,
3753be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_X_MIN, RAW_X_MAX, 0, 0);
3754be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y,
3755be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_Y_MIN, RAW_Y_MAX, 0, 0);
3756be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3757be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & TOUCH) {
3758be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR,
3759be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
3760be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (axes & MINOR) {
3761be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR,
3762be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0);
3763be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        }
3764be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3765be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & TOOL) {
3766be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR,
3767be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0);
3768be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (axes & MINOR) {
3769be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR,
3770be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                    RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0);
3771be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        }
3772be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3773be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & ORIENTATION) {
3774be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION,
3775be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0);
3776be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3777be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & PRESSURE) {
3778be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE,
3779be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0);
3780be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3781be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & DISTANCE) {
3782be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE,
3783be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0);
3784be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3785be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & ID) {
3786be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID,
3787be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_ID_MIN, RAW_ID_MAX, 0, 0);
3788be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3789be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & SLOT) {
3790be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT,
3791be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0);
3792be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0);
3793be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3794be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    if (axes & TOOL_TYPE) {
3795be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE,
3796be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                0, MT_TOOL_MAX, 0, 0);
3797be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
3798be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3799be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3800be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processPosition(
3801be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t x, int32_t y) {
380249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, x);
380349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, y);
3804be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3805be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3806be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processTouchMajor(
3807be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t touchMajor) {
380849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor);
3809be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3810be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3811be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processTouchMinor(
3812be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t touchMinor) {
381349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor);
3814be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3815be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3816be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolMajor(
3817be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t toolMajor) {
381849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor);
3819be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3820be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3821be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolMinor(
3822be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t toolMinor) {
382349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor);
3824be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3825be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3826be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processOrientation(
3827be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t orientation) {
382849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, orientation);
3829be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processPressure(
3832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        MultiTouchInputMapper* mapper, int32_t pressure) {
383349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, pressure);
3834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
3835c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3836be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processDistance(
3837be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t distance) {
383849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_DISTANCE, distance);
3839be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3840be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processId(
3842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        MultiTouchInputMapper* mapper, int32_t id) {
384349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, id);
3844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
3845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3846be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processSlot(
3847be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t slot) {
384849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_SLOT, slot);
3849be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3850be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3851be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolType(
3852be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t toolType) {
385349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOOL_TYPE, toolType);
3854be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3855be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3856be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processKey(
3857be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        MultiTouchInputMapper* mapper, int32_t code, int32_t value) {
385849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value);
3859be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
3860be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
3861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) {
386249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0);
3863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
3864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) {
386649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0);
3867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
3868c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3869c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) {
387147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
387258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
3873b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
3874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION);
3875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
3876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
3877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
3879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3880be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
3881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Two fingers down at once.
3883c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
3884c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x1, y1);
3885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
3886c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
3887c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
3888c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3890be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3891c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3893c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
3896c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3897c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3898fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
3901fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3902fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3904be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
3905c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3907c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3908c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3909be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3910c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3911c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3912c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3913c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3914c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
3915c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            motionArgs.action);
3916c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3917c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3918fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3919c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3920c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
3921fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3922fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3923fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3924fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
3925c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3926be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
3927c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
3928be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
3929c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3930c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3931c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3932c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3933c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Move.
3934c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
3935c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x1, y1);
3936c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
3937c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
3938c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
3939c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3940c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3941be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3942c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3943c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3944c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3945c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3946c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
3947c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3949fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3950c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
3952fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3953fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3954fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3955fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
3956c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3957be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
3958c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
3959be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
3960c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3961c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3962c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3963c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3964c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // First finger up.
3965c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x2 += 15; y2 -= 20;
3966c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
3967c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
3968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
3969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3970be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3972c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3973c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3974c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
3976c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            motionArgs.action);
3977c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
3978c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
3979fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
3980c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
3981c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
3982fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
3983fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
3984fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
3985fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
3986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
3987be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
3988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
3989be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
3990c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
3991c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
3992c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
3993c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
3994be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
3995c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
3996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
3997c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
3998c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
3999c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4000c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
4001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4002fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4003c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
4004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4005fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4006fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4008be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4010c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4011c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4012c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4013c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Move.
4014c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x2 += 20; y2 -= 25;
4015c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
4016c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4017c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4018c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4019be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4020c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4021c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4022c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4023c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4024c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4025c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
4026c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4027fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4028c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
4029c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4030fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4031fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4032c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4033be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4034c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4037c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4038c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // New finger down.
4039c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x3 = 700, y3 = 300;
4040c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
4041c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4042c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x3, y3);
4043c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4044c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4045c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4046be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4047c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4048c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4049c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4050c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4051c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4052c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            motionArgs.action);
4053c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
4054c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4055fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
4057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4058fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4059fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4060fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4061fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4063be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4064c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4065be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4067c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4069c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Second finger up.
4071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x3 += 30; y3 -= 20;
4072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x3, y3);
4073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4075c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4076be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4077c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4078c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4080c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4081c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4082c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            motionArgs.action);
4083c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
4084c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4085fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4086c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
4087c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4088fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4089fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4090fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4091fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4093be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4094c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4095be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4098c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4099c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4100be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
4107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4108fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
4110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4111fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4112fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4114be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Last finger up.
4120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4123be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime);
4125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(DEVICE_ID, motionArgs.deviceId);
4126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source);
4127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(uint32_t(0), motionArgs.policyFlags);
4128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.flags);
4130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState);
4131fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(0, motionArgs.edgeFlags);
4133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4134fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4135fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4137be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON);
4139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON);
4140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime);
4141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Should not have sent any more keys or motions.
4143be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4144be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
4146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) {
414847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
414958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4150b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION | ID);
4152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareVirtualKeys();
4153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
4154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4157be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
4158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Two fingers down at once.
4160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x1, y1);
4162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 1);
4163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
4165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 2);
4166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4169be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
41726894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4173fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4175be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4177be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            motionArgs.action);
4180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
41816894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4182fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
41836894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4184fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4186be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4188be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Move.
4191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x1, y1);
4193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 1);
4194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
4196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 2);
4197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4200be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
42036894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4204fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
42056894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4206fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4208be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4210be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // First finger up.
4213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x2 += 15; y2 -= 20;
4214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
4215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 2);
4216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4219be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4220c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            motionArgs.action);
4222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
42236894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4224fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
42256894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4226fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4228be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4230be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4231c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4232be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
42356894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4236fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4238be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Move.
4241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x2 += 20; y2 -= 25;
4242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
4243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 2);
4244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4246c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4247be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4249c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
42506894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4251fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4253be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4254c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4255c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // New finger down.
4256c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t x3 = 700, y3 = 300;
4257c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x2, y2);
4258c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 2);
4259c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4260c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x3, y3);
4261c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 3);
4262c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4265be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
42666894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4267c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            motionArgs.action);
4268c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
42696894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4270fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
42716894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4272fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4274be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
42756894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4276be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4277c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4278c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Second finger up.
4279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    x3 += 30; y3 -= 20;
4280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, x3, y3);
4281c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, 3);
4282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4283c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4284c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4285be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
42866894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4287c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            motionArgs.action);
4288c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
42896894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4290fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
42916894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4292fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4293c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4294be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
42956894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4296be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4297c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4299c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4300c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
43016894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4302fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4303c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4305c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4306c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Last finger up.
4307c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4308c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4309c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4310be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4311c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4312c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
43136894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4314fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4315c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4316be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4317c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4318c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Should not have sent any more keys or motions.
4319be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4320be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4321c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
4322c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4323be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) {
432447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
432558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4326b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareAxes(POSITION | ID | SLOT);
4328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareVirtualKeys();
4329c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
4330c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4331be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON);
4332be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
4334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4335be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Two fingers down at once.
4336be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500;
4337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x1, y1);
4338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, 1);
4339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSlot(mapper, 1);
4340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x2, y2);
4341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, 2);
4342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4343be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4344be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4345be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4347be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4348be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4349be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            motionArgs.action);
4355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4356be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4357be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Move.
4366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    x1 += 10; y1 += 15; x2 += 5; y2 -= 10;
4367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSlot(mapper, 0);
4368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x1, y1);
4369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSlot(mapper, 1);
4370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x2, y2);
4371be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4382be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4385be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // First finger up.
4386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    x2 += 15; y2 -= 20;
4387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSlot(mapper, 0);
4388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, -1);
4389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSlot(mapper, 1);
4390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x2, y2);
4391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            motionArgs.action);
4396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0));
4403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4409be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4410be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Move.
4415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    x2 += 20; y2 -= 25;
4416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x2, y2);
4417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4422be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[0].id);
4423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4427be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // New finger down.
4428be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t x3 = 700, y3 = 300;
4429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x2, y2);
4430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSlot(mapper, 0);
4431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, 3);
4432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x3, y3);
4433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4434be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4435be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            motionArgs.action);
4438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4444be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4446be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4447be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4448be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Second finger up.
4449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    x3 += 30; y3 -= 20;
4450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSlot(mapper, 1);
4451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, -1);
4452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSlot(mapper, 0);
4453be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, x3, y3);
4454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4455be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4456be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4457be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4458be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            motionArgs.action);
4459be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(2), motionArgs.pointerCount);
4460be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4461be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4462be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(1, motionArgs.pointerProperties[1].id);
4463be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType);
4464be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4465be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4466be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1],
4467be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0));
4468be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4469be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4470be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4471be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4472be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4473be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4474be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4475be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4476be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4477be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Last finger up.
4478be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, -1);
4479be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4480be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4481be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4482be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4483be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(size_t(1), motionArgs.pointerCount);
4484be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.pointerProperties[0].id);
4485be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4486be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
4487be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0));
4488be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4489be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Should not have sent any more keys or motions.
4490be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled());
4491be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled());
4492be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
4493be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4494be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) {
4495be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4496be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4497be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4498be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE);
4499be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
4500be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4501be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // These calculations are based on the input device calibration documentation.
4502be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t rawX = 100;
4503be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t rawY = 200;
4504be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t rawTouchMajor = 7;
4505be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t rawTouchMinor = 6;
4506be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t rawToolMajor = 9;
4507be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t rawToolMinor = 8;
4508be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t rawPressure = 11;
4509be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t rawDistance = 0;
4510c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawOrientation = 3;
4511c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t id = 5;
4512c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4513c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float x = toDisplayX(rawX);
4514c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float y = toDisplayY(rawY);
4515c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float pressure = float(rawPressure) / RAW_PRESSURE_MAX;
4516a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
4517a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
4518a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
4519a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
4520a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
4521c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2;
4522be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float distance = float(rawDistance);
4523c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4524c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, rawX, rawY);
4525c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processTouchMajor(mapper, rawTouchMajor);
4526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processTouchMinor(mapper, rawTouchMinor);
4527c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processToolMajor(mapper, rawToolMajor);
4528c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processToolMinor(mapper, rawToolMinor);
4529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPressure(mapper, rawPressure);
4530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processOrientation(mapper, rawOrientation);
4531be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processDistance(mapper, rawDistance);
4532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processId(mapper, id);
4533c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4534c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4535c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4536be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
4537be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
45386894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    ASSERT_EQ(0, args.pointerProperties[0].id);
4539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4540a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor,
4541a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            orientation, distance));
4542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
4543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) {
454547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
454658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4547b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4548c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION | TOUCH | TOOL | MINOR);
4549a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.size.calibration", "geometric");
4550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
4551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // These calculations are based on the input device calibration documentation.
4553c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawX = 100;
4554c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawY = 200;
4555c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawTouchMajor = 140;
4556c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawTouchMinor = 120;
4557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawToolMajor = 180;
4558c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawToolMinor = 160;
4559c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float x = toDisplayX(rawX);
4561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float y = toDisplayY(rawY);
4562a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX;
4563a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE;
4564a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE;
4565a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE;
4566a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE;
4567c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4568c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, rawX, rawY);
4569c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processTouchMajor(mapper, rawTouchMajor);
4570c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processTouchMinor(mapper, rawTouchMinor);
4571c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processToolMajor(mapper, rawToolMajor);
4572c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processToolMinor(mapper, rawToolMinor);
4573c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4574c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4575c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4576be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
4577be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4579a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0));
4580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
4581c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4582a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) {
458347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
458458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4585b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4586c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION | TOUCH | TOOL);
4587a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.size.calibration", "diameter");
4588a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.size.scale", "10");
4589a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.size.bias", "160");
4590a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.size.isSummed", "1");
4591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
4592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // These calculations are based on the input device calibration documentation.
4594c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Note: We only provide a single common touch/tool value because the device is assumed
4595c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    //       not to emit separate values for each pointer (isSummed = 1).
4596c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawX = 100;
4597c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawY = 200;
4598c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawX2 = 150;
4599c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawY2 = 250;
4600a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    int32_t rawTouchMajor = 5;
4601a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    int32_t rawToolMajor = 8;
4602c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4603c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float x = toDisplayX(rawX);
4604c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float y = toDisplayY(rawY);
4605c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float x2 = toDisplayX(rawX2);
4606c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float y2 = toDisplayY(rawY2);
4607a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX;
4608a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f;
4609a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f;
4610c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4611c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, rawX, rawY);
4612c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processTouchMajor(mapper, rawTouchMajor);
4613c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processToolMajor(mapper, rawToolMajor);
4614c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4615c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, rawX2, rawY2);
4616c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processTouchMajor(mapper, rawTouchMajor);
4617c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processToolMajor(mapper, rawToolMajor);
4618c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4619c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4620c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4621be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
4622be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4623c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action);
462449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
4625be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4626c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
4627c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            args.action);
4628c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(size_t(2), args.pointerCount);
4629c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4630a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
4631c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1],
4632a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0));
4633c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
4634c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4635a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) {
463647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
463758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4638b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4639c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    prepareAxes(POSITION | TOUCH | TOOL);
4640a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.size.calibration", "area");
4641a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.size.scale", "43");
4642a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.size.bias", "3");
4643c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    addMapperAndConfigure(mapper);
4644c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4645c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // These calculations are based on the input device calibration documentation.
4646c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawX = 100;
4647c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t rawY = 200;
4648a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    int32_t rawTouchMajor = 5;
4649a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    int32_t rawToolMajor = 8;
4650c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4651c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float x = toDisplayX(rawX);
4652c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    float y = toDisplayY(rawY);
4653a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float size = float(rawTouchMajor) / RAW_TOUCH_MAX;
4654a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f;
4655a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f;
4656c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4657c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processPosition(mapper, rawX, rawY);
4658c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processTouchMajor(mapper, rawTouchMajor);
4659c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processToolMajor(mapper, rawToolMajor);
4660c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processMTSync(mapper);
4661c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    processSync(mapper);
4662c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4663be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs args;
4664be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4665c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4666a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            x, y, 1.0f, size, touch, touch, tool, tool, 0, 0));
4667a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown}
4668a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown
4669a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) {
4670a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4671a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4672a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4673a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    prepareAxes(POSITION | PRESSURE);
4674a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.pressure.calibration", "amplitude");
4675a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addConfigurationProperty("touch.pressure.scale", "0.01");
4676a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    addMapperAndConfigure(mapper);
4677a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown
4678a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    // These calculations are based on the input device calibration documentation.
4679a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    int32_t rawX = 100;
4680a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    int32_t rawY = 200;
4681a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    int32_t rawPressure = 60;
4682a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown
4683a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float x = toDisplayX(rawX);
4684a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float y = toDisplayY(rawY);
4685a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    float pressure = float(rawPressure) * 0.01f;
4686a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown
4687a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    processPosition(mapper, rawX, rawY);
4688a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    processPressure(mapper, rawPressure);
4689a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    processMTSync(mapper);
4690a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    processSync(mapper);
4691a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown
4692a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    NotifyMotionArgs args;
4693a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
4694a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0],
4695a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            x, y, pressure, 0, 0, 0, 0, 0, 0, 0));
4696be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
4697be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4698be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) {
4699be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4700be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4701be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4702be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareAxes(POSITION | ID | SLOT);
4703be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
4704be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4705be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
4706be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyKeyArgs keyArgs;
4707be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4708be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, 1);
4709be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, 100, 200);
4710be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4711be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4712be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4713be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4714be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4715be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_LEFT, release BTN_LEFT
4716be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_LEFT, 1);
4717be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4718be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4719be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4720be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState);
4721be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4722be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_LEFT, 0);
4723be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4724be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4725be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4726be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4727be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4728be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE
4729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_RIGHT, 1);
4730be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_MIDDLE, 1);
4731be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4732be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4733be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4734be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY,
4735be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            motionArgs.buttonState);
4736be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4737be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_RIGHT, 0);
4738be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4739be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4740be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4741be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4742be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4743be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_MIDDLE, 0);
4744be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4745be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4746be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4747be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4748be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4749be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_BACK, release BTN_BACK
4750be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_BACK, 1);
4751be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4752be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4753be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4754be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4755be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4756be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4757be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4758be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4759be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_BACK, 0);
4760be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4761be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4762be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4763be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4764be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4765be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4766be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4767be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4768be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_SIDE, release BTN_SIDE
4769be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_SIDE, 1);
4770be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4771be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4772be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4773be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4774be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4775be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState);
4776be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4777be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4778be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_SIDE, 0);
4779be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4780be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4781be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4782be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4783be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4784be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4785be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode);
4786be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4787be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_FORWARD, release BTN_FORWARD
4788be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_FORWARD, 1);
4789be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4790be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4791be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4792be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4793be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4794be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4795be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4796be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4797be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_FORWARD, 0);
4798be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4799be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4800be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4801be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4802be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4803be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4804be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4805be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4806be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_EXTRA, release BTN_EXTRA
4807be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_EXTRA, 1);
4808be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4809be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4810be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action);
4811be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4812be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4813be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState);
4814be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4815be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4816be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_EXTRA, 0);
4817be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4818be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4819be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4820be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4821be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs));
4822be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action);
4823be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode);
4824be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4825be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_STYLUS, release BTN_STYLUS
4826be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_STYLUS, 1);
4827be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4828be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4829be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4830be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState);
4831be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4832be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_STYLUS, 0);
4833be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4834be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4835be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4836be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4837be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4838be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // press BTN_STYLUS2, release BTN_STYLUS2
4839be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_STYLUS2, 1);
4840be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4841be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4842be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4843be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState);
4844be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4845be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_STYLUS2, 0);
4846be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4847be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4848be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4849be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4850be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4851be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // release touch
4852be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, -1);
4853be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4854be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4855be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
4856be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(0, motionArgs.buttonState);
4857be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
4858be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4859be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) {
4860be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
4861be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
4862be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
4863be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareAxes(POSITION | ID | SLOT | TOOL_TYPE);
4864be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
4865be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4866be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
4867be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4868be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // default tool type is finger
4869be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, 1);
4870be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, 100, 200);
4871be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4872be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4873be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
4874be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4875be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4876be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // eraser
4877be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_RUBBER, 1);
4878be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4879be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4880be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4881be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4882be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4883be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // stylus
4884be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_RUBBER, 0);
4885be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_PEN, 1);
4886be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4887be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4888be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4889be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4890be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
489165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // brush
4892be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_PEN, 0);
489365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_BRUSH, 1);
489465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
489565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
489665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
489765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
489865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
489965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // pencil
490065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_BRUSH, 0);
490165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_PENCIL, 1);
490265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
490365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
490465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
490565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
490665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
490765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // airbrush
490865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_PENCIL, 0);
490965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_AIRBRUSH, 1);
491065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
491165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
491265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
491365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
491465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
491565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // mouse
491665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_AIRBRUSH, 0);
491765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_MOUSE, 1);
491865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
491965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
492065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
492165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
492265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
492365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // lens
492465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_MOUSE, 0);
492565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_LENS, 1);
492665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
492765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
492865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
492965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
493065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
4931ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    // double-tap
493265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_LENS, 0);
4933ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_DOUBLETAP, 1);
4934ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processSync(mapper);
4935ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4936ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4937ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4938ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown
4939ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    // triple-tap
4940ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_DOUBLETAP, 0);
4941ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_TRIPLETAP, 1);
4942ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processSync(mapper);
4943ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4944ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4945ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4946ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown
4947ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    // quad-tap
4948ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_TRIPLETAP, 0);
4949ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_QUADTAP, 1);
4950ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processSync(mapper);
4951ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4952ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4953ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4954ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown
4955ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    // finger
4956ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    processKey(mapper, BTN_TOOL_QUADTAP, 0);
4957be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_FINGER, 1);
4958be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4959be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4960be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4961be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4962be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4963be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // stylus trumps finger
4964be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_PEN, 1);
4965be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4966be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4967be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4968be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4969be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4970be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // eraser trumps stylus
4971be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_RUBBER, 1);
4972be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4973be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4974be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4975be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType);
4976be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
497765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // mouse trumps eraser
497865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_MOUSE, 1);
497965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processSync(mapper);
498065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
498165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
498265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType);
498365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
4984be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // MT tool type trumps BTN tool types: MT_TOOL_FINGER
4985be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE
4986be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4987be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4988be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4989be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
4990be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4991be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // MT tool type trumps BTN tool types: MT_TOOL_PEN
4992be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processToolType(mapper, MT_TOOL_PEN);
4993be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
4994be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
4995be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
4996be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType);
4997be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
4998be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // back to default tool type
4999be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processToolType(mapper, -1); // use a deliberately undefined tool type, for testing
500065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processKey(mapper, BTN_TOOL_MOUSE, 0);
5001be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_RUBBER, 0);
5002be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_PEN, 0);
5003be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOOL_FINGER, 0);
5004be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5005be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5006be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action);
5007be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType);
5008be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
5009be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5010be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) {
5011be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5012be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
5013be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
5014be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareAxes(POSITION | ID | SLOT);
501549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0);
5016be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
5017be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5018be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
5019be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5020be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0
5021be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, 1);
5022be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, 100, 200);
5023be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5024be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5025be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5026be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5027be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5028be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5029be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5030be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5031be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5032be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5033be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5034be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // move a little
5035be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, 150, 250);
5036be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5037be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5038be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5039be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5040be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5041be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5042be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // down when BTN_TOUCH is pressed, pressure defaults to 1
5043be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOUCH, 1);
5044be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5045be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5046be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5047be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5048be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5049be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5050be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5051be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5052be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5053be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5054be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5055be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // up when BTN_TOUCH is released, hover restored
5056be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processKey(mapper, BTN_TOUCH, 0);
5057be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5058be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5059be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5060be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5061be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5062be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5063be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5064be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5065be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5066be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5067be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5068be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5069be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5070be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5071be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5072be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5073be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // exit hover when pointer goes away
5074be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, -1);
5075be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5076be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5077be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5078be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5079be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5080c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
5081c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
508265fd251c3913fc921468a3dad190810db19eb9dfJeff BrownTEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) {
5083be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice);
5084be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addConfigurationProperty("touch.deviceType", "touchScreen");
5085be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    prepareDisplay(DISPLAY_ORIENTATION_0);
508665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    prepareAxes(POSITION | ID | SLOT | PRESSURE);
5087be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    addMapperAndConfigure(mapper);
5088be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5089be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    NotifyMotionArgs motionArgs;
5090be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
509165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // initially hovering because pressure is 0
5092be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, 1);
5093be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, 100, 200);
509465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processPressure(mapper, 0);
5095be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5096be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5097be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5098be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
509965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5100be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5101be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5102be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5103be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
510465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0));
5105be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5106be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // move a little
5107be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processPosition(mapper, 150, 250);
5108be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5109be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5110be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5111be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
511265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5113be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
511465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // down when pressure becomes non-zero
511565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processPressure(mapper, RAW_PRESSURE_MAX);
5116be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5117be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5118be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5119be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
512065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5121be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5122be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5123be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action);
5124be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5125be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5126be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
512765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // up when pressure becomes 0, hover restored
512865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    processPressure(mapper, 0);
5129be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5130be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5131be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action);
5132be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
5133be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0));
5134be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5135be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5136be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action);
5137be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
513865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5139be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5140be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5141be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action);
5142be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
514365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5144be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5145be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // exit hover when pointer goes away
5146be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processId(mapper, -1);
5147be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    processSync(mapper);
5148be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs));
5149be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action);
5150be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0],
515165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0));
5152be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}
5153be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5154be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
5155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} // namespace android
5156