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

Commit 5fe59da3 authored by Daniel Norman's avatar Daniel Norman Committed by Android Build Coastguard Worker
Browse files

Lower severity for invalid accessibility hover event stream to ERROR.

LOG(FATAL) crashes the device, which is very severe for the user.

The accessibility hover event stream has consistency issues that we
are actively fixing, but these fixes have not yet had time to soak.
Instead of cherrypicking the fix, instead we can demote the severity
of the log so that errors do not crash the device.

Bug: 286037469
Test: atest InputDispatcherTest#InvalidA11yHoverStreamDoesNotCrash
Test: Use talkback, repeatedly enter touch exploration while also
      tapping with another finger. Eventually observe the failure
      message which is now an ERROR instead of crashing the device
      with a FATAL.
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:2f99cdb9150461c6b77c29b31cbf5792a9303c95)
Merged-In: Iceea086345691cdad8ca5e092629de094d666de1
Change-Id: Iceea086345691cdad8ca5e092629de094d666de1
parent d915962a
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -662,7 +662,15 @@ std::vector<TouchedWindow> getHoveringWindowsLocked(const TouchState* oldState,
        } else {
            // This pointer was already sent to the window. Use ACTION_HOVER_MOVE.
            if (CC_UNLIKELY(maskedAction != AMOTION_EVENT_ACTION_HOVER_MOVE)) {
                LOG(FATAL) << "Expected ACTION_HOVER_MOVE instead of " << entry.getDescription();
                android::base::LogSeverity severity = android::base::LogSeverity::FATAL;
                if (entry.flags & AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT) {
                    // The Accessibility injected touch exploration event stream
                    // has known inconsistencies, so log ERROR instead of
                    // crashing the device with FATAL.
                    // TODO(b/286037469): Move a11y severity back to FATAL.
                    severity = android::base::LogSeverity::ERROR;
                }
                LOG(severity) << "Expected ACTION_HOVER_MOVE instead of " << entry.getDescription();
            }
            touchedWindow.targetFlags = InputTarget::Flags::DISPATCH_AS_IS;
        }
+23 −0
Original line number Diff line number Diff line
@@ -3603,6 +3603,29 @@ TEST_F(InputDispatcherTest, HoverExitIsSentToRemovedWindow) {
    window->consumeMotionEvent(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_EXIT));
}

/**
 * Test that invalid HOVER events sent by accessibility do not cause a fatal crash.
 */
TEST_F(InputDispatcherTest, InvalidA11yHoverStreamDoesNotCrash) {
    std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>();
    sp<FakeWindowHandle> window =
            sp<FakeWindowHandle>::make(application, mDispatcher, "Window", ADISPLAY_ID_DEFAULT);
    window->setFrame(Rect(0, 0, 1200, 800));
    mDispatcher->setFocusedApplication(ADISPLAY_ID_DEFAULT, application);
    mDispatcher->setInputWindows({{ADISPLAY_ID_DEFAULT, {window}}});

    MotionEventBuilder hoverEnterBuilder =
            MotionEventBuilder(AMOTION_EVENT_ACTION_HOVER_ENTER, AINPUT_SOURCE_MOUSE)
                    .pointer(PointerBuilder(0, ToolType::MOUSE).x(300).y(400))
                    .addFlag(AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT);
    ASSERT_EQ(InputEventInjectionResult::SUCCEEDED,
              injectMotionEvent(mDispatcher, hoverEnterBuilder.build()));
    ASSERT_EQ(InputEventInjectionResult::SUCCEEDED,
              injectMotionEvent(mDispatcher, hoverEnterBuilder.build()));
    window->consumeMotionEvent(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER));
    window->consumeMotionEvent(WithMotionAction(AMOTION_EVENT_ACTION_HOVER_ENTER));
}

/**
 * If mouse is hovering when the touch goes down, the hovering should be stopped via HOVER_EXIT.
 */