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