Allow PointerController to be disabled on creation

Disable the legacy PointerController when the PointerChoreographer is
enabled.

Bug: 278783893
Test: manual
Change-Id: I475f3286c83b90e161e186e62c2842e539434603
diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp
index 9695e6f..c41cd04 100644
--- a/libs/input/PointerController.cpp
+++ b/libs/input/PointerController.cpp
@@ -63,10 +63,10 @@
 
 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 @@
 }
 
 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>& 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::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::setPosition(float x, float y) {
+    if (!mEnabled) return;
+
     const int32_t displayId = mCursorController.getDisplayId();
     vec2 transformed;
     {
@@ -145,6 +153,11 @@
 }
 
 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 @@
 }
 
 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::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::clearSpots() {
+    if (!mEnabled) return;
+
     std::scoped_lock lock(getLock());
     clearSpotsLocked();
 }
@@ -277,11 +302,15 @@
 }
 
 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 @@
 }
 
 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 01748a8..de39eda 100644
--- a/libs/input/PointerController.h
+++ b/libs/input/PointerController.h
@@ -47,7 +47,7 @@
 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 @@
 
     // 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 @@
     // 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 3e2e43f..94faf4a 100644
--- a/libs/input/tests/PointerController_test.cpp
+++ b/libs/input/tests/PointerController_test.cpp
@@ -181,7 +181,8 @@
     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 @@
                           const sp<Looper>& looper, SpriteController& spriteController)
           : PointerController(
                     new MockPointerControllerPolicyInterface(), looper, spriteController,
+                    /*enabled=*/true,
                     [&registeredListener](const sp<android::gui::WindowInfosListener>& listener) {
                         // Register listener
                         registeredListener = listener;