From 37c1b992d923106d79f4b299b2661a5fde0892cc Mon Sep 17 00:00:00 2001 From: Linnan Li Date: Fri, 24 Nov 2023 13:05:13 +0800 Subject: PointerController: Get initial DisplayInfos from SurfaceComposerClient After the PointerController is created, if SurfaceFlinger hasn't called back to notify DisplayInfo,the PointerController won't have DisplayInfo, if the actual display exists and transforms at this time, using the display touch position will result in the wrong actual display position. Steps to reproduce the problem. 1. Switch the device to landscape. 2. Execute `adb shell settings put system show_touch 1`. 3. Touch the screen. 4. At this point, you can observe that the screen flashes an incorrect touch point location. How to fix it The addWindowInfosListener method has a parameter to get the initial position, which we use to get the current DisplayInfo at creation time. Even though this information would not exist if there were no other listeners, it doesn't matter here because the InputDispatcher was created long before the PointerController, and the InputDispatcher already added a listener, so the DisplayInfo information must exist, so we don't have to worry about this. Bug: 313033164 Test: Manual Change-Id: Ia942c85d1b2204690f69e6a2ba43cfb7542af27c Signed-off-by: Linnan Li --- libs/input/PointerController.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index bba9c9764eee..1604ba2968db 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -111,7 +111,11 @@ PointerController::PointerController(const sp& : PointerController( policy, looper, spriteController, enabled, [](const sp& listener) { - SurfaceComposerClient::getDefault()->addWindowInfosListener(listener); + auto initialInfo = std::make_pair(std::vector{}, + std::vector{}); + SurfaceComposerClient::getDefault()->addWindowInfosListener(listener, + &initialInfo); + return initialInfo; }, [](const sp& listener) { SurfaceComposerClient::getDefault()->removeWindowInfosListener(listener); @@ -119,8 +123,9 @@ PointerController::PointerController(const sp& PointerController::PointerController(const sp& policy, const sp& looper, SpriteController& spriteController, - bool enabled, WindowListenerConsumer registerListener, - WindowListenerConsumer unregisterListener) + bool enabled, + const WindowListenerRegisterConsumer& registerListener, + WindowListenerUnregisterConsumer unregisterListener) : mEnabled(enabled), mContext(policy, looper, spriteController, *this), mCursorController(mContext), @@ -128,7 +133,8 @@ PointerController::PointerController(const sp& mUnregisterWindowInfosListener(std::move(unregisterListener)) { std::scoped_lock lock(getLock()); mLocked.presentation = Presentation::SPOT; - registerListener(mDisplayInfoListener); + const auto& [_, initialDisplayInfos] = registerListener(mDisplayInfoListener); + onDisplayInfosChangedLocked(initialDisplayInfos); } PointerController::~PointerController() { -- cgit v1.2.3-59-g8ed1b From bdf936984acca93aea3ef94fdbd42830a697ca58 Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Tue, 23 Jan 2024 18:08:28 +0000 Subject: PointerController: Simplify display info listener registration Bug: 313033164 Test: Presubmit Change-Id: I71e4943d36e0e3b5b0c9eaaaef7c8d04a82ba90d --- libs/input/PointerController.cpp | 4 ++-- libs/input/PointerController.h | 5 ++--- libs/input/tests/PointerController_test.cpp | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 1604ba2968db..f84107e8792c 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -115,7 +115,7 @@ PointerController::PointerController(const sp& std::vector{}); SurfaceComposerClient::getDefault()->addWindowInfosListener(listener, &initialInfo); - return initialInfo; + return initialInfo.second; }, [](const sp& listener) { SurfaceComposerClient::getDefault()->removeWindowInfosListener(listener); @@ -133,7 +133,7 @@ PointerController::PointerController(const sp& mUnregisterWindowInfosListener(std::move(unregisterListener)) { std::scoped_lock lock(getLock()); mLocked.presentation = Presentation::SPOT; - const auto& [_, initialDisplayInfos] = registerListener(mDisplayInfoListener); + const auto& initialDisplayInfos = registerListener(mDisplayInfoListener); onDisplayInfosChangedLocked(initialDisplayInfos); } diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index 8daa3a33dea4..6ee5707622ca 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -79,9 +79,8 @@ public: std::string dump() override; protected: - using WindowListenerRegisterConsumer = - std::function, std::vector>( - const sp&)>; + using WindowListenerRegisterConsumer = std::function( + const sp&)>; using WindowListenerUnregisterConsumer = std::function&)>; diff --git a/libs/input/tests/PointerController_test.cpp b/libs/input/tests/PointerController_test.cpp index 45b426bf5c5e..a1bb5b3f1cc4 100644 --- a/libs/input/tests/PointerController_test.cpp +++ b/libs/input/tests/PointerController_test.cpp @@ -161,8 +161,7 @@ public: policy, looper, spriteController, /*enabled=*/true, [®isteredListener](const sp& listener) - -> std::pair, - std::vector> { + -> std::vector { // Register listener registeredListener = listener; return {}; -- cgit v1.2.3-59-g8ed1b From 453e1631c492ff561b3602e03cd3d246131db361 Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Mon, 26 Feb 2024 21:27:31 +0000 Subject: Read pointer choreographer flag at boot In native code, we are sometimes reading the enable_pointer_choreographer flag value at boot, and sometimes later during runtime. Since DeviceConfig flag values can change at runtime, the flag values loaded later can sometimes change, resulting in an unexpected state where some code relies on the boot-time value and others on the "current" value. While we should have been using read-only flags in the first place, we cannot convert existing flags to be read-only. So to increase consistency within native code, change all reads of the enable_pointer_choreographer flag to happen at boot. Bug: 324534774 Test: Presubmit Change-Id: Id31496d987e2647fc1176dbdbba67bd6e4443aa1 --- libs/input/PointerController.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'libs/input/PointerController.cpp') diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index f84107e8792c..f9dc5fac7e21 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -41,6 +41,8 @@ namespace android { namespace { +static const bool ENABLE_POINTER_CHOREOGRAPHER = input_flags::enable_pointer_choreographer(); + const ui::Transform kIdentityTransform; } // namespace @@ -224,7 +226,7 @@ void PointerController::setPresentation(Presentation presentation) { mLocked.presentation = presentation; - if (input_flags::enable_pointer_choreographer()) { + if (ENABLE_POINTER_CHOREOGRAPHER) { // When pointer choreographer is enabled, the presentation mode is only set once when the // PointerController is constructed, before the display viewport is provided. // TODO(b/293587049): Clean up the PointerController interface after pointer choreographer -- cgit v1.2.3-59-g8ed1b