InputDispatcher_test.cpp revision 3915bb845b032dc184dba5e60970b803390ca3ed
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Copyright 2010 The Android Open Source Project 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/InputDispatcher.h> 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <gtest/gtest.h> 7c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown#include <linux/input.h> 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary time value. 12c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const nsecs_t ARBITRARY_TIME = 1234; 13c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 14c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary device id. 15c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t DEVICE_ID = 1; 16c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 17c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary injector pid / uid pair that has permission to inject events. 18c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t INJECTOR_PID = 999; 19c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t INJECTOR_UID = 1001; 20c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 21c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 22c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputDispatcherPolicy --- 23c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 24c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputDispatcherPolicy : public InputDispatcherPolicyInterface { 25c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 26c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual ~FakeInputDispatcherPolicy() { 27c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 28c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 30c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown FakeInputDispatcherPolicy() { 31c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 32c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 33c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate: 34c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void notifyConfigurationChanged(nsecs_t when) { 35c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 36c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 37c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 38c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const sp<InputChannel>& inputChannel) { 39c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return 0; 40c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 41c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 42c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void notifyInputChannelBroken(const sp<InputChannel>& inputChannel) { 43c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 44c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 45c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual nsecs_t getKeyRepeatTimeout() { 46c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return 500 * 1000000LL; 47c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 48c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 49c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual nsecs_t getKeyRepeatDelay() { 50c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return 50 * 1000000LL; 51c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 52c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 53c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual int32_t getMaxEventsPerSecond() { 54c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return 60; 55c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 56c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 57c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void interceptKeyBeforeQueueing(nsecs_t when, int32_t deviceId, 58c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t action, int32_t& flags, int32_t keyCode, int32_t scanCode, 59c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown uint32_t& policyFlags) { 60c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 61c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 62c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void interceptGenericBeforeQueueing(nsecs_t when, uint32_t& policyFlags) { 63c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 64c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 65c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual bool interceptKeyBeforeDispatching(const sp<InputChannel>& inputChannel, 66c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown const KeyEvent* keyEvent, uint32_t policyFlags) { 67c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return false; 68c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 69c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 703915bb845b032dc184dba5e60970b803390ca3edJeff Brown virtual bool dispatchUnhandledKey(const sp<InputChannel>& inputChannel, 713915bb845b032dc184dba5e60970b803390ca3edJeff Brown const KeyEvent* keyEvent, uint32_t policyFlags) { 723915bb845b032dc184dba5e60970b803390ca3edJeff Brown return false; 733915bb845b032dc184dba5e60970b803390ca3edJeff Brown } 743915bb845b032dc184dba5e60970b803390ca3edJeff Brown 75c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void notifySwitch(nsecs_t when, 76c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t switchCode, int32_t switchValue, uint32_t policyFlags) { 77c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 78c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 79c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) { 80c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 81c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 82c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual bool checkInjectEventsPermissionNonReentrant( 83c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t injectorPid, int32_t injectorUid) { 84c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown return false; 85c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 88c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 89c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputDispatcherTest --- 90c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 91c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputDispatcherTest : public testing::Test { 92c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected: 93c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<FakeInputDispatcherPolicy> mFakePolicy; 94c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown sp<InputDispatcher> mDispatcher; 95c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 96c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void SetUp() { 97c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy = new FakeInputDispatcherPolicy(); 98c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDispatcher = new InputDispatcher(mFakePolicy); 99c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown virtual void TearDown() { 102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mFakePolicy.clear(); 103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown mDispatcher.clear(); 104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}; 106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) { 109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown KeyEvent event; 110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rejects undefined key actions. 112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*action*/ -1, 0, 114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject key events with undefined action."; 118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API. 120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AKEY_EVENT_ACTION_MULTIPLE, 0, 122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject key events with ACTION_MULTIPLE."; 126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown} 127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) { 129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown MotionEvent event; 130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown int32_t pointerIds[MAX_POINTERS + 1]; 131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown PointerCoords pointerCoords[MAX_POINTERS + 1]; 132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown for (int i = 0; i <= MAX_POINTERS; i++) { 133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown pointerIds[i] = i; 134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown } 135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rejects undefined motion actions. 137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0, 139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 1, pointerIds, pointerCoords); 141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with undefined action."; 144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rejects pointer down with invalid index. 146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 0, 0, AMETA_NONE, 0, 0, 0, 0, 149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 1, pointerIds, pointerCoords); 151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with pointer down index too large."; 154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 0, 0, AMETA_NONE, 0, 0, 0, 0, 158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 1, pointerIds, pointerCoords); 160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with pointer down index too small."; 163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rejects pointer up with invalid index. 165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 0, 0, AMETA_NONE, 0, 0, 0, 0, 168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 1, pointerIds, pointerCoords); 170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with pointer up index too large."; 173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 0, 0, AMETA_NONE, 0, 0, 0, 0, 177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 1, pointerIds, pointerCoords); 179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with pointer up index too small."; 182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rejects motion events with invalid number of pointers. 184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 0, pointerIds, pointerCoords); 188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with 0 pointers."; 191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ MAX_POINTERS + 1, pointerIds, pointerCoords); 196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with more than MAX_POINTERS pointers."; 199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rejects motion events with invalid pointer ids. 201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown pointerIds[0] = -1; 202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 1, pointerIds, pointerCoords); 206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with pointer ids less than 0."; 209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown pointerIds[0] = MAX_POINTER_ID + 1; 211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 1, pointerIds, pointerCoords); 215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with pointer ids greater than MAX_POINTER_ID."; 218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown 219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown // Rejects motion events with duplicate pointer ids. 220c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown pointerIds[0] = 1; 221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown pointerIds[1] = 1; 222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ARBITRARY_TIME, ARBITRARY_TIME, 225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown /*pointerCount*/ 2, pointerIds, pointerCoords); 226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0)) 228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown << "Should reject motion events with duplicate pointer ids."; 22946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} 23046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 23146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android 232