InputDispatcher_test.cpp revision d02c5b6aace05d9fd938e2d03705ac4f60f8da19
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 30d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// An arbitrary injector pid / uid pair that has permission to inject events. 31d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t INJECTOR_PID = 999; 32d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t INJECTOR_UID = 1001; 33d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 34d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 35d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- FakeInputDispatcherPolicy --- 36d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 37d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass FakeInputDispatcherPolicy : public InputDispatcherPolicyInterface { 38d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright InputDispatcherConfiguration mConfig; 39d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 40d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 41d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual ~FakeInputDispatcherPolicy() { 42d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 43d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 44d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightpublic: 45d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright FakeInputDispatcherPolicy() { 46d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 47d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 48d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprivate: 49d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyConfigurationChanged(nsecs_t when) { 50d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 51d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 52d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, 53d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const sp<InputWindowHandle>& inputWindowHandle, 54d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const String8& reason) { 55d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return 0; 56d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 57d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 58d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) { 59d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 60d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 61d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) { 62d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *outConfig = mConfig; 63d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 64d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 65d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool isKeyRepeatEnabled() { 66d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return true; 67d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 68d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) { 70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return true; 71d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 72d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) { 74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 75d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 76d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) { 77d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 78d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 79d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual nsecs_t interceptKeyBeforeDispatching(const sp<InputWindowHandle>& inputWindowHandle, 80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const KeyEvent* keyEvent, uint32_t policyFlags) { 81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return 0; 82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 83d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 84d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { 86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return false; 87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 88d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 89d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifySwitch(nsecs_t when, 90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t switchValues, uint32_t switchMask, uint32_t policyFlags) { 91d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 92d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) { 94d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 95d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 96d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool checkInjectEventsPermissionNonReentrant( 97d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectorPid, int32_t injectorUid) { 98d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return false; 99d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- InputDispatcherTest --- 104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherTest : public testing::Test { 106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<FakeInputDispatcherPolicy> mFakePolicy; 108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputDispatcher> mDispatcher; 109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void SetUp() { 111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mFakePolicy = new FakeInputDispatcherPolicy(); 112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mDispatcher = new InputDispatcher(mFakePolicy); 113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void TearDown() { 116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mFakePolicy.clear(); 117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mDispatcher.clear(); 118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) { 123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyEvent event; 124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects undefined key actions. 126d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 127d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*action*/ -1, 0, 128d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 129d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 130d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 131d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject key events with undefined action."; 132d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 133d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API. 134d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 135d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEY_EVENT_ACTION_MULTIPLE, 0, 136d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 137d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 138d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject key events with ACTION_MULTIPLE."; 140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} 141d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 142d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) { 143d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright MotionEvent event; 144d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerProperties pointerProperties[MAX_POINTERS + 1]; 145d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerCoords pointerCoords[MAX_POINTERS + 1]; 146d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright for (int i = 0; i <= MAX_POINTERS; i++) { 147d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[i].clear(); 148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[i].id = i; 149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerCoords[i].clear(); 150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects undefined motion actions. 153d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 156d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 157d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 158d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 159d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with undefined action."; 160d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 161d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects pointer down with invalid index. 162d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 163d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 164d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 165d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 166d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 167d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 168d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 169d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer down index too large."; 170d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 171d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 172d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 173d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 174d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 175d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 176d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 177d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 178d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer down index too small."; 179d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 180d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects pointer up with invalid index. 181d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 182d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 183d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 184d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 185d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 186d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 187d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 188d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer up index too large."; 189d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 190d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 191d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 192d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 193d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 194d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 195d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 196d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 197d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer up index too small."; 198d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 199d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with invalid number of pointers. 200d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 201d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 202d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 203d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 0, pointerProperties, pointerCoords); 204d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 205d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 206d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with 0 pointers."; 207d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 208d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 209d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 210d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 211d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords); 212d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 213d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 214d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with more than MAX_POINTERS pointers."; 215d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 216d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with invalid pointer ids. 217d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = -1; 218d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 219d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 220d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 221d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 222d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 223d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 224d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer ids less than 0."; 225d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 226d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = MAX_POINTER_ID + 1; 227d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 228d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 229d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 230d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 231d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 232d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 233d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer ids greater than MAX_POINTER_ID."; 234d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 235d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with duplicate pointer ids. 236d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = 1; 237d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[1].id = 1; 238d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 239d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 240d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 241d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 2, pointerProperties, pointerCoords); 242d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event, 243d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 244d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with duplicate pointer ids."; 245d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} 246d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 247d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android 248