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: 5239efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual void notifyConfigurationChanged(nsecs_t) { 53d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 54d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 5539efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual nsecs_t notifyANR(const sp<InputApplicationHandle>&, 5639efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath const sp<InputWindowHandle>&, 5739efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath const String8&) { 58d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return 0; 59d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 60d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 6139efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual void notifyInputChannelBroken(const sp<InputWindowHandle>&) { 62d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 63d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 64d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) { 65d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *outConfig = mConfig; 66d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 67d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 6839efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual bool filterInputEvent(const InputEvent*, uint32_t) { 69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return true; 70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 71d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 7239efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual void interceptKeyBeforeQueueing(const KeyEvent*, uint32_t&) { 73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 7539efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual void interceptMotionBeforeQueueing(nsecs_t, uint32_t&) { 76d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 77d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 7839efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual nsecs_t interceptKeyBeforeDispatching(const sp<InputWindowHandle>&, 7939efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath const KeyEvent*, uint32_t) { 80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return 0; 81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 8339efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>&, 8439efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath const KeyEvent*, uint32_t, KeyEvent*) { 85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return false; 86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 8839efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual void notifySwitch(nsecs_t, uint32_t, uint32_t, uint32_t) { 89d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 9139efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual void pokeUserActivity(nsecs_t, int32_t) { 92d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 9439efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath virtual bool checkInjectEventsPermissionNonReentrant(int32_t, int32_t) { 95d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright return false; 96d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 97d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 98d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 99d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- InputDispatcherTest --- 101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherTest : public testing::Test { 103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected: 104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<FakeInputDispatcherPolicy> mFakePolicy; 105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright sp<InputDispatcher> mDispatcher; 106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void SetUp() { 108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mFakePolicy = new FakeInputDispatcherPolicy(); 109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mDispatcher = new InputDispatcher(mFakePolicy); 110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright virtual void TearDown() { 113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mFakePolicy.clear(); 114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright mDispatcher.clear(); 115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}; 117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) { 120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright KeyEvent event; 121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects undefined key actions. 123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*action*/ -1, 0, 125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 126f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 127f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 128d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 129d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject key events with undefined action."; 130d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 131d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API. 132d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 133d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEY_EVENT_ACTION_MULTIPLE, 0, 134d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 135f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 136f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 137d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 138d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject key events with ACTION_MULTIPLE."; 139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} 140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 141d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) { 142d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright MotionEvent event; 143d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerProperties pointerProperties[MAX_POINTERS + 1]; 144d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright PointerCoords pointerCoords[MAX_POINTERS + 1]; 145d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright for (int i = 0; i <= MAX_POINTERS; i++) { 146d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[i].clear(); 147d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[i].id = i; 148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerCoords[i].clear(); 149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright } 150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects undefined motion actions. 152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 1537b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright /*action*/ -1, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 156f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 157f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 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), 1647b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 165d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 166d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 167f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 168f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 169d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 170d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer down index too large."; 171d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 172d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 1738b10c65312c0cd9a76fe9bdae2917e13d1e120ebDan Albert AMOTION_EVENT_ACTION_POINTER_DOWN | (~0U << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 1747b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 175d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 176d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 177f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 178f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 179d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 180d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer down index too small."; 181d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 182d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects pointer up with invalid index. 183d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 184d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 1857b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 186d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 187d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 188f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 189f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 190d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 191d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer up index too large."; 192d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 193d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 1948b10c65312c0cd9a76fe9bdae2917e13d1e120ebDan Albert AMOTION_EVENT_ACTION_POINTER_UP | (~0U << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 1957b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 196d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 197d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 198f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 199f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 200d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 201d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer up index too small."; 202d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 203d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with invalid number of pointers. 204d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 2057b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 206d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 207d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 0, pointerProperties, pointerCoords); 208f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 209f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 210d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 211d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with 0 pointers."; 212d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 213d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 2147b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 215d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 216d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords); 217f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 218f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 219d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 220d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with more than MAX_POINTERS pointers."; 221d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 222d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with invalid pointer ids. 223d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = -1; 224d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 2257b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 226d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 227d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 228f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 229f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 230d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 231d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer ids less than 0."; 232d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 233d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = MAX_POINTER_ID + 1; 234d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 2357b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 236d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 237d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 1, pointerProperties, pointerCoords); 238f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 239f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 240d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 241d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with pointer ids greater than MAX_POINTER_ID."; 242d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 243d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright // Rejects motion events with duplicate pointer ids. 244d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[0].id = 1; 245d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright pointerProperties[1].id = 1; 246d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, 2477b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 248d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright ARBITRARY_TIME, ARBITRARY_TIME, 249d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright /*pointerCount*/ 2, pointerProperties, pointerCoords); 250f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 251f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown &event, DISPLAY_ID, 252d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 253d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright << "Should reject motion events with duplicate pointer ids."; 254d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} 255d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright 256d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android 257