1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "../InputDispatcher.h" 18 19 #include <binder/Binder.h> 20 21 #include <gtest/gtest.h> 22 #include <linux/input.h> 23 24 namespace android { 25 26 // An arbitrary time value. 27 static const nsecs_t ARBITRARY_TIME = 1234; 28 29 // An arbitrary device id. 30 static const int32_t DEVICE_ID = 1; 31 32 // An arbitrary display id. 33 static const int32_t DISPLAY_ID = ADISPLAY_ID_DEFAULT; 34 35 // An arbitrary injector pid / uid pair that has permission to inject events. 36 static const int32_t INJECTOR_PID = 999; 37 static const int32_t INJECTOR_UID = 1001; 38 39 40 // --- FakeInputDispatcherPolicy --- 41 42 class FakeInputDispatcherPolicy : public InputDispatcherPolicyInterface { 43 InputDispatcherConfiguration mConfig; 44 45 protected: 46 virtual ~FakeInputDispatcherPolicy() { 47 } 48 49 public: 50 FakeInputDispatcherPolicy() { 51 mInputEventFiltered = false; 52 mTime = -1; 53 mAction = -1; 54 mDisplayId = -1; 55 mOnPointerDownToken.clear(); 56 } 57 58 void assertFilterInputEventWasCalledWithExpectedArgs(const NotifyMotionArgs* args) { 59 ASSERT_TRUE(mInputEventFiltered) 60 << "Expected filterInputEvent() to have been called."; 61 62 ASSERT_EQ(mTime, args->eventTime) 63 << "Expected time of filtered event was not matched"; 64 ASSERT_EQ(mAction, args->action) 65 << "Expected action of filtered event was not matched"; 66 ASSERT_EQ(mDisplayId, args->displayId) 67 << "Expected displayId of filtered event was not matched"; 68 69 reset(); 70 } 71 72 void assertFilterInputEventWasCalledWithExpectedArgs(const NotifyKeyArgs* args) { 73 ASSERT_TRUE(mInputEventFiltered) 74 << "Expected filterInputEvent() to have been called."; 75 76 ASSERT_EQ(mTime, args->eventTime) 77 << "Expected time of filtered event was not matched"; 78 ASSERT_EQ(mAction, args->action) 79 << "Expected action of filtered event was not matched"; 80 ASSERT_EQ(mDisplayId, args->displayId) 81 << "Expected displayId of filtered event was not matched"; 82 83 reset(); 84 } 85 86 void assertFilterInputEventWasNotCalled() { 87 ASSERT_FALSE(mInputEventFiltered) 88 << "Expected filterInputEvent() to not have been called."; 89 } 90 91 void assertOnPointerDownEquals(const sp<IBinder>& touchedToken) { 92 ASSERT_EQ(mOnPointerDownToken, touchedToken) 93 << "Expected token from onPointerDownOutsideFocus was not matched"; 94 reset(); 95 } 96 97 private: 98 bool mInputEventFiltered; 99 nsecs_t mTime; 100 int32_t mAction; 101 int32_t mDisplayId; 102 sp<IBinder> mOnPointerDownToken; 103 104 virtual void notifyConfigurationChanged(nsecs_t) { 105 } 106 107 virtual nsecs_t notifyANR(const sp<InputApplicationHandle>&, 108 const sp<IBinder>&, 109 const std::string&) { 110 return 0; 111 } 112 113 virtual void notifyInputChannelBroken(const sp<IBinder>&) { 114 } 115 116 virtual void notifyFocusChanged(const sp<IBinder>&, const sp<IBinder>&) { 117 } 118 119 virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) { 120 *outConfig = mConfig; 121 } 122 123 virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) { 124 switch (inputEvent->getType()) { 125 case AINPUT_EVENT_TYPE_KEY: { 126 const KeyEvent* keyEvent = static_cast<const KeyEvent*>(inputEvent); 127 mTime = keyEvent->getEventTime(); 128 mAction = keyEvent->getAction(); 129 mDisplayId = keyEvent->getDisplayId(); 130 break; 131 } 132 133 case AINPUT_EVENT_TYPE_MOTION: { 134 const MotionEvent* motionEvent = static_cast<const MotionEvent*>(inputEvent); 135 mTime = motionEvent->getEventTime(); 136 mAction = motionEvent->getAction(); 137 mDisplayId = motionEvent->getDisplayId(); 138 break; 139 } 140 } 141 142 mInputEventFiltered = true; 143 return true; 144 } 145 146 virtual void interceptKeyBeforeQueueing(const KeyEvent*, uint32_t&) { 147 } 148 149 virtual void interceptMotionBeforeQueueing(int32_t, nsecs_t, uint32_t&) { 150 } 151 152 virtual nsecs_t interceptKeyBeforeDispatching(const sp<IBinder>&, 153 const KeyEvent*, uint32_t) { 154 return 0; 155 } 156 157 virtual bool dispatchUnhandledKey(const sp<IBinder>&, 158 const KeyEvent*, uint32_t, KeyEvent*) { 159 return false; 160 } 161 162 virtual void notifySwitch(nsecs_t, uint32_t, uint32_t, uint32_t) { 163 } 164 165 virtual void pokeUserActivity(nsecs_t, int32_t) { 166 } 167 168 virtual bool checkInjectEventsPermissionNonReentrant(int32_t, int32_t) { 169 return false; 170 } 171 172 virtual void onPointerDownOutsideFocus(const sp<IBinder>& newToken) { 173 mOnPointerDownToken = newToken; 174 } 175 176 void reset() { 177 mInputEventFiltered = false; 178 mTime = -1; 179 mAction = -1; 180 mDisplayId = -1; 181 mOnPointerDownToken.clear(); 182 } 183 }; 184 185 186 // --- InputDispatcherTest --- 187 188 class InputDispatcherTest : public testing::Test { 189 protected: 190 sp<FakeInputDispatcherPolicy> mFakePolicy; 191 sp<InputDispatcher> mDispatcher; 192 sp<InputDispatcherThread> mDispatcherThread; 193 194 virtual void SetUp() { 195 mFakePolicy = new FakeInputDispatcherPolicy(); 196 mDispatcher = new InputDispatcher(mFakePolicy); 197 mDispatcher->setInputDispatchMode(/*enabled*/ true, /*frozen*/ false); 198 //Start InputDispatcher thread 199 mDispatcherThread = new InputDispatcherThread(mDispatcher); 200 mDispatcherThread->run("InputDispatcherTest", PRIORITY_URGENT_DISPLAY); 201 } 202 203 virtual void TearDown() { 204 mDispatcherThread->requestExit(); 205 mDispatcherThread.clear(); 206 mFakePolicy.clear(); 207 mDispatcher.clear(); 208 } 209 }; 210 211 212 TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) { 213 KeyEvent event; 214 215 // Rejects undefined key actions. 216 event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, ADISPLAY_ID_NONE, 217 /*action*/ -1, 0, 218 AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 219 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 220 &event, 221 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 222 << "Should reject key events with undefined action."; 223 224 // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API. 225 event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, ADISPLAY_ID_NONE, 226 AKEY_EVENT_ACTION_MULTIPLE, 0, 227 AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME); 228 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 229 &event, 230 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 231 << "Should reject key events with ACTION_MULTIPLE."; 232 } 233 234 TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) { 235 MotionEvent event; 236 PointerProperties pointerProperties[MAX_POINTERS + 1]; 237 PointerCoords pointerCoords[MAX_POINTERS + 1]; 238 for (int i = 0; i <= MAX_POINTERS; i++) { 239 pointerProperties[i].clear(); 240 pointerProperties[i].id = i; 241 pointerCoords[i].clear(); 242 } 243 244 // Some constants commonly used below 245 constexpr int32_t source = AINPUT_SOURCE_TOUCHSCREEN; 246 constexpr int32_t edgeFlags = AMOTION_EVENT_EDGE_FLAG_NONE; 247 constexpr int32_t metaState = AMETA_NONE; 248 constexpr MotionClassification classification = MotionClassification::NONE; 249 250 // Rejects undefined motion actions. 251 event.initialize(DEVICE_ID, source, DISPLAY_ID, 252 /*action*/ -1, 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 253 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 1, pointerProperties, pointerCoords); 254 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 255 &event, 256 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 257 << "Should reject motion events with undefined action."; 258 259 // Rejects pointer down with invalid index. 260 event.initialize(DEVICE_ID, source, DISPLAY_ID, 261 AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 262 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 263 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 1, pointerProperties, pointerCoords); 264 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 265 &event, 266 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 267 << "Should reject motion events with pointer down index too large."; 268 269 event.initialize(DEVICE_ID, source, DISPLAY_ID, 270 AMOTION_EVENT_ACTION_POINTER_DOWN | (~0U << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 271 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 272 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 1, pointerProperties, pointerCoords); 273 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 274 &event, 275 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 276 << "Should reject motion events with pointer down index too small."; 277 278 // Rejects pointer up with invalid index. 279 event.initialize(DEVICE_ID, source, DISPLAY_ID, 280 AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 281 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 282 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 1, pointerProperties, pointerCoords); 283 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 284 &event, 285 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 286 << "Should reject motion events with pointer up index too large."; 287 288 event.initialize(DEVICE_ID, source, DISPLAY_ID, 289 AMOTION_EVENT_ACTION_POINTER_UP | (~0U << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), 290 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 291 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 1, pointerProperties, pointerCoords); 292 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 293 &event, 294 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 295 << "Should reject motion events with pointer up index too small."; 296 297 // Rejects motion events with invalid number of pointers. 298 event.initialize(DEVICE_ID, source, DISPLAY_ID, 299 AMOTION_EVENT_ACTION_DOWN, 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 300 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 0, pointerProperties, pointerCoords); 301 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 302 &event, 303 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 304 << "Should reject motion events with 0 pointers."; 305 306 event.initialize(DEVICE_ID, source, DISPLAY_ID, 307 AMOTION_EVENT_ACTION_DOWN, 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 308 ARBITRARY_TIME, ARBITRARY_TIME, 309 /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords); 310 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 311 &event, 312 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 313 << "Should reject motion events with more than MAX_POINTERS pointers."; 314 315 // Rejects motion events with invalid pointer ids. 316 pointerProperties[0].id = -1; 317 event.initialize(DEVICE_ID, source, DISPLAY_ID, 318 AMOTION_EVENT_ACTION_DOWN, 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 319 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 1, pointerProperties, pointerCoords); 320 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 321 &event, 322 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 323 << "Should reject motion events with pointer ids less than 0."; 324 325 pointerProperties[0].id = MAX_POINTER_ID + 1; 326 event.initialize(DEVICE_ID, source, DISPLAY_ID, 327 AMOTION_EVENT_ACTION_DOWN, 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 328 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 1, pointerProperties, pointerCoords); 329 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 330 &event, 331 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 332 << "Should reject motion events with pointer ids greater than MAX_POINTER_ID."; 333 334 // Rejects motion events with duplicate pointer ids. 335 pointerProperties[0].id = 1; 336 pointerProperties[1].id = 1; 337 event.initialize(DEVICE_ID, source, DISPLAY_ID, 338 AMOTION_EVENT_ACTION_DOWN, 0, 0, edgeFlags, metaState, 0, classification, 0, 0, 0, 0, 339 ARBITRARY_TIME, ARBITRARY_TIME, /*pointerCount*/ 2, pointerProperties, pointerCoords); 340 ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( 341 &event, 342 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0)) 343 << "Should reject motion events with duplicate pointer ids."; 344 } 345 346 // --- InputDispatcherTest SetInputWindowTest --- 347 static const int32_t INJECT_EVENT_TIMEOUT = 500; 348 static const int32_t DISPATCHING_TIMEOUT = 100; 349 350 class FakeApplicationHandle : public InputApplicationHandle { 351 public: 352 FakeApplicationHandle() {} 353 virtual ~FakeApplicationHandle() {} 354 355 virtual bool updateInfo() { 356 mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT; 357 return true; 358 } 359 }; 360 361 class FakeInputReceiver { 362 public: 363 void consumeEvent(int32_t expectedEventType, int32_t expectedDisplayId, 364 int32_t expectedFlags = 0) { 365 uint32_t consumeSeq; 366 InputEvent* event; 367 status_t status = mConsumer->consume(&mEventFactory, false /*consumeBatches*/, -1, 368 &consumeSeq, &event); 369 370 ASSERT_EQ(OK, status) 371 << mName.c_str() << ": consumer consume should return OK."; 372 ASSERT_TRUE(event != nullptr) 373 << mName.c_str() << ": consumer should have returned non-NULL event."; 374 ASSERT_EQ(expectedEventType, event->getType()) 375 << mName.c_str() << ": event type should match."; 376 377 ASSERT_EQ(expectedDisplayId, event->getDisplayId()) 378 << mName.c_str() << ": event displayId should be the same as expected."; 379 380 int32_t flags; 381 switch (expectedEventType) { 382 case AINPUT_EVENT_TYPE_KEY: { 383 KeyEvent* typedEvent = static_cast<KeyEvent*>(event); 384 flags = typedEvent->getFlags(); 385 break; 386 } 387 case AINPUT_EVENT_TYPE_MOTION: { 388 MotionEvent* typedEvent = static_cast<MotionEvent*>(event); 389 flags = typedEvent->getFlags(); 390 break; 391 } 392 default: { 393 FAIL() << mName.c_str() << ": invalid event type: " << expectedEventType; 394 } 395 } 396 ASSERT_EQ(expectedFlags, flags) 397 << mName.c_str() << ": event flags should be the same as expected."; 398 399 status = mConsumer->sendFinishedSignal(consumeSeq, handled()); 400 ASSERT_EQ(OK, status) 401 << mName.c_str() << ": consumer sendFinishedSignal should return OK."; 402 } 403 404 void assertNoEvents() { 405 uint32_t consumeSeq; 406 InputEvent* event; 407 status_t status = mConsumer->consume(&mEventFactory, false /*consumeBatches*/, -1, 408 &consumeSeq, &event); 409 ASSERT_NE(OK, status) 410 << mName.c_str() 411 << ": should not have received any events, so consume(..) should not return OK."; 412 } 413 414 protected: 415 explicit FakeInputReceiver(const sp<InputDispatcher>& dispatcher, 416 const std::string name, int32_t displayId) : 417 mDispatcher(dispatcher), mName(name), mDisplayId(displayId) { 418 InputChannel::openInputChannelPair(name, mServerChannel, mClientChannel); 419 mConsumer = new InputConsumer(mClientChannel); 420 } 421 422 virtual ~FakeInputReceiver() { 423 } 424 425 // return true if the event has been handled. 426 virtual bool handled() { 427 return false; 428 } 429 430 sp<InputDispatcher> mDispatcher; 431 sp<InputChannel> mServerChannel, mClientChannel; 432 InputConsumer *mConsumer; 433 PreallocatedInputEventFactory mEventFactory; 434 435 std::string mName; 436 int32_t mDisplayId; 437 }; 438 439 class FakeWindowHandle : public InputWindowHandle, public FakeInputReceiver { 440 public: 441 static const int32_t WIDTH = 600; 442 static const int32_t HEIGHT = 800; 443 444 FakeWindowHandle(const sp<InputApplicationHandle>& inputApplicationHandle, 445 const sp<InputDispatcher>& dispatcher, const std::string name, int32_t displayId) : 446 FakeInputReceiver(dispatcher, name, displayId), 447 mFocused(false), mFrame(Rect(0, 0, WIDTH, HEIGHT)), mLayoutParamFlags(0) { 448 mServerChannel->setToken(new BBinder()); 449 mDispatcher->registerInputChannel(mServerChannel, displayId); 450 451 inputApplicationHandle->updateInfo(); 452 mInfo.applicationInfo = *inputApplicationHandle->getInfo(); 453 } 454 455 virtual bool updateInfo() { 456 mInfo.token = mServerChannel ? mServerChannel->getToken() : nullptr; 457 mInfo.name = mName; 458 mInfo.layoutParamsFlags = mLayoutParamFlags; 459 mInfo.layoutParamsType = InputWindowInfo::TYPE_APPLICATION; 460 mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT; 461 mInfo.frameLeft = mFrame.left; 462 mInfo.frameTop = mFrame.top; 463 mInfo.frameRight = mFrame.right; 464 mInfo.frameBottom = mFrame.bottom; 465 mInfo.globalScaleFactor = 1.0; 466 mInfo.addTouchableRegion(mFrame); 467 mInfo.visible = true; 468 mInfo.canReceiveKeys = true; 469 mInfo.hasFocus = mFocused; 470 mInfo.hasWallpaper = false; 471 mInfo.paused = false; 472 mInfo.layer = 0; 473 mInfo.ownerPid = INJECTOR_PID; 474 mInfo.ownerUid = INJECTOR_UID; 475 mInfo.inputFeatures = 0; 476 mInfo.displayId = mDisplayId; 477 478 return true; 479 } 480 481 void setFocus() { 482 mFocused = true; 483 } 484 485 void setFrame(const Rect& frame) { 486 mFrame.set(frame); 487 } 488 489 void setLayoutParamFlags(int32_t flags) { 490 mLayoutParamFlags = flags; 491 } 492 493 void releaseChannel() { 494 mServerChannel.clear(); 495 InputWindowHandle::releaseChannel(); 496 } 497 protected: 498 virtual bool handled() { 499 return true; 500 } 501 502 bool mFocused; 503 Rect mFrame; 504 int32_t mLayoutParamFlags; 505 }; 506 507 static int32_t injectKeyDown(const sp<InputDispatcher>& dispatcher, 508 int32_t displayId = ADISPLAY_ID_NONE) { 509 KeyEvent event; 510 nsecs_t currentTime = systemTime(SYSTEM_TIME_MONOTONIC); 511 512 // Define a valid key down event. 513 event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD, displayId, 514 AKEY_EVENT_ACTION_DOWN, /* flags */ 0, 515 AKEYCODE_A, KEY_A, AMETA_NONE, /* repeatCount */ 0, currentTime, currentTime); 516 517 // Inject event until dispatch out. 518 return dispatcher->injectInputEvent( 519 &event, 520 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 521 INJECT_EVENT_TIMEOUT, POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER); 522 } 523 524 static int32_t injectMotionDown(const sp<InputDispatcher>& dispatcher, int32_t source, 525 int32_t displayId, int32_t x = 100, int32_t y = 200) { 526 MotionEvent event; 527 PointerProperties pointerProperties[1]; 528 PointerCoords pointerCoords[1]; 529 530 pointerProperties[0].clear(); 531 pointerProperties[0].id = 0; 532 pointerProperties[0].toolType = AMOTION_EVENT_TOOL_TYPE_FINGER; 533 534 pointerCoords[0].clear(); 535 pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, x); 536 pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, y); 537 538 nsecs_t currentTime = systemTime(SYSTEM_TIME_MONOTONIC); 539 // Define a valid motion down event. 540 event.initialize(DEVICE_ID, source, displayId, 541 AMOTION_EVENT_ACTION_DOWN, /* actionButton */ 0, /* flags */ 0, /* edgeFlags */ 0, 542 AMETA_NONE, /* buttonState */ 0, MotionClassification::NONE, 543 /* xOffset */ 0, /* yOffset */ 0, /* xPrecision */ 0, 544 /* yPrecision */ 0, currentTime, currentTime, /*pointerCount*/ 1, pointerProperties, 545 pointerCoords); 546 547 // Inject event until dispatch out. 548 return dispatcher->injectInputEvent( 549 &event, 550 INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 551 INJECT_EVENT_TIMEOUT, POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER); 552 } 553 554 static NotifyKeyArgs generateKeyArgs(int32_t action, int32_t displayId = ADISPLAY_ID_NONE) { 555 nsecs_t currentTime = systemTime(SYSTEM_TIME_MONOTONIC); 556 // Define a valid key event. 557 NotifyKeyArgs args(/* sequenceNum */ 0, currentTime, DEVICE_ID, AINPUT_SOURCE_KEYBOARD, 558 displayId, POLICY_FLAG_PASS_TO_USER, action, /* flags */ 0, 559 AKEYCODE_A, KEY_A, AMETA_NONE, currentTime); 560 561 return args; 562 } 563 564 static NotifyMotionArgs generateMotionArgs(int32_t action, int32_t source, int32_t displayId) { 565 PointerProperties pointerProperties[1]; 566 PointerCoords pointerCoords[1]; 567 568 pointerProperties[0].clear(); 569 pointerProperties[0].id = 0; 570 pointerProperties[0].toolType = AMOTION_EVENT_TOOL_TYPE_FINGER; 571 572 pointerCoords[0].clear(); 573 pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, 100); 574 pointerCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, 200); 575 576 nsecs_t currentTime = systemTime(SYSTEM_TIME_MONOTONIC); 577 // Define a valid motion event. 578 NotifyMotionArgs args(/* sequenceNum */ 0, currentTime, DEVICE_ID, source, displayId, 579 POLICY_FLAG_PASS_TO_USER, action, /* actionButton */ 0, /* flags */ 0, 580 AMETA_NONE, /* buttonState */ 0, MotionClassification::NONE, 581 AMOTION_EVENT_EDGE_FLAG_NONE, /* deviceTimestamp */ 0, 1, pointerProperties, 582 pointerCoords, /* xPrecision */ 0, /* yPrecision */ 0, currentTime, 583 /* videoFrames */ {}); 584 585 return args; 586 } 587 588 TEST_F(InputDispatcherTest, SetInputWindow_SingleWindowTouch) { 589 sp<FakeApplicationHandle> application = new FakeApplicationHandle(); 590 sp<FakeWindowHandle> window = new FakeWindowHandle(application, mDispatcher, "Fake Window", 591 ADISPLAY_ID_DEFAULT); 592 593 std::vector<sp<InputWindowHandle>> inputWindowHandles; 594 inputWindowHandles.push_back(window); 595 596 mDispatcher->setInputWindows(inputWindowHandles, ADISPLAY_ID_DEFAULT); 597 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 598 AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT)) 599 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 600 601 // Window should receive motion event. 602 window->consumeEvent(AINPUT_EVENT_TYPE_MOTION, ADISPLAY_ID_DEFAULT); 603 } 604 605 // The foreground window should receive the first touch down event. 606 TEST_F(InputDispatcherTest, SetInputWindow_MultiWindowsTouch) { 607 sp<FakeApplicationHandle> application = new FakeApplicationHandle(); 608 sp<FakeWindowHandle> windowTop = new FakeWindowHandle(application, mDispatcher, "Top", 609 ADISPLAY_ID_DEFAULT); 610 sp<FakeWindowHandle> windowSecond = new FakeWindowHandle(application, mDispatcher, "Second", 611 ADISPLAY_ID_DEFAULT); 612 613 std::vector<sp<InputWindowHandle>> inputWindowHandles; 614 inputWindowHandles.push_back(windowTop); 615 inputWindowHandles.push_back(windowSecond); 616 617 mDispatcher->setInputWindows(inputWindowHandles, ADISPLAY_ID_DEFAULT); 618 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 619 AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT)) 620 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 621 622 // Top window should receive the touch down event. Second window should not receive anything. 623 windowTop->consumeEvent(AINPUT_EVENT_TYPE_MOTION, ADISPLAY_ID_DEFAULT); 624 windowSecond->assertNoEvents(); 625 } 626 627 TEST_F(InputDispatcherTest, SetInputWindow_FocusedWindow) { 628 sp<FakeApplicationHandle> application = new FakeApplicationHandle(); 629 sp<FakeWindowHandle> windowTop = new FakeWindowHandle(application, mDispatcher, "Top", 630 ADISPLAY_ID_DEFAULT); 631 sp<FakeWindowHandle> windowSecond = new FakeWindowHandle(application, mDispatcher, "Second", 632 ADISPLAY_ID_DEFAULT); 633 634 // Set focused application. 635 mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application); 636 637 // Expect one focus window exist in display. 638 windowSecond->setFocus(); 639 std::vector<sp<InputWindowHandle>> inputWindowHandles; 640 inputWindowHandles.push_back(windowTop); 641 inputWindowHandles.push_back(windowSecond); 642 643 mDispatcher->setInputWindows(inputWindowHandles, ADISPLAY_ID_DEFAULT); 644 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher)) 645 << "Inject key event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 646 647 // Focused window should receive event. 648 windowTop->assertNoEvents(); 649 windowSecond->consumeEvent(AINPUT_EVENT_TYPE_KEY, ADISPLAY_ID_NONE); 650 } 651 652 TEST_F(InputDispatcherTest, SetInputWindow_FocusPriority) { 653 sp<FakeApplicationHandle> application = new FakeApplicationHandle(); 654 sp<FakeWindowHandle> windowTop = new FakeWindowHandle(application, mDispatcher, "Top", 655 ADISPLAY_ID_DEFAULT); 656 sp<FakeWindowHandle> windowSecond = new FakeWindowHandle(application, mDispatcher, "Second", 657 ADISPLAY_ID_DEFAULT); 658 659 // Set focused application. 660 mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application); 661 662 // Display has two focused windows. Add them to inputWindowsHandles in z-order (top most first) 663 windowTop->setFocus(); 664 windowSecond->setFocus(); 665 std::vector<sp<InputWindowHandle>> inputWindowHandles; 666 inputWindowHandles.push_back(windowTop); 667 inputWindowHandles.push_back(windowSecond); 668 669 mDispatcher->setInputWindows(inputWindowHandles, ADISPLAY_ID_DEFAULT); 670 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher)) 671 << "Inject key event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 672 673 // Top focused window should receive event. 674 windowTop->consumeEvent(AINPUT_EVENT_TYPE_KEY, ADISPLAY_ID_NONE); 675 windowSecond->assertNoEvents(); 676 } 677 678 TEST_F(InputDispatcherTest, SetInputWindow_InputWindowInfo) { 679 sp<FakeApplicationHandle> application = new FakeApplicationHandle(); 680 681 sp<FakeWindowHandle> windowTop = new FakeWindowHandle(application, mDispatcher, "Top", 682 ADISPLAY_ID_DEFAULT); 683 sp<FakeWindowHandle> windowSecond = new FakeWindowHandle(application, mDispatcher, "Second", 684 ADISPLAY_ID_DEFAULT); 685 686 // Set focused application. 687 mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application); 688 689 windowTop->setFocus(); 690 windowSecond->setFocus(); 691 std::vector<sp<InputWindowHandle>> inputWindowHandles; 692 inputWindowHandles.push_back(windowTop); 693 inputWindowHandles.push_back(windowSecond); 694 // Release channel for window is no longer valid. 695 windowTop->releaseChannel(); 696 mDispatcher->setInputWindows(inputWindowHandles, ADISPLAY_ID_DEFAULT); 697 698 // Test inject a key down, should dispatch to a valid window. 699 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher)) 700 << "Inject key event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 701 702 // Top window is invalid, so it should not receive any input event. 703 windowTop->assertNoEvents(); 704 windowSecond->consumeEvent(AINPUT_EVENT_TYPE_KEY, ADISPLAY_ID_NONE); 705 } 706 707 /* Test InputDispatcher for MultiDisplay */ 708 class InputDispatcherFocusOnTwoDisplaysTest : public InputDispatcherTest { 709 public: 710 static constexpr int32_t SECOND_DISPLAY_ID = 1; 711 virtual void SetUp() { 712 InputDispatcherTest::SetUp(); 713 714 application1 = new FakeApplicationHandle(); 715 windowInPrimary = new FakeWindowHandle(application1, mDispatcher, "D_1", 716 ADISPLAY_ID_DEFAULT); 717 std::vector<sp<InputWindowHandle>> inputWindowHandles; 718 inputWindowHandles.push_back(windowInPrimary); 719 // Set focus window for primary display, but focused display would be second one. 720 mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application1); 721 windowInPrimary->setFocus(); 722 mDispatcher->setInputWindows(inputWindowHandles, ADISPLAY_ID_DEFAULT); 723 724 application2 = new FakeApplicationHandle(); 725 windowInSecondary = new FakeWindowHandle(application2, mDispatcher, "D_2", 726 SECOND_DISPLAY_ID); 727 // Set focus to second display window. 728 std::vector<sp<InputWindowHandle>> inputWindowHandles_Second; 729 inputWindowHandles_Second.push_back(windowInSecondary); 730 // Set focus display to second one. 731 mDispatcher->setFocusedDisplay(SECOND_DISPLAY_ID); 732 // Set focus window for second display. 733 mDispatcher->setFocusedApplication(SECOND_DISPLAY_ID, application2); 734 windowInSecondary->setFocus(); 735 mDispatcher->setInputWindows(inputWindowHandles_Second, SECOND_DISPLAY_ID); 736 } 737 738 virtual void TearDown() { 739 InputDispatcherTest::TearDown(); 740 741 application1.clear(); 742 windowInPrimary.clear(); 743 application2.clear(); 744 windowInSecondary.clear(); 745 } 746 747 protected: 748 sp<FakeApplicationHandle> application1; 749 sp<FakeWindowHandle> windowInPrimary; 750 sp<FakeApplicationHandle> application2; 751 sp<FakeWindowHandle> windowInSecondary; 752 }; 753 754 TEST_F(InputDispatcherFocusOnTwoDisplaysTest, SetInputWindow_MultiDisplayTouch) { 755 // Test touch down on primary display. 756 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 757 AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT)) 758 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 759 windowInPrimary->consumeEvent(AINPUT_EVENT_TYPE_MOTION, ADISPLAY_ID_DEFAULT); 760 windowInSecondary->assertNoEvents(); 761 762 // Test touch down on second display. 763 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 764 AINPUT_SOURCE_TOUCHSCREEN, SECOND_DISPLAY_ID)) 765 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 766 windowInPrimary->assertNoEvents(); 767 windowInSecondary->consumeEvent(AINPUT_EVENT_TYPE_MOTION, SECOND_DISPLAY_ID); 768 } 769 770 TEST_F(InputDispatcherFocusOnTwoDisplaysTest, SetInputWindow_MultiDisplayFocus) { 771 // Test inject a key down with display id specified. 772 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher, ADISPLAY_ID_DEFAULT)) 773 << "Inject key event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 774 windowInPrimary->consumeEvent(AINPUT_EVENT_TYPE_KEY, ADISPLAY_ID_DEFAULT); 775 windowInSecondary->assertNoEvents(); 776 777 // Test inject a key down without display id specified. 778 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher)) 779 << "Inject key event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 780 windowInPrimary->assertNoEvents(); 781 windowInSecondary->consumeEvent(AINPUT_EVENT_TYPE_KEY, ADISPLAY_ID_NONE); 782 783 // Remove secondary display. 784 std::vector<sp<InputWindowHandle>> noWindows; 785 mDispatcher->setInputWindows(noWindows, SECOND_DISPLAY_ID); 786 787 // Expect old focus should receive a cancel event. 788 windowInSecondary->consumeEvent(AINPUT_EVENT_TYPE_KEY, ADISPLAY_ID_NONE, 789 AKEY_EVENT_FLAG_CANCELED); 790 791 // Test inject a key down, should timeout because of no target window. 792 ASSERT_EQ(INPUT_EVENT_INJECTION_TIMED_OUT, injectKeyDown(mDispatcher)) 793 << "Inject key event should return INPUT_EVENT_INJECTION_TIMED_OUT"; 794 windowInPrimary->assertNoEvents(); 795 windowInSecondary->assertNoEvents(); 796 } 797 798 class FakeMonitorReceiver : public FakeInputReceiver, public RefBase { 799 public: 800 FakeMonitorReceiver(const sp<InputDispatcher>& dispatcher, const std::string name, 801 int32_t displayId, bool isGestureMonitor = false) 802 : FakeInputReceiver(dispatcher, name, displayId) { 803 mServerChannel->setToken(new BBinder()); 804 mDispatcher->registerInputMonitor(mServerChannel, displayId, isGestureMonitor); 805 } 806 }; 807 808 // Test per-display input monitors for motion event. 809 TEST_F(InputDispatcherFocusOnTwoDisplaysTest, MonitorMotionEvent_MultiDisplay) { 810 sp<FakeMonitorReceiver> monitorInPrimary = 811 new FakeMonitorReceiver(mDispatcher, "M_1", ADISPLAY_ID_DEFAULT); 812 sp<FakeMonitorReceiver> monitorInSecondary = 813 new FakeMonitorReceiver(mDispatcher, "M_2", SECOND_DISPLAY_ID); 814 815 // Test touch down on primary display. 816 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 817 AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT)) 818 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 819 windowInPrimary->consumeEvent(AINPUT_EVENT_TYPE_MOTION, ADISPLAY_ID_DEFAULT); 820 monitorInPrimary->consumeEvent(AINPUT_EVENT_TYPE_MOTION, ADISPLAY_ID_DEFAULT); 821 windowInSecondary->assertNoEvents(); 822 monitorInSecondary->assertNoEvents(); 823 824 // Test touch down on second display. 825 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 826 AINPUT_SOURCE_TOUCHSCREEN, SECOND_DISPLAY_ID)) 827 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 828 windowInPrimary->assertNoEvents(); 829 monitorInPrimary->assertNoEvents(); 830 windowInSecondary->consumeEvent(AINPUT_EVENT_TYPE_MOTION, SECOND_DISPLAY_ID); 831 monitorInSecondary->consumeEvent(AINPUT_EVENT_TYPE_MOTION, SECOND_DISPLAY_ID); 832 833 // Test inject a non-pointer motion event. 834 // If specific a display, it will dispatch to the focused window of particular display, 835 // or it will dispatch to the focused window of focused display. 836 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 837 AINPUT_SOURCE_TRACKBALL, ADISPLAY_ID_NONE)) 838 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 839 windowInPrimary->assertNoEvents(); 840 monitorInPrimary->assertNoEvents(); 841 windowInSecondary->consumeEvent(AINPUT_EVENT_TYPE_MOTION, ADISPLAY_ID_NONE); 842 monitorInSecondary->consumeEvent(AINPUT_EVENT_TYPE_MOTION, ADISPLAY_ID_NONE); 843 } 844 845 // Test per-display input monitors for key event. 846 TEST_F(InputDispatcherFocusOnTwoDisplaysTest, MonitorKeyEvent_MultiDisplay) { 847 //Input monitor per display. 848 sp<FakeMonitorReceiver> monitorInPrimary = 849 new FakeMonitorReceiver(mDispatcher, "M_1", ADISPLAY_ID_DEFAULT); 850 sp<FakeMonitorReceiver> monitorInSecondary = 851 new FakeMonitorReceiver(mDispatcher, "M_2", SECOND_DISPLAY_ID); 852 853 // Test inject a key down. 854 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher)) 855 << "Inject key event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 856 windowInPrimary->assertNoEvents(); 857 monitorInPrimary->assertNoEvents(); 858 windowInSecondary->consumeEvent(AINPUT_EVENT_TYPE_KEY, ADISPLAY_ID_NONE); 859 monitorInSecondary->consumeEvent(AINPUT_EVENT_TYPE_KEY, ADISPLAY_ID_NONE); 860 } 861 862 class InputFilterTest : public InputDispatcherTest { 863 protected: 864 static constexpr int32_t SECOND_DISPLAY_ID = 1; 865 866 void testNotifyMotion(int32_t displayId, bool expectToBeFiltered) { 867 NotifyMotionArgs motionArgs; 868 869 motionArgs = generateMotionArgs( 870 AMOTION_EVENT_ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN, displayId); 871 mDispatcher->notifyMotion(&motionArgs); 872 motionArgs = generateMotionArgs( 873 AMOTION_EVENT_ACTION_UP, AINPUT_SOURCE_TOUCHSCREEN, displayId); 874 mDispatcher->notifyMotion(&motionArgs); 875 876 if (expectToBeFiltered) { 877 mFakePolicy->assertFilterInputEventWasCalledWithExpectedArgs(&motionArgs); 878 } else { 879 mFakePolicy->assertFilterInputEventWasNotCalled(); 880 } 881 } 882 883 void testNotifyKey(bool expectToBeFiltered) { 884 NotifyKeyArgs keyArgs; 885 886 keyArgs = generateKeyArgs(AKEY_EVENT_ACTION_DOWN); 887 mDispatcher->notifyKey(&keyArgs); 888 keyArgs = generateKeyArgs(AKEY_EVENT_ACTION_UP); 889 mDispatcher->notifyKey(&keyArgs); 890 891 if (expectToBeFiltered) { 892 mFakePolicy->assertFilterInputEventWasCalledWithExpectedArgs(&keyArgs); 893 } else { 894 mFakePolicy->assertFilterInputEventWasNotCalled(); 895 } 896 } 897 }; 898 899 // Test InputFilter for MotionEvent 900 TEST_F(InputFilterTest, MotionEvent_InputFilter) { 901 // Since the InputFilter is disabled by default, check if touch events aren't filtered. 902 testNotifyMotion(ADISPLAY_ID_DEFAULT, /*expectToBeFiltered*/ false); 903 testNotifyMotion(SECOND_DISPLAY_ID, /*expectToBeFiltered*/ false); 904 905 // Enable InputFilter 906 mDispatcher->setInputFilterEnabled(true); 907 // Test touch on both primary and second display, and check if both events are filtered. 908 testNotifyMotion(ADISPLAY_ID_DEFAULT, /*expectToBeFiltered*/ true); 909 testNotifyMotion(SECOND_DISPLAY_ID, /*expectToBeFiltered*/ true); 910 911 // Disable InputFilter 912 mDispatcher->setInputFilterEnabled(false); 913 // Test touch on both primary and second display, and check if both events aren't filtered. 914 testNotifyMotion(ADISPLAY_ID_DEFAULT, /*expectToBeFiltered*/ false); 915 testNotifyMotion(SECOND_DISPLAY_ID, /*expectToBeFiltered*/ false); 916 } 917 918 // Test InputFilter for KeyEvent 919 TEST_F(InputFilterTest, KeyEvent_InputFilter) { 920 // Since the InputFilter is disabled by default, check if key event aren't filtered. 921 testNotifyKey(/*expectToBeFiltered*/ false); 922 923 // Enable InputFilter 924 mDispatcher->setInputFilterEnabled(true); 925 // Send a key event, and check if it is filtered. 926 testNotifyKey(/*expectToBeFiltered*/ true); 927 928 // Disable InputFilter 929 mDispatcher->setInputFilterEnabled(false); 930 // Send a key event, and check if it isn't filtered. 931 testNotifyKey(/*expectToBeFiltered*/ false); 932 } 933 934 class InputDispatcherOnPointerDownOutsideFocus : public InputDispatcherTest { 935 virtual void SetUp() { 936 InputDispatcherTest::SetUp(); 937 938 sp<FakeApplicationHandle> application = new FakeApplicationHandle(); 939 mUnfocusedWindow = new FakeWindowHandle(application, mDispatcher, "Top", 940 ADISPLAY_ID_DEFAULT); 941 mUnfocusedWindow->setFrame(Rect(0, 0, 30, 30)); 942 // Adding FLAG_NOT_TOUCH_MODAL to ensure taps outside this window are not sent to this 943 // window. 944 mUnfocusedWindow->setLayoutParamFlags(InputWindowInfo::FLAG_NOT_TOUCH_MODAL); 945 946 mWindowFocused = new FakeWindowHandle(application, mDispatcher, "Second", 947 ADISPLAY_ID_DEFAULT); 948 mWindowFocused->setFrame(Rect(50, 50, 100, 100)); 949 mWindowFocused->setLayoutParamFlags(InputWindowInfo::FLAG_NOT_TOUCH_MODAL); 950 mWindowFocusedTouchPoint = 60; 951 952 // Set focused application. 953 mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application); 954 mWindowFocused->setFocus(); 955 956 // Expect one focus window exist in display. 957 std::vector<sp<InputWindowHandle>> inputWindowHandles; 958 inputWindowHandles.push_back(mUnfocusedWindow); 959 inputWindowHandles.push_back(mWindowFocused); 960 mDispatcher->setInputWindows(inputWindowHandles, ADISPLAY_ID_DEFAULT); 961 } 962 963 virtual void TearDown() { 964 InputDispatcherTest::TearDown(); 965 966 mUnfocusedWindow.clear(); 967 mWindowFocused.clear(); 968 } 969 970 protected: 971 sp<FakeWindowHandle> mUnfocusedWindow; 972 sp<FakeWindowHandle> mWindowFocused; 973 int32_t mWindowFocusedTouchPoint; 974 }; 975 976 // Have two windows, one with focus. Inject MotionEvent with source TOUCHSCREEN and action 977 // DOWN on the window that doesn't have focus. Ensure the window that didn't have focus received 978 // the onPointerDownOutsideFocus callback. 979 TEST_F(InputDispatcherOnPointerDownOutsideFocus, OnPointerDownOutsideFocus_Success) { 980 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 981 AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT, 20, 20)) 982 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 983 // Call monitor to wait for the command queue to get flushed. 984 mDispatcher->monitor(); 985 986 mFakePolicy->assertOnPointerDownEquals(mUnfocusedWindow->getToken()); 987 } 988 989 // Have two windows, one with focus. Inject MotionEvent with source TRACKBALL and action 990 // DOWN on the window that doesn't have focus. Ensure no window received the 991 // onPointerDownOutsideFocus callback. 992 TEST_F(InputDispatcherOnPointerDownOutsideFocus, OnPointerDownOutsideFocus_NonPointerSource) { 993 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 994 AINPUT_SOURCE_TRACKBALL, ADISPLAY_ID_DEFAULT, 20, 20)) 995 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 996 // Call monitor to wait for the command queue to get flushed. 997 mDispatcher->monitor(); 998 999 mFakePolicy->assertOnPointerDownEquals(nullptr); 1000 } 1001 1002 // Have two windows, one with focus. Inject KeyEvent with action DOWN on the window that doesn't 1003 // have focus. Ensure no window received the onPointerDownOutsideFocus callback. 1004 TEST_F(InputDispatcherOnPointerDownOutsideFocus, OnPointerDownOutsideFocus_NonMotionFailure) { 1005 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher, ADISPLAY_ID_DEFAULT)) 1006 << "Inject key event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 1007 // Call monitor to wait for the command queue to get flushed. 1008 mDispatcher->monitor(); 1009 1010 mFakePolicy->assertOnPointerDownEquals(nullptr); 1011 } 1012 1013 // Have two windows, one with focus. Inject MotionEvent with source TOUCHSCREEN and action 1014 // DOWN on the window that already has focus. Ensure no window received the 1015 // onPointerDownOutsideFocus callback. 1016 TEST_F(InputDispatcherOnPointerDownOutsideFocus, 1017 OnPointerDownOutsideFocus_OnAlreadyFocusedWindow) { 1018 ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, 1019 AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT, mWindowFocusedTouchPoint, 1020 mWindowFocusedTouchPoint)) 1021 << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; 1022 // Call monitor to wait for the command queue to get flushed. 1023 mDispatcher->monitor(); 1024 1025 mFakePolicy->assertOnPointerDownEquals(nullptr); 1026 } 1027 1028 } // namespace android 1029