InputDispatcher_test.cpp revision f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8
1d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/* 2d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Copyright (C) 2010 The Android Open Source Project 3d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 4d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Licensed under the Apache License, Version 2.0 (the "License"); 5d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * you may not use this file except in compliance with the License. 6d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * You may obtain a copy of the License at 7d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 8d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * http://www.apache.org/licenses/LICENSE-2.0 9d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * 10d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Unless required by applicable law or agreed to in writing, software 11d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * distributed under the License is distributed on an "AS IS" BASIS, 12d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * See the License for the specific language governing permissions and 14d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * limitations under the License. 15d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */ 16d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 17d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include "../InputDispatcher.h" 18d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 19d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <gtest/gtest.h> 20d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <linux/input.h> 21d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 22d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightnamespace android { 23d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 24d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// An arbitrary time value. 25d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const nsecs_t ARBITRARY_TIME = 1234; 26d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 27d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// An arbitrary device id. 28d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t DEVICE_ID = 1; 29d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 30f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown// An arbitrary display id. 31f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brownstatic const int32_t DISPLAY_ID = 0; 32f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown 33d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// An arbitrary injector pid / uid pair that has permission to inject events. 34d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t INJECTOR_PID = 999; 35d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t INJECTOR_UID = 1001; 36d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 37d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 38d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- FakeInputDispatcherPolicy --- 39d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 40d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass FakeInputDispatcherPolicy : public InputDispatcherPolicyInterface { 41d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputDispatcherConfiguration mConfig; 42d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 43d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 44d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~FakeInputDispatcherPolicy() { 45d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 46d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 47d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightpublic: 48d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FakeInputDispatcherPolicy() { 49d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 50d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 51d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprivate: 52d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyConfigurationChanged(nsecs_t when) { 53d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 54d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 55d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 56d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& inputWindowHandle, 57d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const String8& reason) { 58d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return 0; 59d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 60d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 61d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) { 62d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 63d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 64d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) { 65d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *outConfig = mConfig; 66d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 67d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 68d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool isKeyRepeatEnabled() { 69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return true; 70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 71d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 72d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) { 73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return true; 74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 75d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 76d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) { 77d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 78d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 79d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) { 80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual nsecs_t interceptKeyBeforeDispatching(const sp<InputWindowHandle>& inputWindowHandle, 83d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const KeyEvent* keyEvent, uint32_t policyFlags) { 84d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return 0; 85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 88d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { 89d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return false; 90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 91d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 92d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifySwitch(nsecs_t when, 93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t switchValues, uint32_t switchMask, uint32_t policyFlags) { 94d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 95d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 96d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) { 97d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 98d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 99d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool checkInjectEventsPermissionNonReentrant( 100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectorPid, int32_t injectorUid) { 101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return false; 102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- InputDispatcherTest --- 107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherTest : public testing::Test { 109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<FakeInputDispatcherPolicy> mFakePolicy; 111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputDispatcher> mDispatcher; 112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void SetUp() { 114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mFakePolicy = new FakeInputDispatcherPolicy(); 115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mDispatcher = new InputDispatcher(mFakePolicy); 116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void TearDown() { 119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mFakePolicy.clear(); 120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mDispatcher.clear(); 121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) { 126d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyEvent event; 127d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 128d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects undefined key actions. 129d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 130d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*action*/ -1, 0, 131d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 132f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 133f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 134d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 135d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject key events with undefined action."; 136d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 137d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API. 138d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEY_EVENT_ACTION_MULTIPLE, 0, 140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 141f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 142f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 143d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 144d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject key events with ACTION_MULTIPLE."; 145d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} 146d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 147d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) { 148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright MotionEvent event; 149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerProperties pointerProperties[MAX_POINTERS + 1]; 150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerCoords pointerCoords[MAX_POINTERS + 1]; 151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright for (int i = 0; i <= MAX_POINTERS; i++) { 152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[i].clear(); 153d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[i].id = i; 154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerCoords[i].clear(); 155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 156d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 157d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects undefined motion actions. 158d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 159d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 160d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 161d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 162f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 163f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 164d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 165d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with undefined action."; 166d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 167d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects pointer down with invalid index. 168d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 169d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 170d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 171d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 172d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 173f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 174f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 175d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 176d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer down index too large."; 177d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 178d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 179d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 180d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 181d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 182d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 183f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 184f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 185d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 186d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer down index too small."; 187d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 188d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects pointer up with invalid index. 189d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 190d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 191d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 192d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 193d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 194f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 195f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 196d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 197d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer up index too large."; 198d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 199d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 200d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 201d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 202d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 203d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 204f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 205f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 206d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 207d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer up index too small."; 208d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 209d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with invalid number of pointers. 210d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 211d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 212d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 213d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 0, pointerProperties, pointerCoords); 214f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 215f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 216d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 217d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with 0 pointers."; 218d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 219d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 220d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 221d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 222d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords); 223f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 224f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 225d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 226d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with more than MAX_POINTERS pointers."; 227d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 228d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with invalid pointer ids. 229d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = -1; 230d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 231d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 232d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 233d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 234f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 235f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 236d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 237d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer ids less than 0."; 238d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 239d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = MAX_POINTER_ID + 1; 240d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 241d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 242d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 243d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 244f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 245f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 246d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 247d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer ids greater than MAX_POINTER_ID."; 248d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 249d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with duplicate pointer ids. 250d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = 1; 251d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[1].id = 1; 252d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 253d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 254d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 255d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 2, pointerProperties, pointerCoords); 256f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 257f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 258d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 259d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with duplicate pointer ids."; 260d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} 261d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 262d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android 263