diff options
6 files changed, 131 insertions, 127 deletions
diff --git a/services/inputflinger/InputManager.cpp b/services/inputflinger/InputManager.cpp index fc771a2c58..e68946d734 100644 --- a/services/inputflinger/InputManager.cpp +++ b/services/inputflinger/InputManager.cpp @@ -111,8 +111,10 @@ void InputManager::setInputWindows(const std::vector<InputWindowInfo>& infos, handlesPerDisplay.emplace(info.displayId, std::vector<sp<InputWindowHandle>>()); handlesPerDisplay[info.displayId].push_back(new BinderWindowHandle(info)); } - for (auto const& i : handlesPerDisplay) { - mDispatcher->setInputWindows(i.second, i.first, setInputWindowsListener); + mDispatcher->setInputWindows(handlesPerDisplay); + + if (setInputWindowsListener) { + setInputWindowsListener->onSetInputWindowsFinished(); } } diff --git a/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp b/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp index 3b18813cef..7c5c9c5f0c 100644 --- a/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp +++ b/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp @@ -252,7 +252,7 @@ static void benchmarkNotifyMotion(benchmark::State& state) { sp<FakeApplicationHandle> application = new FakeApplicationHandle(); sp<FakeWindowHandle> window = new FakeWindowHandle(application, dispatcher, "Fake Window"); - dispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + dispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); NotifyMotionArgs motionArgs = generateMotionArgs(); @@ -288,7 +288,7 @@ static void benchmarkInjectMotion(benchmark::State& state) { sp<FakeApplicationHandle> application = new FakeApplicationHandle(); sp<FakeWindowHandle> window = new FakeWindowHandle(application, dispatcher, "Fake Window"); - dispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + dispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); for (auto _ : state) { MotionEvent event = generateMotionEvent(); diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index 308d19b085..4ec61b0c63 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -3621,6 +3621,18 @@ void InputDispatcher::updateWindowHandlesForDisplayLocked( mWindowHandlesByDisplay[displayId] = newHandles; } +void InputDispatcher::setInputWindows( + const std::unordered_map<int32_t, std::vector<sp<InputWindowHandle>>>& handlesPerDisplay) { + { // acquire lock + std::scoped_lock _l(mLock); + for (auto const& i : handlesPerDisplay) { + setInputWindowsLocked(i.second, i.first); + } + } + // Wake up poll loop since it may need to make new input dispatching choices. + mLooper->wake(); +} + /** * Called from InputManagerService, update window handle list by displayId that can receive input. * A window handle contains information about InputChannel, Touch Region, Types, Focused,... @@ -3628,9 +3640,8 @@ void InputDispatcher::updateWindowHandlesForDisplayLocked( * For focused handle, check if need to change and send a cancel event to previous one. * For removed handle, check if need to send a cancel event if already in touch. */ -void InputDispatcher::setInputWindows(const std::vector<sp<InputWindowHandle>>& inputWindowHandles, - int32_t displayId, - const sp<ISetInputWindowsListener>& setInputWindowsListener) { +void InputDispatcher::setInputWindowsLocked( + const std::vector<sp<InputWindowHandle>>& inputWindowHandles, int32_t displayId) { if (DEBUG_FOCUS) { std::string windowList; for (const sp<InputWindowHandle>& iwh : inputWindowHandles) { @@ -3638,109 +3649,97 @@ void InputDispatcher::setInputWindows(const std::vector<sp<InputWindowHandle>>& } ALOGD("setInputWindows displayId=%" PRId32 " %s", displayId, windowList.c_str()); } - { // acquire lock - std::scoped_lock _l(mLock); - // Copy old handles for release if they are no longer present. - const std::vector<sp<InputWindowHandle>> oldWindowHandles = - getWindowHandlesLocked(displayId); + // Copy old handles for release if they are no longer present. + const std::vector<sp<InputWindowHandle>> oldWindowHandles = getWindowHandlesLocked(displayId); - updateWindowHandlesForDisplayLocked(inputWindowHandles, displayId); + updateWindowHandlesForDisplayLocked(inputWindowHandles, displayId); - sp<InputWindowHandle> newFocusedWindowHandle = nullptr; - bool foundHoveredWindow = false; - for (const sp<InputWindowHandle>& windowHandle : getWindowHandlesLocked(displayId)) { - // Set newFocusedWindowHandle to the top most focused window instead of the last one - if (!newFocusedWindowHandle && windowHandle->getInfo()->hasFocus && - windowHandle->getInfo()->visible) { - newFocusedWindowHandle = windowHandle; - } - if (windowHandle == mLastHoverWindowHandle) { - foundHoveredWindow = true; - } + sp<InputWindowHandle> newFocusedWindowHandle = nullptr; + bool foundHoveredWindow = false; + for (const sp<InputWindowHandle>& windowHandle : getWindowHandlesLocked(displayId)) { + // Set newFocusedWindowHandle to the top most focused window instead of the last one + if (!newFocusedWindowHandle && windowHandle->getInfo()->hasFocus && + windowHandle->getInfo()->visible) { + newFocusedWindowHandle = windowHandle; } - - if (!foundHoveredWindow) { - mLastHoverWindowHandle = nullptr; + if (windowHandle == mLastHoverWindowHandle) { + foundHoveredWindow = true; } + } - sp<InputWindowHandle> oldFocusedWindowHandle = - getValueByKey(mFocusedWindowHandlesByDisplay, displayId); + if (!foundHoveredWindow) { + mLastHoverWindowHandle = nullptr; + } - if (!haveSameToken(oldFocusedWindowHandle, newFocusedWindowHandle)) { - if (oldFocusedWindowHandle != nullptr) { - if (DEBUG_FOCUS) { - ALOGD("Focus left window: %s in display %" PRId32, - oldFocusedWindowHandle->getName().c_str(), displayId); - } - sp<InputChannel> focusedInputChannel = - getInputChannelLocked(oldFocusedWindowHandle->getToken()); - if (focusedInputChannel != nullptr) { - CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, - "focus left window"); - synthesizeCancelationEventsForInputChannelLocked(focusedInputChannel, options); - enqueueFocusEventLocked(*oldFocusedWindowHandle, false /*hasFocus*/); - } - mFocusedWindowHandlesByDisplay.erase(displayId); + sp<InputWindowHandle> oldFocusedWindowHandle = + getValueByKey(mFocusedWindowHandlesByDisplay, displayId); + + if (!haveSameToken(oldFocusedWindowHandle, newFocusedWindowHandle)) { + if (oldFocusedWindowHandle != nullptr) { + if (DEBUG_FOCUS) { + ALOGD("Focus left window: %s in display %" PRId32, + oldFocusedWindowHandle->getName().c_str(), displayId); } - if (newFocusedWindowHandle != nullptr) { - if (DEBUG_FOCUS) { - ALOGD("Focus entered window: %s in display %" PRId32, - newFocusedWindowHandle->getName().c_str(), displayId); - } - mFocusedWindowHandlesByDisplay[displayId] = newFocusedWindowHandle; - enqueueFocusEventLocked(*newFocusedWindowHandle, true /*hasFocus*/); + sp<InputChannel> focusedInputChannel = + getInputChannelLocked(oldFocusedWindowHandle->getToken()); + if (focusedInputChannel != nullptr) { + CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, + "focus left window"); + synthesizeCancelationEventsForInputChannelLocked(focusedInputChannel, options); + enqueueFocusEventLocked(*oldFocusedWindowHandle, false /*hasFocus*/); } - - if (mFocusedDisplayId == displayId) { - onFocusChangedLocked(oldFocusedWindowHandle, newFocusedWindowHandle); + mFocusedWindowHandlesByDisplay.erase(displayId); + } + if (newFocusedWindowHandle != nullptr) { + if (DEBUG_FOCUS) { + ALOGD("Focus entered window: %s in display %" PRId32, + newFocusedWindowHandle->getName().c_str(), displayId); } + mFocusedWindowHandlesByDisplay[displayId] = newFocusedWindowHandle; + enqueueFocusEventLocked(*newFocusedWindowHandle, true /*hasFocus*/); } - ssize_t stateIndex = mTouchStatesByDisplay.indexOfKey(displayId); - if (stateIndex >= 0) { - TouchState& state = mTouchStatesByDisplay.editValueAt(stateIndex); - for (size_t i = 0; i < state.windows.size();) { - TouchedWindow& touchedWindow = state.windows[i]; - if (!hasWindowHandleLocked(touchedWindow.windowHandle)) { - if (DEBUG_FOCUS) { - ALOGD("Touched window was removed: %s in display %" PRId32, - touchedWindow.windowHandle->getName().c_str(), displayId); - } - sp<InputChannel> touchedInputChannel = - getInputChannelLocked(touchedWindow.windowHandle->getToken()); - if (touchedInputChannel != nullptr) { - CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS, - "touched window was removed"); - synthesizeCancelationEventsForInputChannelLocked(touchedInputChannel, - options); - } - state.windows.erase(state.windows.begin() + i); - } else { - ++i; - } - } + if (mFocusedDisplayId == displayId) { + onFocusChangedLocked(oldFocusedWindowHandle, newFocusedWindowHandle); } + } - // Release information for windows that are no longer present. - // This ensures that unused input channels are released promptly. - // Otherwise, they might stick around until the window handle is destroyed - // which might not happen until the next GC. - for (const sp<InputWindowHandle>& oldWindowHandle : oldWindowHandles) { - if (!hasWindowHandleLocked(oldWindowHandle)) { + ssize_t stateIndex = mTouchStatesByDisplay.indexOfKey(displayId); + if (stateIndex >= 0) { + TouchState& state = mTouchStatesByDisplay.editValueAt(stateIndex); + for (size_t i = 0; i < state.windows.size();) { + TouchedWindow& touchedWindow = state.windows[i]; + if (!hasWindowHandleLocked(touchedWindow.windowHandle)) { if (DEBUG_FOCUS) { - ALOGD("Window went away: %s", oldWindowHandle->getName().c_str()); + ALOGD("Touched window was removed: %s in display %" PRId32, + touchedWindow.windowHandle->getName().c_str(), displayId); + } + sp<InputChannel> touchedInputChannel = + getInputChannelLocked(touchedWindow.windowHandle->getToken()); + if (touchedInputChannel != nullptr) { + CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS, + "touched window was removed"); + synthesizeCancelationEventsForInputChannelLocked(touchedInputChannel, options); } - oldWindowHandle->releaseChannel(); + state.windows.erase(state.windows.begin() + i); + } else { + ++i; } } - } // release lock - - // Wake up poll loop since it may need to make new input dispatching choices. - mLooper->wake(); + } - if (setInputWindowsListener) { - setInputWindowsListener->onSetInputWindowsFinished(); + // Release information for windows that are no longer present. + // This ensures that unused input channels are released promptly. + // Otherwise, they might stick around until the window handle is destroyed + // which might not happen until the next GC. + for (const sp<InputWindowHandle>& oldWindowHandle : oldWindowHandles) { + if (!hasWindowHandleLocked(oldWindowHandle)) { + if (DEBUG_FOCUS) { + ALOGD("Window went away: %s", oldWindowHandle->getName().c_str()); + } + oldWindowHandle->releaseChannel(); + } } } diff --git a/services/inputflinger/dispatcher/InputDispatcher.h b/services/inputflinger/dispatcher/InputDispatcher.h index 4aa47f89f0..cbba7e1318 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.h +++ b/services/inputflinger/dispatcher/InputDispatcher.h @@ -109,8 +109,8 @@ public: virtual std::unique_ptr<VerifiedInputEvent> verifyInputEvent(const InputEvent& event) override; virtual void setInputWindows( - const std::vector<sp<InputWindowHandle>>& inputWindowHandles, int32_t displayId, - const sp<ISetInputWindowsListener>& setInputWindowsListener = nullptr) override; + const std::unordered_map<int32_t, std::vector<sp<InputWindowHandle>>>& + handlesPerDisplay) override; virtual void setFocusedApplication( int32_t displayId, const sp<InputApplicationHandle>& inputApplicationHandle) override; virtual void setFocusedDisplay(int32_t displayId) override; @@ -278,6 +278,8 @@ private: std::unordered_map<int32_t, std::vector<sp<InputWindowHandle>>> mWindowHandlesByDisplay GUARDED_BY(mLock); + void setInputWindowsLocked(const std::vector<sp<InputWindowHandle>>& inputWindowHandles, + int32_t displayId) REQUIRES(mLock); // Get window handles by display, return an empty vector if not found. std::vector<sp<InputWindowHandle>> getWindowHandlesLocked(int32_t displayId) const REQUIRES(mLock); diff --git a/services/inputflinger/dispatcher/include/InputDispatcherInterface.h b/services/inputflinger/dispatcher/include/InputDispatcherInterface.h index 6e986768fc..09dc92c8fa 100644 --- a/services/inputflinger/dispatcher/include/InputDispatcherInterface.h +++ b/services/inputflinger/dispatcher/include/InputDispatcherInterface.h @@ -19,6 +19,7 @@ #include <InputListener.h> #include <input/ISetInputWindowsListener.h> +#include <unordered_map> namespace android { @@ -99,13 +100,13 @@ public: */ virtual std::unique_ptr<VerifiedInputEvent> verifyInputEvent(const InputEvent& event) = 0; - /* Sets the list of input windows. + /* Sets the list of input windows per display. * * This method may be called on any thread (usually by the input manager). */ virtual void setInputWindows( - const std::vector<sp<InputWindowHandle> >& inputWindowHandles, int32_t displayId, - const sp<ISetInputWindowsListener>& setInputWindowsListener = nullptr) = 0; + const std::unordered_map<int32_t, std::vector<sp<InputWindowHandle>>>& + handlesPerDisplay) = 0; /* Sets the focused application on the given display. * diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index 1f283b18ac..29f3dac03e 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -871,7 +871,7 @@ TEST_F(InputDispatcherTest, SetInputWindow_SingleWindowTouch) { sp<FakeWindowHandle> window = new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT)) << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; @@ -888,7 +888,7 @@ TEST_F(InputDispatcherTest, SetInputWindow_MultiWindowsTouch) { sp<FakeWindowHandle> windowSecond = new FakeWindowHandle(application, mDispatcher, "Second", ADISPLAY_ID_DEFAULT); - mDispatcher->setInputWindows({windowTop, windowSecond}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {windowTop, windowSecond}}}); ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectMotionDown(mDispatcher, AINPUT_SOURCE_TOUCHSCREEN, ADISPLAY_ID_DEFAULT)) << "Inject motion event should return INPUT_EVENT_INJECTION_SUCCEEDED"; @@ -910,7 +910,7 @@ TEST_F(InputDispatcherTest, SetInputWindow_FocusedWindow) { // Display should have only one focused window windowSecond->setFocus(true); - mDispatcher->setInputWindows({windowTop, windowSecond}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {windowTop, windowSecond}}}); windowSecond->consumeFocusEvent(true); ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher)) @@ -935,7 +935,7 @@ TEST_F(InputDispatcherTest, SetInputWindow_FocusPriority) { windowTop->setFocus(true); windowSecond->setFocus(true); - mDispatcher->setInputWindows({windowTop, windowSecond}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {windowTop, windowSecond}}}); windowTop->consumeFocusEvent(true); ASSERT_EQ(INPUT_EVENT_INJECTION_SUCCEEDED, injectKeyDown(mDispatcher)) << "Inject key event should return INPUT_EVENT_INJECTION_SUCCEEDED"; @@ -960,7 +960,7 @@ TEST_F(InputDispatcherTest, SetInputWindow_InputWindowInfo) { windowSecond->setFocus(true); // Release channel for window is no longer valid. windowTop->releaseChannel(); - mDispatcher->setInputWindows({windowTop, windowSecond}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {windowTop, windowSecond}}}); windowSecond->consumeFocusEvent(true); // Test inject a key down, should dispatch to a valid window. @@ -986,7 +986,7 @@ TEST_F(InputDispatcherTest, DispatchMouseEventsUnderCursor) { mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application); - mDispatcher->setInputWindows({windowLeft, windowRight}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {windowLeft, windowRight}}}); // Inject an event with coordinate in the area of right window, with mouse cursor in the area of // left window. This event should be dispatched to the left window. @@ -1003,7 +1003,7 @@ TEST_F(InputDispatcherTest, NotifyDeviceReset_CancelsKeyStream) { new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); window->setFocus(true); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(true); NotifyKeyArgs keyArgs = generateKeyArgs(AKEY_EVENT_ACTION_DOWN, ADISPLAY_ID_DEFAULT); @@ -1025,7 +1025,7 @@ TEST_F(InputDispatcherTest, NotifyDeviceReset_CancelsMotionStream) { sp<FakeWindowHandle> window = new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); NotifyMotionArgs motionArgs = generateMotionArgs(AMOTION_EVENT_ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN, @@ -1053,7 +1053,7 @@ TEST_F(InputDispatcherTest, TransferTouchFocus_OnePointer) { "Second Window", ADISPLAY_ID_DEFAULT); // Add the windows to the dispatcher - mDispatcher->setInputWindows({firstWindow, secondWindow}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {firstWindow, secondWindow}}}); // Send down to the first window NotifyMotionArgs downMotionArgs = generateMotionArgs(AMOTION_EVENT_ACTION_DOWN, @@ -1090,7 +1090,7 @@ TEST_F(InputDispatcherTest, TransferTouchFocus_TwoPointerNoSplitTouch) { "Second Window", ADISPLAY_ID_DEFAULT); // Add the windows to the dispatcher - mDispatcher->setInputWindows({firstWindow, secondWindow}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {firstWindow, secondWindow}}}); // Send down to the first window NotifyMotionArgs downMotionArgs = generateMotionArgs(AMOTION_EVENT_ACTION_DOWN, @@ -1152,7 +1152,7 @@ TEST_F(InputDispatcherTest, TransferTouchFocus_TwoPointersSplitTouch) { | InputWindowInfo::FLAG_SPLIT_TOUCH); // Add the windows to the dispatcher - mDispatcher->setInputWindows({firstWindow, secondWindow}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {firstWindow, secondWindow}}}); PointF pointInFirst = {300, 200}; PointF pointInSecond = {300, 600}; @@ -1204,7 +1204,7 @@ TEST_F(InputDispatcherTest, FocusedWindow_ReceivesFocusEventAndKeyEvent) { new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); window->setFocus(true); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(true); @@ -1220,7 +1220,7 @@ TEST_F(InputDispatcherTest, UnfocusedWindow_DoesNotReceiveFocusEventOrKeyEvent) sp<FakeWindowHandle> window = new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); NotifyKeyArgs keyArgs = generateKeyArgs(AKEY_EVENT_ACTION_DOWN, ADISPLAY_ID_DEFAULT); mDispatcher->notifyKey(&keyArgs); @@ -1235,7 +1235,7 @@ TEST_F(InputDispatcherTest, UnfocusedWindow_ReceivesMotionsButNotKeys) { sp<FakeWindowHandle> window = new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); // Send key NotifyKeyArgs keyArgs = generateKeyArgs(AKEY_EVENT_ACTION_DOWN, ADISPLAY_ID_DEFAULT); @@ -1289,7 +1289,7 @@ TEST_F(InputDispatcherTest, GestureMonitor_ReceivesMotionEvents) { sp<FakeApplicationHandle> application = new FakeApplicationHandle(); sp<FakeWindowHandle> window = new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); FakeMonitorReceiver monitor = FakeMonitorReceiver(mDispatcher, "GM_1", ADISPLAY_ID_DEFAULT, true /*isGestureMonitor*/); @@ -1309,7 +1309,7 @@ TEST_F(InputDispatcherTest, GestureMonitor_DoesNotReceiveKeyEvents) { mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application); window->setFocus(true); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(true); FakeMonitorReceiver monitor = FakeMonitorReceiver(mDispatcher, "GM_1", ADISPLAY_ID_DEFAULT, @@ -1325,7 +1325,7 @@ TEST_F(InputDispatcherTest, GestureMonitor_CanPilferAfterWindowIsRemovedMidStrea sp<FakeApplicationHandle> application = new FakeApplicationHandle(); sp<FakeWindowHandle> window = new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); FakeMonitorReceiver monitor = FakeMonitorReceiver(mDispatcher, "GM_1", ADISPLAY_ID_DEFAULT, true /*isGestureMonitor*/); @@ -1351,7 +1351,7 @@ TEST_F(InputDispatcherTest, TestMoveEvent) { sp<FakeWindowHandle> window = new FakeWindowHandle(application, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); NotifyMotionArgs motionArgs = generateMotionArgs(AMOTION_EVENT_ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN, @@ -1387,29 +1387,29 @@ TEST_F(InputDispatcherTest, TouchModeState_IsSentToApps) { window->setFocus(true); SCOPED_TRACE("Check default value of touch mode"); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(true /*hasFocus*/, true /*inTouchMode*/); SCOPED_TRACE("Remove the window to trigger focus loss"); window->setFocus(false); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(false /*hasFocus*/, true /*inTouchMode*/); SCOPED_TRACE("Disable touch mode"); mDispatcher->setInTouchMode(false); window->setFocus(true); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(true /*hasFocus*/, false /*inTouchMode*/); SCOPED_TRACE("Remove the window to trigger focus loss"); window->setFocus(false); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(false /*hasFocus*/, false /*inTouchMode*/); SCOPED_TRACE("Enable touch mode again"); mDispatcher->setInTouchMode(true); window->setFocus(true); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(true /*hasFocus*/, true /*inTouchMode*/); window->assertNoEvents(); @@ -1423,7 +1423,7 @@ TEST_F(InputDispatcherTest, VerifyInputEvent_KeyEvent) { mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application); window->setFocus(true); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); window->consumeFocusEvent(true /*hasFocus*/, true /*inTouchMode*/); NotifyKeyArgs keyArgs = generateKeyArgs(AKEY_EVENT_ACTION_DOWN); @@ -1459,7 +1459,7 @@ TEST_F(InputDispatcherTest, VerifyInputEvent_MotionEvent) { mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application); - mDispatcher->setInputWindows({window}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}}); NotifyMotionArgs motionArgs = generateMotionArgs(AMOTION_EVENT_ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN, @@ -1512,7 +1512,7 @@ protected: mWindow = new FakeWindowHandle(mApp, mDispatcher, "Fake Window", ADISPLAY_ID_DEFAULT); mWindow->setFocus(true); - mDispatcher->setInputWindows({mWindow}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {mWindow}}}); mWindow->consumeFocusEvent(true); } @@ -1602,7 +1602,7 @@ public: // Set focus window for primary display, but focused display would be second one. mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application1); windowInPrimary->setFocus(true); - mDispatcher->setInputWindows({windowInPrimary}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {windowInPrimary}}}); windowInPrimary->consumeFocusEvent(true); application2 = new FakeApplicationHandle(); @@ -1614,7 +1614,7 @@ public: // Set focus window for second display. mDispatcher->setFocusedApplication(SECOND_DISPLAY_ID, application2); windowInSecondary->setFocus(true); - mDispatcher->setInputWindows({windowInSecondary}, SECOND_DISPLAY_ID); + mDispatcher->setInputWindows({{SECOND_DISPLAY_ID, {windowInSecondary}}}); windowInSecondary->consumeFocusEvent(true); } @@ -1664,7 +1664,7 @@ TEST_F(InputDispatcherFocusOnTwoDisplaysTest, SetInputWindow_MultiDisplayFocus) windowInSecondary->consumeKeyDown(ADISPLAY_ID_NONE); // Remove all windows in secondary display. - mDispatcher->setInputWindows({}, SECOND_DISPLAY_ID); + mDispatcher->setInputWindows({{SECOND_DISPLAY_ID, {}}}); // Expect old focus should receive a cancel event. windowInSecondary->consumeEvent(AINPUT_EVENT_TYPE_KEY, AKEY_EVENT_ACTION_UP, ADISPLAY_ID_NONE, @@ -1828,7 +1828,7 @@ class InputDispatcherOnPointerDownOutsideFocus : public InputDispatcherTest { mFocusedWindow->setFocus(true); // Expect one focus window exist in display. - mDispatcher->setInputWindows({mUnfocusedWindow, mFocusedWindow}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {mUnfocusedWindow, mFocusedWindow}}}); mFocusedWindow->consumeFocusEvent(true); } @@ -1916,7 +1916,7 @@ class InputDispatcherMultiWindowSameTokenTests : public InputDispatcherTest { mWindow2->setId(1); mWindow2->setFrame(Rect(100, 100, 200, 200)); - mDispatcher->setInputWindows({mWindow1, mWindow2}, ADISPLAY_ID_DEFAULT); + mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {mWindow1, mWindow2}}}); } protected: |