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 filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) { 69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return true; 70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 71d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 72d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) { 73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 75d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) { 76d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 77d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 78d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual nsecs_t interceptKeyBeforeDispatching(const sp<InputWindowHandle>& inputWindowHandle, 79d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const KeyEvent* keyEvent, uint32_t policyFlags) { 80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return 0; 81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 83d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle, 84d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { 85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return false; 86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 88d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void notifySwitch(nsecs_t when, 89d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright uint32_t switchValues, uint32_t switchMask, uint32_t policyFlags) { 90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 91d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 92d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) { 93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 94d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 95d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual bool checkInjectEventsPermissionNonReentrant( 96d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright int32_t injectorPid, int32_t injectorUid) { 97d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return false; 98d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 99d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- InputDispatcherTest --- 103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherTest : public testing::Test { 105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<FakeInputDispatcherPolicy> mFakePolicy; 107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputDispatcher> mDispatcher; 108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void SetUp() { 110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mFakePolicy = new FakeInputDispatcherPolicy(); 111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mDispatcher = new InputDispatcher(mFakePolicy); 112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void TearDown() { 115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mFakePolicy.clear(); 116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mDispatcher.clear(); 117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) { 122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyEvent event; 123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects undefined key actions. 125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 126d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*action*/ -1, 0, 127d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 128f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 129f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 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); 137f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 138f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject key events with ACTION_MULTIPLE."; 141d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} 142d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 143d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) { 144d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright MotionEvent event; 145d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerProperties pointerProperties[MAX_POINTERS + 1]; 146d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerCoords pointerCoords[MAX_POINTERS + 1]; 147d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright for (int i = 0; i <= MAX_POINTERS; i++) { 148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[i].clear(); 149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[i].id = i; 150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerCoords[i].clear(); 151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 153d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects undefined motion actions. 154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 156d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 157d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 158f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 159f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 160d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 161d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with undefined action."; 162d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 163d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects pointer down with invalid index. 164d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 165d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 166d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 167d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 168d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 169f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 170f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 171d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 172d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer down index too large."; 173d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 174d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 175d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 176d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 177d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 178d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 179f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 180f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 181d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 182d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer down index too small."; 183d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 184d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects pointer up with invalid index. 185d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 186d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 187d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 188d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 189d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 190f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 191f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 192d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 193d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer up index too large."; 194d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 195d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 196d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 197d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 198d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 199d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 200f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 201f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 202d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 203d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer up index too small."; 204d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 205d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with invalid number of pointers. 206d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 207d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 208d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 209d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 0, pointerProperties, pointerCoords); 210f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 211f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 212d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 213d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with 0 pointers."; 214d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 215d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 216d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 217d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 218d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords); 219f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 220f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 221d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 222d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with more than MAX_POINTERS pointers."; 223d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 224d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with invalid pointer ids. 225d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = -1; 226d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 227d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 228d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 229d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 230f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 231f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 232d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 233d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer ids less than 0."; 234d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 235d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = MAX_POINTER_ID + 1; 236d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 237d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 238d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 239d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 240f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 241f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 242d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 243d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer ids greater than MAX_POINTER_ID."; 244d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 245d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with duplicate pointer ids. 246d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = 1; 247d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[1].id = 1; 248d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 249d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 250d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 251d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 2, pointerProperties, pointerCoords); 252f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 253f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 254d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 255d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with duplicate pointer ids."; 256d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} 257d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 258d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android 259