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