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