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