InputReader_test.cpp revision 49ccac530b5a798e3c4a79b66b51b8546a0deed1
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; 130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~FakeInputReaderPolicy() { } 133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 135214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown FakeInputReaderPolicy() { 136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setDisplayInfo(int32_t displayId, int32_t width, int32_t height, int32_t orientation) { 13965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // Set the size of both the internal and external display at the same time. 14065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mConfig.setDisplayInfo(displayId, false /*external*/, width, height, orientation); 14165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mConfig.setDisplayInfo(displayId, true /*external*/, width, height, orientation); 142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 144fe50892af3b365806a767298dfd8e86447682581Jeff Brown virtual nsecs_t getVirtualKeyQuietTime() { 145fe50892af3b365806a767298dfd8e86447682581Jeff Brown return 0; 146fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 147fe50892af3b365806a767298dfd8e86447682581Jeff Brown 148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void addExcludedDeviceName(const String8& deviceName) { 149214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown mConfig.excludedDeviceNames.push(deviceName); 150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 15283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown void setPointerController(int32_t deviceId, const sp<FakePointerController>& controller) { 15383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mPointerControllers.add(deviceId, controller); 15483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 15583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 15665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown const InputReaderConfiguration* getReaderConfiguration() const { 15765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown return &mConfig; 158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 16065fd251c3913fc921468a3dad190810db19eb9dfJeff Brownprivate: 161214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) { 162214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown *outConfig = mConfig; 163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 16483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 16583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) { 16683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown return mPointerControllers.valueFor(deviceId); 16783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 171be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown// --- FakeInputListener --- 172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 173be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownclass FakeInputListener : public InputListenerInterface { 174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 175be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown List<NotifyConfigurationChangedArgs> mNotifyConfigurationChangedArgsQueue; 17665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown List<NotifyDeviceResetArgs> mNotifyDeviceResetArgsQueue; 177be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown List<NotifyKeyArgs> mNotifyKeyArgsQueue; 178be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown List<NotifyMotionArgs> mNotifyMotionArgsQueue; 179be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown List<NotifySwitchArgs> mNotifySwitchArgsQueue; 180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 182be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual ~FakeInputListener() { } 183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 185be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown FakeInputListener() { 186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 188be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void assertNotifyConfigurationChangedWasCalled( 189be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyConfigurationChangedArgs* outEventArgs = NULL) { 190be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_FALSE(mNotifyConfigurationChangedArgsQueue.empty()) 191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyConfigurationChanged() to have been called."; 192be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (outEventArgs) { 193be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *outEventArgs = *mNotifyConfigurationChangedArgsQueue.begin(); 194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 195be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyConfigurationChangedArgsQueue.erase(mNotifyConfigurationChangedArgsQueue.begin()); 196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 19865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown void assertNotifyDeviceResetWasCalled( 19965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown NotifyDeviceResetArgs* outEventArgs = NULL) { 20065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_FALSE(mNotifyDeviceResetArgsQueue.empty()) 20165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown << "Expected notifyDeviceReset() to have been called."; 20265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (outEventArgs) { 20365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown *outEventArgs = *mNotifyDeviceResetArgsQueue.begin(); 20465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 20565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mNotifyDeviceResetArgsQueue.erase(mNotifyDeviceResetArgsQueue.begin()); 20665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 20765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 208be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void assertNotifyKeyWasCalled(NotifyKeyArgs* outEventArgs = NULL) { 209be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_FALSE(mNotifyKeyArgsQueue.empty()) 210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyKey() to have been called."; 211be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (outEventArgs) { 212be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *outEventArgs = *mNotifyKeyArgsQueue.begin(); 213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 214be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyKeyArgsQueue.erase(mNotifyKeyArgsQueue.begin()); 215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertNotifyKeyWasNotCalled() { 218be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_TRUE(mNotifyKeyArgsQueue.empty()) 219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyKey() to not have been called."; 220c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 222be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void assertNotifyMotionWasCalled(NotifyMotionArgs* outEventArgs = NULL) { 223be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_FALSE(mNotifyMotionArgsQueue.empty()) 224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyMotion() to have been called."; 225be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (outEventArgs) { 226be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *outEventArgs = *mNotifyMotionArgsQueue.begin(); 227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 228be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyMotionArgsQueue.erase(mNotifyMotionArgsQueue.begin()); 229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 231c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertNotifyMotionWasNotCalled() { 232be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_TRUE(mNotifyMotionArgsQueue.empty()) 233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifyMotion() to not have been called."; 234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 236be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void assertNotifySwitchWasCalled(NotifySwitchArgs* outEventArgs = NULL) { 237be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_FALSE(mNotifySwitchArgsQueue.empty()) 238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected notifySwitch() to have been called."; 239be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (outEventArgs) { 240be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *outEventArgs = *mNotifySwitchArgsQueue.begin(); 241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 242be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifySwitchArgsQueue.erase(mNotifySwitchArgsQueue.begin()); 243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 246be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) { 247be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyConfigurationChangedArgsQueue.push_back(*args); 2480029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 2490029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 25065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) { 25165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mNotifyDeviceResetArgsQueue.push_back(*args); 25265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 25365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 254be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual void notifyKey(const NotifyKeyArgs* args) { 255be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyKeyArgsQueue.push_back(*args); 2567631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown } 2577631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown 258be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual void notifyMotion(const NotifyMotionArgs* args) { 259be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifyMotionArgsQueue.push_back(*args); 260c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 261c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 262be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual void notifySwitch(const NotifySwitchArgs* args) { 263be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mNotifySwitchArgsQueue.push_back(*args); 264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 265c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 266c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 267c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 268c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeEventHub --- 269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeEventHub : public EventHubInterface { 271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown struct KeyInfo { 272c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t keyCode; 273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint32_t flags; 274c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown }; 275c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 276c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown struct Device { 277e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown InputDeviceIdentifier identifier; 278c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint32_t classes; 27947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown PropertyMap configuration; 280efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown KeyedVector<int, RawAbsoluteAxisInfo> absoluteAxes; 281efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown KeyedVector<int, bool> relativeAxes; 282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> keyCodeStates; 283c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> scanCodeStates; 284c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> switchStates; 2852717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown KeyedVector<int32_t, int32_t> absoluteAxisValue; 28649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown KeyedVector<int32_t, KeyInfo> keysByScanCode; 28749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown KeyedVector<int32_t, KeyInfo> keysByUsageCode; 28851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown KeyedVector<int32_t, bool> leds; 2899065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Vector<VirtualKeyDefinition> virtualKeys; 290c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 291e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown Device(uint32_t classes) : 292e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown classes(classes) { 293c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 294c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown }; 295c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 296c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, Device*> mDevices; 297c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Vector<String8> mExcludedDevices; 298c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown List<RawEvent> mEvents; 299c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 300c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 301c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~FakeEventHub() { 302c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (size_t i = 0; i < mDevices.size(); i++) { 303c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mDevices.valueAt(i); 304c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 305c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 306c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 307c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 308c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeEventHub() { } 309c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 310c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void addDevice(int32_t deviceId, const String8& name, uint32_t classes) { 311e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown Device* device = new Device(classes); 312e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown device->identifier.name = name; 313c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevices.add(deviceId, device); 314c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 31549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_ADDED, 0, 0); 316c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 317c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 318c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void removeDevice(int32_t deviceId) { 319c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mDevices.valueFor(deviceId); 320c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevices.removeItem(deviceId); 321c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 32249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown enqueueEvent(ARBITRARY_TIME, deviceId, EventHubInterface::DEVICE_REMOVED, 0, 0); 323c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 324c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 325c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void finishDeviceScan() { 32649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown enqueueEvent(ARBITRARY_TIME, 0, EventHubInterface::FINISHED_DEVICE_SCAN, 0, 0); 327c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 328c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 32947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown void addConfigurationProperty(int32_t deviceId, const String8& key, const String8& value) { 33047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown Device* device = getDevice(deviceId); 33147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown device->configuration.addProperty(key, value); 33247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 33347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 33483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown void addConfigurationMap(int32_t deviceId, const PropertyMap* configuration) { 33583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown Device* device = getDevice(deviceId); 33683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown device->configuration.addAll(configuration); 33783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 33883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 339efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown void addAbsoluteAxis(int32_t deviceId, int axis, 340b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown int32_t minValue, int32_t maxValue, int flat, int fuzz, int resolution = 0) { 341c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 342c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 343c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawAbsoluteAxisInfo info; 344c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.valid = true; 345c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.minValue = minValue; 346c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.maxValue = maxValue; 347c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.flat = flat; 348c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.fuzz = fuzz; 349b3a2d1330716812784aee91b6d6275764b5e4210Jeff Brown info.resolution = resolution; 350efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown device->absoluteAxes.add(axis, info); 351efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown } 352efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown 353efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown void addRelativeAxis(int32_t deviceId, int32_t axis) { 354efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown Device* device = getDevice(deviceId); 355efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown device->relativeAxes.add(axis, true); 356c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 357c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 358c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setKeyCodeState(int32_t deviceId, int32_t keyCode, int32_t state) { 359c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 360c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown device->keyCodeStates.replaceValueFor(keyCode, state); 361c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 362c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 363c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setScanCodeState(int32_t deviceId, int32_t scanCode, int32_t state) { 364c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 365c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown device->scanCodeStates.replaceValueFor(scanCode, state); 366c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 367c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 368c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setSwitchState(int32_t deviceId, int32_t switchCode, int32_t state) { 369c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 370c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown device->switchStates.replaceValueFor(switchCode, state); 371c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 372c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3732717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown void setAbsoluteAxisValue(int32_t deviceId, int32_t axis, int32_t value) { 3742717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown Device* device = getDevice(deviceId); 3752717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown device->absoluteAxisValue.replaceValueFor(axis, value); 3762717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown } 3772717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown 37849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown void addKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, 37949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown int32_t keyCode, uint32_t flags) { 380c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 381c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyInfo info; 382c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.keyCode = keyCode; 383c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown info.flags = flags; 38449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (scanCode) { 38549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown device->keysByScanCode.add(scanCode, info); 38649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 38749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (usageCode) { 38849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown device->keysByUsageCode.add(usageCode, info); 38949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 390c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 391c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 39251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown void addLed(int32_t deviceId, int32_t led, bool initialState) { 39351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown Device* device = getDevice(deviceId); 39451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown device->leds.add(led, initialState); 39551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } 39651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 39751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown bool getLedState(int32_t deviceId, int32_t led) { 39851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown Device* device = getDevice(deviceId); 39951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown return device->leds.valueFor(led); 40051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } 40151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 402c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Vector<String8>& getExcludedDevices() { 403c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mExcludedDevices; 404c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 405c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4069065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown void addVirtualKeyDefinition(int32_t deviceId, const VirtualKeyDefinition& definition) { 4079065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device* device = getDevice(deviceId); 4089065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown device->virtualKeys.push(definition); 4099065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 4109065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 411c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void enqueueEvent(nsecs_t when, int32_t deviceId, int32_t type, 41249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown int32_t code, int32_t value) { 413c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent event; 414c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.when = when; 415c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.deviceId = deviceId; 416c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.type = type; 41749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown event.code = code; 418c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.value = value; 419c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mEvents.push_back(event); 420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (type == EV_ABS) { 42249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown setAbsoluteAxisValue(deviceId, code, value); 423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 424c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 425c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 426c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertQueueIsEmpty() { 427c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(0), mEvents.size()) 428c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected the event queue to be empty (fully consumed)."; 429c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 430c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 431c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 432c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* getDevice(int32_t deviceId) const { 433c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = mDevices.indexOfKey(deviceId); 434c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return index >= 0 ? mDevices.valueAt(index) : NULL; 435c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 436c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 437c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual uint32_t getDeviceClasses(int32_t deviceId) const { 438c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 439c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device ? device->classes : 0; 440c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 441c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 442e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown virtual InputDeviceIdentifier getDeviceIdentifier(int32_t deviceId) const { 443c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 444e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown return device ? device->identifier : InputDeviceIdentifier(); 445c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 446c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 44747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown virtual void getConfiguration(int32_t deviceId, PropertyMap* outConfiguration) const { 44847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown Device* device = getDevice(deviceId); 44947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown if (device) { 45047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown *outConfiguration = device->configuration; 45147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 45247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 45347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 454c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual status_t getAbsoluteAxisInfo(int32_t deviceId, int axis, 455c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawAbsoluteAxisInfo* outAxisInfo) const { 456c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 457c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 458efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ssize_t index = device->absoluteAxes.indexOfKey(axis); 459c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (index >= 0) { 460efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown *outAxisInfo = device->absoluteAxes.valueAt(index); 461c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return OK; 462c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 463c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 464c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return -1; 465c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 466c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 467cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown virtual bool hasRelativeAxis(int32_t deviceId, int axis) const { 468efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown Device* device = getDevice(deviceId); 469efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown if (device) { 470efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown return device->relativeAxes.indexOfKey(axis) >= 0; 471efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown } 472cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown return false; 473cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown } 474cc0c159e9b3dd4e0f48da0ce3e33d2c68a651413Jeff Brown 47580fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown virtual bool hasInputProperty(int32_t deviceId, int property) const { 47680fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown return false; 47780fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown } 47880fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown 47949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown virtual status_t mapKey(int32_t deviceId, int32_t scanCode, int32_t usageCode, 480c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t* outKeycode, uint32_t* outFlags) const { 481c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 482c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 48349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown const KeyInfo* key = NULL; 48449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (scanCode) { 48549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ssize_t index = device->keysByScanCode.indexOfKey(scanCode); 48649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (index >= 0) { 48749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown key = &device->keysByScanCode.valueAt(index); 48849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 48949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 49049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (!key && usageCode) { 49149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ssize_t index = device->keysByUsageCode.indexOfKey(usageCode); 49249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (index >= 0) { 49349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown key = &device->keysByUsageCode.valueAt(index); 49449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 49549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 49649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (key) { 497c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (outKeycode) { 49849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown *outKeycode = key->keyCode; 499c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 500c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (outFlags) { 50149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown *outFlags = key->flags; 502c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 503c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return OK; 504c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 505c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 506c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return NAME_NOT_FOUND; 507c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 508c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 50949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown virtual status_t mapAxis(int32_t deviceId, int32_t scanCode, 5108529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown AxisInfo* outAxisInfo) const { 5116f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown return NAME_NOT_FOUND; 5126f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown } 5136f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown 5141a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown virtual void setExcludedDevices(const Vector<String8>& devices) { 5151a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mExcludedDevices = devices; 516c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 517c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 518b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown virtual size_t getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) { 519c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (mEvents.empty()) { 520b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown return 0; 521c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 522c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 523b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown *buffer = *mEvents.begin(); 524c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mEvents.erase(mEvents.begin()); 525b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown return 1; 526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 527c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 528c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getScanCodeState(int32_t deviceId, int32_t scanCode) const { 529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = device->scanCodeStates.indexOfKey(scanCode); 532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (index >= 0) { 533c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device->scanCodeStates.valueAt(index); 534c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 535c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 536c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return AKEY_STATE_UNKNOWN; 537c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getKeyCodeState(int32_t deviceId, int32_t keyCode) const { 540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = device->keyCodeStates.indexOfKey(keyCode); 543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (index >= 0) { 544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device->keyCodeStates.valueAt(index); 545c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 546c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 547c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return AKEY_STATE_UNKNOWN; 548c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 549c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getSwitchState(int32_t deviceId, int32_t sw) const { 551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 552c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 553c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = device->switchStates.indexOfKey(sw); 554c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (index >= 0) { 555c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device->switchStates.valueAt(index); 556c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 558c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return AKEY_STATE_UNKNOWN; 559c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 5612717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown virtual status_t getAbsoluteAxisValue(int32_t deviceId, int32_t axis, 5622717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown int32_t* outValue) const { 5632717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown Device* device = getDevice(deviceId); 5642717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown if (device) { 5652717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown ssize_t index = device->absoluteAxisValue.indexOfKey(axis); 5662717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown if (index >= 0) { 5672717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown *outValue = device->absoluteAxisValue.valueAt(index); 5682717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown return OK; 5692717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown } 5702717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown } 5712717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown *outValue = 0; 5722717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown return -1; 5732717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown } 5742717eff2ac04bed60e5fd577bcb8ec1ea7c2ccdeJeff Brown 575c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual bool markSupportedKeyCodes(int32_t deviceId, size_t numCodes, const int32_t* keyCodes, 576c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t* outFlags) const { 577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool result = false; 578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Device* device = getDevice(deviceId); 579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (device) { 580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (size_t i = 0; i < numCodes; i++) { 58149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown for (size_t j = 0; j < device->keysByScanCode.size(); j++) { 58249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (keyCodes[i] == device->keysByScanCode.valueAt(j).keyCode) { 58349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown outFlags[i] = 1; 58449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown result = true; 58549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 58649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown } 58749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown for (size_t j = 0; j < device->keysByUsageCode.size(); j++) { 58849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown if (keyCodes[i] == device->keysByUsageCode.valueAt(j).keyCode) { 589c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown outFlags[i] = 1; 590c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown result = true; 591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 594c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 595c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return result; 596c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 597c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 59849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown virtual bool hasScanCode(int32_t deviceId, int32_t scanCode) const { 59949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown Device* device = getDevice(deviceId); 60049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown if (device) { 60149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ssize_t index = device->keysByScanCode.indexOfKey(scanCode); 60249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown return index >= 0; 60349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown } 60449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown return false; 60549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown } 60649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown 6077631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown virtual bool hasLed(int32_t deviceId, int32_t led) const { 60851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown Device* device = getDevice(deviceId); 60951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown return device && device->leds.indexOfKey(led) >= 0; 6107631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown } 6117631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown 6127631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown virtual void setLedState(int32_t deviceId, int32_t led, bool on) { 61351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown Device* device = getDevice(deviceId); 61451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown if (device) { 61551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ssize_t index = device->leds.indexOfKey(led); 61651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown if (index >= 0) { 61751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown device->leds.replaceValueAt(led, on); 61851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } else { 61951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ADD_FAILURE() 62051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown << "Attempted to set the state of an LED that the EventHub declared " 62151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown "was not present. led=" << led; 62251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } 62351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown } 6247631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown } 6257631cbbed41ad3183723e5bc6e082d40549664b9Jeff Brown 6269065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown virtual void getVirtualKeyDefinitions(int32_t deviceId, 6279065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Vector<VirtualKeyDefinition>& outVirtualKeys) const { 6289065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown outVirtualKeys.clear(); 6299065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 6309065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown Device* device = getDevice(deviceId); 6319065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown if (device) { 6329065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown outVirtualKeys.appendVector(device->virtualKeys); 6339065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 6349065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown } 6359065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown 6369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown virtual sp<KeyCharacterMap> getKeyCharacterMap(int32_t deviceId) const { 6379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown return NULL; 6381e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown } 6391e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown 64056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown virtual bool isExternal(int32_t deviceId) const { 64156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown return false; 64256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 64356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 644c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void dump(String8& dump) { 645c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 6461a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 64789ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown virtual void monitor() { 64889ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown } 64989ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown 65093fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void requestReopenDevices() { 65193fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown } 65293fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown 65393fa9b30b91f75ee161d0791ff17f98d1a603812Jeff Brown virtual void wake() { 6541a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } 655c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 656c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 657c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 658c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputReaderContext --- 659c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 660c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputReaderContext : public InputReaderContext { 661c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<EventHubInterface> mEventHub; 662c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<InputReaderPolicyInterface> mPolicy; 663be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown sp<InputListenerInterface> mListener; 664c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t mGlobalMetaState; 665c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool mUpdateGlobalMetaStateWasCalled; 666c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 667c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 668c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputReaderContext(const sp<EventHubInterface>& eventHub, 669c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const sp<InputReaderPolicyInterface>& policy, 670be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown const sp<InputListenerInterface>& listener) : 671be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mEventHub(eventHub), mPolicy(policy), mListener(listener), 672c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mGlobalMetaState(0) { 673c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 674c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 675c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~FakeInputReaderContext() { } 676c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 677c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertUpdateGlobalMetaStateWasCalled() { 678c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled) 679c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected updateGlobalMetaState() to have been called."; 680c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mUpdateGlobalMetaStateWasCalled = false; 681c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 682c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 683c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setGlobalMetaState(int32_t state) { 684c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mGlobalMetaState = state; 685c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 686c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 687c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 688c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void updateGlobalMetaState() { 689c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mUpdateGlobalMetaStateWasCalled = true; 690c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 691c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 692c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getGlobalMetaState() { 693c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mGlobalMetaState; 694c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 695c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 696c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual EventHubInterface* getEventHub() { 697c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mEventHub.get(); 698c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 699c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 700c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual InputReaderPolicyInterface* getPolicy() { 701c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mPolicy.get(); 702c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 703c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 704be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual InputListenerInterface* getListener() { 705be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown return mListener.get(); 706c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 707fe50892af3b365806a767298dfd8e86447682581Jeff Brown 708fe50892af3b365806a767298dfd8e86447682581Jeff Brown virtual void disableVirtualKeysUntil(nsecs_t time) { 709fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 710fe50892af3b365806a767298dfd8e86447682581Jeff Brown 711fe50892af3b365806a767298dfd8e86447682581Jeff Brown virtual bool shouldDropVirtualKey(nsecs_t now, 712fe50892af3b365806a767298dfd8e86447682581Jeff Brown InputDevice* device, int32_t keyCode, int32_t scanCode) { 713fe50892af3b365806a767298dfd8e86447682581Jeff Brown return false; 714fe50892af3b365806a767298dfd8e86447682581Jeff Brown } 71505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 71605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown virtual void fadePointer() { 71705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 718aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown 719aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown virtual void requestTimeoutAtTime(nsecs_t when) { 720aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown } 721c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 722c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 723c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 724c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputMapper --- 725c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 726c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputMapper : public InputMapper { 727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint32_t mSources; 728c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t mKeyboardType; 729c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t mMetaState; 730c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> mKeyCodeStates; 731c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> mScanCodeStates; 732c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyedVector<int32_t, int32_t> mSwitchStates; 733c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Vector<int32_t> mSupportedKeyCodes; 734c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent mLastEvent; 735c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 736c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool mConfigureWasCalled; 737c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool mResetWasCalled; 738c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool mProcessWasCalled; 739c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 740c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 741c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper(InputDevice* device, uint32_t sources) : 742c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputMapper(device), 743c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mSources(sources), mKeyboardType(AINPUT_KEYBOARD_TYPE_NONE), 744c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mMetaState(0), 745c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mConfigureWasCalled(false), mResetWasCalled(false), mProcessWasCalled(false) { 746c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 747c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 748c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~FakeInputMapper() { } 749c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 750c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setKeyboardType(int32_t keyboardType) { 751c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mKeyboardType = keyboardType; 752c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 753c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 754c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setMetaState(int32_t metaState) { 755c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mMetaState = metaState; 756c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 757c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 758c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertConfigureWasCalled() { 759c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mConfigureWasCalled) 760c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected configure() to have been called."; 761c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mConfigureWasCalled = false; 762c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 763c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 764c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertResetWasCalled() { 765c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mResetWasCalled) 766c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected reset() to have been called."; 767c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mResetWasCalled = false; 768c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 769c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void assertProcessWasCalled(RawEvent* outLastEvent = NULL) { 771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mProcessWasCalled) 772c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Expected process() to have been called."; 773c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (outLastEvent) { 774c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown *outLastEvent = mLastEvent; 775c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mProcessWasCalled = false; 777c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setKeyCodeState(int32_t keyCode, int32_t state) { 780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mKeyCodeStates.replaceValueFor(keyCode, state); 781c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 782c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 783c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setScanCodeState(int32_t scanCode, int32_t state) { 784c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mScanCodeStates.replaceValueFor(scanCode, state); 785c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 786c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 787c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setSwitchState(int32_t switchCode, int32_t state) { 788c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mSwitchStates.replaceValueFor(switchCode, state); 789c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 790c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 791c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void addSupportedKeyCode(int32_t keyCode) { 792c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mSupportedKeyCodes.add(keyCode); 793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 794c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 795c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 796c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual uint32_t getSources() { 797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mSources; 798c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) { 801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputMapper::populateDeviceInfo(deviceInfo); 802c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 803c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (mKeyboardType != AINPUT_KEYBOARD_TYPE_NONE) { 804c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown deviceInfo->setKeyboardType(mKeyboardType); 805c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 806c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 807c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 80865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown virtual void configure(nsecs_t when, 80965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown const InputReaderConfiguration* config, uint32_t changes) { 810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mConfigureWasCalled = true; 811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 81365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown virtual void reset(nsecs_t when) { 814c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mResetWasCalled = true; 815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void process(const RawEvent* rawEvent) { 818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mLastEvent = *rawEvent; 819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mProcessWasCalled = true; 820c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) { 823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = mKeyCodeStates.indexOfKey(keyCode); 824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return index >= 0 ? mKeyCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN; 825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 827c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) { 828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = mScanCodeStates.indexOfKey(scanCode); 829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return index >= 0 ? mScanCodeStates.valueAt(index) : AKEY_STATE_UNKNOWN; 830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode) { 833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ssize_t index = mSwitchStates.indexOfKey(switchCode); 834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return index >= 0 ? mSwitchStates.valueAt(index) : AKEY_STATE_UNKNOWN; 835c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 836c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes, 838c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t* keyCodes, uint8_t* outFlags) { 839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown bool result = false; 840c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (size_t i = 0; i < numCodes; i++) { 841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (size_t j = 0; j < mSupportedKeyCodes.size(); j++) { 842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (keyCodes[i] == mSupportedKeyCodes[j]) { 843c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown outFlags[i] = 1; 844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown result = true; 845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 847c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return result; 849c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 851c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getMetaState() { 852c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mMetaState; 853c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 85405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown 85505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown virtual void fadePointer() { 85605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown } 857c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 858c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 860c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InstrumentedInputReader --- 861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 862c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InstrumentedInputReader : public InputReader { 863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDevice* mNextDevice; 864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic: 866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InstrumentedInputReader(const sp<EventHubInterface>& eventHub, 867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const sp<InputReaderPolicyInterface>& policy, 868be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown const sp<InputListenerInterface>& listener) : 869be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown InputReader(eventHub, policy, listener), 87071c86ada9f00334b2967d24d4182dc324cd97605Jeff Brown mNextDevice(NULL) { 871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~InstrumentedInputReader() { 874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (mNextDevice) { 875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mNextDevice; 876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void setNextDevice(InputDevice* device) { 880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mNextDevice = device; 881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 8839ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown InputDevice* newDevice(int32_t deviceId, const String8& name, uint32_t classes) { 884e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown InputDeviceIdentifier identifier; 885e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown identifier.name = name; 886e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown return new InputDevice(&mContext, deviceId, identifier, classes); 887be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 888be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 890be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown virtual InputDevice* createDeviceLocked(int32_t deviceId, 891e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown const InputDeviceIdentifier& identifier, uint32_t classes) { 892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (mNextDevice) { 893c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDevice* device = mNextDevice; 894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mNextDevice = NULL; 895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return device; 896c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 897e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown return InputReader::createDeviceLocked(deviceId, identifier, classes); 898c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown friend class InputReaderTest; 901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 902c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 904c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputReaderTest --- 905c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputReaderTest : public testing::Test { 907c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 908be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown sp<FakeInputListener> mFakeListener; 909c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeInputReaderPolicy> mFakePolicy; 910c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeEventHub> mFakeEventHub; 911c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<InstrumentedInputReader> mReader; 912c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 913c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void SetUp() { 914c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub = new FakeEventHub(); 915c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy = new FakeInputReaderPolicy(); 916be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener = new FakeInputListener(); 917c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 918be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mReader = new InstrumentedInputReader(mFakeEventHub, mFakePolicy, mFakeListener); 919c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 920c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 921c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void TearDown() { 922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader.clear(); 923c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 924be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener.clear(); 925c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy.clear(); 926c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub.clear(); 927c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 928c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 92983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown void addDevice(int32_t deviceId, const String8& name, uint32_t classes, 93083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown const PropertyMap* configuration) { 931c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->addDevice(deviceId, name, classes); 93265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 93383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown if (configuration) { 93483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mFakeEventHub->addConfigurationMap(deviceId, configuration); 93583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 936c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->finishDeviceScan(); 937c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->loopOnce(); 938c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->loopOnce(); 939c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->assertQueueIsEmpty(); 940c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 941c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 942c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* addDeviceWithFakeInputMapper(int32_t deviceId, 94383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown const String8& name, uint32_t classes, uint32_t sources, 94483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown const PropertyMap* configuration) { 9459ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown InputDevice* device = mReader->newDevice(deviceId, name, classes); 946c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = new FakeInputMapper(device, sources); 947c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown device->addMapper(mapper); 948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->setNextDevice(device); 94983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addDevice(deviceId, name, classes, configuration); 950c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return mapper; 951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 952c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 953c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 954c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenNoDevices_ReturnsDefaults) { 955c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputConfiguration config; 956c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->getInputConfiguration(&config); 957c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 958c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard); 959c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation); 960c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen); 961c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 962c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 963c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenAlphabeticKeyboardPresent_ReturnsQwertyKeyboard) { 964c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("keyboard"), 96583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY, NULL)); 966c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 967c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputConfiguration config; 968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->getInputConfiguration(&config); 969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 970c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::KEYBOARD_QWERTY, config.keyboard); 971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation); 972c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen); 973c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 974c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenTouchScreenPresent_ReturnsFingerTouchScreen) { 97658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown PropertyMap configuration; 97758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown configuration.addProperty(String8("touch.deviceType"), String8("touchScreen")); 978c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("touchscreen"), 97958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown INPUT_DEVICE_CLASS_TOUCH, &configuration)); 980c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 981c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputConfiguration config; 982c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->getInputConfiguration(&config); 983c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 984c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard); 985c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation); 986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::TOUCHSCREEN_FINGER, config.touchScreen); 987c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 98958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenTouchPadPresent_ReturnsFingerNoTouch) { 99058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("touchpad"), 99158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown INPUT_DEVICE_CLASS_TOUCH, NULL)); 99258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown 99358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown InputConfiguration config; 99458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown mReader->getInputConfiguration(&config); 99558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown 99658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard); 99758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation); 99858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen); 99958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown} 100058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown 100183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenMousePresent_ReturnsNoNavigation) { 1002b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown sp<FakePointerController> controller = new FakePointerController(); 1003b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mFakePolicy->setPointerController(0, controller); 1004b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 100583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown PropertyMap configuration; 100683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown configuration.addProperty(String8("cursor.mode"), String8("pointer")); 100783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("mouse"), 100883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_CURSOR, &configuration)); 100983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 101083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown InputConfiguration config; 101183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mReader->getInputConfiguration(&config); 101283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 101383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard); 101483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown ASSERT_EQ(InputConfiguration::NAVIGATION_NONAV, config.navigation); 101583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen); 101683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 101783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 1018c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenTrackballPresent_ReturnsTrackballNavigation) { 101983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown PropertyMap configuration; 102083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown configuration.addProperty(String8("cursor.mode"), String8("navigation")); 1021c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("trackball"), 102283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_CURSOR, &configuration)); 1023c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1024c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputConfiguration config; 1025c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->getInputConfiguration(&config); 1026c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1027c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard); 1028c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::NAVIGATION_TRACKBALL, config.navigation); 1029c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen); 1030c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1031c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1032c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputConfiguration_WhenDPadPresent_ReturnsDPadNavigation) { 1033c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(0, String8("dpad"), 103483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_DPAD, NULL)); 1035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputConfiguration config; 1037c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->getInputConfiguration(&config); 1038c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1039c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::KEYBOARD_NOKEYS, config.keyboard); 1040c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::NAVIGATION_DPAD, config.navigation); 1041c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(InputConfiguration::TOUCHSCREEN_NOTOUCH, config.touchScreen); 1042c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1043c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1044c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputDeviceInfo_WhenDeviceIdIsValid) { 1045c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"), 104683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, NULL)); 1047c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1048c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 1049c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown status_t result = mReader->getInputDeviceInfo(1, &info); 1050c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1051c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(OK, result); 1052c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, info.getId()); 1053c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_STREQ("keyboard", info.getName().string()); 1054c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, info.getKeyboardType()); 1055c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, info.getSources()); 1056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(0), info.getMotionRanges().size()); 1057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1059c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputDeviceInfo_WhenDeviceIdIsInvalid) { 1060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 1061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown status_t result = mReader->getInputDeviceInfo(-1, &info); 1062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1063c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(NAME_NOT_FOUND, result); 1064c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1065c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputDeviceInfo_WhenDeviceIdIsIgnored) { 106783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addDevice(1, String8("ignored"), 0, NULL); // no classes so device will be ignored 1068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1069c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 1070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown status_t result = mReader->getInputDeviceInfo(1, &info); 1071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(NAME_NOT_FOUND, result); 1073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1075c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetInputDeviceIds) { 1076b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown sp<FakePointerController> controller = new FakePointerController(); 1077b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown mFakePolicy->setPointerController(2, controller); 1078b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 1079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(1, String8("keyboard"), 108083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_ALPHAKEY, NULL)); 108183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown ASSERT_NO_FATAL_FAILURE(addDevice(2, String8("mouse"), 108283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_CURSOR, NULL)); 1083c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1084c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown Vector<int32_t> ids; 1085c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->getInputDeviceIds(ids); 1086c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1087c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), ids.size()); 1088c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, ids[0]); 1089c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(2, ids[1]); 1090c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1091c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetKeyCodeState_ForwardsRequestsToMappers) { 1093c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1094c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 109583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN); 1097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1098c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(0, 1099c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_ANY, AKEYCODE_A)) 1100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is >= 0 but unknown."; 1101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(1, 1103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(1, 1107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getKeyCodeState(-1, 1111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getKeyCodeState(-1, 1115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetScanCodeState_ForwardsRequestsToMappers) { 1120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 112283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->setScanCodeState(KEY_A, AKEY_STATE_DOWN); 1124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(0, 1126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_ANY, KEY_A)) 1127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is >= 0 but unknown."; 1128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(1, 1130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, KEY_A)) 1131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(1, 1134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A)) 1135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getScanCodeState(-1, 1138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, KEY_A)) 1139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getScanCodeState(-1, 1142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, KEY_A)) 1143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, GetSwitchState_ForwardsRequestsToMappers) { 1147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 114983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->setSwitchState(SW_LID, AKEY_STATE_DOWN); 1151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(0, 1153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_ANY, SW_LID)) 1154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is >= 0 but unknown."; 1155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(1, 1157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, SW_LID)) 1158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is valid but the sources are not supported by the device."; 1159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(1, 1161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID)) 1162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mReader->getSwitchState(-1, 1165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_TRACKBALL, SW_LID)) 1166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown when the device id is < 0 but the sources are not supported by any device."; 1167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mReader->getSwitchState(-1, 1169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, SW_LID)) 1170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, MarkSupportedKeyCodes_ForwardsRequestsToMappers) { 1174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 117683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->addSupportedKeyCode(AKEYCODE_A); 1178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->addSupportedKeyCode(AKEYCODE_B); 1179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 }; 1181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[4] = { 0, 0, 0, 1 }; 1182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mReader->hasKeys(0, AINPUT_SOURCE_ANY, 4, keyCodes, flags)) 1184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return false when device id is >= 0 but unknown."; 1185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown flags[3] = 1; 1188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mReader->hasKeys(1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return false when device id is valid but the sources are not supported by the device."; 1190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown flags[3] = 1; 1193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mReader->hasKeys(1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is valid and the device supports some of the sources."; 1195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]); 1196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown flags[3] = 1; 1198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mReader->hasKeys(-1, AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return false when the device id is < 0 but the sources are not supported by any device."; 1200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(!flags[0] && !flags[1] && !flags[2] && !flags[3]); 1201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown flags[3] = 1; 1203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mReader->hasKeys(-1, AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return value provided by mapper when device id is < 0 and one of the devices supports some of the sources."; 1205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(flags[0] && flags[1] && !flags[2] && !flags[3]); 1206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, LoopOnce_WhenDeviceScanFinished_SendsConfigurationChanged) { 120983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addDevice(1, String8("ignored"), INPUT_DEVICE_CLASS_KEYBOARD, NULL); 1210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1211be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyConfigurationChangedArgs args; 1212be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1213be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyConfigurationChangedWasCalled(&args)); 1214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputReaderTest, LoopOnce_ForwardsRawEventsToMappers) { 1218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper = NULL; 1219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper = addDeviceWithFakeInputMapper(1, String8("fake"), 122083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown INPUT_DEVICE_CLASS_KEYBOARD, AINPUT_SOURCE_KEYBOARD, NULL)); 1221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 122249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->enqueueEvent(0, 1, EV_KEY, KEY_A, 1); 1223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mReader->loopOnce(); 1224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeEventHub->assertQueueIsEmpty()); 1225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent event; 1227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper->assertProcessWasCalled(&event)); 1228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, event.when); 1229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, event.deviceId); 1230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(EV_KEY, event.type); 123149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(KEY_A, event.code); 1232c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, event.value); 1233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputDeviceTest --- 1237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputDeviceTest : public testing::Test { 1239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const char* DEVICE_NAME; 1241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t DEVICE_ID; 12429ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown static const uint32_t DEVICE_CLASSES; 1243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeEventHub> mFakeEventHub; 1245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeInputReaderPolicy> mFakePolicy; 1246be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown sp<FakeInputListener> mFakeListener; 1247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputReaderContext* mFakeContext; 1248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1249c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDevice* mDevice; 1250c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1251c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void SetUp() { 1252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub = new FakeEventHub(); 1253c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy = new FakeInputReaderPolicy(); 1254be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener = new FakeInputListener(); 1255be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener); 1256c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 125749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0); 1258e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown InputDeviceIdentifier identifier; 1259e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown identifier.name = DEVICE_NAME; 1260e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown mDevice = new InputDevice(mFakeContext, DEVICE_ID, identifier, DEVICE_CLASSES); 1261c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1262c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void TearDown() { 1264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mDevice; 1265c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1266c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mFakeContext; 1267be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener.clear(); 1268c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy.clear(); 1269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub.clear(); 1270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1272c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst char* InputDeviceTest::DEVICE_NAME = "device"; 1274c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t InputDeviceTest::DEVICE_ID = 1; 12759ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brownconst uint32_t InputDeviceTest::DEVICE_CLASSES = INPUT_DEVICE_CLASS_KEYBOARD 12769ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown | INPUT_DEVICE_CLASS_TOUCH | INPUT_DEVICE_CLASS_JOYSTICK; 1277c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1278c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, ImmutableProperties) { 1279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, mDevice->getId()); 1280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_STREQ(DEVICE_NAME, mDevice->getName()); 12819ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown ASSERT_EQ(DEVICE_CLASSES, mDevice->getClasses()); 1282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1283c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1284c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, WhenNoMappersAreRegistered_DeviceIsIgnored) { 1285c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Configuration. 1286474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown InputReaderConfiguration config; 128765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->configure(ARBITRARY_TIME, &config, 0); 128865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 128965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // Reset. 129065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->reset(ARBITRARY_TIME); 129165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 129265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown NotifyDeviceResetArgs resetArgs; 129365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs)); 129465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime); 129565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(DEVICE_ID, resetArgs.deviceId); 1296c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1297c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Metadata. 1298c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mDevice->isIgnored()); 1299c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, mDevice->getSources()); 1300c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1301c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 1302c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->getDeviceInfo(&info); 1303c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, info.getId()); 1304c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_STREQ(DEVICE_NAME, info.getName().string()); 1305c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_KEYBOARD_TYPE_NONE, info.getKeyboardType()); 1306c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_UNKNOWN, info.getSources()); 1307c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1308c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // State queries. 1309c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, mDevice->getMetaState()); 1310c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1311c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, 0)) 1312c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Ignored device should return unknown key code state."; 1313c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 0)) 1314c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Ignored device should return unknown scan code state."; 1315c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 0)) 1316c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Ignored device should return unknown switch state."; 1317c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1318c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B }; 1319c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[2] = { 0, 1 }; 1320c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 2, keyCodes, flags)) 1321c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Ignored device should never mark any key codes."; 1322c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[0]) << "Flag for unsupported key should be unchanged."; 1323c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[1]) << "Flag for unsupported key should be unchanged."; 1324c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1325c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1326c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDeviceTest, WhenMappersAreRegistered_DeviceIsNotIgnoredAndForwardsRequestsToMappers) { 1327c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Configuration. 132847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8("key"), String8("value")); 1329c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1330c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper1 = new FakeInputMapper(mDevice, AINPUT_SOURCE_KEYBOARD); 1331c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setKeyboardType(AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1332c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setMetaState(AMETA_ALT_ON); 1333c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->addSupportedKeyCode(AKEYCODE_A); 1334c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->addSupportedKeyCode(AKEYCODE_B); 1335c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setKeyCodeState(AKEYCODE_A, AKEY_STATE_DOWN); 1336c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setKeyCodeState(AKEYCODE_B, AKEY_STATE_UP); 1337c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setScanCodeState(2, AKEY_STATE_DOWN); 1338c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setScanCodeState(3, AKEY_STATE_UP); 1339c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper1->setSwitchState(4, AKEY_STATE_DOWN); 1340c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->addMapper(mapper1); 1341c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1342c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputMapper* mapper2 = new FakeInputMapper(mDevice, AINPUT_SOURCE_TOUCHSCREEN); 1343c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper2->setMetaState(AMETA_SHIFT_ON); 1344c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->addMapper(mapper2); 1345c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1346474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown InputReaderConfiguration config; 134765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->configure(ARBITRARY_TIME, &config, 0); 1348c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1349c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown String8 propertyValue; 135047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown ASSERT_TRUE(mDevice->getConfiguration().tryGetProperty(String8("key"), propertyValue)) 135147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown << "Device should have read configuration during configuration phase."; 1352c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_STREQ("value", propertyValue.string()); 1353c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1354c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper1->assertConfigureWasCalled()); 1355c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper2->assertConfigureWasCalled()); 1356c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 135765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // Reset 135865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->reset(ARBITRARY_TIME); 135965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mapper1->assertResetWasCalled()); 136065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mapper2->assertResetWasCalled()); 136165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 136265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown NotifyDeviceResetArgs resetArgs; 136365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs)); 136465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime); 136565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(DEVICE_ID, resetArgs.deviceId); 136665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 1367c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Metadata. 1368c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mDevice->isIgnored()); 1369c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), mDevice->getSources()); 1370c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1371c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 1372c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->getDeviceInfo(&info); 1373c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, info.getId()); 1374c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_STREQ(DEVICE_NAME, info.getName().string()); 1375c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_KEYBOARD_TYPE_ALPHABETIC, info.getKeyboardType()); 1376c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(AINPUT_SOURCE_KEYBOARD | AINPUT_SOURCE_TOUCHSCREEN), info.getSources()); 1377c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1378c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // State queries. 1379c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_ALT_ON | AMETA_SHIFT_ON, mDevice->getMetaState()) 1380c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mappers and combine meta states."; 1381c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1382c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1383c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown key code state when source not supported."; 1384c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getScanCodeState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1385c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown scan code state when source not supported."; 1386c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mDevice->getSwitchState(AINPUT_SOURCE_TRACKBALL, AKEYCODE_A)) 1387c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should return unknown switch state when source not supported."; 1388c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1389c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getKeyCodeState(AINPUT_SOURCE_KEYBOARD, AKEYCODE_A)) 1390c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mapper when source is supported."; 1391c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UP, mDevice->getScanCodeState(AINPUT_SOURCE_KEYBOARD, 3)) 1392c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mapper when source is supported."; 1393c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_DOWN, mDevice->getSwitchState(AINPUT_SOURCE_KEYBOARD, 4)) 1394c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mapper when source is supported."; 1395c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1396c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keyCodes[4] = { AKEYCODE_A, AKEYCODE_B, AKEYCODE_1, AKEYCODE_2 }; 1397c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[4] = { 0, 0, 0, 1 }; 1398c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_TRACKBALL, 4, keyCodes, flags)) 1399c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should do nothing when source is unsupported."; 1400c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[0]) << "Flag should be unchanged when source is unsupported."; 1401c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[1]) << "Flag should be unchanged when source is unsupported."; 1402c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[2]) << "Flag should be unchanged when source is unsupported."; 1403c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[3]) << "Flag should be unchanged when source is unsupported."; 1404c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1405c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mDevice->markSupportedKeyCodes(AINPUT_SOURCE_KEYBOARD, 4, keyCodes, flags)) 1406c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should query mapper when source is supported."; 1407c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[0]) << "Flag for supported key should be set."; 1408c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[1]) << "Flag for supported key should be set."; 1409c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, flags[2]) << "Flag for unsupported key should be unchanged."; 1410c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, flags[3]) << "Flag for unsupported key should be unchanged."; 1411c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1412c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Event handling. 1413c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent event; 1414b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown mDevice->process(&event, 1); 1415c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1416c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper1->assertProcessWasCalled()); 1417c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mapper2->assertProcessWasCalled()); 1418c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1419c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1420c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1421c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputMapperTest --- 1422c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1423c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputMapperTest : public testing::Test { 1424c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1425c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const char* DEVICE_NAME; 1426c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t DEVICE_ID; 14279ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown static const uint32_t DEVICE_CLASSES; 1428c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1429c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeEventHub> mFakeEventHub; 1430c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeInputReaderPolicy> mFakePolicy; 1431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown sp<FakeInputListener> mFakeListener; 1432c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputReaderContext* mFakeContext; 1433c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDevice* mDevice; 1434c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1435c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void SetUp() { 1436c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub = new FakeEventHub(); 1437c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy = new FakeInputReaderPolicy(); 1438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener = new FakeInputListener(); 1439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeListener); 1440e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown InputDeviceIdentifier identifier; 1441e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown identifier.name = DEVICE_NAME; 1442e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown mDevice = new InputDevice(mFakeContext, DEVICE_ID, identifier, DEVICE_CLASSES); 1443c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1444c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0); 1445c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1446c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1447c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void TearDown() { 1448c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mDevice; 1449c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown delete mFakeContext; 1450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeListener.clear(); 1451c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy.clear(); 1452c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub.clear(); 1453c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1454c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 145547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown void addConfigurationProperty(const char* key, const char* value) { 145647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown mFakeEventHub->addConfigurationProperty(DEVICE_ID, String8(key), String8(value)); 1457c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1458c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1459c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void addMapperAndConfigure(InputMapper* mapper) { 1460c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDevice->addMapper(mapper); 146165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 0); 146265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->reset(ARBITRARY_TIME); 146365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 146465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 146565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height, 146665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown int32_t orientation) { 146765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mFakePolicy->setDisplayInfo(displayId, width, height, orientation); 146865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mDevice->configure(ARBITRARY_TIME, mFakePolicy->getReaderConfiguration(), 146965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown InputReaderConfiguration::CHANGE_DISPLAY_INFO); 1470c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1471c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1472c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static void process(InputMapper* mapper, nsecs_t when, int32_t deviceId, int32_t type, 147349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown int32_t code, int32_t value) { 1474c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown RawEvent event; 1475c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.when = when; 1476c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.deviceId = deviceId; 1477c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.type = type; 147849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown event.code = code; 1479c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.value = value; 1480c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->process(&event); 1481c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1482c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1483c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static void assertMotionRange(const InputDeviceInfo& info, 1484efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown int32_t axis, uint32_t source, float min, float max, float flat, float fuzz) { 1485efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown const InputDeviceInfo::MotionRange* range = info.getMotionRange(axis, source); 1486efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_TRUE(range != NULL) << "Axis: " << axis << " Source: " << source; 1487efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_EQ(axis, range->axis) << "Axis: " << axis << " Source: " << source; 1488efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_EQ(source, range->source) << "Axis: " << axis << " Source: " << source; 1489efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NEAR(min, range->min, EPSILON) << "Axis: " << axis << " Source: " << source; 1490efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NEAR(max, range->max, EPSILON) << "Axis: " << axis << " Source: " << source; 1491efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NEAR(flat, range->flat, EPSILON) << "Axis: " << axis << " Source: " << source; 1492efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NEAR(fuzz, range->fuzz, EPSILON) << "Axis: " << axis << " Source: " << source; 1493c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1494c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1495c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static void assertPointerCoords(const PointerCoords& coords, 1496c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x, float y, float pressure, float size, 1497c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float touchMajor, float touchMinor, float toolMajor, float toolMinor, 1498be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown float orientation, float distance) { 1499ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(x, coords.getAxisValue(AMOTION_EVENT_AXIS_X), 1); 1500ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(y, coords.getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 1501ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(pressure, coords.getAxisValue(AMOTION_EVENT_AXIS_PRESSURE), EPSILON); 1502ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(size, coords.getAxisValue(AMOTION_EVENT_AXIS_SIZE), EPSILON); 1503ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(touchMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR), 1); 1504ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(touchMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR), 1); 1505ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(toolMajor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR), 1); 1506ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(toolMinor, coords.getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR), 1); 1507ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(orientation, coords.getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION), EPSILON); 1508be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NEAR(distance, coords.getAxisValue(AMOTION_EVENT_AXIS_DISTANCE), EPSILON); 1509be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 1510be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1511be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static void assertPosition(const sp<FakePointerController>& controller, float x, float y) { 1512be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown float actualX, actualY; 1513be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown controller->getPosition(&actualX, &actualY); 1514be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NEAR(x, actualX, 1); 1515be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NEAR(y, actualY, 1); 1516c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 1517c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1518c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1519c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst char* InputMapperTest::DEVICE_NAME = "device"; 1520c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t InputMapperTest::DEVICE_ID = 1; 15219ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brownconst uint32_t InputMapperTest::DEVICE_CLASSES = 0; // not needed for current tests 1522c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1523c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1524c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- SwitchInputMapperTest --- 1525c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass SwitchInputMapperTest : public InputMapperTest { 1527c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1528c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, GetSources) { 1531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1533c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 153489de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown ASSERT_EQ(uint32_t(AINPUT_SOURCE_SWITCH), mapper->getSources()); 1535c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1536c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1537c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, GetSwitchState) { 1538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 1); 1542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID)); 1543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setSwitchState(DEVICE_ID, SW_LID, 0); 1545c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, mapper->getSwitchState(AINPUT_SOURCE_ANY, SW_LID)); 1546c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1547c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1548c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SwitchInputMapperTest, Process) { 1549c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SwitchInputMapper* mapper = new SwitchInputMapper(mDevice); 1550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 155249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SW, SW_LID, 1); 1553c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1554be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifySwitchArgs args; 1555be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifySwitchWasCalled(&args)); 1556be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(SW_LID, args.switchCode); 1558c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, args.switchValue); 1559c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), args.policyFlags); 1560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1562c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- KeyboardInputMapperTest --- 1564c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1565c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass KeyboardInputMapperTest : public InputMapperTest { 1566c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1567c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void testDPadKeyRotation(KeyboardInputMapper* mapper, 1568c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode); 1569c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1570c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1571c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid KeyboardInputMapperTest::testDPadKeyRotation(KeyboardInputMapper* mapper, 1572c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t originalScanCode, int32_t originalKeyCode, int32_t rotatedKeyCode) { 1573be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 1574c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 157549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 1); 1576be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(originalScanCode, args.scanCode); 1579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(rotatedKeyCode, args.keyCode); 1580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 158149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, originalScanCode, 0); 1582be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1583c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1584c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(originalScanCode, args.scanCode); 1585c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(rotatedKeyCode, args.keyCode); 1586c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1587c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1588c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1589c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetSources) { 159047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1594c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, mapper->getSources()); 1595c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1596c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1597c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, Process_SimpleKeyPress) { 159849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown const int32_t USAGE_A = 0x070004; 159949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown const int32_t USAGE_UNKNOWN = 0x07ffff; 160049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE); 160149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, 0, USAGE_A, AKEYCODE_A, POLICY_FLAG_WAKE); 160249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 160347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1604c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1605c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1606c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 160749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key down by scan code. 1608c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 160949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_HOME, 1); 1610be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 1611be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1612c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 1613c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1614c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 1615c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1616c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 1617c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, args.scanCode); 1618c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 1619c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1620c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 1621c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1622c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 162349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key up by scan code. 1624c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 162549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_HOME, 0); 1626be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1627c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 1628c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 1629c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 1630c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1631c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 1632c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, args.scanCode); 1633c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 1634c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 1635c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 1636c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 163749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 163849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key down by usage code. 163949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 164049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_MSC, MSC_SCAN, USAGE_A); 164149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 164249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, 0, 1); 164349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 164449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 164549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 164649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 164749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 164849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEYCODE_A, args.keyCode); 164949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0, args.scanCode); 165049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 165149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 165249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 165349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 165449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 165549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key up by usage code. 165649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 165749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_MSC, MSC_SCAN, USAGE_A); 165849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 165949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, 0, 0); 166049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 166149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 166249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 166349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 166449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 166549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEYCODE_A, args.keyCode); 166649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0, args.scanCode); 166749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 166849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 166949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(POLICY_FLAG_WAKE, args.policyFlags); 167049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 167149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 167249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key down with unknown scan code or usage code. 167349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 167449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_MSC, MSC_SCAN, USAGE_UNKNOWN); 167549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 167649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_UNKNOWN, 1); 167749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 167849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 167949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 168049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 168149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 168249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0, args.keyCode); 168349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(KEY_UNKNOWN, args.scanCode); 168449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 168549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 168649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0U, args.policyFlags); 168749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 168849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 168949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown // Key up with unknown scan code or usage code. 169049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 169149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_MSC, MSC_SCAN, USAGE_UNKNOWN); 169249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 169349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_UNKNOWN, 0); 169449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 169549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 169649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 169749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 169849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 169949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0, args.keyCode); 170049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(KEY_UNKNOWN, args.scanCode); 170149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 170249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM, args.flags); 170349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(0U, args.policyFlags); 170449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 1705c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1706c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1707c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, Process_ShouldUpdateMetaState) { 170849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_LEFTSHIFT, 0, AKEYCODE_SHIFT_LEFT, 0); 170949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0); 171049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 171147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1712c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1713c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1714c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1715c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Initial metastate. 1716c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 1717c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1718c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Metakey down. 1719c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 172049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_LEFTSHIFT, 1); 1721be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 1722be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1723c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1724c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1725c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled()); 1726c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Key down. 1728c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, 172949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_A, 1); 1730be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1731c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1732c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1733c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1734c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Key up. 1735c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME + 2, DEVICE_ID, 173649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_A, 0); 1737be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1738c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 1739c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, mapper->getMetaState()); 1740c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1741c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Metakey up. 1742c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown process(mapper, ARBITRARY_TIME + 3, DEVICE_ID, 174349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_LEFTSHIFT, 0); 1744be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1745c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, args.metaState); 1746c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 1747c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeContext->assertUpdateGlobalMetaStateWasCalled()); 1748c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1749c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 175047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(KeyboardInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateDPad) { 175149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0); 175249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0); 175349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0); 175449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0); 175549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 175647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1757c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1758c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1759c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 176065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 176147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1762b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_90); 1763c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1764c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP)); 1765c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1766c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT)); 1767c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1768c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN)); 1769c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT)); 1771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1772c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 177347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(KeyboardInputMapperTest, Process_WhenOrientationAware_ShouldRotateDPad) { 177449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_UP, 0, AKEYCODE_DPAD_UP, 0); 177549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_RIGHT, 0, AKEYCODE_DPAD_RIGHT, 0); 177649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_DOWN, 0, AKEYCODE_DPAD_DOWN, 0); 177749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_LEFT, 0, AKEYCODE_DPAD_LEFT, 0); 177849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown 177947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 178147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown addConfigurationProperty("keyboard.orientationAware", "1"); 1782c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1783c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 178465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1785c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1786b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_0); 1787c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1788c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_UP)); 1789c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1790c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_RIGHT)); 1791c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1792c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_DOWN)); 1793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1794c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_LEFT)); 1795c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 179665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1798b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_90); 1799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT)); 1801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1802c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP)); 1803c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1804c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT)); 1805c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1806c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN)); 1807c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 180865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1809c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1810b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_180); 1811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_DOWN)); 1813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1814c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_LEFT)); 1815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_UP)); 1817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_RIGHT)); 1819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 182065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1822b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_270); 1823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_UP, AKEYCODE_DPAD_UP, AKEYCODE_DPAD_RIGHT)); 1825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_RIGHT, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_DOWN)); 1827c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_DOWN, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_LEFT)); 1829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testDPadKeyRotation(mapper, 1830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KEY_LEFT, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_UP)); 1831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Special case: if orientation changes while key is down, we still emit the same keycode 1833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // in the key up as we did in the key down. 1834be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 1835c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 183665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1838b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_270); 183949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 1); 1840be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 1842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_UP, args.scanCode); 1843c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode); 1844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 184565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 1846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 1847b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_180); 184849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_UP, 0); 1849be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 1850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 1851c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_UP, args.scanCode); 1852c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_DPAD_RIGHT, args.keyCode); 1853c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1855c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetKeyCodeState) { 185647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1857c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1858c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1860c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 1); 1861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 1862c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setKeyCodeState(DEVICE_ID, AKEYCODE_A, 0); 1864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 1865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, GetScanCodeState) { 186847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1869c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 1); 1873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(1, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 1874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeEventHub->setScanCodeState(DEVICE_ID, KEY_A, 0); 1876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 1877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(KeyboardInputMapperTest, MarkSupportedKeyCodes) { 188047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 1881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 1882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 1883c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 188449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_A, 0, AKEYCODE_A, 0); 1885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1886c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keyCodes[2] = { AKEYCODE_A, AKEYCODE_B }; 1887c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[2] = { 0, 0 }; 1888c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 1, keyCodes, flags)); 1889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(flags[0]); 1890c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(flags[1]); 1891c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 1892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 189351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff BrownTEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) { 189451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown mFakeEventHub->addLed(DEVICE_ID, LED_CAPSL, true /*initially on*/); 189551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown mFakeEventHub->addLed(DEVICE_ID, LED_NUML, false /*initially off*/); 189651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown mFakeEventHub->addLed(DEVICE_ID, LED_SCROLLL, false /*initially off*/); 189749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_CAPSLOCK, 0, AKEYCODE_CAPS_LOCK, 0); 189849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_NUMLOCK, 0, AKEYCODE_NUM_LOCK, 0); 189949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_SCROLLLOCK, 0, AKEYCODE_SCROLL_LOCK, 0); 190051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 190147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown KeyboardInputMapper* mapper = new KeyboardInputMapper(mDevice, 190251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown AINPUT_SOURCE_KEYBOARD, AINPUT_KEYBOARD_TYPE_ALPHABETIC); 190351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown addMapperAndConfigure(mapper); 190451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 190551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Initialization should have turned all of the lights off. 190651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 190751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 190851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 190951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 191051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle caps lock on. 191151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 191249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_CAPSLOCK, 1); 191351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 191449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_CAPSLOCK, 0); 191551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 191651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 191751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 191851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_CAPS_LOCK_ON, mapper->getMetaState()); 191951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 192051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle num lock on. 192151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 192249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_NUMLOCK, 1); 192351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 192449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_NUMLOCK, 0); 192551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 192651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 192751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 192851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_CAPS_LOCK_ON | AMETA_NUM_LOCK_ON, mapper->getMetaState()); 192951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 193051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle caps lock off. 193151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 193249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_CAPSLOCK, 1); 193351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 193449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_CAPSLOCK, 0); 193551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 193651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 193751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 193851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_NUM_LOCK_ON, mapper->getMetaState()); 193951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 194051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle scroll lock on. 194151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 194249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_SCROLLLOCK, 1); 194351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 194449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_SCROLLLOCK, 0); 194551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 194651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 194751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 194851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_NUM_LOCK_ON | AMETA_SCROLL_LOCK_ON, mapper->getMetaState()); 194951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 195051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle num lock off. 195151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 195249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_NUMLOCK, 1); 195351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 195449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_NUMLOCK, 0); 195551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 195651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 195751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 195851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_SCROLL_LOCK_ON, mapper->getMetaState()); 195951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 196051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown // Toggle scroll lock off. 196151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 196249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_SCROLLLOCK, 1); 196351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, 196449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown EV_KEY, KEY_SCROLLLOCK, 0); 196551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); 196651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); 196751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); 196851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown ASSERT_EQ(AMETA_NONE, mapper->getMetaState()); 196951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown} 197051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown 1971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 197283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown// --- CursorInputMapperTest --- 1973c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 197483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownclass CursorInputMapperTest : public InputMapperTest { 1975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 1976c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t TRACKBALL_MOVEMENT_THRESHOLD; 1977c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 197883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown sp<FakePointerController> mFakePointerController; 197983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 198083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown virtual void SetUp() { 198183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown InputMapperTest::SetUp(); 198283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 198383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mFakePointerController = new FakePointerController(); 198483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mFakePolicy->setPointerController(DEVICE_ID, mFakePointerController); 198583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown } 198683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 198783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown void testMotionRotation(CursorInputMapper* mapper, 1988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY); 1989c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 1990c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 199183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownconst int32_t CursorInputMapperTest::TRACKBALL_MOVEMENT_THRESHOLD = 6; 1992c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 199383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownvoid CursorInputMapperTest::testMotionRotation(CursorInputMapper* mapper, 1994c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t originalX, int32_t originalY, int32_t rotatedX, int32_t rotatedY) { 1995be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 1996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 199749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, originalX); 199849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, originalY); 199949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2000be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2003c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float(rotatedX) / TRACKBALL_MOVEMENT_THRESHOLD, 2004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float(rotatedY) / TRACKBALL_MOVEMENT_THRESHOLD, 2005be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2006c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 200883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsPointer_GetSources_ReturnsMouse) { 200983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 201083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "pointer"); 201183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addMapperAndConfigure(mapper); 201283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 201383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources()); 201483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 201583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 201683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsNavigation_GetSources_ReturnsTrackball) { 201783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 201883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2019c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2020c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2021c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, mapper->getSources()); 2022c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2023c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 202483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsPointer_PopulateDeviceInfo_ReturnsRangeFromPointerController) { 202583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 202683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "pointer"); 202783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addMapperAndConfigure(mapper); 202883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 202983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown InputDeviceInfo info; 203083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mapper->populateDeviceInfo(&info); 203183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 203283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // Initially there may not be a valid motion range. 2033efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE)); 2034efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_EQ(NULL, info.getMotionRange(AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE)); 2035efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2036efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 0.0f, 1.0f, 0.0f, 0.0f)); 203783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 203883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown // When the bounds are set, then there should be a valid motion range. 20399626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown mFakePointerController->setBounds(1, 2, 800 - 1, 480 - 1); 204083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 204183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown InputDeviceInfo info2; 204283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown mapper->populateDeviceInfo(&info2); 204383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 2044efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 2045efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_MOUSE, 20469626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown 1, 800 - 1, 0.0f, 0.0f)); 2047efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 2048efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_MOUSE, 20499626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown 2, 480 - 1, 0.0f, 0.0f)); 2050efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info2, 2051efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_MOUSE, 2052b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 0.0f, 1.0f, 0.0f, 0.0f)); 205383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown} 205483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown 205583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, WhenModeIsNavigation_PopulateDeviceInfo_ReturnsScaledRange) { 205683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 205783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2059c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown InputDeviceInfo info; 2061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mapper->populateDeviceInfo(&info); 2062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2063efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2064efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_X, AINPUT_SOURCE_TRACKBALL, 2065c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD)); 2066efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2067efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_Y, AINPUT_SOURCE_TRACKBALL, 2068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown -1.0f, 1.0f, 0.0f, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD)); 2069efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown ASSERT_NO_FATAL_FAILURE(assertMotionRange(info, 2070efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown AINPUT_MOTION_RANGE_PRESSURE, AINPUT_SOURCE_TRACKBALL, 2071b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown 0.0f, 1.0f, 0.0f, 0.0f)); 2072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 207483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldSetAllFieldsAndIncludeGlobalMetaState) { 207583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 207683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2077c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2078c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2080c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2081be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2082c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2083c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Button press. 2084c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Mostly testing non x/y behavior here so we don't need to check again elsewhere. 208549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 208649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2087be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2088c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2089c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 2090c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source); 2091c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), args.policyFlags); 2092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2093c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, args.flags); 2094c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2095fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, args.buttonState); 2096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, args.edgeFlags); 2097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(1), args.pointerCount); 2098fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, args.pointerProperties[0].id); 2099fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType); 2100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2101be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision); 2103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision); 2104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Button release. Should have same down time. 210749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 210849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME + 1, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2109be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME + 1, args.eventTime); 2111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 2112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TRACKBALL, args.source); 2113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), args.policyFlags); 2114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, args.flags); 2116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2117fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, args.buttonState); 2118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, args.edgeFlags); 2119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(1), args.pointerCount); 2120fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, args.pointerProperties[0].id); 2121fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, args.pointerProperties[0].toolType); 2122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2123be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.xPrecision); 2125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(TRACKBALL_MOVEMENT_THRESHOLD, args.yPrecision); 2126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 212983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentXYUpdates) { 213083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 213183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2134be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Motion in X but not Y. 213749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1); 213849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2139be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2142be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Motion in Y but not X. 214549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2); 214649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2147be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2150be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 215383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleIndependentButtonUpdates) { 215483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 215583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2158be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2160be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Button press. 216149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 216249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2163be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2166be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2168be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Button release. 216949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 217049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2171be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2174be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 217783c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleCombinedXYAndButtonUpdates) { 217883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 217983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2182be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Combined X, Y and Button. 218549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 1); 218649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, -2); 218749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 1); 218849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2189be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 2191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, -2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 2193be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move X, Y a bit while pressed. 219649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 2); 219749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 1); 219849ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2199be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action); 2201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2.0f / TRACKBALL_MOVEMENT_THRESHOLD, 1.0f / TRACKBALL_MOVEMENT_THRESHOLD, 2203be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Release Button. 220649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MOUSE, 0); 220749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2208be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, args.action); 2210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2211be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 221483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenNotOrientationAware_ShouldNotRotateMotions) { 221583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 221683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 2217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 221965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 222047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, 2221b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_ORIENTATION_90); 2222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1)); 2223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1)); 2224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0)); 2225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1)); 2226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1)); 2227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1)); 2228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0)); 2229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1)); 2230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2231c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 223283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenOrientationAware_ShouldRotateMotions) { 223383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 223483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.mode", "navigation"); 223583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown addConfigurationProperty("cursor.orientationAware", "1"); 2236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 223865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 2239b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_0); 2240c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, 1)); 2241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, 1)); 2242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 1, 0)); 2243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, -1)); 2244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, -1)); 2245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, -1)); 2246c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, -1, 0)); 2247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, 1)); 2248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 224965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 2250b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_90); 2251c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 1, 0)); 2252c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, 1, -1)); 2253c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, -1)); 2254c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, -1)); 2255c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, -1, 0)); 2256c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, -1, 1)); 2257c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, 1)); 2258c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, 1)); 2259c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 226065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 2261b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_180); 2262c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, 0, -1)); 2263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, -1)); 2264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, -1, 0)); 2265c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, -1, 1)); 2266c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 0, 1)); 2267c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, 1)); 2268c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 1, 0)); 2269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, 1, -1)); 2270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 227165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, 2272b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_ORIENTATION_270); 2273c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, 1, -1, 0)); 2274c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 1, -1, 1)); 2275c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, 0, 0, 1)); 2276c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 1, -1, 1, 1)); 2277c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, 0, -1, 1, 0)); 2278c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, -1, 1, -1)); 2279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 0, 0, -1)); 2280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(testMotionRotation(mapper, -1, 1, -1, -1)); 2281c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2283be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(CursorInputMapperTest, Process_ShouldHandleAllButtons) { 2284be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2285be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("cursor.mode", "pointer"); 2286be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 2287be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2288be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); 2289be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setPosition(100, 200); 2290be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setButtonState(0); 2291be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2292be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 2293be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs keyArgs; 2294be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2295be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_LEFT, release BTN_LEFT 229649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 1); 229749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 2301be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, mFakePointerController->getButtonState()); 2302be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 230549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_LEFT, 0); 230649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2308be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2309be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2310be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2311be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2312be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2313be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2314be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2315be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2316be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2317be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2318be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2319be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2320be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2321be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 232249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 1); 232349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_MIDDLE, 1); 232449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2325be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2326be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 2328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.buttonState); 2329be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 2330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->getButtonState()); 2331be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2332be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 233449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_RIGHT, 0); 233549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2336be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 2338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, mFakePointerController->getButtonState()); 2339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 2340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 1.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_MIDDLE, 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_UP, 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->assertNotifyMotionWasCalled(&motionArgs)); 2352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2356be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2357be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_BACK, release BTN_BACK 235949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 1); 236049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 2366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState()); 2367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 237149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_BACK, 0); 237249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2382be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_SIDE, release BTN_SIDE 238449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 1); 238549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 2391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, mFakePointerController->getButtonState()); 2392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 239649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_SIDE, 0); 239749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 2407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_FORWARD, release BTN_FORWARD 240949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 1); 241049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 2416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState()); 2417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 242149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_FORWARD, 0); 242249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2427be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2428be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_EXTRA, release BTN_EXTRA 243449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 1); 243549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 2441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, mFakePointerController->getButtonState()); 2442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2444be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 244649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_EXTRA, 0); 244749ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2448be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, mFakePointerController->getButtonState()); 2451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 2452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2453be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 100.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2455be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2456be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 2457be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 2458be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2459be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(CursorInputMapperTest, Process_WhenModeIsPointer_ShouldMoveThePointerAround) { 2460be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown CursorInputMapper* mapper = new CursorInputMapper(mDevice); 2461be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("cursor.mode", "pointer"); 2462be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 2463be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2464be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); 2465be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setPosition(100, 200); 2466be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakePointerController->setButtonState(0); 2467be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2468be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 2469be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 247049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_X, 10); 247149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_REL, REL_Y, 20); 247249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2473be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 2474be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action); 2475be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 2476be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 110.0f, 220.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); 2477be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPosition(mFakePointerController, 110.0f, 220.0f)); 2478be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 2479be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2480c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2481c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- TouchInputMapperTest --- 2482c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2483c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass TouchInputMapperTest : public InputMapperTest { 2484c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 2485c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_X_MIN; 2486c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_X_MAX; 2487c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_Y_MIN; 2488c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_Y_MAX; 2489c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_TOUCH_MIN; 2490c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_TOUCH_MAX; 2491c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_TOOL_MIN; 2492c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_TOOL_MAX; 2493c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_PRESSURE_MIN; 2494c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_PRESSURE_MAX; 2495c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_ORIENTATION_MIN; 2496c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_ORIENTATION_MAX; 2497be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static const int32_t RAW_DISTANCE_MIN; 2498be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static const int32_t RAW_DISTANCE_MAX; 249965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown static const int32_t RAW_TILT_MIN; 250065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown static const int32_t RAW_TILT_MAX; 2501c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_ID_MIN; 2502c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const int32_t RAW_ID_MAX; 2503be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static const int32_t RAW_SLOT_MIN; 2504be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown static const int32_t RAW_SLOT_MAX; 2505c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const float X_PRECISION; 2506c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const float Y_PRECISION; 2507c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2508a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown static const float GEOMETRIC_SCALE; 2509a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 2510c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown static const VirtualKeyDefinition VIRTUAL_KEYS[2]; 2511c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2512c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown enum Axes { 2513c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown POSITION = 1 << 0, 2514c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown TOUCH = 1 << 1, 2515c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown TOOL = 1 << 2, 2516c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown PRESSURE = 1 << 3, 2517c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ORIENTATION = 1 << 4, 2518c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown MINOR = 1 << 5, 2519c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ID = 1 << 6, 2520be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown DISTANCE = 1 << 7, 252165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown TILT = 1 << 8, 252265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown SLOT = 1 << 9, 252365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown TOOL_TYPE = 1 << 10, 2524c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown }; 2525c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void prepareDisplay(int32_t orientation); 2527c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void prepareVirtualKeys(); 2528c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t toRawX(float displayX); 2529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t toRawY(float displayY); 2530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float toDisplayX(int32_t rawX); 2531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float toDisplayY(int32_t rawY); 2532c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 2533c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2534c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_X_MIN = 25; 25359626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst int32_t TouchInputMapperTest::RAW_X_MAX = 1019; 2536c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_Y_MIN = 30; 25379626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst int32_t TouchInputMapperTest::RAW_Y_MAX = 1009; 2538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOUCH_MIN = 0; 2539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOUCH_MAX = 31; 2540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOOL_MIN = 0; 2541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_TOOL_MAX = 15; 2542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_PRESSURE_MIN = RAW_TOUCH_MIN; 2543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_PRESSURE_MAX = RAW_TOUCH_MAX; 2544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ORIENTATION_MIN = -7; 2545c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ORIENTATION_MAX = 7; 2546be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_DISTANCE_MIN = 0; 2547be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_DISTANCE_MAX = 7; 254865fd251c3913fc921468a3dad190810db19eb9dfJeff Brownconst int32_t TouchInputMapperTest::RAW_TILT_MIN = 0; 254965fd251c3913fc921468a3dad190810db19eb9dfJeff Brownconst int32_t TouchInputMapperTest::RAW_TILT_MAX = 150; 2550c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ID_MIN = 0; 2551c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst int32_t TouchInputMapperTest::RAW_ID_MAX = 9; 2552be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_SLOT_MIN = 0; 2553be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownconst int32_t TouchInputMapperTest::RAW_SLOT_MAX = 9; 25549626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst float TouchInputMapperTest::X_PRECISION = float(RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH; 25559626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brownconst float TouchInputMapperTest::Y_PRECISION = float(RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT; 2556c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2557a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brownconst float TouchInputMapperTest::GEOMETRIC_SCALE = 2558a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown avg(float(DISPLAY_WIDTH) / (RAW_X_MAX - RAW_X_MIN + 1), 2559a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float(DISPLAY_HEIGHT) / (RAW_Y_MAX - RAW_Y_MIN + 1)); 2560a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 2561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownconst VirtualKeyDefinition TouchInputMapperTest::VIRTUAL_KEYS[2] = { 2562c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown { KEY_HOME, 60, DISPLAY_HEIGHT + 15, 20, 20 }, 2563c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown { KEY_MENU, DISPLAY_HEIGHT - 60, DISPLAY_WIDTH + 15, 20, 20 }, 2564c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 2565c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2566c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid TouchInputMapperTest::prepareDisplay(int32_t orientation) { 256765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown setDisplayInfoAndReconfigure(DISPLAY_ID, DISPLAY_WIDTH, DISPLAY_HEIGHT, orientation); 2568c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2569c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2570c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid TouchInputMapperTest::prepareVirtualKeys() { 25719065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[0]); 25729065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown mFakeEventHub->addVirtualKeyDefinition(DEVICE_ID, VIRTUAL_KEYS[1]); 257349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_HOME, 0, AKEYCODE_HOME, POLICY_FLAG_WAKE); 257449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, KEY_MENU, 0, AKEYCODE_MENU, POLICY_FLAG_WAKE); 2575c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2576c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2577c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownint32_t TouchInputMapperTest::toRawX(float displayX) { 25789626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown return int32_t(displayX * (RAW_X_MAX - RAW_X_MIN + 1) / DISPLAY_WIDTH + RAW_X_MIN); 2579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2581c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownint32_t TouchInputMapperTest::toRawY(float displayY) { 25829626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown return int32_t(displayY * (RAW_Y_MAX - RAW_Y_MIN + 1) / DISPLAY_HEIGHT + RAW_Y_MIN); 2583c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2584c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2585c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownfloat TouchInputMapperTest::toDisplayX(int32_t rawX) { 25869626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown return float(rawX - RAW_X_MIN) * DISPLAY_WIDTH / (RAW_X_MAX - RAW_X_MIN + 1); 2587c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2588c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2589c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownfloat TouchInputMapperTest::toDisplayY(int32_t rawY) { 25909626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown return float(rawY - RAW_Y_MIN) * DISPLAY_HEIGHT / (RAW_Y_MAX - RAW_Y_MIN + 1); 2591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2594c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- SingleTouchInputMapperTest --- 2595c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2596c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass SingleTouchInputMapperTest : public TouchInputMapperTest { 2597c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 259849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown void prepareButtons(); 2599c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void prepareAxes(int axes); 2600c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2601c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y); 2602c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y); 2603c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processUp(SingleTouchInputMapper* mappery); 2604c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processPressure(SingleTouchInputMapper* mapper, int32_t pressure); 2605c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processToolMajor(SingleTouchInputMapper* mapper, int32_t toolMajor); 2606be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processDistance(SingleTouchInputMapper* mapper, int32_t distance); 260765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown void processTilt(SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY); 2608be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processKey(SingleTouchInputMapper* mapper, int32_t code, int32_t value); 2609c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown void processSync(SingleTouchInputMapper* mapper); 2610c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 2611c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 261249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownvoid SingleTouchInputMapperTest::prepareButtons() { 261349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0); 261449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown} 261549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown 2616c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::prepareAxes(int axes) { 2617c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (axes & POSITION) { 2618efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_X, 2619efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown RAW_X_MIN, RAW_X_MAX, 0, 0); 2620efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_Y, 2621efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown RAW_Y_MIN, RAW_Y_MAX, 0, 0); 2622c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 2623c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (axes & PRESSURE) { 2624efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_PRESSURE, 2625efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0); 2626c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 2627c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown if (axes & TOOL) { 2628efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TOOL_WIDTH, 2629efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0); 2630c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 2631be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & DISTANCE) { 2632be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_DISTANCE, 2633be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0); 2634be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 263565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown if (axes & TILT) { 263665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_X, 263765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown RAW_TILT_MIN, RAW_TILT_MAX, 0, 0); 263865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_TILT_Y, 263965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown RAW_TILT_MIN, RAW_TILT_MAX, 0, 0); 264065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown } 2641c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2642c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2643c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processDown(SingleTouchInputMapper* mapper, int32_t x, int32_t y) { 264449ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 1); 264549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x); 264649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y); 2647c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2648c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2649c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processMove(SingleTouchInputMapper* mapper, int32_t x, int32_t y) { 265049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_X, x); 265149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_Y, y); 2652c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2653c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2654c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processUp(SingleTouchInputMapper* mapper) { 265549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, BTN_TOUCH, 0); 2656c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2657c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2658c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processPressure( 2659c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SingleTouchInputMapper* mapper, int32_t pressure) { 266049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_PRESSURE, pressure); 2661c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2662c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2663c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processToolMajor( 2664c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown SingleTouchInputMapper* mapper, int32_t toolMajor) { 266549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TOOL_WIDTH, toolMajor); 2666c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2667c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2668be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid SingleTouchInputMapperTest::processDistance( 2669be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper, int32_t distance) { 267049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_DISTANCE, distance); 2671be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 2672be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 267365fd251c3913fc921468a3dad190810db19eb9dfJeff Brownvoid SingleTouchInputMapperTest::processTilt( 267465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown SingleTouchInputMapper* mapper, int32_t tiltX, int32_t tiltY) { 267549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_X, tiltX); 267649ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_TILT_Y, tiltY); 267765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown} 267865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 2679be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid SingleTouchInputMapperTest::processKey( 2680be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper, int32_t code, int32_t value) { 268149ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value); 2682be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 2683be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 2684c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) { 268549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 2686c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2687c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2688c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2689ace13b17866dc9136aeecf6dfaf7077f37434469Jeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndNotACursor_ReturnsPointer) { 269058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 269149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 269258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown prepareAxes(POSITION); 269358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addMapperAndConfigure(mapper); 269458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown 269565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AINPUT_SOURCE_MOUSE, mapper->getSources()); 2696ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown} 2697ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown 2698ace13b17866dc9136aeecf6dfaf7077f37434469Jeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsNotSpecifiedAndIsACursor_ReturnsTouchPad) { 2699ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 2700ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_X); 2701ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown mFakeEventHub->addRelativeAxis(DEVICE_ID, REL_Y); 270249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2703ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown prepareAxes(POSITION); 2704ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown addMapperAndConfigure(mapper); 2705ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown 270658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources()); 270758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown} 270858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown 270949ed71db425c5054e3ad9526496a7e116c89556bJeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) { 271047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 271149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2712c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 271349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown addConfigurationProperty("touch.deviceType", "touchPad"); 2714c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2715c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2716c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources()); 2717c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2718c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 271949ed71db425c5054e3ad9526496a7e116c89556bJeff BrownTEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) { 272047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 272149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2722c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 272349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2724c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2725c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2726c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources()); 2727c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2728c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2729c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, GetKeyCodeState) { 273047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 273158a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2732b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 273349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2734c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2735c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2736c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2737c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2738c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Unknown key. 2739c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_A)); 2740c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2741c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Virtual key is down. 2742c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2743c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2744c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2745c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2746be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2747c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2748c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME)); 2749c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2750c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Virtual key is up. 2751c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2752c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2753be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2754c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2755c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UP, mapper->getKeyCodeState(AINPUT_SOURCE_ANY, AKEYCODE_HOME)); 2756c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2757c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2758c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, GetScanCodeState) { 275947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 276058a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2761b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 276249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2763c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2764c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2765c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2766c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2767c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Unknown key. 2768c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UNKNOWN, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_A)); 2769c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2770c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Virtual key is down. 2771c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2772c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2773c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2774c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2775be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2776c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2777c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_VIRTUAL, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME)); 2778c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2779c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Virtual key is up. 2780c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2781c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2782be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled()); 2783c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2784c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_STATE_UP, mapper->getScanCodeState(AINPUT_SOURCE_ANY, KEY_HOME)); 2785c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2786c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2787c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, MarkSupportedKeyCodes) { 278847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 278958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2790b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 279149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2792c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2793c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2794c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2795c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2796c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const int32_t keys[2] = { AKEYCODE_HOME, AKEYCODE_A }; 2797c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint8_t flags[2] = { 0, 0 }; 2798c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(mapper->markSupportedKeyCodes(AINPUT_SOURCE_ANY, 2, keys, flags)); 2799c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_TRUE(flags[0]); 2800c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_FALSE(flags[1]); 2801c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2802c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2803c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndReleasedNormally_SendsKeyDownAndKeyUp) { 280447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 280558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2806b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 280749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2808c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2809c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2810c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2811c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2812c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2813c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2814be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs args; 2815c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2816c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Press virtual key. 2817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2820c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2822be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 2823c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2824c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 2825c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 2826c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags); 2827c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, args.action); 2828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags); 2829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 2830c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, args.scanCode); 2831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2833c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2834c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Release virtual key. 2835c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2836c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2837c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2838be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&args)); 2839c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.eventTime); 2840c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, args.deviceId); 2841c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, args.source); 2842c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_VIRTUAL, args.policyFlags); 2843c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, args.action); 2844c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, args.flags); 2845c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, args.keyCode); 2846c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, args.scanCode); 2847c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, args.metaState); 2848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, args.downTime); 2849c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any motions. 2851be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 2852c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2853c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenVirtualKeyIsPressedAndMovedOutOfBounds_SendsKeyDownAndKeyCancel) { 285547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 285658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2857b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 285849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2859c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2860c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2862c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2865be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs keyArgs; 2866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2867c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Press virtual key. 2868c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = toRawX(VIRTUAL_KEYS[0].centerX); 2869c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = toRawY(VIRTUAL_KEYS[0].centerY); 2870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2873be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime); 2875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, keyArgs.deviceId); 2876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source); 2877c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags); 2878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 2879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY, keyArgs.flags); 2880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode); 2881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, keyArgs.scanCode); 2882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState); 2883c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime); 2884c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2885c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move out of bounds. This should generate a cancel and a pointer down since we moved 2886c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // into the display area. 2887c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown y -= 100; 2888c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMove(mapper, x, y); 2889c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2890c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2891be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 2892c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, keyArgs.eventTime); 2893c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, keyArgs.deviceId); 2894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_KEYBOARD, keyArgs.source); 2895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(POLICY_FLAG_VIRTUAL, keyArgs.policyFlags); 2896c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 2897c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEY_EVENT_FLAG_FROM_SYSTEM | AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY 2898c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown | AKEY_EVENT_FLAG_CANCELED, keyArgs.flags); 2899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AKEYCODE_HOME, keyArgs.keyCode); 2900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(KEY_HOME, keyArgs.scanCode); 2901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, keyArgs.metaState); 2902c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, keyArgs.downTime); 2903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2904be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 2905be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2907c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2908c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2909c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2910c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 2911c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 2912c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2913fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2914c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 2915c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2916fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2917fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2918c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2919be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2920c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2921c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2923c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2924c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Keep moving out of bounds. Should generate a pointer move. 2925c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown y -= 50; 2926c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMove(mapper, x, y); 2927c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2928c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2929be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2930c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2931c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2932c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2933c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2934c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 2935c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 2936c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2937fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2938c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 2939c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2940fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2941fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2942c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2943be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2944c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2945c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2946c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2947c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Release out of bounds. Should generate a pointer up. 2949c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 2950c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2952be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 2953c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 2954c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 2955c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 2956c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 2957c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 2958c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 2959c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 2960fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 2961c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 2962c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 2963fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 2964fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 2965c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 2966be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 2967c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 2968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 2969c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 2970c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2971c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 2972be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 2973be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 2974c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 2975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2976c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenTouchStartsOutsideDisplayAndMovesIn_SendsDownAsTouchEntersDisplay) { 297747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 297858a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 2979b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 298049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 2981c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 2982c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 2983c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 2984c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2985c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 2986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2987be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 2988c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2989c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Initially go down out of bounds. 2990c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = -10; 2991c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = -10; 2992c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 2993c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 2994c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2995be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 2996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2997c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move into the display area. Should generate a pointer down. 2998c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x = 50; 2999c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown y = 75; 3000c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMove(mapper, x, y); 3001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3003be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3005c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3006c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3008c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3010c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3011fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3012c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3013c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3014fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3015fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3016c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3017be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3018c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3019c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3020c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3021c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3022c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Release. Should generate a pointer up. 3023c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3024c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3025c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3026be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3027c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3028c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3029c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3030c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3031c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3032c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3033c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3034fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3037fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3038fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3039c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3040be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3041c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3042c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3043c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3044c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3045c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 3046be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 3047be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 3048c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3049c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3050c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_NormalSingleTouchGesture) { 305147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 305258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3053b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 305449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 3055c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 3056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 3057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 3058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3059c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 3060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3061be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3063c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Down. 3064c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x = 100; 3065c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t y = 125; 3066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, x, y); 3067c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3069be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3072c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3075c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3076c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3077fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3078c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3080fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3081fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3082c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3083be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3084c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3085c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3086c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3087c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3088c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 3089c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x += 50; 3090c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown y += 75; 3091c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMove(mapper, x, y); 3092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3093c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3094be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3095c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3098c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3099c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3102fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3105fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3106fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3108be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Up. 3114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3117be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3125fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3128fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3129fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3131be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x), toDisplayY(y), 1, 0, 0, 0, 0, 0, 0, 0)); 3132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 3137be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 3138be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 3139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 314147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenNotOrientationAware_DoesNotRotateMotions) { 314247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 314358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 314449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 314547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown prepareAxes(POSITION); 314647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown addConfigurationProperty("touch.orientationAware", "0"); 314747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown addMapperAndConfigure(mapper); 314847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 3149be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 315047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 315147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown // Rotation 90. 3152b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_90); 315347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown processDown(mapper, toRawX(50), toRawY(75)); 315447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown processSync(mapper); 315547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 3156be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3157ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3158ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 315947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 316047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown processUp(mapper); 316147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown processSync(mapper); 3162be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 316347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown} 316447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown 316547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenOrientationAware_RotatesMotions) { 316647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 316758a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 316849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 3169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 3170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 3171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3172be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 3173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rotation 0. 3175b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, toRawX(50), toRawY(75)); 3177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3179be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3180ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 3181ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3185be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rotation 90. 3188b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_90); 31899626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown processDown(mapper, RAW_X_MAX - toRawX(75) + RAW_X_MIN, toRawY(50)); 3190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3192be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 31939626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 31949626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3198be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rotation 180. 3201b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_180); 32029626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown processDown(mapper, RAW_X_MAX - toRawX(50) + RAW_X_MIN, RAW_Y_MAX - toRawY(75) + RAW_Y_MIN); 3203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3205be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 32069626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 32079626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3211be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rotation 270. 3214b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_270); 32159626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown processDown(mapper, toRawX(75), RAW_Y_MAX - toRawY(50) + RAW_Y_MIN); 3216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3218be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 32199626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(50, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X), 1); 32209626b14a283ef82d16636cf5fb5ba8bb4d30381eJeff Brown ASSERT_NEAR(75, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y), 1); 3221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processUp(mapper); 3223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3224be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled()); 3225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_AllAxes_DefaultCalibration) { 322847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 322958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3230b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 323149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown prepareButtons(); 323265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown prepareAxes(POSITION | PRESSURE | TOOL | DISTANCE | TILT); 3233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 3234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // These calculations are based on the input device calibration documentation. 3236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX = 100; 3237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY = 200; 3238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawPressure = 10; 3239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawToolMajor = 12; 324065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown int32_t rawDistance = 2; 324165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown int32_t rawTiltX = 30; 324265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown int32_t rawTiltY = 110; 3243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 3245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 3246c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float pressure = float(rawPressure) / RAW_PRESSURE_MAX; 3247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float size = float(rawToolMajor) / RAW_TOOL_MAX; 3248a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float tool = float(rawToolMajor) * GEOMETRIC_SCALE; 3249be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown float distance = float(rawDistance); 3250c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 325165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tiltCenter = (RAW_TILT_MAX + RAW_TILT_MIN) * 0.5f; 325265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tiltScale = M_PI / 180; 325365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tiltXAngle = (rawTiltX - tiltCenter) * tiltScale; 325465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tiltYAngle = (rawTiltY - tiltCenter) * tiltScale; 325565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float orientation = atan2f(-sinf(tiltXAngle), sinf(tiltYAngle)); 325665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown float tilt = acosf(cosf(tiltXAngle) * cosf(tiltYAngle)); 325765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 3258c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processDown(mapper, rawX, rawY); 3259c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPressure(mapper, rawPressure); 3260c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 3261be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDistance(mapper, rawDistance); 326265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processTilt(mapper, rawTiltX, rawTiltY); 3263c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3265be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 3266be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 3267c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 326865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown x, y, pressure, size, tool, tool, tool, tool, orientation, distance)); 326965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(tilt, args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_TILT)); 3270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3272be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllButtons) { 3273be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3274be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3275be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3276be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareButtons(); 3277be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION); 3278be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 3279c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3280be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3281be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs keyArgs; 3282c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3283be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDown(mapper, 100, 200); 3284be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3285be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3286be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3287be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3288c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3289be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_LEFT, release BTN_LEFT 3290be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_LEFT, 1); 3291be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3292be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3293be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3294be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 3295c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3296be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_LEFT, 0); 3297be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3301c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3302be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 3303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_RIGHT, 1); 3304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_MIDDLE, 1); 3305be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3306be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3308be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 3309be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.buttonState); 3310c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3311be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_RIGHT, 0); 3312be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3313be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3314be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 3315be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3316c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3317be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_MIDDLE, 0); 3318be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3319be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3320be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3321be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3322c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3323be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_BACK, release BTN_BACK 3324be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_BACK, 1); 3325be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3326be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3329be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 3331be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3332c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_BACK, 0); 3334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3335be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3336be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_SIDE, release BTN_SIDE 3343be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_SIDE, 1); 3344be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3345be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3347be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3348be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3349be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 3350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_SIDE, 0); 3353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3356be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3357be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 3360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_FORWARD, release BTN_FORWARD 3362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_FORWARD, 1); 3363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 3369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3371be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_FORWARD, 0); 3372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_EXTRA, release BTN_EXTRA 3381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_EXTRA, 1); 3382be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 3385be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 3388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_EXTRA, 0); 3391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 3396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 3397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 3398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_STYLUS, release BTN_STYLUS 3400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS, 1); 3401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState); 3405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS, 0); 3407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3409be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3410be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_STYLUS2, release BTN_STYLUS2 3413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS2, 1); 3414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 3418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS2, 0); 3420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3422be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // release touch 3426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processUp(mapper); 3427be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3428be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3433be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_ShouldHandleAllToolTypes) { 3434be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3435be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareButtons(); 3438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION); 3439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 3440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // default tool type is finger 3444be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDown(mapper, 100, 200); 3445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3446be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3447be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3448be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // eraser 3451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 1); 3452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3453be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3455be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 3456be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3457be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // stylus 3458be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 0); 3459be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 1); 3460be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3461be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3462be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3463be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3464be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 346565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // brush 3466be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 0); 346765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_BRUSH, 1); 346865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 346965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 347065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 347165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 347265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 347365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // pencil 347465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_BRUSH, 0); 347565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_PENCIL, 1); 347665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 347765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 347865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 347965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 348065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 348165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // airbrush 348265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_PENCIL, 0); 348365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_AIRBRUSH, 1); 348465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 348565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 348665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 348765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 348865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 348965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // mouse 349065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_AIRBRUSH, 0); 349165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 1); 349265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 349365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 349465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 349565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 349665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 349765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // lens 349865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 0); 349965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_LENS, 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 3505ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // double-tap 350665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_LENS, 0); 3507ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_DOUBLETAP, 1); 3508ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 3509ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3510ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3511ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3512ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 3513ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // triple-tap 3514ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_DOUBLETAP, 0); 3515ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_TRIPLETAP, 1); 3516ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 3517ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3518ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3519ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3520ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 3521ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // quad-tap 3522ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_TRIPLETAP, 0); 3523ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_QUADTAP, 1); 3524ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 3525ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3526ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3527ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3528ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 3529ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // finger 3530ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_QUADTAP, 0); 3531be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 1); 3532be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3533be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3534be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3535be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3536be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3537be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // stylus trumps finger 3538be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 1); 3539be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3540be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3541be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3542be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 3543be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3544be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // eraser trumps stylus 3545be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 1); 3546be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3547be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3548be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3549be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 3550be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 355165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // mouse trumps eraser 355265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 1); 355365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 355465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 355565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 355665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 355765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 3558be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // back to default tool type 355965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 0); 3560be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 0); 3561be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 0); 3562be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 0); 3563be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3564be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3565be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 3566be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3567be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3568be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3569be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) { 3570be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3571be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3572be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3573be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareButtons(); 3574be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION); 357549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, BTN_TOOL_FINGER, 0, AKEYCODE_UNKNOWN, 0); 3576be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 3577be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3578be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3579be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3580be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0 3581be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 1); 3582be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processMove(mapper, 100, 200); 3583be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3584be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3585be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3586be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3587be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3588be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3589be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3590be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3591be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3592be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3593be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3594be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // move a little 3595be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processMove(mapper, 150, 250); 3596be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3597be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3598be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3599be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3600be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3601be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3602be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // down when BTN_TOUCH is pressed, pressure defaults to 1 3603be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOUCH, 1); 3604be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3605be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3606be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3607be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3608be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3609be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3610be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3611be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3612be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3613be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3614be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3615be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // up when BTN_TOUCH is released, hover restored 3616be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOUCH, 0); 3617be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3618be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3619be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3620be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3621be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3622be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3623be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3624be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3625be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3626be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3627be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3628be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3629be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3630be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3631be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3632be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3633be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // exit hover when pointer goes away 3634be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 0); 3635be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3636be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3637be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3638be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3639be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3640be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3641be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 364265fd251c3913fc921468a3dad190810db19eb9dfJeff BrownTEST_F(SingleTouchInputMapperTest, Process_WhenAbsPressureIsPresent_HoversIfItsValueIsZero) { 3643be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); 3644be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3645be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3646be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareButtons(); 364765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown prepareAxes(POSITION | PRESSURE); 3648be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 3649be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3650be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3651be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 365265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // initially hovering because pressure is 0 3653be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDown(mapper, 100, 200); 365465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, 0); 3655be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3656be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3657be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3658be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 365965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3660be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3661be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3662be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3663be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 366465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 3665be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3666be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // move a little 3667be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processMove(mapper, 150, 250); 3668be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3669be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3670be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3671be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 367265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3673be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 367465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // down when pressure is non-zero 367565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, RAW_PRESSURE_MAX); 3676be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3677be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3678be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3679be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 368065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3681be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3682be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3683be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3684be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3685be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3686be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 368765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // up when pressure becomes 0, hover restored 368865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, 0); 3689be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3690be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3691be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 3692be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3693be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 3694be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3695be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3696be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 3697be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 369865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3699be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3700be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3701be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 3702be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 370365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3704be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3705be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // exit hover when pointer goes away 3706be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processUp(mapper); 3707be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 3708be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3709be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 3710be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 371165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 3712be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3713be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3714be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3715be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown// --- MultiTouchInputMapperTest --- 3716be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3717be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownclass MultiTouchInputMapperTest : public TouchInputMapperTest { 3718be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownprotected: 3719be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void prepareAxes(int axes); 3720be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3721be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processPosition(MultiTouchInputMapper* mapper, int32_t x, int32_t y); 3722be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processTouchMajor(MultiTouchInputMapper* mapper, int32_t touchMajor); 3723be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processTouchMinor(MultiTouchInputMapper* mapper, int32_t touchMinor); 3724be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processToolMajor(MultiTouchInputMapper* mapper, int32_t toolMajor); 3725be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processToolMinor(MultiTouchInputMapper* mapper, int32_t toolMinor); 3726be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processOrientation(MultiTouchInputMapper* mapper, int32_t orientation); 3727be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processPressure(MultiTouchInputMapper* mapper, int32_t pressure); 3728be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processDistance(MultiTouchInputMapper* mapper, int32_t distance); 3729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processId(MultiTouchInputMapper* mapper, int32_t id); 3730be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processSlot(MultiTouchInputMapper* mapper, int32_t slot); 3731be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processToolType(MultiTouchInputMapper* mapper, int32_t toolType); 3732be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processKey(MultiTouchInputMapper* mapper, int32_t code, int32_t value); 3733be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processMTSync(MultiTouchInputMapper* mapper); 3734be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown void processSync(MultiTouchInputMapper* mapper); 3735be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown}; 3736be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3737be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::prepareAxes(int axes) { 3738be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & POSITION) { 3739be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_X, 3740be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_X_MIN, RAW_X_MAX, 0, 0); 3741be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_POSITION_Y, 3742be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_Y_MIN, RAW_Y_MAX, 0, 0); 3743be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3744be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & TOUCH) { 3745be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MAJOR, 3746be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0); 3747be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & MINOR) { 3748be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOUCH_MINOR, 3749be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_TOUCH_MIN, RAW_TOUCH_MAX, 0, 0); 3750be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3751be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3752be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & TOOL) { 3753be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MAJOR, 3754be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_TOOL_MIN, RAW_TOOL_MAX, 0, 0); 3755be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & MINOR) { 3756be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_WIDTH_MINOR, 3757be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_TOOL_MAX, RAW_TOOL_MAX, 0, 0); 3758be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3759be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3760be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & ORIENTATION) { 3761be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_ORIENTATION, 3762be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_ORIENTATION_MIN, RAW_ORIENTATION_MAX, 0, 0); 3763be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3764be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & PRESSURE) { 3765be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_PRESSURE, 3766be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_PRESSURE_MIN, RAW_PRESSURE_MAX, 0, 0); 3767be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3768be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & DISTANCE) { 3769be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_DISTANCE, 3770be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_DISTANCE_MIN, RAW_DISTANCE_MAX, 0, 0); 3771be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3772be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & ID) { 3773be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TRACKING_ID, 3774be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_ID_MIN, RAW_ID_MAX, 0, 0); 3775be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3776be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & SLOT) { 3777be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_SLOT, 3778be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown RAW_SLOT_MIN, RAW_SLOT_MAX, 0, 0); 3779be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->setAbsoluteAxisValue(DEVICE_ID, ABS_MT_SLOT, 0); 3780be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3781be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown if (axes & TOOL_TYPE) { 3782be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeEventHub->addAbsoluteAxis(DEVICE_ID, ABS_MT_TOOL_TYPE, 3783be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 0, MT_TOOL_MAX, 0, 0); 3784be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown } 3785be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3786be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3787be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processPosition( 3788be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t x, int32_t y) { 378949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_X, x); 379049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_POSITION_Y, y); 3791be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3792be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3793be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processTouchMajor( 3794be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t touchMajor) { 379549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MAJOR, touchMajor); 3796be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3797be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3798be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processTouchMinor( 3799be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t touchMinor) { 380049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOUCH_MINOR, touchMinor); 3801be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3802be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3803be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolMajor( 3804be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t toolMajor) { 380549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MAJOR, toolMajor); 3806be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3807be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3808be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolMinor( 3809be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t toolMinor) { 381049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_WIDTH_MINOR, toolMinor); 3811be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3812be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3813be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processOrientation( 3814be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t orientation) { 381549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_ORIENTATION, orientation); 3816be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3817c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3818c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processPressure( 3819c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown MultiTouchInputMapper* mapper, int32_t pressure) { 382049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_PRESSURE, pressure); 3821c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3822c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3823be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processDistance( 3824be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t distance) { 382549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_DISTANCE, distance); 3826be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3827be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3828c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processId( 3829c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown MultiTouchInputMapper* mapper, int32_t id) { 383049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TRACKING_ID, id); 3831c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3832c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3833be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processSlot( 3834be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t slot) { 383549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_SLOT, slot); 3836be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3837be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3838be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processToolType( 3839be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t toolType) { 384049ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_ABS, ABS_MT_TOOL_TYPE, toolType); 3841be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3842be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3843be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownvoid MultiTouchInputMapperTest::processKey( 3844be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper, int32_t code, int32_t value) { 384549ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, code, value); 3846be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 3847be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 3848c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processMTSync(MultiTouchInputMapper* mapper) { 384949ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_MT_REPORT, 0); 3850c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3851c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3852c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownvoid MultiTouchInputMapperTest::processSync(MultiTouchInputMapper* mapper) { 385349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_SYN, SYN_REPORT, 0); 3854c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 3855c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3856c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3857c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithoutTrackingIds) { 385847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 385958a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 3860b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 3861c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION); 3862c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 3863c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 3864c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3865c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 3866c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3867be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 3868c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3869c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Two fingers down at once. 3870c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 3871c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x1, y1); 3872c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3873c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 3874c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3875c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3876c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3877be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3878c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3879c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3880c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3881c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3882c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 3883c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3884c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3885fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3886c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3887c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 3888fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3889fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].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_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3893c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3894c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3895c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3896be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3897c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3898c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3899c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3900c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3901c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 3902c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 3903c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3904c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3905fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3906c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3907c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3908fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3909fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3910fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3911fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3912c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3913be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3914c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3915be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3916c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3917c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3918c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3919c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3920c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 3921c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 3922c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x1, y1); 3923c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3924c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 3925c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3926c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 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(2), motionArgs.pointerCount); 3939fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3940fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3941fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3942fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3943c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3944be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3945c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3946be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3947c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3948c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3949c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3950c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3951c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // First finger up. 3952c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x2 += 15; y2 -= 20; 3953c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 3954c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 3955c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 3956c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3957be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3958c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3959c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3960c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3961c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3962c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 3963c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 3964c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 3965c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 3966fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 3967c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 3968c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 3969fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 3970fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3971fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 3972fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 3973c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3974be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 3975c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 3976be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3977c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3978c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3979c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3980c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 3981be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 3982c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 3983c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 3984c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 3985c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 3986c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, 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(1), motionArgs.pointerCount); 3992fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 3993fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 3994c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 3995be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 3996c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 3997c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 3998c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 3999c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4000c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 4001c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x2 += 20; y2 -= 25; 4002c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4003c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4004c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4005c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4006be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4007c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4008c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4009c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4010c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4011c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4012c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 4013c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4014fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4015c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 4016c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4017fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4018fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4019c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4020be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4021c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4022c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4023c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4024c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4025c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // New finger down. 4026c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x3 = 700, y3 = 300; 4027c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4028c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4029c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x3, y3); 4030c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4031c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4032c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4033be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4034c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4035c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4036c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4037c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4038c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4039c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 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(2), motionArgs.pointerCount); 4045fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4046fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4047fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4048fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4049c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4050be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4051c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4052be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4053c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4054c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4055c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4056c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4057c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Second finger up. 4058c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x3 += 30; y3 -= 20; 4059c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x3, y3); 4060c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4061c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4062c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4063be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4064c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4065c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4066c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4067c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4069c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 4070c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 4071c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4072fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4073c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 4074c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4075fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4076fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4077fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4078fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4079c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4080be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4081c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4082be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4083c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4084c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4085c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4086c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4087be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4088c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4089c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4090c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4091c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4092c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4093c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 4094c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4095fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4096c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 4097c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4098fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4099fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4101be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Last finger up. 4107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4110be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.eventTime); 4112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(DEVICE_ID, motionArgs.deviceId); 4113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, motionArgs.source); 4114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(uint32_t(0), motionArgs.policyFlags); 4115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.flags); 4117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON, motionArgs.metaState); 4118fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(0, motionArgs.edgeFlags); 4120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4121fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4122fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4124be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(X_PRECISION, motionArgs.xPrecision, EPSILON); 4126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NEAR(Y_PRECISION, motionArgs.yPrecision, EPSILON); 4127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(ARBITRARY_TIME, motionArgs.downTime); 4128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 4130be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4131be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithTrackingIds) { 413547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 413658a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4137b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION | ID); 4139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareVirtualKeys(); 4140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 4143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4144be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Two fingers down at once. 4147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 4148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x1, y1); 4149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 1); 4150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4156be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 41596894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4160fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].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 4164be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 4167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 41686894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4169fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 41706894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4171fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4173be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4175be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 4178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 4179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x1, y1); 4180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 1); 4181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4187be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 41906894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4191fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 41926894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4193fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4195be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4197be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // First finger up. 4200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x2 += 15; y2 -= 20; 4201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4206be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 4209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 42106894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4211fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 42126894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4213fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4215be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4217be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4219be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4220c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 42226894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4223fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4225be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Move. 4228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x2 += 20; y2 -= 25; 4229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4231c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4232c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4234be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 42376894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4238fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4240be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4242c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // New finger down. 4243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t x3 = 700, y3 = 300; 4244c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x2, y2); 4245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 2); 4246c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4247c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x3, y3); 4248c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 3); 4249c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4250c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4251c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4252be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 42536894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4254c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 4255c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 42566894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4257fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 42586894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4259fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4260c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4261be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 42626894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4263be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4264c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4265c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Second finger up. 4266c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown x3 += 30; y3 -= 20; 4267c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, x3, y3); 4268c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, 3); 4269c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4270c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4271c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4272be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 42736894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4274c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown motionArgs.action); 4275c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 42766894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4277fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 42786894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4279fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4280c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4281be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 42826894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4283be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4284c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4285be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4286c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4287c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 42886894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4289fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4290c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4291be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4292c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4293c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Last finger up. 4294c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4295c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4296c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4297be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4298c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4299c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 43006894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4301fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4302c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4304c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4305c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Should not have sent any more keys or motions. 4306be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4308c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4309c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4310be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_NormalMultiTouchGesture_WithSlots) { 431147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 431258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4313b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4314be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | ID | SLOT); 4315be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareVirtualKeys(); 4316c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4317c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4318be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown mFakeContext->setGlobalMetaState(AMETA_SHIFT_LEFT_ON | AMETA_SHIFT_ON); 4319be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4320be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4321be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4322be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Two fingers down at once. 4323be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t x1 = 100, y1 = 125, x2 = 300, y2 = 500; 4324be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x1, y1); 4325be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 4326be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 1); 4327be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4328be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 2); 4329be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4331be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4332be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4335be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4336be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.action); 4342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4343be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4344be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4345be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4346be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4347be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4348be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4349be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4350be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4351be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4352be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Move. 4353be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown x1 += 10; y1 += 15; x2 += 5; y2 -= 10; 4354be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 0); 4355be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x1, y1); 4356be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 1); 4357be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4358be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4359be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4362be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4363be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4365be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4367be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4371be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // First finger up. 4373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown x2 += 15; y2 -= 20; 4374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 0); 4375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 4376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 1); 4377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4382be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.action); 4383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4385be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4386be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4387be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4388be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4389be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x1), toDisplayY(y1), 1, 0, 0, 0, 0, 0, 0, 0)); 4390be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4396be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4399be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Move. 4402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown x2 += 20; y2 -= 25; 4403be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4407be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4409be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[0].id); 4410be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4413be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // New finger down. 4415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t x3 = 700, y3 = 300; 4416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x2, y2); 4417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 0); 4418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 3); 4419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x3, y3); 4420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4422be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (0 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.action); 4425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4427be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4428be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4434be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4435be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Second finger up. 4436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown x3 += 30; y3 -= 20; 4437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 1); 4438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 4439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSlot(mapper, 0); 4440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, x3, y3); 4441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4442be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4444be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4445be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.action); 4446be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(2), motionArgs.pointerCount); 4447be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4448be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4449be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(1, motionArgs.pointerProperties[1].id); 4450be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[1].toolType); 4451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4453be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[1], 4454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x2), toDisplayY(y2), 1, 0, 0, 0, 0, 0, 0, 0)); 4455be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4456be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4457be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4458be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4459be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4460be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4461be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4462be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4463be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4464be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Last finger up. 4465be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 4466be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4467be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4468be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4469be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4470be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(size_t(1), motionArgs.pointerCount); 4471be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.pointerProperties[0].id); 4472be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4473be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 4474be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(x3), toDisplayY(y3), 1, 0, 0, 0, 0, 0, 0, 0)); 4475be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4476be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // Should not have sent any more keys or motions. 4477be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasNotCalled()); 4478be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasNotCalled()); 4479be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 4480be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4481be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_AllAxes_WithDefaultCalibration) { 4482be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4483be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4484be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4485be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | TOUCH | TOOL | PRESSURE | ORIENTATION | ID | MINOR | DISTANCE); 4486be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 4487be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4488be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // These calculations are based on the input device calibration documentation. 4489be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawX = 100; 4490be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawY = 200; 4491be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawTouchMajor = 7; 4492be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawTouchMinor = 6; 4493be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawToolMajor = 9; 4494be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawToolMinor = 8; 4495be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawPressure = 11; 4496be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown int32_t rawDistance = 0; 4497c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawOrientation = 3; 4498c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t id = 5; 4499c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4500c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 4501c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 4502c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float pressure = float(rawPressure) / RAW_PRESSURE_MAX; 4503a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX; 4504a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE; 4505a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE; 4506a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE; 4507a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE; 4508c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float orientation = float(rawOrientation) / RAW_ORIENTATION_MAX * M_PI_2; 4509be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown float distance = float(rawDistance); 4510c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4511c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX, rawY); 4512c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4513c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMinor(mapper, rawTouchMinor); 4514c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4515c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMinor(mapper, rawToolMinor); 4516c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPressure(mapper, rawPressure); 4517c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processOrientation(mapper, rawOrientation); 4518be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processDistance(mapper, rawDistance); 4519c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processId(mapper, id); 4520c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4521c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4522c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4523be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 4524be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 45256894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown ASSERT_EQ(0, args.pointerProperties[0].id); 4526c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4527a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, pressure, size, touchMajor, touchMinor, toolMajor, toolMinor, 4528a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown orientation, distance)); 4529c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4530c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4531c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_GeometricCalibration) { 453247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 453358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4534b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4535c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION | TOUCH | TOOL | MINOR); 4536a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.calibration", "geometric"); 4537c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4538c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4539c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // These calculations are based on the input device calibration documentation. 4540c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX = 100; 4541c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY = 200; 4542c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawTouchMajor = 140; 4543c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawTouchMinor = 120; 4544c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawToolMajor = 180; 4545c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawToolMinor = 160; 4546c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4547c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 4548c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 4549a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float size = avg(rawTouchMajor, rawTouchMinor) / RAW_TOUCH_MAX; 4550a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float toolMajor = float(rawToolMajor) * GEOMETRIC_SCALE; 4551a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float toolMinor = float(rawToolMinor) * GEOMETRIC_SCALE; 4552a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touchMajor = float(rawTouchMajor) * GEOMETRIC_SCALE; 4553a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touchMinor = float(rawTouchMinor) * GEOMETRIC_SCALE; 4554c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4555c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX, rawY); 4556c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4557c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMinor(mapper, rawTouchMinor); 4558c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4559c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMinor(mapper, rawToolMinor); 4560c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4561c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4562c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4563be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 4564be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4565c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4566a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, 1.0f, size, touchMajor, touchMinor, toolMajor, toolMinor, 0, 0)); 4567c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4568c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4569a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_SummedLinearCalibration) { 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", "diameter"); 4575a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.scale", "10"); 4576a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.bias", "160"); 4577a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.isSummed", "1"); 4578c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4579c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4580c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // These calculations are based on the input device calibration documentation. 4581c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Note: We only provide a single common touch/tool value because the device is assumed 4582c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // not to emit separate values for each pointer (isSummed = 1). 4583c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX = 100; 4584c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY = 200; 4585c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX2 = 150; 4586c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY2 = 250; 4587a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawTouchMajor = 5; 4588a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawToolMajor = 8; 4589c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4590c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 4591c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 4592c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x2 = toDisplayX(rawX2); 4593c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y2 = toDisplayY(rawY2); 4594a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float size = float(rawTouchMajor) / 2 / RAW_TOUCH_MAX; 4595a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touch = float(rawTouchMajor) / 2 * 10.0f + 160.0f; 4596a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float tool = float(rawToolMajor) / 2 * 10.0f + 160.0f; 4597c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4598c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX, rawY); 4599c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4600c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4601c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4602c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX2, rawY2); 4603c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4604c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4605c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4606c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4607c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4608be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 4609be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4610c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, args.action); 461149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown 4612be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4613c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 4614c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown args.action); 4615c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(size_t(2), args.pointerCount); 4616c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4617a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4618c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[1], 4619a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x2, y2, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4620c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 4621c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4622a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_TouchAndToolAxes_AreaCalibration) { 462347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 462458a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4625b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4626c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown prepareAxes(POSITION | TOUCH | TOOL); 4627a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.calibration", "area"); 4628a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.scale", "43"); 4629a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.size.bias", "3"); 4630c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown addMapperAndConfigure(mapper); 4631c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4632c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // These calculations are based on the input device calibration documentation. 4633c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawX = 100; 4634c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t rawY = 200; 4635a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawTouchMajor = 5; 4636a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawToolMajor = 8; 4637c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4638c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float x = toDisplayX(rawX); 4639c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown float y = toDisplayY(rawY); 4640a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float size = float(rawTouchMajor) / RAW_TOUCH_MAX; 4641a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float touch = sqrtf(rawTouchMajor) * 43.0f + 3.0f; 4642a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float tool = sqrtf(rawToolMajor) * 43.0f + 3.0f; 4643c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4644c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processPosition(mapper, rawX, rawY); 4645c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processTouchMajor(mapper, rawTouchMajor); 4646c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processToolMajor(mapper, rawToolMajor); 4647c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processMTSync(mapper); 4648c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown processSync(mapper); 4649c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 4650be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs args; 4651be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4652c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4653a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, 1.0f, size, touch, touch, tool, tool, 0, 0)); 4654a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown} 4655a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4656a1f89ceec076392da409e9f389b33e62e1d92da6Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_PressureAxis_AmplitudeCalibration) { 4657a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4658a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4659a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4660a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown prepareAxes(POSITION | PRESSURE); 4661a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.pressure.calibration", "amplitude"); 4662a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addConfigurationProperty("touch.pressure.scale", "0.01"); 4663a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown addMapperAndConfigure(mapper); 4664a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4665a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown // These calculations are based on the input device calibration documentation. 4666a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawX = 100; 4667a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawY = 200; 4668a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown int32_t rawPressure = 60; 4669a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4670a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float x = toDisplayX(rawX); 4671a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float y = toDisplayY(rawY); 4672a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown float pressure = float(rawPressure) * 0.01f; 4673a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4674a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown processPosition(mapper, rawX, rawY); 4675a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown processPressure(mapper, rawPressure); 4676a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown processMTSync(mapper); 4677a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown processSync(mapper); 4678a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown 4679a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown NotifyMotionArgs args; 4680a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args)); 4681a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(args.pointerCoords[0], 4682a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown x, y, pressure, 0, 0, 0, 0, 0, 0, 0)); 4683be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 4684be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4685be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllButtons) { 4686be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4687be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4688be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4689be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | ID | SLOT); 4690be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 4691be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4692be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4693be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyKeyArgs keyArgs; 4694be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4695be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 4696be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 100, 200); 4697be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4698be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4699be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4700be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4701be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4702be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_LEFT, release BTN_LEFT 4703be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_LEFT, 1); 4704be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4705be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4706be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4707be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_PRIMARY, motionArgs.buttonState); 4708be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4709be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_LEFT, 0); 4710be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4711be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4712be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4713be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4714be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4715be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_RIGHT + BTN_MIDDLE, release BTN_RIGHT, release BTN_MIDDLE 4716be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_RIGHT, 1); 4717be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_MIDDLE, 1); 4718be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4719be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4720be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4721be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY | AMOTION_EVENT_BUTTON_TERTIARY, 4722be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown motionArgs.buttonState); 4723be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4724be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_RIGHT, 0); 4725be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4726be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4727be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 4728be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4730be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_MIDDLE, 0); 4731be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4732be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4733be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4734be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4735be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4736be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_BACK, release BTN_BACK 4737be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_BACK, 1); 4738be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4739be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4740be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4741be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4742be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4743be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 4744be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4745be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4746be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_BACK, 0); 4747be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4748be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4749be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4750be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4751be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4752be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4753be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4754be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4755be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_SIDE, release BTN_SIDE 4756be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_SIDE, 1); 4757be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4758be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4759be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4760be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4761be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4762be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_BACK, motionArgs.buttonState); 4763be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4764be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4765be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_SIDE, 0); 4766be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4767be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4768be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4769be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4770be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4771be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4772be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_BACK, keyArgs.keyCode); 4773be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4774be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_FORWARD, release BTN_FORWARD 4775be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_FORWARD, 1); 4776be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4777be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4778be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4779be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4780be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4781be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 4782be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4783be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4784be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_FORWARD, 0); 4785be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4786be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4787be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4788be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4789be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4790be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4791be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4792be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4793be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_EXTRA, release BTN_EXTRA 4794be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_EXTRA, 1); 4795be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4796be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4797be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_DOWN, keyArgs.action); 4798be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4799be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4800be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_FORWARD, motionArgs.buttonState); 4801be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4802be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4803be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_EXTRA, 0); 4804be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4805be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4806be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4807be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4808be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyKeyWasCalled(&keyArgs)); 4809be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEY_EVENT_ACTION_UP, keyArgs.action); 4810be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AKEYCODE_FORWARD, keyArgs.keyCode); 4811be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4812be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_STYLUS, release BTN_STYLUS 4813be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS, 1); 4814be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4815be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4816be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4817be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_SECONDARY, motionArgs.buttonState); 4818be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4819be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS, 0); 4820be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4821be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4822be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4823be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4824be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4825be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // press BTN_STYLUS2, release BTN_STYLUS2 4826be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS2, 1); 4827be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4828be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4829be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4830be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_BUTTON_TERTIARY, motionArgs.buttonState); 4831be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4832be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_STYLUS2, 0); 4833be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4834be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4835be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4836be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4837be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4838be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // release touch 4839be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 4840be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4841be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4842be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 4843be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(0, motionArgs.buttonState); 4844be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 4845be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4846be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_ShouldHandleAllToolTypes) { 4847be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4848be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 4849be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 4850be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | ID | SLOT | TOOL_TYPE); 4851be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 4852be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4853be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 4854be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4855be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // default tool type is finger 4856be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 4857be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 100, 200); 4858be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4859be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4860be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 4861be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4862be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4863be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // eraser 4864be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 1); 4865be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4866be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4867be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4868be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 4869be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4870be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // stylus 4871be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 0); 4872be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 1); 4873be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4874be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4875be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4876be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4877be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 487865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // brush 4879be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 0); 488065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_BRUSH, 1); 488165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 488265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 488365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 488465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 488565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 488665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // pencil 488765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_BRUSH, 0); 488865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_PENCIL, 1); 488965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 489065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 489165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 489265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 489365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 489465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // airbrush 489565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_PENCIL, 0); 489665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_AIRBRUSH, 1); 489765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 489865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 489965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 490065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 490165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 490265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // mouse 490365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_AIRBRUSH, 0); 490465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 1); 490565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 490665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 490765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 490865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 490965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 491065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // lens 491165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 0); 491265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_LENS, 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 4918ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // double-tap 491965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_LENS, 0); 4920ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_DOUBLETAP, 1); 4921ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 4922ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4923ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4924ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4925ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 4926ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // triple-tap 4927ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_DOUBLETAP, 0); 4928ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_TRIPLETAP, 1); 4929ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 4930ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4931ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4932ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4933ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 4934ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // quad-tap 4935ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_TRIPLETAP, 0); 4936ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_QUADTAP, 1); 4937ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processSync(mapper); 4938ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4939ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4940ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4941ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown 4942ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown // finger 4943ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown processKey(mapper, BTN_TOOL_QUADTAP, 0); 4944be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 1); 4945be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4946be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4947be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4948be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4949be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4950be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // stylus trumps finger 4951be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 1); 4952be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4953be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4954be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4955be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4956be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4957be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // eraser trumps stylus 4958be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 1); 4959be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4960be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4961be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4962be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_ERASER, motionArgs.pointerProperties[0].toolType); 4963be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 496465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // mouse trumps eraser 496565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 1); 496665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processSync(mapper); 496765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 496865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 496965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_MOUSE, motionArgs.pointerProperties[0].toolType); 497065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown 4971be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // MT tool type trumps BTN tool types: MT_TOOL_FINGER 4972be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processToolType(mapper, MT_TOOL_FINGER); // this is the first time we send MT_TOOL_TYPE 4973be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4974be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4975be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4976be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4977be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4978be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // MT tool type trumps BTN tool types: MT_TOOL_PEN 4979be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processToolType(mapper, MT_TOOL_PEN); 4980be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4981be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4982be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4983be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_STYLUS, motionArgs.pointerProperties[0].toolType); 4984be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4985be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // back to default tool type 4986be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processToolType(mapper, -1); // use a deliberately undefined tool type, for testing 498765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processKey(mapper, BTN_TOOL_MOUSE, 0); 4988be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_RUBBER, 0); 4989be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_PEN, 0); 4990be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOOL_FINGER, 0); 4991be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 4992be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 4993be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, motionArgs.action); 4994be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_TOOL_TYPE_FINGER, motionArgs.pointerProperties[0].toolType); 4995be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 4996be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 4997be1aa8250cee7819c49741e819e81659d1d03823Jeff BrownTEST_F(MultiTouchInputMapperTest, Process_WhenBtnTouchPresent_HoversIfItsValueIsZero) { 4998be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 4999be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 5000be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 5001be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareAxes(POSITION | ID | SLOT); 500249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown mFakeEventHub->addKey(DEVICE_ID, BTN_TOUCH, 0, AKEYCODE_UNKNOWN, 0); 5003be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 5004be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5005be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 5006be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5007be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // initially hovering because BTN_TOUCH not sent yet, pressure defaults to 0 5008be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 5009be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 100, 200); 5010be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5011be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5012be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 5013be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5014be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 5015be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5016be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5017be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5018be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5019be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 5020be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5021be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // move a little 5022be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 150, 250); 5023be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5024be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5025be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5026be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5027be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5028be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5029be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // down when BTN_TOUCH is pressed, pressure defaults to 1 5030be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOUCH, 1); 5031be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5032be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5033be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5034be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5035be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5036be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5037be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5038be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 5039be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5040be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 5041be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5042be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // up when BTN_TOUCH is released, hover restored 5043be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processKey(mapper, BTN_TOUCH, 0); 5044be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5045be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5046be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 5047be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5048be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 5049be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5050be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5051be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 5052be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5053be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5054be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5055be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5056be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5057be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5058be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5059be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5060be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // exit hover when pointer goes away 5061be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 5062be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5063be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5064be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5065be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5066be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5067c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 5068c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 506965fd251c3913fc921468a3dad190810db19eb9dfJeff BrownTEST_F(MultiTouchInputMapperTest, Process_WhenAbsMTPressureIsPresent_HoversIfItsValueIsZero) { 5070be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); 5071be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addConfigurationProperty("touch.deviceType", "touchScreen"); 5072be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown prepareDisplay(DISPLAY_ORIENTATION_0); 507365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown prepareAxes(POSITION | ID | SLOT | PRESSURE); 5074be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown addMapperAndConfigure(mapper); 5075be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5076be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown NotifyMotionArgs motionArgs; 5077be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 507865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // initially hovering because pressure is 0 5079be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, 1); 5080be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 100, 200); 508165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, 0); 5082be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5083be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5084be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 5085be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 508665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 5087be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5088be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5089be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5090be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 509165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(100), toDisplayY(200), 0, 0, 0, 0, 0, 0, 0, 0)); 5092be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5093be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // move a little 5094be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processPosition(mapper, 150, 250); 5095be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5096be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5097be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5098be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 509965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5100be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 510165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // down when pressure becomes non-zero 510265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, RAW_PRESSURE_MAX); 5103be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5104be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5105be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5106be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 510765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5108be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5109be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5110be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_DOWN, motionArgs.action); 5111be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5112be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 5113be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 511465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown // up when pressure becomes 0, hover restored 511565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown processPressure(mapper, 0); 5116be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5117be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5118be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_UP, motionArgs.action); 5119be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 5120be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown toDisplayX(150), toDisplayY(250), 1, 0, 0, 0, 0, 0, 0, 0)); 5121be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5122be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5123be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_ENTER, motionArgs.action); 5124be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 512565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5126be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5127be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5128be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, motionArgs.action); 5129be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 513065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5131be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5132be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown // exit hover when pointer goes away 5133be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processId(mapper, -1); 5134be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown processSync(mapper); 5135be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&motionArgs)); 5136be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_EXIT, motionArgs.action); 5137be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown ASSERT_NO_FATAL_FAILURE(assertPointerCoords(motionArgs.pointerCoords[0], 513865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown toDisplayX(150), toDisplayY(250), 0, 0, 0, 0, 0, 0, 0, 0)); 5139be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown} 5140be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5141be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown 5142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} // namespace android 5143