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. 141d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown bool isRotated = (orientation == DISPLAY_ORIENTATION_90 142d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown || orientation == DISPLAY_ORIENTATION_270); 143d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown DisplayViewport v; 144d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.displayId = displayId; 145d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.orientation = orientation; 146d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.logicalLeft = 0; 147d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.logicalTop = 0; 148d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.logicalRight = isRotated ? height : width; 149d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.logicalBottom = isRotated ? width : height; 150d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.physicalLeft = 0; 151d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.physicalTop = 0; 152d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.physicalRight = isRotated ? height : width; 153d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown v.physicalBottom = isRotated ? width : height; 15483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown v.deviceWidth = isRotated ? height : width; 15583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown v.deviceHeight = isRotated ? width : height; 156d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown mConfig.setDisplayInfo(false /*external*/, v); 157d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown mConfig.setDisplayInfo(true /*external*/, v); 158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void addExcludedDeviceName(const String8& deviceName) { 161214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown mConfig.excludedDeviceNames.push(deviceName); 162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 16483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) { 16583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mPointerControllers.add(deviceId, controller); 16683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 16783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 16865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown const InputReaderConfiguration* getReaderConfiguration() const { 16965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown return &mConfig; 170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 172af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown const Vector<InputDeviceInfo>& getInputDevices() const { 173af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown return mInputDevices; 174af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 175af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 17665fd251c3913fc921468a3dad190810db19eb9dfJeff Brownprivate: 177214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) { 178214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown *outConfig = mConfig; 179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 18083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 18183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) { 18283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown return mPointerControllers.valueFor(deviceId); 18383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 184af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 185af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) { 186af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown mInputDevices = inputDevices; 187af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 1886ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 189426f905b840a710314cc4e91ea4f03bd0c4bcbfbJeff Brown virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const String8& inputDeviceDescriptor) { 1906ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown return NULL; 1916ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown } 1925bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown 1935bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown virtual String8 getDeviceAlias(const InputDeviceIdentifier& identifier) { 1945bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown return String8::empty(); 1955bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown } 196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 199be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown// --- FakeInputListener --- 200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 201be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownclass FakeInputListener : public InputListenerInterface { 202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 203be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue; 20465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue; 205be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown List<NotifyKeyArgs> mNotifyKeyArgsQueue; 206be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown List<NotifyMotionArgs> mNotifyMotionArgsQueue; 207be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown List<NotifySwitchArgs> mNotifySwitchArgsQueue; 208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 210be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual ~FakeInputListener() { } 211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 213be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown FakeInputListener() { 214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 216be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void assertNotifyConfigurationChangedWasCalled( 217be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyConfigurationChangedArgs* outEventArgs = NULL) { 218be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty()) 219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyConfigurationChanged() to have been called."; 220be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (outEventArgs) { 221be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin(); 222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 223be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin()); 224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 22665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown void assertNotifyDeviceResetWasCalled( 22765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown NotifyDeviceResetArgs* outEventArgs = NULL) { 22865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty()) 22965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown << "Expected notifyDeviceReset() to have been called."; 23065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (outEventArgs) { 23165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown *outEventArgs = *mNotifyDeviceResetArgsQueue.begin(); 23265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 23365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin()); 23465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 23565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 236be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = NULL) { 237be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_FALSE(mNotifyKeyArgsQueue.empty()) 238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyKey() to have been called."; 239be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (outEventArgs) { 240be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *outEventArgs = *mNotifyKeyArgsQueue.begin(); 241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 242be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin()); 243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertNotifyKeyWasNotCalled() { 246be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_TRUE(mNotifyKeyArgsQueue.empty()) 247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyKey() to not have been called."; 248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 249c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 250be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = NULL) { 251be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_FALSE(mNotifyMotionArgsQueue.empty()) 252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyMotion() to have been called."; 253be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (outEventArgs) { 254be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *outEventArgs = *mNotifyMotionArgsQueue.begin(); 255c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 256be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin()); 257c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 258c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 259c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertNotifyMotionWasNotCalled() { 260be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_TRUE(mNotifyMotionArgsQueue.empty()) 261c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyMotion() to not have been called."; 262c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 264be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = NULL) { 265be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_FALSE(mNotifySwitchArgsQueue.empty()) 266c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifySwitch() to have been called."; 267be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (outEventArgs) { 268be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *outEventArgs = *mNotifySwitchArgsQueue.begin(); 269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 270be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin()); 271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 272c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 274be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) { 275be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyConfigurationChangedArgsQueue.push_back(*args); 2760029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 2770029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 27865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) { 27965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mNotifyDeviceResetArgsQueue.push_back(*args); 28065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 28165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 282be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual void notifyKey(const NotifyKeyArgs* args) { 283be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyKeyArgsQueue.push_back(*args); 2847631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown } 2857631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown 286be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual void notifyMotion(const NotifyMotionArgs* args) { 287be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyMotionArgsQueue.push_back(*args); 288c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 289c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 290be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual void notifySwitch(const NotifySwitchArgs* args) { 291be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifySwitchArgsQueue.push_back(*args); 292c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 293c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 294c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 295c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 296c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeEventHub --- 297c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 298c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeEventHub : public EventHubInterface { 299c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown struct KeyInfo { 300c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t keyCode; 301c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint32_t flags; 302c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown }; 303c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 304c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown struct Device { 305e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown InputDeviceIdentifier identifier; 306c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint32_t classes; 30747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown PropertyMap configuration; 308efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes; 309efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown KeyedVector<int, bool> relativeAxes; 310c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> keyCodeStates; 311c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> scanCodeStates; 312c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> switchStates; 3132717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown KeyedVector<int32_t, int32_t> absoluteAxisValue; 31449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown KeyedVector<int32_t, KeyInfo> keysByScanCode; 31549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown KeyedVector<int32_t, KeyInfo> keysByUsageCode; 31651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown KeyedVector<int32_t, bool> leds; 3179065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Vector<VirtualKeyDefinition> virtualKeys; 318c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 319e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown Device(uint32_t classes) : 320e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown classes(classes) { 321c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 322c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown }; 323c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 324c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, Device*> mDevices; 325c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Vector<String8> mExcludedDevices; 326c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown List<RawEvent> mEvents; 327c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 328c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 329c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~FakeEventHub() { 330c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (size_t i = 0; i < mDevices.size(); i++) { 331c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mDevices.valueAt(i); 332c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 333c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 334c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 335c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 336c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeEventHub() { } 337c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 338c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void addDevice(int32_t deviceId, const String8& name, uint32_t classes) { 339e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown Device* device = new Device(classes); 340e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown device->identifier.name = name; 341c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevices.add(deviceId, device); 342c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 34349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0); 344c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 345c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 346c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void removeDevice(int32_t deviceId) { 347c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mDevices.valueFor(deviceId); 348c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevices.removeItem(deviceId); 349c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 35049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0); 351c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 352c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 353c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void finishDeviceScan() { 35449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0); 355c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 356c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 35747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) { 35847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown Device* device = getDevice(deviceId); 35947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown device->configuration.addProperty(key, value); 36047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 36147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 36283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) { 36383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown Device* device = getDevice(deviceId); 36483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown device->configuration.addAll(configuration); 36583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 36683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 367efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown void addAbsoluteAxis(int32_t deviceId, int axis, 368b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) { 369c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 370c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 371c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawAbsoluteAxisInfo info; 372c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.valid = true; 373c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.minValue = minValue; 374c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.maxValue = maxValue; 375c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.flat = flat; 376c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.fuzz = fuzz; 377b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown info.resolution = resolution; 378efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown device->absoluteAxes.add(axis, info); 379efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown } 380efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown 381efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown void addRelativeAxis(int32_t deviceId, int32_t axis) { 382efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown Device* device = getDevice(deviceId); 383efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown device->relativeAxes.add(axis, true); 384c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 385c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 386c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) { 387c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 388c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown device->keyCodeStates.replaceValueFor(keyCode, state); 389c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 390c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 391c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) { 392c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 393c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown device->scanCodeStates.replaceValueFor(scanCode, state); 394c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 395c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 396c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) { 397c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 398c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown device->switchStates.replaceValueFor(switchCode, state); 399c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 400c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4012717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) { 4022717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown Device* device = getDevice(deviceId); 4032717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown device->absoluteAxisValue.replaceValueFor(axis, value); 4042717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown } 4052717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown 40649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, 40749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown int32_t keyCode, uint32_t flags) { 408c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 409c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyInfo info; 410c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.keyCode = keyCode; 411c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.flags = flags; 41249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (scanCode) { 41349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown device->keysByScanCode.add(scanCode, info); 41449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 41549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (usageCode) { 41649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown device->keysByUsageCode.add(usageCode, info); 41749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 418c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 419c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 42051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown void addLed(int32_t deviceId, int32_t led, bool initialState) { 42151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown Device* device = getDevice(deviceId); 42251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown device->leds.add(led, initialState); 42351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } 42451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 42551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown bool getLedState(int32_t deviceId, int32_t led) { 42651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown Device* device = getDevice(deviceId); 42751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown return device->leds.valueFor(led); 42851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } 42951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 430c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Vector<String8>& getExcludedDevices() { 431c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mExcludedDevices; 432c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 433c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4349065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) { 4359065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device* device = getDevice(deviceId); 4369065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown device->virtualKeys.push(definition); 4379065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 4389065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 439c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type, 44049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown int32_t code, int32_t value) { 441c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent event; 442c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.when = when; 443c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.deviceId = deviceId; 444c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.type = type; 44549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown event.code = code; 446c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.value = value; 447c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mEvents.push_back(event); 448be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (type == EV_ABS) { 45049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown setAbsoluteAxisValue(deviceId, code, value); 451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 452c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 453c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 454c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertQueueIsEmpty() { 455c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(0), mEvents.size()) 456c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected the event queue to be empty (fully consumed)."; 457c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 458c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 459c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 460c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* getDevice(int32_t deviceId) const { 461c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = mDevices.indexOfKey(deviceId); 462c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return index >= 0 ? mDevices.valueAt(index) : NULL; 463c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 464c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 465c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual uint32_t getDeviceClasses(int32_t deviceId) const { 466c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 467c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device ? device->classes : 0; 468c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 469c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 470e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const { 471c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 472e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown return device ? device->identifier : InputDeviceIdentifier(); 473c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 474c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 47547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const { 47647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown Device* device = getDevice(deviceId); 47747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown if (device) { 47847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown *outConfiguration = device->configuration; 47947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 48047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 48147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 482c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, 483c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawAbsoluteAxisInfo* outAxisInfo) const { 484c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 485c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 486efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ssize_t index = device->absoluteAxes.indexOfKey(axis); 487c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (index >= 0) { 488efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown *outAxisInfo = device->absoluteAxes.valueAt(index); 489c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return OK; 490c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 491c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 49283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown outAxisInfo->clear(); 493c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return -1; 494c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 495c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 496cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown virtual bool hasRelativeAxis(int32_t deviceId, int axis) const { 497efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown Device* device = getDevice(deviceId); 498efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown if (device) { 499efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown return device->relativeAxes.indexOfKey(axis) >= 0; 500efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown } 501cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown return false; 502cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown } 503cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown 50480fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown virtual bool hasInputProperty(int32_t deviceId, int property) const { 50580fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown return false; 50680fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown } 50780fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown 50849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown virtual status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, 509c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t* outKeycode, uint32_t* outFlags) const { 510c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 511c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 512cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown const KeyInfo* key = getKey(device, scanCode, usageCode); 51349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (key) { 514c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (outKeycode) { 51549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown *outKeycode = key->keyCode; 516c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 517c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (outFlags) { 51849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown *outFlags = key->flags; 519c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 520c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return OK; 521c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 522c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 523c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return NAME_NOT_FOUND; 524c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 525c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 526cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown const KeyInfo* getKey(Device* device, int32_t scanCode, int32_t usageCode) const { 527cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown if (usageCode) { 528cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown ssize_t index = device->keysByUsageCode.indexOfKey(usageCode); 529cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown if (index >= 0) { 530cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown return &device->keysByUsageCode.valueAt(index); 531cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown } 532cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown } 533cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown if (scanCode) { 534cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown ssize_t index = device->keysByScanCode.indexOfKey(scanCode); 535cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown if (index >= 0) { 536cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown return &device->keysByScanCode.valueAt(index); 537cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown } 538cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown } 539cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown return NULL; 540cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown } 541cc1169831921d9295b2fc01c1eaf7e9b00836f53Jeff Brown 54249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown virtual status_t mapAxis(int32_t deviceId, int32_t scanCode, 5438529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown AxisInfo* outAxisInfo) const { 5446f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return NAME_NOT_FOUND; 5456f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 5466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 5471a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown virtual void setExcludedDevices(const Vector<String8>& devices) { 5481a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mExcludedDevices = devices; 549c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 551b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) { 552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (mEvents.empty()) { 553b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown return 0; 554c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 555c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 556b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown *buffer = *mEvents.begin(); 557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mEvents.erase(mEvents.begin()); 558b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown return 1; 559c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const { 562c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 564c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = device->scanCodeStates.indexOfKey(scanCode); 565c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (index >= 0) { 566c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device->scanCodeStates.valueAt(index); 567c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 568c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 569c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return AKEY_STATE_UNKNOWN; 570c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 571c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 572c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const { 573c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 574c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 575c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = device->keyCodeStates.indexOfKey(keyCode); 576c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (index >= 0) { 577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device->keyCodeStates.valueAt(index); 578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return AKEY_STATE_UNKNOWN; 581c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 582c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 583c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const { 584c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 585c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 586c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = device->switchStates.indexOfKey(sw); 587c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (index >= 0) { 588c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device->switchStates.valueAt(index); 589c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 590c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return AKEY_STATE_UNKNOWN; 592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 5942717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, 5952717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown int32_t* outValue) const { 5962717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown Device* device = getDevice(deviceId); 5972717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown if (device) { 5982717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown ssize_t index = device->absoluteAxisValue.indexOfKey(axis); 5992717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown if (index >= 0) { 6002717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown *outValue = device->absoluteAxisValue.valueAt(index); 6012717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown return OK; 6022717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown } 6032717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown } 6042717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown *outValue = 0; 6052717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown return -1; 6062717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown } 6072717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown 608c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes, 609c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t* outFlags) const { 610c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool result = false; 611c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 612c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 613c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (size_t i = 0; i < numCodes; i++) { 61449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown for (size_t j = 0; j < device->keysByScanCode.size(); j++) { 61549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) { 61649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown outFlags[i] = 1; 61749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown result = true; 61849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 61949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 62049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown for (size_t j = 0; j < device->keysByUsageCode.size(); j++) { 62149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) { 622c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown outFlags[i] = 1; 623c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown result = true; 624c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 625c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 626c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 627c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 628c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return result; 629c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 630c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 63149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const { 63249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown Device* device = getDevice(deviceId); 63349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown if (device) { 63449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ssize_t index = device->keysByScanCode.indexOfKey(scanCode); 63549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown return index >= 0; 63649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown } 63749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown return false; 63849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown } 63949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown 6407631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown virtual bool hasLed(int32_t deviceId, int32_t led) const { 64151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown Device* device = getDevice(deviceId); 64251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown return device && device->leds.indexOfKey(led) >= 0; 6437631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown } 6447631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown 6457631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown virtual void setLedState(int32_t deviceId, int32_t led, bool on) { 64651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown Device* device = getDevice(deviceId); 64751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown if (device) { 64851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ssize_t index = device->leds.indexOfKey(led); 64951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown if (index >= 0) { 65051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown device->leds.replaceValueAt(led, on); 65151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } else { 65251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ADD_FAILURE() 65351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown << "Attempted to set the state of an LED that the EventHub declared " 65451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown "was not present. led=" << led; 65551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } 65651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } 6577631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown } 6587631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown 6599065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown virtual void getVirtualKeyDefinitions(int32_t deviceId, 6609065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Vector<VirtualKeyDefinition>& outVirtualKeys) const { 6619065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown outVirtualKeys.clear(); 6629065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 6639065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device* device = getDevice(deviceId); 6649065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown if (device) { 6659065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown outVirtualKeys.appendVector(device->virtualKeys); 6669065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 6679065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 6689065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 6699f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const { 6709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return NULL; 6711e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown } 6721e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown 6736ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown virtual bool setKeyboardLayoutOverlay(int32_t deviceId, const sp<KeyCharacterMap>& map) { 6746ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown return false; 6756ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown } 6766ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown 677a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown virtual void vibrate(int32_t deviceId, nsecs_t duration) { 678a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown } 679a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 680a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown virtual void cancelVibrate(int32_t deviceId) { 681a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown } 682a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown 68356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown virtual bool isExternal(int32_t deviceId) const { 68456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown return false; 68556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 68656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 687c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void dump(String8& dump) { 688c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 6891a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 69089ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown virtual void monitor() { 69189ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown } 69289ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 69393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void requestReopenDevices() { 69493fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown } 69593fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 69693fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void wake() { 6971a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } 698c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 699c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 700c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 701c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputReaderContext --- 702c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 703c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputReaderContext : public InputReaderContext { 704c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<EventHubInterface> mEventHub; 705c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<InputReaderPolicyInterface> mPolicy; 706be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown sp<InputListenerInterface> mListener; 707c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t mGlobalMetaState; 708c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool mUpdateGlobalMetaStateWasCalled; 709af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown int32_t mGeneration; 710c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 711c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 712c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputReaderContext(const sp<EventHubInterface>& eventHub, 713c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const sp<InputReaderPolicyInterface>& policy, 714be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown const sp<InputListenerInterface>& listener) : 715be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mEventHub(eventHub), mPolicy(policy), mListener(listener), 716c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mGlobalMetaState(0) { 717c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 718c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 719c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~FakeInputReaderContext() { } 720c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 721c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertUpdateGlobalMetaStateWasCalled() { 722c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled) 723c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected updateGlobalMetaState() to have been called."; 724c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mUpdateGlobalMetaStateWasCalled = false; 725c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 726c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setGlobalMetaState(int32_t state) { 728c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mGlobalMetaState = state; 729c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 730c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 731c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 732c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void updateGlobalMetaState() { 733c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mUpdateGlobalMetaStateWasCalled = true; 734c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 735c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 736c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getGlobalMetaState() { 737c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mGlobalMetaState; 738c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 739c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 740c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual EventHubInterface* getEventHub() { 741c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mEventHub.get(); 742c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 743c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 744c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual InputReaderPolicyInterface* getPolicy() { 745c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mPolicy.get(); 746c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 747c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 748be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual InputListenerInterface* getListener() { 749be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown return mListener.get(); 750c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 751fe50892af3b365806a767298dfd8e86447682581Jeff Brown 752fe50892af3b365806a767298dfd8e86447682581Jeff Brown virtual void disableVirtualKeysUntil(nsecs_t time) { 753fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 754fe50892af3b365806a767298dfd8e86447682581Jeff Brown 755fe50892af3b365806a767298dfd8e86447682581Jeff Brown virtual bool shouldDropVirtualKey(nsecs_t now, 756fe50892af3b365806a767298dfd8e86447682581Jeff Brown InputDevice* device, int32_t keyCode, int32_t scanCode) { 757fe50892af3b365806a767298dfd8e86447682581Jeff Brown return false; 758fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 75905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 76005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown virtual void fadePointer() { 76105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 762aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown 763aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown virtual void requestTimeoutAtTime(nsecs_t when) { 764aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown } 765af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 766af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown virtual int32_t bumpGeneration() { 767af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown return ++mGeneration; 768af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown } 769c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 772c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputMapper --- 773c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 774c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputMapper : public InputMapper { 775c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint32_t mSources; 776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t mKeyboardType; 777c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t mMetaState; 778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> mKeyCodeStates; 779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> mScanCodeStates; 780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> mSwitchStates; 781c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Vector<int32_t> mSupportedKeyCodes; 782c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent mLastEvent; 783c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 784c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool mConfigureWasCalled; 785c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool mResetWasCalled; 786c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool mProcessWasCalled; 787c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 788c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 789c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper(InputDevice* device, uint32_t sources) : 790c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputMapper(device), 791c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE), 792c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mMetaState(0), 793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) { 794c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 795c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 796c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~FakeInputMapper() { } 797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 798c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setKeyboardType(int32_t keyboardType) { 799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mKeyboardType = keyboardType; 800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 802c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setMetaState(int32_t metaState) { 803c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mMetaState = metaState; 804c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 805c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 806c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertConfigureWasCalled() { 807c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mConfigureWasCalled) 808c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected configure() to have been called."; 809c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mConfigureWasCalled = false; 810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertResetWasCalled() { 813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mResetWasCalled) 814c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected reset() to have been called."; 815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mResetWasCalled = false; 816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertProcessWasCalled(RawEvent* outLastEvent = NULL) { 819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mProcessWasCalled) 820c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected process() to have been called."; 821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (outLastEvent) { 822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown *outLastEvent = mLastEvent; 823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mProcessWasCalled = false; 825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 827c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setKeyCodeState(int32_t keyCode, int32_t state) { 828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mKeyCodeStates.replaceValueFor(keyCode, state); 829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setScanCodeState(int32_t scanCode, int32_t state) { 832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mScanCodeStates.replaceValueFor(scanCode, state); 833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 835c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setSwitchState(int32_t switchCode, int32_t state) { 836c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mSwitchStates.replaceValueFor(switchCode, state); 837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 838c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void addSupportedKeyCode(int32_t keyCode) { 840c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mSupportedKeyCodes.add(keyCode); 841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 843c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual uint32_t getSources() { 845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mSources; 846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 847c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) { 849c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputMapper::populateDeviceInfo(deviceInfo); 850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 851c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) { 852c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown deviceInfo->setKeyboardType(mKeyboardType); 853c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 855c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 85665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown virtual void configure(nsecs_t when, 85765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown const InputReaderConfiguration* config, uint32_t changes) { 858c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mConfigureWasCalled = true; 859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 860c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 86165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown virtual void reset(nsecs_t when) { 862c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mResetWasCalled = true; 863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void process(const RawEvent* rawEvent) { 866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mLastEvent = *rawEvent; 867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mProcessWasCalled = true; 868c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 869c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) { 871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = mKeyCodeStates.indexOfKey(keyCode); 872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN; 873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) { 876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = mScanCodeStates.indexOfKey(scanCode); 877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN; 878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode) { 881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = mSwitchStates.indexOfKey(switchCode); 882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN; 883c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 884c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes, 886c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t* keyCodes, uint8_t* outFlags) { 887c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool result = false; 888c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (size_t i = 0; i < numCodes; i++) { 889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) { 890c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (keyCodes[i] == mSupportedKeyCodes[j]) { 891c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown outFlags[i] = 1; 892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown result = true; 893c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 896c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return result; 897c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 898c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getMetaState() { 900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mMetaState; 901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 90205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 90305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown virtual void fadePointer() { 90405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 905c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 907c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 908c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InstrumentedInputReader --- 909c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 910c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InstrumentedInputReader : public InputReader { 911c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDevice* mNextDevice; 912c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 913c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 914c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InstrumentedInputReader(const sp<EventHubInterface>& eventHub, 915c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const sp<InputReaderPolicyInterface>& policy, 916be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown const sp<InputListenerInterface>& listener) : 917be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown InputReader(eventHub, policy, listener), 91871c86ada9f00334b2967d24d4182dc324cd97605Jeff Brown mNextDevice(NULL) { 919c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 920c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 921c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~InstrumentedInputReader() { 922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (mNextDevice) { 923c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mNextDevice; 924c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 925c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 926c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 927c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setNextDevice(InputDevice* device) { 928c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mNextDevice = device; 929c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 930c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 9319ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown InputDevice* newDevice(int32_t deviceId, const String8& name, uint32_t classes) { 932e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown InputDeviceIdentifier identifier; 933e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown identifier.name = name; 934af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown int32_t generation = deviceId + 1; 935af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown return new InputDevice(&mContext, deviceId, generation, identifier, classes); 936be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 937be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 938c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 939be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual InputDevice* createDeviceLocked(int32_t deviceId, 940e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown const InputDeviceIdentifier& identifier, uint32_t classes) { 941c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (mNextDevice) { 942c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDevice* device = mNextDevice; 943c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mNextDevice = NULL; 944c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device; 945c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 946e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown return InputReader::createDeviceLocked(deviceId, identifier, classes); 947c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 949c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown friend class InputReaderTest; 950c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 952c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 953c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputReaderTest --- 954c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 955c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputReaderTest : public testing::Test { 956c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 957be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown sp<FakeInputListener> mFakeListener; 958c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeInputReaderPolicy> mFakePolicy; 959c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeEventHub> mFakeEventHub; 960c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<InstrumentedInputReader> mReader; 961c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 962c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void SetUp() { 963c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub = new FakeEventHub(); 964c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy = new FakeInputReaderPolicy(); 965be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener = new FakeInputListener(); 966c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 967be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener); 968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 970c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void TearDown() { 971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader.clear(); 972c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 973be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener.clear(); 974c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy.clear(); 975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub.clear(); 976c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 977c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 97883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown void addDevice(int32_t deviceId, const String8& name, uint32_t classes, 97983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown const PropertyMap* configuration) { 980c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->addDevice(deviceId, name, classes); 98165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 98283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (configuration) { 98383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mFakeEventHub->addConfigurationMap(deviceId, configuration); 98483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 985c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->finishDeviceScan(); 986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->loopOnce(); 987c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->loopOnce(); 988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->assertQueueIsEmpty(); 989c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 990c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 991c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, 99283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown const String8& name, uint32_t classes, uint32_t sources, 99383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown const PropertyMap* configuration) { 9949ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown InputDevice* device = mReader->newDevice(deviceId, name, classes); 995c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = new FakeInputMapper(device, sources); 996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown device->addMapper(mapper); 997c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->setNextDevice(device); 99883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addDevice(deviceId, name, classes, configuration); 999c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mapper; 1000c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1003af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff BrownTEST_F(InputReaderTest, GetInputDevices) { 1004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"), 100583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, NULL)); 1006af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("ignored"), 1007af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 0, NULL)); // no classes so device will be ignored 1008af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 1009af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown Vector<InputDeviceInfo> inputDevices; 1010af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown mReader->getInputDevices(inputDevices); 1011af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 1012af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(1U, inputDevices.size()); 1013af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(1, inputDevices[0].getId()); 10145bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.string()); 1015af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType()); 1016af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources()); 1017af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size()); 1018af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown 1019af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown // Should also have received a notification describing the new input devices. 1020af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown inputDevices = mFakePolicy->getInputDevices(); 1021af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(1U, inputDevices.size()); 1022af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(1, inputDevices[0].getId()); 10235bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown ASSERT_STREQ("keyboard", inputDevices[0].getIdentifier().name.string()); 1024af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, inputDevices[0].getKeyboardType()); 1025af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, inputDevices[0].getSources()); 1026af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown ASSERT_EQ(size_t(0), inputDevices[0].getMotionRanges().size()); 1027c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1028c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1029c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) { 1030c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1031c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 103283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1033c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN); 1034c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0, 1036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_ANY, AKEYCODE_A)) 1037c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is >= 0 but unknown."; 1038c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1039c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1, 1040c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1041c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1042c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1043c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1, 1044c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1045c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1046c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1047c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1, 1048c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1049c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1050c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1051c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1, 1052c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1053c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1054c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1055c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) { 1057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 105983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN); 1061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0, 1063c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_ANY, KEY_A)) 1064c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is >= 0 but unknown."; 1065c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1, 1067c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, KEY_A)) 1068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1069c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1, 1071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A)) 1072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1, 1075c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, KEY_A)) 1076c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1077c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1078c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1, 1079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A)) 1080c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1081c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1082c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1083c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) { 1084c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1085c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 108683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1087c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN); 1088c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1089c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0, 1090c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_ANY, SW_LID)) 1091c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is >= 0 but unknown."; 1092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1093c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1, 1094c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, SW_LID)) 1095c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1, 1098c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID)) 1099c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1, 1102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, SW_LID)) 1103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1, 1106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID)) 1107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) { 1111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 111383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->addSupportedKeyCode(AKEYCODE_A); 1115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->addSupportedKeyCode(AKEYCODE_B); 1116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 }; 1118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[4] = { 0, 0, 0, 1 }; 1119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags)) 1121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return false when device id is >= 0 but unknown."; 1122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown flags[3] = 1; 1125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return false when device id is valid but the sources are not supported by the device."; 1127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown flags[3] = 1; 1130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]); 1133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown flags[3] = 1; 1135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return false when the device id is < 0 but the sources are not supported by any device."; 1137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown flags[3] = 1; 1140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]); 1143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) { 114683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD, NULL); 1147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1148be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyConfigurationChangedArgs args; 1149be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1150be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args)); 1151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) { 1155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 115783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 115949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1); 1160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->loopOnce(); 1161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty()); 1162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent event; 1164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event)); 1165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, event.when); 1166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, event.deviceId); 1167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(EV_KEY, event.type); 116849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(KEY_A, event.code); 1169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, event.value); 1170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputDeviceTest --- 1174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputDeviceTest : public testing::Test { 1176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const char* DEVICE_NAME; 1178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t DEVICE_ID; 1179af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown static const int32_t DEVICE_GENERATION; 11809ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown static const uint32_t DEVICE_CLASSES; 1181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeEventHub> mFakeEventHub; 1183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeInputReaderPolicy> mFakePolicy; 1184be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown sp<FakeInputListener> mFakeListener; 1185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputReaderContext* mFakeContext; 1186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDevice* mDevice; 1188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void SetUp() { 1190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub = new FakeEventHub(); 1191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy = new FakeInputReaderPolicy(); 1192be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener = new FakeInputListener(); 1193be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener); 1194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 119549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0); 1196e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown InputDeviceIdentifier identifier; 1197e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown identifier.name = DEVICE_NAME; 1198af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION, 1199af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown identifier, DEVICE_CLASSES); 1200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void TearDown() { 1203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mDevice; 1204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mFakeContext; 1206be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener.clear(); 1207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy.clear(); 1208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub.clear(); 1209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst char* InputDeviceTest::DEVICE_NAME = "device"; 1213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t InputDeviceTest::DEVICE_ID = 1; 1214af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brownconst int32_t InputDeviceTest::DEVICE_GENERATION = 2; 12159ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brownconst uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD 12169ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK; 1217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, ImmutableProperties) { 1219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, mDevice->getId()); 1220c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_STREQ(DEVICE_NAME, mDevice->getName()); 12219ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses()); 1222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) { 1225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Configuration. 1226474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown InputReaderConfiguration config; 122765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->configure(ARBITRARY_TIME, &config, 0); 122865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 122965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // Reset. 123065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->reset(ARBITRARY_TIME); 123165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 123265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown NotifyDeviceResetArgs resetArgs; 123365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs)); 123465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime); 123565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(DEVICE_ID, resetArgs.deviceId); 1236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Metadata. 1238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mDevice->isIgnored()); 1239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources()); 1240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 1242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->getDeviceInfo(&info); 1243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, info.getId()); 12445bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.string()); 1245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType()); 1246c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources()); 1247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // State queries. 1249c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, mDevice->getMetaState()); 1250c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1251c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0)) 1252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Ignored device should return unknown key code state."; 1253c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0)) 1254c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Ignored device should return unknown scan code state."; 1255c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0)) 1256c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Ignored device should return unknown switch state."; 1257c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1258c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B }; 1259c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[2] = { 0, 1 }; 1260c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags)) 1261c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Ignored device should never mark any key codes."; 1262c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged."; 1263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged."; 1264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1265c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1266c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) { 1267c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Configuration. 126847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value")); 1269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD); 1271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1272c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setMetaState(AMETA_ALT_ON); 1273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->addSupportedKeyCode(AKEYCODE_A); 1274c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->addSupportedKeyCode(AKEYCODE_B); 1275c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN); 1276c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP); 1277c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setScanCodeState(2, AKEY_STATE_DOWN); 1278c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setScanCodeState(3, AKEY_STATE_UP); 1279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setSwitchState(4, AKEY_STATE_DOWN); 1280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->addMapper(mapper1); 1281c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN); 1283c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper2->setMetaState(AMETA_SHIFT_ON); 1284c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->addMapper(mapper2); 1285c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1286474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown InputReaderConfiguration config; 128765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->configure(ARBITRARY_TIME, &config, 0); 1288c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1289c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown String8 propertyValue; 129047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue)) 129147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown << "Device should have read configuration during configuration phase."; 1292c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_STREQ("value", propertyValue.string()); 1293c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1294c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled()); 1295c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled()); 1296c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 129765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // Reset 129865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->reset(ARBITRARY_TIME); 129965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled()); 130065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled()); 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); 130665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 1307c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Metadata. 1308c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mDevice->isIgnored()); 1309c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources()); 1310c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1311c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 1312c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->getDeviceInfo(&info); 1313c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, info.getId()); 13145bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown ASSERT_STREQ(DEVICE_NAME, info.getIdentifier().name.string()); 1315c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType()); 1316c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources()); 1317c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1318c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // State queries. 1319c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState()) 1320c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mappers and combine meta states."; 1321c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1322c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1323c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown key code state when source not supported."; 1324c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1325c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown scan code state when source not supported."; 1326c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1327c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown switch state when source not supported."; 1328c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1329c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A)) 1330c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mapper when source is supported."; 1331c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3)) 1332c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mapper when source is supported."; 1333c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4)) 1334c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mapper when source is supported."; 1335c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1336c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 }; 1337c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[4] = { 0, 0, 0, 1 }; 1338c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1339c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should do nothing when source is unsupported."; 1340c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported."; 1341c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported."; 1342c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported."; 1343c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported."; 1344c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1345c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags)) 1346c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mapper when source is supported."; 1347c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set."; 1348c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set."; 1349c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged."; 1350c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged."; 1351c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1352c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Event handling. 1353c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent event; 1354b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown mDevice->process(&event, 1); 1355c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1356c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled()); 1357c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled()); 1358c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1359c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1360c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1361c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputMapperTest --- 1362c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1363c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputMapperTest : public testing::Test { 1364c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1365c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const char* DEVICE_NAME; 1366c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t DEVICE_ID; 1367af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown static const int32_t DEVICE_GENERATION; 13689ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown static const uint32_t DEVICE_CLASSES; 1369c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1370c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeEventHub> mFakeEventHub; 1371c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeInputReaderPolicy> mFakePolicy; 1372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown sp<FakeInputListener> mFakeListener; 1373c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputReaderContext* mFakeContext; 1374c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDevice* mDevice; 1375c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1376c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void SetUp() { 1377c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub = new FakeEventHub(); 1378c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy = new FakeInputReaderPolicy(); 1379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener = new FakeInputListener(); 1380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener); 1381e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown InputDeviceIdentifier identifier; 1382e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown identifier.name = DEVICE_NAME; 1383af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown mDevice = new InputDevice(mFakeContext, DEVICE_ID, DEVICE_GENERATION, 1384af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown identifier, DEVICE_CLASSES); 1385c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1386c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0); 1387c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1388c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1389c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void TearDown() { 1390c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mDevice; 1391c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mFakeContext; 1392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener.clear(); 1393c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy.clear(); 1394c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub.clear(); 1395c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1396c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 139747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown void addConfigurationProperty(const char* key, const char* value) { 139847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8(key), String8(value)); 1399c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1400c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1401c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void addMapperAndConfigure(InputMapper* mapper) { 1402c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->addMapper(mapper); 140365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 0); 140465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->reset(ARBITRARY_TIME); 140565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 140665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 140765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height, 140865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown int32_t orientation) { 140965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mFakePolicy->setDisplayInfo(displayId, width, height, orientation); 141065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 141165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 1412c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1413c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1414c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type, 141549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown int32_t code, int32_t value) { 1416c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent event; 1417c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.when = when; 1418c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.deviceId = deviceId; 1419c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.type = type; 142049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown event.code = code; 1421c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.value = value; 1422c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->process(&event); 1423c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1424c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1425c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static void assertMotionRange(const InputDeviceInfo& info, 1426efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) { 1427efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source); 1428efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_TRUE(range != NULL) << "Axis: " << axis << " Source: " << source; 1429efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source; 1430efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source; 1431efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source; 1432efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source; 1433efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source; 1434efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source; 1435c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1436c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1437c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static void assertPointerCoords(const PointerCoords& coords, 1438c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x, float y, float pressure, float size, 1439c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float touchMajor, float touchMinor, float toolMajor, float toolMinor, 1440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown float orientation, float distance) { 1441ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1); 1442ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 1443ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON); 1444ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON); 1445ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1); 1446ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1); 1447ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1); 1448ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1); 1449ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON); 1450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON); 1451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 1452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1453be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static void assertPosition(const sp<FakePointerController>& controller, float x, float y) { 1454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown float actualX, actualY; 1455be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown controller->getPosition(&actualX, &actualY); 1456be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NEAR(x, actualX, 1); 1457be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NEAR(y, actualY, 1); 1458c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1459c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1460c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1461c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst char* InputMapperTest::DEVICE_NAME = "device"; 1462c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t InputMapperTest::DEVICE_ID = 1; 1463af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brownconst int32_t InputMapperTest::DEVICE_GENERATION = 2; 14649ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brownconst uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests 1465c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1466c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1467c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- SwitchInputMapperTest --- 1468c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1469c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass SwitchInputMapperTest : public InputMapperTest { 1470c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1471c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1472c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1473c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, GetSources) { 1474c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1475c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1476c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 147789de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources()); 1478c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1479c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1480c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, GetSwitchState) { 1481c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1482c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1483c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1484c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1); 1485c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID)); 1486c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1487c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0); 1488c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID)); 1489c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1490c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1491c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, Process) { 1492c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1493c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1494c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 149549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 1); 1496bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_JACK_PHYSICAL_INSERT, 1); 1497bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_HEADPHONE_INSERT, 0); 1498bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 1499c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1500be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifySwitchArgs args; 1501be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args)); 1502be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1503bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown ASSERT_EQ((1 << SW_LID) | (1 << SW_JACK_PHYSICAL_INSERT), args.switchValues); 1504bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown ASSERT_EQ((1 << SW_LID) | (1 << SW_JACK_PHYSICAL_INSERT) | (1 << SW_HEADPHONE_INSERT), 1505bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown args.switchMask); 1506c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), args.policyFlags); 1507c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1508c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1509c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1510c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- KeyboardInputMapperTest --- 1511c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1512c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass KeyboardInputMapperTest : public InputMapperTest { 1513c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1514c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void testDPadKeyRotation(KeyboardInputMapper* mapper, 1515c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode); 1516c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1517c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1518c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper, 1519c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) { 1520be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 1521c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 152249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 1); 1523be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1524c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1525c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(originalScanCode, args.scanCode); 1526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(rotatedKeyCode, args.keyCode); 1527c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 152849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 0); 1529be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(originalScanCode, args.scanCode); 1532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(rotatedKeyCode, args.keyCode); 1533c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1534c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1535c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1536c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetSources) { 153747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources()); 1542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) { 154549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown const int32_t USAGE_A = 0x070004; 154649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown const int32_t USAGE_UNKNOWN = 0x07ffff; 154749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE); 154849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE); 154949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 155047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1553c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 155449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key down by scan code. 1555c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 155649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_HOME, 1); 1557be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 1558be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1559c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 1560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1562c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 1564c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, args.scanCode); 1565c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 1566c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1567c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 1568c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1569c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 157049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key up by scan code. 1571c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 157249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_HOME, 0); 1573be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1574c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 1575c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1576c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 1577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 1579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, args.scanCode); 1580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 1581c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1582c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 1583c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 158449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 158549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key down by usage code. 158649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 158749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_MSC, MSC_SCAN, USAGE_A); 158849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 158949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, 0, 1); 159049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 159149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 159249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 159349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 159449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 159549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEYCODE_A, args.keyCode); 159649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0, args.scanCode); 159749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 159849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 159949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 160049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 160149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 160249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key up by usage code. 160349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 160449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_MSC, MSC_SCAN, USAGE_A); 160549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 160649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, 0, 0); 160749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 160849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 160949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 161049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 161149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 161249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEYCODE_A, args.keyCode); 161349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0, args.scanCode); 161449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 161549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 161649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 161749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 161849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 161949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key down with unknown scan code or usage code. 162049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 162149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_MSC, MSC_SCAN, USAGE_UNKNOWN); 162249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 162349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_UNKNOWN, 1); 162449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 162549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 162649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 162749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 162849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 162949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0, args.keyCode); 163049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(KEY_UNKNOWN, args.scanCode); 163149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 163249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 163349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0U, args.policyFlags); 163449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 163549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 163649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key up with unknown scan code or usage code. 163749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 163849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_MSC, MSC_SCAN, USAGE_UNKNOWN); 163949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 164049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_UNKNOWN, 0); 164149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 164249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 164349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 164449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 164549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 164649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0, args.keyCode); 164749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(KEY_UNKNOWN, args.scanCode); 164849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 164949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 165049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0U, args.policyFlags); 165149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1652c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1653c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1654c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) { 165549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0); 165649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0); 165749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 165847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1659c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1660c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1661c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1662c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Initial metastate. 1663c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 1664c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1665c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Metakey down. 1666c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 166749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_LEFTSHIFT, 1); 1668be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 1669be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1670c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1671c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1672c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled()); 1673c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1674c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Key down. 1675c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 167649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_A, 1); 1677be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1678c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1679c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1680c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1681c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Key up. 1682c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME + 2, DEVICE_ID, 168349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_A, 0); 1684be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1685c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1686c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1687c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1688c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Metakey up. 1689c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME + 3, DEVICE_ID, 169049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_LEFTSHIFT, 0); 1691be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1692c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 1693c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 1694c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled()); 1695c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1696c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 169747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) { 169849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0); 169949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0); 170049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0); 170149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0); 170249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 170347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1704c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1705c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1706c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 170765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 170847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1709b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_90); 1710c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1711c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP)); 1712c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1713c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT)); 1714c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1715c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN)); 1716c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1717c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT)); 1718c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1719c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 172047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) { 172149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0); 172249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0); 172349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0); 172449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0); 172549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 172647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 172847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown addConfigurationProperty("keyboard.orientationAware", "1"); 1729c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1730c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 173165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1732c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1733b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_0); 1734c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1735c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP)); 1736c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1737c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT)); 1738c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1739c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN)); 1740c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1741c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT)); 1742c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 174365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1744c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1745b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_90); 1746c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1747c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT)); 1748c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1749c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP)); 1750c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1751c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT)); 1752c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1753c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN)); 1754c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 175565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1756c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1757b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_180); 1758c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1759c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN)); 1760c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1761c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT)); 1762c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1763c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP)); 1764c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1765c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT)); 1766c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 176765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1768c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1769b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_270); 1770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT)); 1772c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1773c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN)); 1774c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1775c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT)); 1776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1777c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP)); 1778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Special case: if orientation changes while key is down, we still emit the same keycode 1780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // in the key up as we did in the key down. 1781be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 1782c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 178365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1784c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1785b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_270); 178649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1); 1787be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1788c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1789c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_UP, args.scanCode); 1790c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode); 1791c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 179265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1794b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_180); 179549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0); 1796be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1798c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_UP, args.scanCode); 1799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode); 1800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1802c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetKeyCodeState) { 180347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1804c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1805c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1806c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1807c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1); 1808c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 1809c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0); 1811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 1812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1814c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetScanCodeState) { 181547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1); 1820c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 1821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0); 1823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 1824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) { 182747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 183149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0); 1832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B }; 1834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[2] = { 0, 0 }; 1835c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags)); 1836c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(flags[0]); 1837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(flags[1]); 1838c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 184051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff BrownTEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) { 184151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/); 184251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/); 184351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/); 184449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0); 184549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0); 184649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0); 184751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 184847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 184951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 185051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown addMapperAndConfigure(mapper); 185151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 185251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Initialization should have turned all of the lights off. 185351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 185451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 185551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 185651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 185751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle caps lock on. 185851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 185949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_CAPSLOCK, 1); 186051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 186149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_CAPSLOCK, 0); 186251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 186351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 186451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 186551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState()); 186651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 186751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle num lock on. 186851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 186949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_NUMLOCK, 1); 187051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 187149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_NUMLOCK, 0); 187251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 187351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 187451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 187551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState()); 187651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 187751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle caps lock off. 187851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 187949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_CAPSLOCK, 1); 188051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 188149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_CAPSLOCK, 0); 188251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 188351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 188451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 188551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState()); 188651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 188751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle scroll lock on. 188851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 188949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_SCROLLLOCK, 1); 189051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 189149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_SCROLLLOCK, 0); 189251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 189351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 189451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 189551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState()); 189651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 189751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle num lock off. 189851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 189949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_NUMLOCK, 1); 190051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 190149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_NUMLOCK, 0); 190251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 190351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 190451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 190551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState()); 190651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 190751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle scroll lock off. 190851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 190949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_SCROLLLOCK, 1); 191051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 191149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_SCROLLLOCK, 0); 191251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 191351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 191451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 191551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 191651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown} 191751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 1918c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 191983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown// --- CursorInputMapperTest --- 1920c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 192183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownclass CursorInputMapperTest : public InputMapperTest { 1922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1923c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t TRACKBALL_MOVEMENT_THRESHOLD; 1924c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 192583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<FakePointerController> mFakePointerController; 192683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 192783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown virtual void SetUp() { 192883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown InputMapperTest::SetUp(); 192983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 193083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mFakePointerController = new FakePointerController(); 193183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController); 193283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 193383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 193483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown void testMotionRotation(CursorInputMapper* mapper, 1935c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY); 1936c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1937c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 193883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownconst int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6; 1939c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 194083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownvoid CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper, 1941c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) { 1942be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 1943c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 194449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, originalX); 194549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, originalY); 194649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 1947be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 1948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 1949c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 1950c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD, 1951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD, 1952be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 1953c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1954c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 195583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) { 195683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 195783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "pointer"); 195883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addMapperAndConfigure(mapper); 195983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 196083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources()); 196183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 196283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 196383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) { 196483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 196583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 1966c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1967c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources()); 1969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1970c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 197183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) { 197283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 197383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "pointer"); 197483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addMapperAndConfigure(mapper); 197583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 197683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown InputDeviceInfo info; 197783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mapper->populateDeviceInfo(&info); 197883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 197983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Initially there may not be a valid motion range. 1980efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE)); 1981efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE)); 1982efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 1983efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f)); 198483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 198583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // When the bounds are set, then there should be a valid motion range. 19869626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1); 198783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 198883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown InputDeviceInfo info2; 198983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mapper->populateDeviceInfo(&info2); 199083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 1991efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 1992efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE, 19939626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown 1, 800 - 1, 0.0f, 0.0f)); 1994efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 1995efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE, 19969626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown 2, 480 - 1, 0.0f, 0.0f)); 1997efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 1998efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 1999b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 0.0f, 1.0f, 0.0f, 0.0f)); 200083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 200183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 200283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) { 200383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 200483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2005c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2006c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 2008c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->populateDeviceInfo(&info); 2009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2010efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2011efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL, 2012c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD)); 2013efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2014efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL, 2015c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD)); 2016efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2017efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL, 2018b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 0.0f, 1.0f, 0.0f, 0.0f)); 2019c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2020c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 202183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) { 202283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 202383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2024c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2025c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2026c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2027c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2028be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2029c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2030c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Button press. 2031c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Mostly testing non x/y behavior here so we don't need to check again elsewhere. 203249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 203349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2034be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 2037c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source); 2038c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), args.policyFlags); 2039c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2040c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, args.flags); 2041c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2042fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState); 2043c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, args.edgeFlags); 2044c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(1), args.pointerCount); 2045fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, args.pointerProperties[0].id); 2046fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType); 2047c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2048be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2049c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision); 2050c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision); 2051c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2052c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2053c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Button release. Should have same down time. 205449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 205549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2056be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 2058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 2059c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source); 2060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), args.policyFlags); 2061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, args.flags); 2063c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2064fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, args.buttonState); 2065c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, args.edgeFlags); 2066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(1), args.pointerCount); 2067fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, args.pointerProperties[0].id); 2068fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType); 2069c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2070be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision); 2072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision); 2073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2075c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 207683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) { 207783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 207883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2080c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2081be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2082c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2083c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Motion in X but not Y. 208449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1); 208549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2086be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2087c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2088c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2089be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2090c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2091c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Motion in Y but not X. 209249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2); 209349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2094be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2095c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2097be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2098c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2099c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 210083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) { 210183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 210283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2105be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2107be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Button press. 210849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 210949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2110be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2113be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2115be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Button release. 211649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 211749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2118be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2121be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 212483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) { 212583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 212683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2129be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Combined X, Y and Button. 213249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1); 213349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2); 213449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 213549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2136be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 2140be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move X, Y a bit while pressed. 214349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 2); 214449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 1); 214549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2146be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 2150be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Release Button. 215349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 215449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2155be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2158be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 216183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) { 216283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 216383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 216665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 216747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 2168b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_90); 2169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1)); 2170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1)); 2171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0)); 2172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1)); 2173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1)); 2174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1)); 2175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0)); 2176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1)); 2177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 217983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) { 218083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 218183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 218283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.orientationAware", "1"); 2183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 218565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 2186b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0); 2187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1)); 2188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1)); 2189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0)); 2190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1)); 2191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1)); 2192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1)); 2193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0)); 2194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1)); 2195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 219665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 2197b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_90); 2198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0)); 2199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1)); 2200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1)); 2201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1)); 2202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0)); 2203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1)); 2204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1)); 2205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1)); 2206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 220765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 2208b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_180); 2209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1)); 2210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1)); 2211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0)); 2212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1)); 2213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1)); 2214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1)); 2215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0)); 2216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1)); 2217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 221865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 2219b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_270); 2220c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0)); 2221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1)); 2222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1)); 2223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1)); 2224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0)); 2225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1)); 2226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1)); 2227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1)); 2228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2230be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) { 2231be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2232be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("cursor.mode", "pointer"); 2233be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 2234be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2235be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); 2236be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setPosition(100, 200); 2237be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setButtonState(0); 2238be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2239be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 2240be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs keyArgs; 2241be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2242be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_LEFT, release BTN_LEFT 224349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 1); 224449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2245be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2246be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2247be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 2248be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState()); 2249be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2250be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2251be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 225249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 0); 225349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2254be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2255be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2256be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2257be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2258be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2259be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2260be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2261be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2262be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2263be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2264be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2265be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2266be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2267be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2268be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 226949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 1); 227049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 1); 227149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2272be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2273be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2274be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 2275be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.buttonState); 2276be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 2277be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->getButtonState()); 2278be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2279be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2280be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 228149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 0); 228249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2283be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2284be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 2285be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState()); 2286be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 2287be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2288be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2289be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 229049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 0); 229149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2292be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2293be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2294be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2295be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2296be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2297be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2301be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2302be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2305be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_BACK, release BTN_BACK 230649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 1); 230749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2308be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2309be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2310be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2311be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2312be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 2313be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState()); 2314be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2315be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2316be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.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_BACK, 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_HOVER_MOVE, 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 ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2329be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_SIDE, release BTN_SIDE 233149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 1); 233249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2335be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2336be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 2338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState()); 2339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 234349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 0); 234449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2345be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2347be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2348be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2349be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_FORWARD, release BTN_FORWARD 235649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 1); 235749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 2363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState()); 2364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 236849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 0); 236949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2371be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_EXTRA, release BTN_EXTRA 238149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 1); 238249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2385be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 2388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, 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 239349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 0); 239449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 2405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2406be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) { 2407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("cursor.mode", "pointer"); 2409be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 2410be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); 2412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setPosition(100, 200); 2413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setButtonState(0); 2414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 241749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10); 241849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20); 241949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action); 2422be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f)); 2425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 2426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2427c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2428c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- TouchInputMapperTest --- 2429c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2430c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass TouchInputMapperTest : public InputMapperTest { 2431c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 2432c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_X_MIN; 2433c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_X_MAX; 2434c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_Y_MIN; 2435c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_Y_MAX; 2436c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_TOUCH_MIN; 2437c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_TOUCH_MAX; 2438c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_TOOL_MIN; 2439c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_TOOL_MAX; 2440c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_PRESSURE_MIN; 2441c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_PRESSURE_MAX; 2442c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_ORIENTATION_MIN; 2443c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_ORIENTATION_MAX; 2444be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static const int32_t RAW_DISTANCE_MIN; 2445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static const int32_t RAW_DISTANCE_MAX; 244665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown static const int32_t RAW_TILT_MIN; 244765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown static const int32_t RAW_TILT_MAX; 2448c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_ID_MIN; 2449c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_ID_MAX; 2450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static const int32_t RAW_SLOT_MIN; 2451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static const int32_t RAW_SLOT_MAX; 2452c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const float X_PRECISION; 2453c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const float Y_PRECISION; 2454c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2455a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown static const float GEOMETRIC_SCALE; 2456a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 2457c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const VirtualKeyDefinition VIRTUAL_KEYS[2]; 2458c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2459c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown enum Axes { 2460c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown POSITION = 1 << 0, 2461c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown TOUCH = 1 << 1, 2462c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown TOOL = 1 << 2, 2463c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown PRESSURE = 1 << 3, 2464c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ORIENTATION = 1 << 4, 2465c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown MINOR = 1 << 5, 2466c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ID = 1 << 6, 2467be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown DISTANCE = 1 << 7, 246865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown TILT = 1 << 8, 246965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown SLOT = 1 << 9, 247065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown TOOL_TYPE = 1 << 10, 2471c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown }; 2472c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2473c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void prepareDisplay(int32_t orientation); 2474c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void prepareVirtualKeys(); 2475c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t toRawX(float displayX); 2476c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t toRawY(float displayY); 2477c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float toDisplayX(int32_t rawX); 2478c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float toDisplayY(int32_t rawY); 2479c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 2480c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2481c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_X_MIN = 25; 24829626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst int32_t TouchInputMapperTest::RAW_X_MAX = 1019; 2483c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_Y_MIN = 30; 24849626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst int32_t TouchInputMapperTest::RAW_Y_MAX = 1009; 2485c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0; 2486c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31; 2487c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0; 2488c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15; 2489c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = RAW_TOUCH_MIN; 2490c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = RAW_TOUCH_MAX; 2491c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7; 2492c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7; 2493be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0; 2494be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7; 249565fd251c3913fc921468a3dad190810db19eb9dfJeff Brownconst int32_t TouchInputMapperTest::RAW_TILT_MIN = 0; 249665fd251c3913fc921468a3dad190810db19eb9dfJeff Brownconst int32_t TouchInputMapperTest::RAW_TILT_MAX = 150; 2497c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ID_MIN = 0; 2498c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ID_MAX = 9; 2499be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0; 2500be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9; 25019626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH; 25029626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT; 2503c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2504a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brownconst float TouchInputMapperTest::GEOMETRIC_SCALE = 2505a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1), 2506a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1)); 2507a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 2508c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = { 2509c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 }, 2510c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 }, 2511c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 2512c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2513c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid TouchInputMapperTest::prepareDisplay(int32_t orientation) { 251465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation); 2515c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2516c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2517c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid TouchInputMapperTest::prepareVirtualKeys() { 25189065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]); 25199065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]); 252049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE); 252149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE); 2522c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2523c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2524c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownint32_t TouchInputMapperTest::toRawX(float displayX) { 25259626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN); 2526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2527c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2528c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownint32_t TouchInputMapperTest::toRawY(float displayY) { 25299626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN); 2530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownfloat TouchInputMapperTest::toDisplayX(int32_t rawX) { 25339626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown return float(rawX - RAW_X_MIN) * DISPLAY_WIDTH / (RAW_X_MAX - RAW_X_MIN + 1); 2534c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2535c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2536c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownfloat TouchInputMapperTest::toDisplayY(int32_t rawY) { 25379626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown return float(rawY - RAW_Y_MIN) * DISPLAY_HEIGHT / (RAW_Y_MAX - RAW_Y_MIN + 1); 2538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- SingleTouchInputMapperTest --- 2542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass SingleTouchInputMapperTest : public TouchInputMapperTest { 2544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 254549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown void prepareButtons(); 2546c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void prepareAxes(int axes); 2547c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2548c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y); 2549c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y); 2550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processUp(SingleTouchInputMapper* mappery); 2551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processPressure(SingleTouchInputMapper* mapper, int32_t pressure); 2552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor); 2553be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processDistance(SingleTouchInputMapper* mapper, int32_t distance); 255465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY); 2555be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value); 2556c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processSync(SingleTouchInputMapper* mapper); 2557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 2558c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 255949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownvoid SingleTouchInputMapperTest::prepareButtons() { 256049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0); 256149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown} 256249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown 2563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::prepareAxes(int axes) { 2564c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (axes & POSITION) { 2565efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X, 2566efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown RAW_X_MIN, RAW_X_MAX, 0, 0); 2567efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y, 2568efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown RAW_Y_MIN, RAW_Y_MAX, 0, 0); 2569c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 2570c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (axes & PRESSURE) { 2571efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE, 2572efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0); 2573c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 2574c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (axes & TOOL) { 2575efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH, 2576efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0); 2577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 2578be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & DISTANCE) { 2579be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE, 2580be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0); 2581be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 258265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (axes & TILT) { 258365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X, 258465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown RAW_TILT_MIN, RAW_TILT_MAX, 0, 0); 258565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y, 258665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown RAW_TILT_MIN, RAW_TILT_MAX, 0, 0); 258765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 2588c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2589c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2590c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) { 259149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 1); 259249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x); 259349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y); 2594c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2595c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2596c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) { 259749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x); 259849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y); 2599c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2600c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2601c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) { 260249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0); 2603c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2604c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2605c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processPressure( 2606c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SingleTouchInputMapper* mapper, int32_t pressure) { 260749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, pressure); 2608c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2609c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2610c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processToolMajor( 2611c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SingleTouchInputMapper* mapper, int32_t toolMajor) { 261249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, toolMajor); 2613c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2614c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2615be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid SingleTouchInputMapperTest::processDistance( 2616be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper, int32_t distance) { 261749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_DISTANCE, distance); 2618be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 2619be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 262065fd251c3913fc921468a3dad190810db19eb9dfJeff Brownvoid SingleTouchInputMapperTest::processTilt( 262165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) { 262249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_X, tiltX); 262349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_Y, tiltY); 262465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown} 262565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 2626be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid SingleTouchInputMapperTest::processKey( 2627be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper, int32_t code, int32_t value) { 262849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value); 2629be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 2630be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2631c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) { 263249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2633c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2634c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2635c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2636ace13b17866dc9136aeecf6dfaf7077f37434469Jeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) { 263758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 263849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 263958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown prepareAxes(POSITION); 264058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addMapperAndConfigure(mapper); 264158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown 264265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources()); 2643ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown} 2644ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown 2645ace13b17866dc9136aeecf6dfaf7077f37434469Jeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) { 2646ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2647ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X); 2648ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y); 264949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2650ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown prepareAxes(POSITION); 2651ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown addMapperAndConfigure(mapper); 2652ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown 265358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources()); 265458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown} 265558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown 265649ed71db425c5054e3ad9526496a7e116c89556bJeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) { 265747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 265849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2659c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 266049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown addConfigurationProperty("touch.deviceType", "touchPad"); 2661c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2662c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2663c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources()); 2664c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2665c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 266649ed71db425c5054e3ad9526496a7e116c89556bJeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) { 266747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 266849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2669c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 267049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2671c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2672c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2673c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources()); 2674c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2675c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2676c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, GetKeyCodeState) { 267747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 267858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2679b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 268049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2681c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2682c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2683c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2684c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2685c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Unknown key. 2686c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 2687c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2688c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Virtual key is down. 2689c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2690c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2691c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2692c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2693be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2694c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2695c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME)); 2696c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2697c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Virtual key is up. 2698c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2699c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2700be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2701c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2702c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME)); 2703c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2704c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2705c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, GetScanCodeState) { 270647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 270758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2708b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 270949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2710c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2711c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2712c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2713c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2714c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Unknown key. 2715c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 2716c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2717c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Virtual key is down. 2718c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2719c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2720c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2721c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2722be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2723c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2724c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME)); 2725c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2726c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Virtual key is up. 2727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2728c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2730c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2731c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME)); 2732c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2733c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2734c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) { 273547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 273658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2737b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 273849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2739c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2740c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2741c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2742c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2743c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A }; 2744c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[2] = { 0, 0 }; 2745c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags)); 2746c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(flags[0]); 2747c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(flags[1]); 2748c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2749c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2750c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) { 275147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 275258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2753b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 275449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2755c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2756c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2757c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2758c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2759c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2760c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2761be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 2762c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2763c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Press virtual key. 2764c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2765c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2766c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2767c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2768c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2769be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 2770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 2772c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 2773c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags); 2774c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 2775c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags); 2776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 2777c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, args.scanCode); 2778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2781c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Release virtual key. 2782c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2783c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2784c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2785be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 2786c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2787c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 2788c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 2789c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags); 2790c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 2791c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags); 2792c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 2793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, args.scanCode); 2794c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2795c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2796c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any motions. 2798be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 2799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) { 280247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 280358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2804b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 280549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2806c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2807c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2808c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2809c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2812be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs keyArgs; 2813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2814c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Press virtual key. 2815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2820be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime); 2822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, keyArgs.deviceId); 2823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source); 2824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags); 2825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags); 2827c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode); 2828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, keyArgs.scanCode); 2829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState); 2830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime); 2831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move out of bounds. This should generate a cancel and a pointer down since we moved 2833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // into the display area. 2834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown y -= 100; 2835c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMove(mapper, x, y); 2836c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2838be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime); 2840c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, keyArgs.deviceId); 2841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source); 2842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags); 2843c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY 2845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags); 2846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode); 2847c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, keyArgs.scanCode); 2848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState); 2849c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime); 2850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2851be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 2852be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2853c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2855c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2856c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2857c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2858c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 2859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2860fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 2862c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2863fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2864fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2866be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2868c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2869c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Keep moving out of bounds. Should generate a pointer move. 2872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown y -= 50; 2873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMove(mapper, x, y); 2874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2876be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 2882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 2883c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2884fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 2886c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2887fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2888fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2890be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2891c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2893c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Release out of bounds. Should generate a pointer up. 2896c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2897c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2898c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2899be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2902c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2904c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2905c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 2906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2907fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2908c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 2909c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2910fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2911fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2912c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2913be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2914c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2915c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2916c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2917c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2918c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 2919be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 2920be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 2921c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2923c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) { 292447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 292558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2926b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 292749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2928c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2929c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2930c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2931c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2932c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2933c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2934be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 2935c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2936c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Initially go down out of bounds. 2937c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = -10; 2938c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = -10; 2939c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2940c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2941c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2942be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 2943c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2944c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move into the display area. Should generate a pointer down. 2945c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x = 50; 2946c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown y = 75; 2947c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMove(mapper, x, y); 2948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2949c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2950be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2952c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2953c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2954c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2955c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2956c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 2957c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2958fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2959c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 2960c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2961fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2962fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2963c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2964be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2965c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2966c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2967c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Release. Should generate a pointer up. 2970c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2972c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2973be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2974c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2976c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2977c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2978c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2979c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 2980c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2981fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2982c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 2983c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2984fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2985fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2987be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2989c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2990c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2991c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2992c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 2993be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 2994be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 2995c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2997c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) { 299847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 299958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3000b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 300149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 3002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 3003c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 3004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 3005c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3006c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 3007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3008be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3010c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Down. 3011c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = 100; 3012c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = 125; 3013c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(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 // Move. 3036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x += 50; 3037c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown y += 75; 3038c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMove(mapper, x, y); 3039c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3040c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3041be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3042c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3043c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3044c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3045c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3046c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3047c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3048c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3049fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3050c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3051c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3052fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3053fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3054c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3055be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3059c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Up. 3061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3063c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3064be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3065c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3067c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3069c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3072fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3075fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3076fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3077c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3078be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3080c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3081c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3082c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3083c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 3084be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 3085be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 3086c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3087c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 308847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) { 308947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 309058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 309149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 309247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown prepareAxes(POSITION); 309347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown addConfigurationProperty("touch.orientationAware", "0"); 309447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown addMapperAndConfigure(mapper); 309547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 3096be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 309747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 309847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown // Rotation 90. 3099b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_90); 310047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown processDown(mapper, toRawX(50), toRawY(75)); 310147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown processSync(mapper); 310247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 3103be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3104ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3105ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 310647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 310747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown processUp(mapper); 310847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown processSync(mapper); 3109be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 311047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown} 311147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 311247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) { 311347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 311458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 311549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 3116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 3117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 3118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3119be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 3120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rotation 0. 3122b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, toRawX(50), toRawY(75)); 3124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3126be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3127ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3128ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3132be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rotation 90. 3135b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_90); 31369626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50)); 3137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3139be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 31409626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 31419626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3145be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rotation 180. 3148b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_180); 31499626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN); 3150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3152be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 31539626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 31549626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3158be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rotation 270. 3161b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_270); 31629626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN); 3163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3165be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 31669626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 31679626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3171be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) { 317547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 317658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3177b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 317849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 317965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT); 3180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 3181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // These calculations are based on the input device calibration documentation. 3183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX = 100; 3184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY = 200; 3185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawPressure = 10; 3186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawToolMajor = 12; 318765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown int32_t rawDistance = 2; 318865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown int32_t rawTiltX = 30; 318965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown int32_t rawTiltY = 110; 3190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 3192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 3193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float pressure = float(rawPressure) / RAW_PRESSURE_MAX; 3194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float size = float(rawToolMajor) / RAW_TOOL_MAX; 3195a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float tool = float(rawToolMajor) * GEOMETRIC_SCALE; 3196be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown float distance = float(rawDistance); 3197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 319865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f; 319965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tiltScale = M_PI / 180; 320065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale; 320165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale; 320265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle)); 320365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle)); 320465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 3205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, rawX, rawY); 3206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPressure(mapper, rawPressure); 3207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 3208be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDistance(mapper, rawDistance); 320965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processTilt(mapper, rawTiltX, rawTiltY); 3210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3212be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 3213be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 321565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown x, y, pressure, size, tool, tool, tool, tool, orientation, distance)); 321665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT)); 3217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3219be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) { 3220be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3221be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3222be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3223be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareButtons(); 3224be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION); 3225be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 3226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3227be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3228be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs keyArgs; 3229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3230be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDown(mapper, 100, 200); 3231be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3232be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3233be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3234be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3236be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_LEFT, release BTN_LEFT 3237be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_LEFT, 1); 3238be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3239be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3240be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3241be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 3242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3243be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_LEFT, 0); 3244be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3245be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3246be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3247be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3249be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 3250be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_RIGHT, 1); 3251be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_MIDDLE, 1); 3252be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3253be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3254be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3255be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 3256be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.buttonState); 3257c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3258be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_RIGHT, 0); 3259be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3260be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3261be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 3262be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3264be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_MIDDLE, 0); 3265be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3266be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3267be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3268be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3270be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_BACK, release BTN_BACK 3271be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_BACK, 1); 3272be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3273be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3274be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3275be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3276be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3277be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 3278be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3280be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_BACK, 0); 3281be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3282be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3283be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3284be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3285be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3286be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3287be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3288be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3289be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_SIDE, release BTN_SIDE 3290be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_SIDE, 1); 3291be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3292be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3293be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3294be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3295be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3296be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 3297be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_SIDE, 0); 3300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3301be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3302be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3305be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3306be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3308be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_FORWARD, release BTN_FORWARD 3309be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_FORWARD, 1); 3310be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3311be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3312be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3313be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3314be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3315be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 3316be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3317be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3318be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_FORWARD, 0); 3319be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3320be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3321be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3322be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3323be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3324be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3325be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3326be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_EXTRA, release BTN_EXTRA 3328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_EXTRA, 1); 3329be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3331be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3332be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 3335be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3336be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_EXTRA, 0); 3338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3343be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3344be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3345be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_STYLUS, release BTN_STYLUS 3347be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS, 1); 3348be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3349be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState); 3352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS, 0); 3354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3356be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3357be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_STYLUS2, release BTN_STYLUS2 3360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS2, 1); 3361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 3365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS2, 0); 3367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3371be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // release touch 3373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processUp(mapper); 3374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3380be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) { 3381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3382be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareButtons(); 3385be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION); 3386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 3387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // default tool type is finger 3391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDown(mapper, 100, 200); 3392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // eraser 3398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 1); 3399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 3403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // stylus 3405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 0); 3406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 1); 3407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3409be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3410be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 341265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // brush 3413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 0); 341465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_BRUSH, 1); 341565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 341665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 341765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 341865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 341965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 342065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // pencil 342165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_BRUSH, 0); 342265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_PENCIL, 1); 342365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 342465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 342565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 342665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 342765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 342865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // airbrush 342965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_PENCIL, 0); 343065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_AIRBRUSH, 1); 343165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 343265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 343365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 343465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 343565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 343665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // mouse 343765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_AIRBRUSH, 0); 343865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 1); 343965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 344065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 344165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 344265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 344365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 344465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // lens 344565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 0); 344665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_LENS, 1); 344765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 344865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 344965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 345065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 345165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 3452ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // double-tap 345365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_LENS, 0); 3454ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_DOUBLETAP, 1); 3455ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 3456ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3457ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3458ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3459ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 3460ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // triple-tap 3461ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_DOUBLETAP, 0); 3462ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_TRIPLETAP, 1); 3463ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 3464ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3465ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3466ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3467ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 3468ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // quad-tap 3469ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_TRIPLETAP, 0); 3470ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_QUADTAP, 1); 3471ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 3472ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3473ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3474ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3475ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 3476ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // finger 3477ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_QUADTAP, 0); 3478be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 1); 3479be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3480be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3481be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3482be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3483be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3484be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // stylus trumps finger 3485be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 1); 3486be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3487be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3488be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3489be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3490be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3491be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // eraser trumps stylus 3492be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 1); 3493be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3494be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3495be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3496be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 3497be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 349865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // mouse trumps eraser 349965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 1); 350065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 350165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 350265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 350365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 350465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 3505be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // back to default tool type 350665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 0); 3507be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 0); 3508be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 0); 3509be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 0); 3510be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3511be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3512be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3513be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3514be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3515be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3516be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) { 3517be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3518be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3519be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3520be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareButtons(); 3521be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION); 352249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0); 3523be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 3524be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3525be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3526be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3527be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0 3528be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 1); 3529be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processMove(mapper, 100, 200); 3530be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3531be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3532be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3533be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3534be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3535be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3536be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3537be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3538be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3539be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3540be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3541be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // move a little 3542be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processMove(mapper, 150, 250); 3543be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3544be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3545be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3546be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3547be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3548be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3549be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // down when BTN_TOUCH is pressed, pressure defaults to 1 3550be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOUCH, 1); 3551be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3552be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3553be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3554be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3555be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3556be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3557be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3558be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3559be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3560be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3561be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3562be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // up when BTN_TOUCH is released, hover restored 3563be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOUCH, 0); 3564be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3565be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3566be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3567be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3568be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3569be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3570be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3571be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3572be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3573be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3574be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3575be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3576be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3577be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3578be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3579be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3580be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // exit hover when pointer goes away 3581be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 0); 3582be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3583be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3584be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3585be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3586be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3587be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3588be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 358965fd251c3913fc921468a3dad190810db19eb9dfJeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) { 3590be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3591be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3592be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3593be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareButtons(); 359465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown prepareAxes(POSITION | PRESSURE); 3595be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 3596be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3597be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3598be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 359965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // initially hovering because pressure is 0 3600be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDown(mapper, 100, 200); 360165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, 0); 3602be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3603be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3604be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3605be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 360665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3607be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3608be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3609be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3610be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 361165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3612be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3613be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // move a little 3614be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processMove(mapper, 150, 250); 3615be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3616be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3617be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3618be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 361965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3620be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 362165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // down when pressure is non-zero 362265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, RAW_PRESSURE_MAX); 3623be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3624be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3625be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3626be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 362765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3628be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3629be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3630be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3631be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3632be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3633be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 363465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // up when pressure becomes 0, hover restored 363565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, 0); 3636be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3637be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3638be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3639be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3640be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3641be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3642be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3643be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3644be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 364565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3646be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3647be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3648be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3649be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 365065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3651be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3652be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // exit hover when pointer goes away 3653be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processUp(mapper); 3654be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3655be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3656be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3657be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 365865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3659be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3660be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3661be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3662be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown// --- MultiTouchInputMapperTest --- 3663be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3664be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownclass MultiTouchInputMapperTest : public TouchInputMapperTest { 3665be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownprotected: 3666be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void prepareAxes(int axes); 3667be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3668be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y); 3669be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor); 3670be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor); 3671be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor); 3672be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor); 3673be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation); 3674be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processPressure(MultiTouchInputMapper* mapper, int32_t pressure); 3675be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processDistance(MultiTouchInputMapper* mapper, int32_t distance); 3676be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processId(MultiTouchInputMapper* mapper, int32_t id); 3677be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processSlot(MultiTouchInputMapper* mapper, int32_t slot); 3678be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processToolType(MultiTouchInputMapper* mapper, int32_t toolType); 3679be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value); 3680be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processMTSync(MultiTouchInputMapper* mapper); 3681be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processSync(MultiTouchInputMapper* mapper); 3682be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}; 3683be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3684be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::prepareAxes(int axes) { 3685be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & POSITION) { 3686be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X, 3687be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_X_MIN, RAW_X_MAX, 0, 0); 3688be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y, 3689be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_Y_MIN, RAW_Y_MAX, 0, 0); 3690be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3691be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & TOUCH) { 3692be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR, 3693be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0); 3694be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & MINOR) { 3695be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR, 3696be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0); 3697be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3698be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3699be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & TOOL) { 3700be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR, 3701be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0); 3702be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & MINOR) { 3703be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR, 3704be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0); 3705be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3706be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3707be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & ORIENTATION) { 3708be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION, 3709be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0); 3710be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3711be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & PRESSURE) { 3712be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE, 3713be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0); 3714be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3715be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & DISTANCE) { 3716be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE, 3717be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0); 3718be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3719be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & ID) { 3720be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID, 3721be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_ID_MIN, RAW_ID_MAX, 0, 0); 3722be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3723be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & SLOT) { 3724be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT, 3725be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0); 3726be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0); 3727be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3728be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & TOOL_TYPE) { 3729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE, 3730be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0, MT_TOOL_MAX, 0, 0); 3731be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3732be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3733be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3734be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processPosition( 3735be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t x, int32_t y) { 373649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, x); 373749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, y); 3738be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3739be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3740be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processTouchMajor( 3741be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t touchMajor) { 374249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor); 3743be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3744be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3745be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processTouchMinor( 3746be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t touchMinor) { 374749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor); 3748be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3749be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3750be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolMajor( 3751be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t toolMajor) { 375249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor); 3753be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3754be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3755be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolMinor( 3756be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t toolMinor) { 375749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor); 3758be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3759be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3760be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processOrientation( 3761be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t orientation) { 376249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, orientation); 3763be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3764c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3765c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processPressure( 3766c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown MultiTouchInputMapper* mapper, int32_t pressure) { 376749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, pressure); 3768c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3769c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3770be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processDistance( 3771be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t distance) { 377249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_DISTANCE, distance); 3773be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3774be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3775c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processId( 3776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown MultiTouchInputMapper* mapper, int32_t id) { 377749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, id); 3778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3780be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processSlot( 3781be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t slot) { 378249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_SLOT, slot); 3783be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3784be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3785be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolType( 3786be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t toolType) { 378749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOOL_TYPE, toolType); 3788be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3789be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3790be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processKey( 3791be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t code, int32_t value) { 379249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value); 3793be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3794be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3795c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) { 379649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0); 3797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3798c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) { 380049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 3801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3802c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3803c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3804c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) { 380547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 380658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3807b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3808c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 3809c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 3810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 3811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 3813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3814be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Two fingers down at once. 3817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 3818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x1, y1); 3819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3820c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 3821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3824be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3827c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3832fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3835fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3836fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3838be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3840c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3843be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3847c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 3849c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 3850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3851c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3852fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3853c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3855fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3856fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3857fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3858fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3860be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3862be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 3868c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 3869c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x1, y1); 3870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 3872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3875be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3883fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3884c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3886fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3887fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3888fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3889fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3890c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3891be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3893be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3896c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3897c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3898c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // First finger up. 3899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x2 += 15; y2 -= 20; 3900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 3901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3902c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3904be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3905c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3907c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3908c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3909c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 3910c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 3911c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3912c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3913fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3914c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3915c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3916fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3917fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3918fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3919fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3920c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3921be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3923be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3924c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3925c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3926c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3927c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3928be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3929c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3930c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3931c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3932c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3933c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3934c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3935c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3936fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3937c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3938c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3939fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 3940fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3941c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3942be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3943c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3944c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3945c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3946c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3947c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 3948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x2 += 20; y2 -= 25; 3949c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 3950c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3952c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3953be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3954c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3955c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3956c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3957c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3958c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3959c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3960c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3961fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3962c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3963c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3964fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 3965fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3966c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3967be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3970c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3972c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // New finger down. 3973c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x3 = 700, y3 = 300; 3974c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 3975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3976c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x3, y3); 3977c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3978c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3979c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3980be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3981c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3982c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3983c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3984c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3985c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 3986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 3987c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3989fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3990c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3991c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3992fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3993fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3994fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3995fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3997be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 3998c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3999be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4000c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4003c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Second finger up. 4005c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x3 += 30; y3 -= 20; 4006c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x3, y3); 4007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4008c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4010be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4011c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4012c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4013c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4014c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4015c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4016c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 4017c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 4018c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4019fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4020c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 4021c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4022fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4023fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4024fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4025fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4026c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4027be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4028c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4029be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4030c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4031c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4032c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4033c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4034be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4037c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4038c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4039c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4040c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 4041c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4042fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4043c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 4044c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4045fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4046fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4047c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4048be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4049c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4050c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4051c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4052c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4053c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Last finger up. 4054c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4055c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4057be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4059c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4063c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 4064c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4065fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 4067c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4068fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4069fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4071be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4075c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4076c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 4077be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4078be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4080c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4081c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) { 408247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 408358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4084b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4085c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION | ID); 4086c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 4087c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4088c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4089c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 4090c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4091be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4093c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Two fingers down at once. 4094c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 4095c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x1, y1); 4096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 1); 4097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4098c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4099c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4103be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 41066894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4107fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4109be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4111be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 4114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 41156894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4116fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 41176894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4118fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4120be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4122be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 4125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 4126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x1, y1); 4127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 1); 4128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4134be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 41376894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4138fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 41396894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4140fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4142be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4144be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // First finger up. 4147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x2 += 15; y2 -= 20; 4148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4153be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 4156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 41576894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4158fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 41596894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4160fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4162be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4164be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4166be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 41696894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4170fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4172be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 4175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x2 += 20; y2 -= 25; 4176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4181be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 41846894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4185fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4187be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // New finger down. 4190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x3 = 700, y3 = 300; 4191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x3, y3); 4195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 3); 4196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4199be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 42006894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 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(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 42096894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff 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 // Second finger up. 4213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x3 += 30; y3 -= 20; 4214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x3, y3); 4215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 3); 4216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4219be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 42206894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << 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(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 42296894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff 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(0, 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(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Last finger up. 4241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4244be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4246c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 42476894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4248fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4249c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4250be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4251c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 4253be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4254be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4255c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4256c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4257be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) { 425847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 425958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4260b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4261be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | ID | SLOT); 4262be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareVirtualKeys(); 4263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4265be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 4266be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4267be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4268be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4269be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Two fingers down at once. 4270be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 4271be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x1, y1); 4272be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 4273be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 1); 4274be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4275be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 2); 4276be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4277be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4278be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4279be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4280be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4281be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4282be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4283be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4284be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4285be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4286be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4287be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4288be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.action); 4289be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4290be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4291be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4292be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4293be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4294be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4295be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4296be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4297be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Move. 4300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 4301be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 0); 4302be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x1, y1); 4303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 1); 4304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4305be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4306be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4308be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4309be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4310be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4311be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4312be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4313be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4314be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4315be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4316be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4317be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4318be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4319be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // First finger up. 4320be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown x2 += 15; y2 -= 20; 4321be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 0); 4322be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 4323be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 1); 4324be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4325be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4326be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4329be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.action); 4330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4331be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4332be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4335be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4336be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4343be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4344be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4345be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4347be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4348be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Move. 4349be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown x2 += 20; y2 -= 25; 4350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4356be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4357be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // New finger down. 4362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t x3 = 700, y3 = 300; 4363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 0); 4365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 3); 4366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x3, y3); 4367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4371be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.action); 4372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4382be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Second finger up. 4383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown x3 += 30; y3 -= 20; 4384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 1); 4385be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 4386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 0); 4387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x3, y3); 4388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.action); 4393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4409be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4410be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Last finger up. 4412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 4413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4422be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Should not have sent any more keys or motions. 4424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 4427be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4428be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) { 4429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE); 4433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 4434be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4435be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // These calculations are based on the input device calibration documentation. 4436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawX = 100; 4437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawY = 200; 4438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawTouchMajor = 7; 4439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawTouchMinor = 6; 4440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawToolMajor = 9; 4441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawToolMinor = 8; 4442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawPressure = 11; 4443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawDistance = 0; 4444c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawOrientation = 3; 4445c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t id = 5; 4446c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4447c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 4448c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 4449c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float pressure = float(rawPressure) / RAW_PRESSURE_MAX; 4450a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX; 4451a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE; 4452a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE; 4453a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE; 4454a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE; 4455c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2; 4456be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown float distance = float(rawDistance); 4457c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4458c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX, rawY); 4459c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4460c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMinor(mapper, rawTouchMinor); 4461c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4462c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMinor(mapper, rawToolMinor); 4463c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPressure(mapper, rawPressure); 4464c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processOrientation(mapper, rawOrientation); 4465be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDistance(mapper, rawDistance); 4466c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, id); 4467c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4468c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4469c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4470be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 4471be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 44726894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, args.pointerProperties[0].id); 4473c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4474a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor, 4475a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown orientation, distance)); 4476c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4477c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4478c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) { 447947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 448058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4481b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4482c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION | TOUCH | TOOL | MINOR); 4483a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.calibration", "geometric"); 4484c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4485c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4486c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // These calculations are based on the input device calibration documentation. 4487c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX = 100; 4488c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY = 200; 4489c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawTouchMajor = 140; 4490c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawTouchMinor = 120; 4491c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawToolMajor = 180; 4492c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawToolMinor = 160; 4493c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4494c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 4495c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 4496a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX; 4497a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE; 4498a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE; 4499a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE; 4500a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE; 4501c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4502c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX, rawY); 4503c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4504c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMinor(mapper, rawTouchMinor); 4505c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4506c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMinor(mapper, rawToolMinor); 4507c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4508c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4509c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4510be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 4511be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4512c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4513a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0)); 4514c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4515c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4516a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) { 451747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 451858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4519b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4520c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION | TOUCH | TOOL); 4521a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.calibration", "diameter"); 4522a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.scale", "10"); 4523a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.bias", "160"); 4524a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.isSummed", "1"); 4525c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4527c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // These calculations are based on the input device calibration documentation. 4528c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Note: We only provide a single common touch/tool value because the device is assumed 4529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // not to emit separate values for each pointer (isSummed = 1). 4530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX = 100; 4531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY = 200; 4532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX2 = 150; 4533c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY2 = 250; 4534a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawTouchMajor = 5; 4535a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawToolMajor = 8; 4536c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4537c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 4538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 4539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x2 = toDisplayX(rawX2); 4540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y2 = toDisplayY(rawY2); 4541a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX; 4542a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f; 4543a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f; 4544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4545c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX, rawY); 4546c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4547c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4548c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4549c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX2, rawY2); 4550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4553c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4554c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4555be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 4556be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 455849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown 4559be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown args.action); 4562c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), args.pointerCount); 4563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4564a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4565c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1], 4566a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4567c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4568c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4569a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) { 457047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 457158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4572b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4573c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION | TOUCH | TOOL); 4574a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.calibration", "area"); 4575a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.scale", "43"); 4576a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.bias", "3"); 4577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // These calculations are based on the input device calibration documentation. 4580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX = 100; 4581c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY = 200; 4582a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawTouchMajor = 5; 4583a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawToolMajor = 8; 4584c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4585c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 4586c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 4587a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float size = float(rawTouchMajor) / RAW_TOUCH_MAX; 4588a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f; 4589a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f; 4590c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX, rawY); 4592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4594c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4595c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4596c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4597be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 4598be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4599c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4600a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4601a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown} 4602a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4603a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) { 4604a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4605a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4606a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4607a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown prepareAxes(POSITION | PRESSURE); 4608a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.pressure.calibration", "amplitude"); 4609a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.pressure.scale", "0.01"); 4610a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addMapperAndConfigure(mapper); 4611a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4612a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown // These calculations are based on the input device calibration documentation. 4613a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawX = 100; 4614a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawY = 200; 4615a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawPressure = 60; 4616a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4617a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float x = toDisplayX(rawX); 4618a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float y = toDisplayY(rawY); 4619a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float pressure = float(rawPressure) * 0.01f; 4620a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4621a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown processPosition(mapper, rawX, rawY); 4622a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown processPressure(mapper, rawPressure); 4623a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown processMTSync(mapper); 4624a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown processSync(mapper); 4625a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4626a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown NotifyMotionArgs args; 4627a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4628a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4629a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, pressure, 0, 0, 0, 0, 0, 0, 0)); 4630be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 4631be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4632be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) { 4633be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4634be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4635be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4636be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | ID | SLOT); 4637be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 4638be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4639be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4640be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs keyArgs; 4641be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4642be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 4643be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 100, 200); 4644be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4645be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4646be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4647be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4648be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4649be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_LEFT, release BTN_LEFT 4650be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_LEFT, 1); 4651be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4652be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4653be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4654be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 4655be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4656be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_LEFT, 0); 4657be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4658be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4659be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4660be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4661be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4662be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 4663be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_RIGHT, 1); 4664be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_MIDDLE, 1); 4665be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4666be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4667be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4668be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 4669be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.buttonState); 4670be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4671be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_RIGHT, 0); 4672be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4673be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4674be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 4675be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4676be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4677be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_MIDDLE, 0); 4678be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4679be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4680be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4681be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4682be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4683be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_BACK, release BTN_BACK 4684be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_BACK, 1); 4685be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4686be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4687be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4688be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4689be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4690be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 4691be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4692be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4693be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_BACK, 0); 4694be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4695be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4696be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4697be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4698be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4699be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4700be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4701be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4702be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_SIDE, release BTN_SIDE 4703be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_SIDE, 1); 4704be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4705be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4706be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4707be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4708be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4709be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 4710be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4711be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4712be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_SIDE, 0); 4713be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4714be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4715be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4716be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4717be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4718be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4719be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4720be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4721be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_FORWARD, release BTN_FORWARD 4722be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_FORWARD, 1); 4723be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4724be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4725be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4726be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4727be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4728be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 4729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4730be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4731be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_FORWARD, 0); 4732be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4733be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4734be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4735be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4736be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4737be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4738be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4739be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4740be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_EXTRA, release BTN_EXTRA 4741be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_EXTRA, 1); 4742be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4743be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4744be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4745be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4746be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4747be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 4748be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4749be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4750be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_EXTRA, 0); 4751be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4752be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4753be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4754be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4755be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4756be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4757be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4758be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4759be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_STYLUS, release BTN_STYLUS 4760be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS, 1); 4761be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4762be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4763be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4764be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState); 4765be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4766be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS, 0); 4767be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4768be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4769be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4770be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4771be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4772be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_STYLUS2, release BTN_STYLUS2 4773be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS2, 1); 4774be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4775be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4776be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4777be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 4778be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4779be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS2, 0); 4780be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4781be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4782be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4783be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4784be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4785be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // release touch 4786be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 4787be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4788be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4789be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4790be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4791be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 4792be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4793be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) { 4794be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4795be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4796be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4797be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | ID | SLOT | TOOL_TYPE); 4798be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 4799be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4800be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4801be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4802be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // default tool type is finger 4803be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 4804be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 100, 200); 4805be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4806be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4807be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4808be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4809be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4810be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // eraser 4811be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 1); 4812be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4813be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4814be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4815be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 4816be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4817be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // stylus 4818be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 0); 4819be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 1); 4820be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4821be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4822be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4823be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4824be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 482565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // brush 4826be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 0); 482765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_BRUSH, 1); 482865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 482965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 483065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 483165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 483265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 483365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // pencil 483465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_BRUSH, 0); 483565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_PENCIL, 1); 483665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 483765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 483865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 483965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 484065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 484165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // airbrush 484265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_PENCIL, 0); 484365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_AIRBRUSH, 1); 484465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 484565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 484665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 484765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 484865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 484965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // mouse 485065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_AIRBRUSH, 0); 485165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 1); 485265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 485365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 485465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 485565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 485665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 485765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // lens 485865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 0); 485965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_LENS, 1); 486065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 486165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 486265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 486365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 486465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 4865ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // double-tap 486665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_LENS, 0); 4867ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_DOUBLETAP, 1); 4868ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 4869ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4870ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4871ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4872ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 4873ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // triple-tap 4874ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_DOUBLETAP, 0); 4875ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_TRIPLETAP, 1); 4876ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 4877ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4878ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4879ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4880ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 4881ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // quad-tap 4882ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_TRIPLETAP, 0); 4883ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_QUADTAP, 1); 4884ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 4885ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4886ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4887ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4888ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 4889ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // finger 4890ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_QUADTAP, 0); 4891be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 1); 4892be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4893be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4894be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4895be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4896be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4897be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // stylus trumps finger 4898be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 1); 4899be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4900be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4901be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4902be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4903be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4904be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // eraser trumps stylus 4905be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 1); 4906be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4907be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4908be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4909be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 4910be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 491165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // mouse trumps eraser 491265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 1); 491365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 491465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 491565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 491665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 491765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 4918be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // MT tool type trumps BTN tool types: MT_TOOL_FINGER 4919be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE 4920be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4921be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4922be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4923be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4924be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4925be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // MT tool type trumps BTN tool types: MT_TOOL_PEN 4926be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processToolType(mapper, MT_TOOL_PEN); 4927be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4928be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4929be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4930be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4931be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4932be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // back to default tool type 4933be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processToolType(mapper, -1); // use a deliberately undefined tool type, for testing 493465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 0); 4935be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 0); 4936be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 0); 4937be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 0); 4938be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4939be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4940be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4941be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4942be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 4943be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4944be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) { 4945be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4946be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4947be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4948be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | ID | SLOT); 494949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0); 4950be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 4951be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4952be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4953be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4954be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0 4955be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 4956be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 100, 200); 4957be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4958be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4959be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 4960be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4961be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 4962be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4963be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4964be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 4965be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4966be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 4967be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4968be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // move a little 4969be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 150, 250); 4970be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4971be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4972be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 4973be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4974be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 4975be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4976be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // down when BTN_TOUCH is pressed, pressure defaults to 1 4977be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOUCH, 1); 4978be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4979be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4980be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 4981be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4982be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 4983be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4984be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4985be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4986be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4987be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 4988be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4989be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // up when BTN_TOUCH is released, hover restored 4990be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOUCH, 0); 4991be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4992be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4993be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4994be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4995be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 4996be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4997be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4998be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 4999be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5000be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5001be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5002be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5003be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5004be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5005be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5006be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5007be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // exit hover when pointer goes away 5008be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 5009be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5010be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5011be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5012be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5013be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5014c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 5015c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 501665fd251c3913fc921468a3dad190810db19eb9dfJeff BrownTEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) { 5017be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 5018be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 5019be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 502065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown prepareAxes(POSITION | ID | SLOT | PRESSURE); 5021be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 5022be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5023be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 5024be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 502565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // initially hovering because pressure is 0 5026be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 5027be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 100, 200); 502865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, 0); 5029be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5030be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5031be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 5032be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 503365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 5034be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5035be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5036be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5037be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 503865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 5039be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5040be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // move a little 5041be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 150, 250); 5042be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5043be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5044be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5045be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 504665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5047be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 504865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // down when pressure becomes non-zero 504965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, RAW_PRESSURE_MAX); 5050be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5051be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5052be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5053be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 505465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5055be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5056be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5057be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 5058be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5059be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 5060be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 506165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // up when pressure becomes 0, hover restored 506265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, 0); 5063be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5064be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5065be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 5066be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5067be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 5068be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5069be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5070be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 5071be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 507265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5073be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5074be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5075be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5076be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 507765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5078be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5079be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // exit hover when pointer goes away 5080be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 5081be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5082be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5083be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5084be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 508565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5086be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 5087be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5088be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5089c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} // namespace android 5090