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

Commit 888993de authored by Prabir Pradhan's avatar Prabir Pradhan
Browse files

PointerChoreographer: Show spot hover icon for stylus when showing taps

When "show touches" is enabled, we show the spot hover icon when the
stylus is hovering. However, when an app is allowed to override the icon
for a hovering stylus, we were never showing the spot hover icon.

In this CL, we ensure that the spot hover icon is visible for a hovering
stylus when "show touches" is enabled and the app has not specified an
icon to use.

Bug: 342067371
Test: atest inputflinger_tests
Flag: EXEMPT bug fix
Change-Id: Iddf637c87ecba928a5a227a8efc0dd436b9528c7
parent 691afb4d
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -407,7 +407,8 @@ void PointerChoreographer::processStylusHoverEventLocked(const NotifyMotionArgs&
        // TODO(b/315815559): Do not fade and reset the icon if the hover exit will be followed
        //   immediately by a DOWN event.
        pc.fade(PointerControllerInterface::Transition::IMMEDIATE);
        pc.updatePointerIcon(PointerIconStyle::TYPE_NOT_SPECIFIED);
        pc.updatePointerIcon(mShowTouchesEnabled ? PointerIconStyle::TYPE_SPOT_HOVER
                                                 : PointerIconStyle::TYPE_NOT_SPECIFIED);
    } else if (canUnfadeOnDisplay(args.displayId)) {
        pc.unfade(PointerControllerInterface::Transition::IMMEDIATE);
    }
@@ -792,6 +793,13 @@ bool PointerChoreographer::setPointerIcon(
    if (isFromSource(sources, AINPUT_SOURCE_STYLUS)) {
        auto it = mStylusPointersByDevice.find(deviceId);
        if (it != mStylusPointersByDevice.end()) {
            if (mShowTouchesEnabled) {
                // If an app doesn't override the icon for the hovering stylus, show the hover icon.
                auto* style = std::get_if<PointerIconStyle>(&icon);
                if (style != nullptr && *style == PointerIconStyle::TYPE_NOT_SPECIFIED) {
                    *style = PointerIconStyle::TYPE_SPOT_HOVER;
                }
            }
            setIconForController(icon, *it->second);
            return true;
        }
+30 −0
Original line number Diff line number Diff line
@@ -978,6 +978,36 @@ TEST_F(PointerChoreographerTest, WhenTouchDeviceIsResetClearsSpots) {
    assertPointerControllerRemoved(pc);
}

/**
 * When both "show touches" and "stylus hover icons" are enabled, if the app doesn't specify an
 * icon for the hovering stylus, fall back to using the spot hover icon.
 */
TEST_F(PointerChoreographerTest, ShowTouchesOverridesUnspecifiedStylusIcon) {
    mChoreographer.setShowTouchesEnabled(true);
    mChoreographer.setStylusPointerIconEnabled(true);
    mChoreographer.notifyInputDevicesChanged(
            {/*id=*/0,
             {generateTestDeviceInfo(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN | AINPUT_SOURCE_STYLUS,
                                     DISPLAY_ID)}});

    mChoreographer.notifyMotion(MotionArgsBuilder(AMOTION_EVENT_ACTION_HOVER_ENTER,
                                                  AINPUT_SOURCE_TOUCHSCREEN | AINPUT_SOURCE_STYLUS)
                                        .pointer(STYLUS_POINTER)
                                        .deviceId(DEVICE_ID)
                                        .displayId(DISPLAY_ID)
                                        .build());
    auto pc = assertPointerControllerCreated(ControllerType::STYLUS);

    mChoreographer.setPointerIcon(PointerIconStyle::TYPE_NOT_SPECIFIED, DISPLAY_ID, DEVICE_ID);
    pc->assertPointerIconSet(PointerIconStyle::TYPE_SPOT_HOVER);

    mChoreographer.setPointerIcon(PointerIconStyle::TYPE_ARROW, DISPLAY_ID, DEVICE_ID);
    pc->assertPointerIconSet(PointerIconStyle::TYPE_ARROW);

    mChoreographer.setPointerIcon(PointerIconStyle::TYPE_NOT_SPECIFIED, DISPLAY_ID, DEVICE_ID);
    pc->assertPointerIconSet(PointerIconStyle::TYPE_SPOT_HOVER);
}

using StylusFixtureParam =
        std::tuple</*name*/ std::string_view, /*source*/ uint32_t, ControllerType>;