Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb134f13 authored by Hu Guo's avatar Hu Guo Committed by Siarhei Vishniakou
Browse files

Add tests for dropped event

Cancel only the gesture corresponding to the dropped event

Test: atest inputflinger_tests
Change-Id: I88fd0702d5e1b0d15f808bfad4ee923a6dd19357
parent 0994001a
Loading
Loading
Loading
Loading
+88 −0
Original line number Diff line number Diff line
@@ -7332,6 +7332,94 @@ TEST_F(InputDispatcherFocusOnTwoDisplaysTest, CancelTouch_MultiDisplay) {
    monitorInSecondary.assertNoEvents();
}
/**
 * Send a key to the primary display and to the secondary display.
 * Then cause the key on the primary display to be canceled by sending in a stale key.
 * Ensure that the key on the primary display is canceled, and that the key on the secondary display
 * does not get canceled.
 */
TEST_F(InputDispatcherFocusOnTwoDisplaysTest, WhenDropKeyEvent_OnlyCancelCorrespondingKeyGesture) {
    // Send a key down on primary display
    mDispatcher->notifyKey(
            KeyArgsBuilder(AKEY_EVENT_ACTION_DOWN, AINPUT_SOURCE_KEYBOARD)
                    .displayId(ADISPLAY_ID_DEFAULT)
                    .policyFlags(DEFAULT_POLICY_FLAGS | POLICY_FLAG_DISABLE_KEY_REPEAT)
                    .build());
    windowInPrimary->consumeKeyEvent(
            AllOf(WithKeyAction(AKEY_EVENT_ACTION_DOWN), WithDisplayId(ADISPLAY_ID_DEFAULT)));
    windowInSecondary->assertNoEvents();
    // Send a key down on second display
    mDispatcher->notifyKey(
            KeyArgsBuilder(AKEY_EVENT_ACTION_DOWN, AINPUT_SOURCE_KEYBOARD)
                    .displayId(SECOND_DISPLAY_ID)
                    .policyFlags(DEFAULT_POLICY_FLAGS | POLICY_FLAG_DISABLE_KEY_REPEAT)
                    .build());
    windowInSecondary->consumeKeyEvent(
            AllOf(WithKeyAction(AKEY_EVENT_ACTION_DOWN), WithDisplayId(SECOND_DISPLAY_ID)));
    windowInPrimary->assertNoEvents();
    // Send a valid key up event on primary display that will be dropped because it is stale
    NotifyKeyArgs staleKeyUp =
            KeyArgsBuilder(AKEY_EVENT_ACTION_UP, AINPUT_SOURCE_KEYBOARD)
                    .displayId(ADISPLAY_ID_DEFAULT)
                    .policyFlags(DEFAULT_POLICY_FLAGS | POLICY_FLAG_DISABLE_KEY_REPEAT)
                    .build();
    static constexpr std::chrono::duration STALE_EVENT_TIMEOUT = 10ms;
    mFakePolicy->setStaleEventTimeout(STALE_EVENT_TIMEOUT);
    std::this_thread::sleep_for(STALE_EVENT_TIMEOUT);
    mDispatcher->notifyKey(staleKeyUp);
    // Only the key gesture corresponding to the dropped event should receive the cancel event.
    // Therefore, windowInPrimary should get the cancel event and windowInSecondary should not
    // receive any events.
    windowInPrimary->consumeKeyEvent(AllOf(WithKeyAction(AKEY_EVENT_ACTION_UP),
                                           WithDisplayId(ADISPLAY_ID_DEFAULT),
                                           WithFlags(AKEY_EVENT_FLAG_CANCELED)));
    windowInSecondary->assertNoEvents();
}
/**
 * Similar to 'WhenDropKeyEvent_OnlyCancelCorrespondingKeyGesture' but for motion events.
 */
TEST_F(InputDispatcherFocusOnTwoDisplaysTest, WhenDropMotionEvent_OnlyCancelCorrespondingGesture) {
    // Send touch down on primary display.
    mDispatcher->notifyMotion(
            MotionArgsBuilder(ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN)
                    .pointer(PointerBuilder(/*id=*/0, ToolType::FINGER).x(100).y(200))
                    .displayId(ADISPLAY_ID_DEFAULT)
                    .build());
    windowInPrimary->consumeMotionEvent(
            AllOf(WithMotionAction(ACTION_DOWN), WithDisplayId(ADISPLAY_ID_DEFAULT)));
    windowInSecondary->assertNoEvents();
    // Send touch down on second display.
    mDispatcher->notifyMotion(
            MotionArgsBuilder(ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN)
                    .pointer(PointerBuilder(/*id=*/0, ToolType::FINGER).x(100).y(200))
                    .displayId(SECOND_DISPLAY_ID)
                    .build());
    windowInPrimary->assertNoEvents();
    windowInSecondary->consumeMotionEvent(
            AllOf(WithMotionAction(ACTION_DOWN), WithDisplayId(SECOND_DISPLAY_ID)));
    // inject a valid MotionEvent on primary display that will be stale when it arrives.
    NotifyMotionArgs staleMotionUp =
            MotionArgsBuilder(ACTION_UP, AINPUT_SOURCE_TOUCHSCREEN)
                    .displayId(ADISPLAY_ID_DEFAULT)
                    .pointer(PointerBuilder(/*id=*/0, ToolType::FINGER).x(100).y(200))
                    .build();
    static constexpr std::chrono::duration STALE_EVENT_TIMEOUT = 10ms;
    mFakePolicy->setStaleEventTimeout(STALE_EVENT_TIMEOUT);
    std::this_thread::sleep_for(STALE_EVENT_TIMEOUT);
    mDispatcher->notifyMotion(staleMotionUp);
    // For stale motion events, we let the gesture to complete. This behaviour is different from key
    // events, where we would cancel the current keys instead.
    windowInPrimary->consumeMotionEvent(WithMotionAction(ACTION_UP));
    windowInSecondary->assertNoEvents();
}
class InputFilterTest : public InputDispatcherTest {
protected:
    void testNotifyMotion(int32_t displayId, bool expectToBeFiltered,