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

Commit a84ff996 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Disable mouse acceleration and scaling when Pointer Capture is enabled"...

Merge "Disable mouse acceleration and scaling when Pointer Capture is enabled" into tm-dev am: b3cf87bb am: b81cf780

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/17524504



Change-Id: I8f8c5053fab7f54d1c0256a5b572bd037dc15cb5
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 3e811401 b81cf780
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -27,6 +27,9 @@

namespace android {

// The default velocity control parameters that has no effect.
static const VelocityControlParameters FLAT_VELOCITY_CONTROL_PARAMS{};

// --- CursorMotionAccumulator ---

CursorMotionAccumulator::CursorMotionAccumulator() {
@@ -154,8 +157,9 @@ void CursorInputMapper::configure(nsecs_t when, const InputReaderConfiguration*
        mHWheelScale = 1.0f;
    }

    if ((!changes && config->pointerCaptureRequest.enable) ||
        (changes & InputReaderConfiguration::CHANGE_POINTER_CAPTURE)) {
    const bool configurePointerCapture = (!changes && config->pointerCaptureRequest.enable) ||
            (changes & InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
    if (configurePointerCapture) {
        if (config->pointerCaptureRequest.enable) {
            if (mParameters.mode == Parameters::MODE_POINTER) {
                mParameters.mode = Parameters::MODE_POINTER_RELATIVE;
@@ -180,11 +184,19 @@ void CursorInputMapper::configure(nsecs_t when, const InputReaderConfiguration*
        }
    }

    if (!changes || (changes & InputReaderConfiguration::CHANGE_POINTER_SPEED)) {
    if (!changes || (changes & InputReaderConfiguration::CHANGE_POINTER_SPEED) ||
        configurePointerCapture) {
        if (config->pointerCaptureRequest.enable) {
            // Disable any acceleration or scaling when Pointer Capture is enabled.
            mPointerVelocityControl.setParameters(FLAT_VELOCITY_CONTROL_PARAMS);
            mWheelXVelocityControl.setParameters(FLAT_VELOCITY_CONTROL_PARAMS);
            mWheelYVelocityControl.setParameters(FLAT_VELOCITY_CONTROL_PARAMS);
        } else {
            mPointerVelocityControl.setParameters(config->pointerVelocityControlParameters);
            mWheelXVelocityControl.setParameters(config->wheelVelocityControlParameters);
            mWheelYVelocityControl.setParameters(config->wheelVelocityControlParameters);
        }
    }

    if (!changes || (changes & InputReaderConfiguration::CHANGE_DISPLAY_INFO)) {
        mOrientation = DISPLAY_ORIENTATION_0;
+57 −1
Original line number Diff line number Diff line
@@ -375,6 +375,11 @@ public:

    float getPointerGestureMovementSpeedRatio() { return mConfig.pointerGestureMovementSpeedRatio; }

    void setVelocityControlParams(const VelocityControlParameters& params) {
        mConfig.pointerVelocityControlParameters = params;
        mConfig.wheelVelocityControlParameters = params;
    }

private:
    uint32_t mNextPointerCaptureSequenceNumber = 0;

@@ -2949,7 +2954,10 @@ protected:
    }

    void configureDevice(uint32_t changes) {
        if (!changes || (changes & InputReaderConfiguration::CHANGE_DISPLAY_INFO)) {
        if (!changes ||
            (changes &
             (InputReaderConfiguration::CHANGE_DISPLAY_INFO |
              InputReaderConfiguration::CHANGE_POINTER_CAPTURE))) {
            mReader->requestRefreshConfiguration(changes);
            mReader->loopOnce();
        }
@@ -4842,6 +4850,54 @@ TEST_F(CursorInputMapperTest, Process_PointerCapture) {
    ASSERT_NO_FATAL_FAILURE(assertPosition(*mFakePointerController, 110.0f, 220.0f));
}

/**
 * When Pointer Capture is enabled, we expect to report unprocessed relative movements, so any
 * pointer acceleration or speed processing should not be applied.
 */
TEST_F(CursorInputMapperTest, PointerCaptureDisablesVelocityProcessing) {
    addConfigurationProperty("cursor.mode", "pointer");
    const VelocityControlParameters testParams(5.f /*scale*/, 0.f /*low threshold*/,
                                               100.f /*high threshold*/, 10.f /*acceleration*/);
    mFakePolicy->setVelocityControlParams(testParams);
    CursorInputMapper& mapper = addMapperAndConfigure<CursorInputMapper>();

    NotifyDeviceResetArgs resetArgs;
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyDeviceResetWasCalled(&resetArgs));
    ASSERT_EQ(ARBITRARY_TIME, resetArgs.eventTime);
    ASSERT_EQ(DEVICE_ID, resetArgs.deviceId);

    NotifyMotionArgs args;

    // Move and verify scale is applied.
    process(mapper, ARBITRARY_TIME, READ_TIME, EV_REL, REL_X, 10);
    process(mapper, ARBITRARY_TIME, READ_TIME, EV_REL, REL_Y, 20);
    process(mapper, ARBITRARY_TIME, READ_TIME, EV_SYN, SYN_REPORT, 0);
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
    ASSERT_EQ(AINPUT_SOURCE_MOUSE, args.source);
    ASSERT_EQ(AMOTION_EVENT_ACTION_HOVER_MOVE, args.action);
    const float relX = args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X);
    const float relY = args.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y);
    ASSERT_GT(relX, 10);
    ASSERT_GT(relY, 20);

    // Enable Pointer Capture
    mFakePolicy->setPointerCapture(true);
    configureDevice(InputReaderConfiguration::CHANGE_POINTER_CAPTURE);
    NotifyPointerCaptureChangedArgs captureArgs;
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyCaptureWasCalled(&captureArgs));
    ASSERT_TRUE(captureArgs.request.enable);

    // Move and verify scale is not applied.
    process(mapper, ARBITRARY_TIME, READ_TIME, EV_REL, REL_X, 10);
    process(mapper, ARBITRARY_TIME, READ_TIME, EV_REL, REL_Y, 20);
    process(mapper, ARBITRARY_TIME, READ_TIME, EV_SYN, SYN_REPORT, 0);
    ASSERT_NO_FATAL_FAILURE(mFakeListener->assertNotifyMotionWasCalled(&args));
    ASSERT_EQ(AINPUT_SOURCE_MOUSE_RELATIVE, args.source);
    ASSERT_EQ(AMOTION_EVENT_ACTION_MOVE, args.action);
    ASSERT_EQ(10, args.pointerCoords[0].getX());
    ASSERT_EQ(20, args.pointerCoords[0].getY());
}

TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) {
    CursorInputMapper& mapper = addMapperAndConfigure<CursorInputMapper>();