diff options
-rw-r--r-- | libs/input/PointerController.cpp | 46 | ||||
-rw-r--r-- | libs/input/PointerController.h | 9 | ||||
-rw-r--r-- | libs/input/tests/PointerController_test.cpp | 4 | ||||
-rw-r--r-- | services/core/jni/com_android_server_input_InputManagerService.cpp | 10 |
4 files changed, 57 insertions, 12 deletions
diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 9695e6f0d733..c41cd0467ed3 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -63,10 +63,10 @@ void PointerController::DisplayInfoListener::onPointerControllerDestroyed() { std::shared_ptr<PointerController> PointerController::create( const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper, - SpriteController& spriteController) { + SpriteController& spriteController, bool enabled) { // using 'new' to access non-public constructor std::shared_ptr<PointerController> controller = std::shared_ptr<PointerController>( - new PointerController(policy, looper, spriteController)); + new PointerController(policy, looper, spriteController, enabled)); /* * Now we need to hook up the constructed PointerController object to its callbacks. @@ -85,9 +85,10 @@ std::shared_ptr<PointerController> PointerController::create( } PointerController::PointerController(const sp<PointerControllerPolicyInterface>& policy, - const sp<Looper>& looper, SpriteController& spriteController) + const sp<Looper>& looper, SpriteController& spriteController, + bool enabled) : PointerController( - policy, looper, spriteController, + policy, looper, spriteController, enabled, [](const sp<android::gui::WindowInfosListener>& listener) { SurfaceComposerClient::getDefault()->addWindowInfosListener(listener); }, @@ -97,9 +98,10 @@ PointerController::PointerController(const sp<PointerControllerPolicyInterface>& PointerController::PointerController(const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper, SpriteController& spriteController, - WindowListenerConsumer registerListener, + bool enabled, WindowListenerConsumer registerListener, WindowListenerConsumer unregisterListener) - : mContext(policy, looper, spriteController, *this), + : mEnabled(enabled), + mContext(policy, looper, spriteController, *this), mCursorController(mContext), mDisplayInfoListener(sp<DisplayInfoListener>::make(this)), mUnregisterWindowInfosListener(std::move(unregisterListener)) { @@ -119,10 +121,14 @@ std::mutex& PointerController::getLock() const { } std::optional<FloatRect> PointerController::getBounds() const { + if (!mEnabled) return {}; + return mCursorController.getBounds(); } void PointerController::move(float deltaX, float deltaY) { + if (!mEnabled) return; + const int32_t displayId = mCursorController.getDisplayId(); vec2 transformed; { @@ -134,6 +140,8 @@ void PointerController::move(float deltaX, float deltaY) { } void PointerController::setPosition(float x, float y) { + if (!mEnabled) return; + const int32_t displayId = mCursorController.getDisplayId(); vec2 transformed; { @@ -145,6 +153,11 @@ void PointerController::setPosition(float x, float y) { } FloatPoint PointerController::getPosition() const { + if (!mEnabled) { + return FloatPoint{AMOTION_EVENT_INVALID_CURSOR_POSITION, + AMOTION_EVENT_INVALID_CURSOR_POSITION}; + } + const int32_t displayId = mCursorController.getDisplayId(); const auto p = mCursorController.getPosition(); { @@ -155,20 +168,28 @@ FloatPoint PointerController::getPosition() const { } int32_t PointerController::getDisplayId() const { + if (!mEnabled) return ADISPLAY_ID_NONE; + return mCursorController.getDisplayId(); } void PointerController::fade(Transition transition) { + if (!mEnabled) return; + std::scoped_lock lock(getLock()); mCursorController.fade(transition); } void PointerController::unfade(Transition transition) { + if (!mEnabled) return; + std::scoped_lock lock(getLock()); mCursorController.unfade(transition); } void PointerController::setPresentation(Presentation presentation) { + if (!mEnabled) return; + std::scoped_lock lock(getLock()); if (mLocked.presentation == presentation) { @@ -193,6 +214,8 @@ void PointerController::setPresentation(Presentation presentation) { void PointerController::setSpots(const PointerCoords* spotCoords, const uint32_t* spotIdToIndex, BitSet32 spotIdBits, int32_t displayId) { + if (!mEnabled) return; + std::scoped_lock lock(getLock()); std::array<PointerCoords, MAX_POINTERS> outSpotCoords{}; const ui::Transform& transform = getTransformForDisplayLocked(displayId); @@ -216,6 +239,8 @@ void PointerController::setSpots(const PointerCoords* spotCoords, const uint32_t } void PointerController::clearSpots() { + if (!mEnabled) return; + std::scoped_lock lock(getLock()); clearSpotsLocked(); } @@ -277,11 +302,15 @@ void PointerController::setDisplayViewport(const DisplayViewport& viewport) { } void PointerController::updatePointerIcon(PointerIconStyle iconId) { + if (!mEnabled) return; + std::scoped_lock lock(getLock()); mCursorController.updatePointerIcon(iconId); } void PointerController::setCustomPointerIcon(const SpriteIcon& icon) { + if (!mEnabled) return; + std::scoped_lock lock(getLock()); mCursorController.setCustomPointerIcon(icon); } @@ -326,6 +355,11 @@ const ui::Transform& PointerController::getTransformForDisplayLocked(int display } void PointerController::dump(std::string& dump) { + if (!mEnabled) { + dump += INDENT "PointerController: DISABLED due to ongoing PointerChoreographer refactor\n"; + return; + } + dump += INDENT "PointerController:\n"; std::scoped_lock lock(getLock()); dump += StringPrintf(INDENT2 "Presentation: %s\n", diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index 01748a8bb709..de39eda75210 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -47,7 +47,7 @@ class PointerController : public PointerControllerInterface { public: static std::shared_ptr<PointerController> create( const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper, - SpriteController& spriteController); + SpriteController& spriteController, bool enabled); ~PointerController() override; @@ -83,12 +83,13 @@ protected: // Constructor used to test WindowInfosListener registration. PointerController(const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper, - SpriteController& spriteController, WindowListenerConsumer registerListener, + SpriteController& spriteController, bool enabled, + WindowListenerConsumer registerListener, WindowListenerConsumer unregisterListener); private: PointerController(const sp<PointerControllerPolicyInterface>& policy, const sp<Looper>& looper, - SpriteController& spriteController); + SpriteController& spriteController, bool enabled); friend PointerControllerContext::LooperCallback; friend PointerControllerContext::MessageHandler; @@ -99,6 +100,8 @@ private: // we use the DisplayInfoListener's lock in PointerController. std::mutex& getLock() const; + const bool mEnabled; + PointerControllerContext mContext; MouseCursorController mCursorController; diff --git a/libs/input/tests/PointerController_test.cpp b/libs/input/tests/PointerController_test.cpp index 3e2e43fdfdca..94faf4a65a1c 100644 --- a/libs/input/tests/PointerController_test.cpp +++ b/libs/input/tests/PointerController_test.cpp @@ -181,7 +181,8 @@ PointerControllerTest::PointerControllerTest() : mPointerSprite(new NiceMock<Moc EXPECT_CALL(*mSpriteController, createSprite()) .WillOnce(Return(mPointerSprite)); - mPointerController = PointerController::create(mPolicy, mLooper, *mSpriteController); + mPointerController = + PointerController::create(mPolicy, mLooper, *mSpriteController, /*enabled=*/true); } PointerControllerTest::~PointerControllerTest() { @@ -321,6 +322,7 @@ public: const sp<Looper>& looper, SpriteController& spriteController) : PointerController( new MockPointerControllerPolicyInterface(), looper, spriteController, + /*enabled=*/true, [®isteredListener](const sp<android::gui::WindowInfosListener>& listener) { // Register listener registeredListener = listener; diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 788299cba059..6e0d98cab8e6 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -733,7 +733,13 @@ std::shared_ptr<PointerControllerInterface> NativeInputManager::obtainPointerCon if (controller == nullptr) { ensureSpriteControllerLocked(); - controller = PointerController::create(this, mLooper, *mLocked.spriteController); + static const bool ENABLE_POINTER_CHOREOGRAPHER = + sysprop::InputProperties::enable_pointer_choreographer().value_or(false); + + // Disable the functionality of the legacy PointerController if PointerChoreographer is + // enabled. + controller = PointerController::create(this, mLooper, *mLocked.spriteController, + /*enabled=*/!ENABLE_POINTER_CHOREOGRAPHER); mLocked.legacyPointerController = controller; updateInactivityTimeoutLocked(); } @@ -745,7 +751,7 @@ std::shared_ptr<PointerControllerInterface> NativeInputManager::createPointerCon std::scoped_lock _l(mLock); ensureSpriteControllerLocked(); std::shared_ptr<PointerController> pc = - PointerController::create(this, mLooper, *mLocked.spriteController); + PointerController::create(this, mLooper, *mLocked.spriteController, /*enabled=*/true); mLocked.pointerControllers.emplace_back(pc); return pc; } |