Strong pointer fixes in libinputservice

Make components of libinputservice work with implicit conversions
disabled for strong pointers.

Bug: 278783893
Test: Build

Change-Id: Ibe1e97c845662113437635efd7a1e875e8407c64
diff --git a/libs/input/Android.bp b/libs/input/Android.bp
index 6c0fd5f..5ce990f 100644
--- a/libs/input/Android.bp
+++ b/libs/input/Android.bp
@@ -23,6 +23,12 @@
 
 cc_library_shared {
     name: "libinputservice",
+    defaults: [
+        // Build using the same flags and configurations as inputflinger.
+        "inputflinger_defaults",
+    ],
+    host_supported: false,
+
     srcs: [
         "PointerController.cpp",
         "PointerControllerContext.cpp",
@@ -50,12 +56,4 @@
     ],
 
     include_dirs: ["frameworks/native/services"],
-
-    cflags: [
-        "-Wall",
-        "-Wextra",
-        "-Werror",
-        "-Wthread-safety",
-    ],
-
 }
diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp
index e21d6fb..bb3d9d7 100644
--- a/libs/input/PointerController.cpp
+++ b/libs/input/PointerController.cpp
@@ -103,7 +103,7 @@
                                      WindowListenerConsumer unregisterListener)
       : mContext(policy, looper, spriteController, *this),
         mCursorController(mContext),
-        mDisplayInfoListener(new DisplayInfoListener(this)),
+        mDisplayInfoListener(sp<DisplayInfoListener>::make(this)),
         mUnregisterWindowInfosListener(std::move(unregisterListener)) {
     std::scoped_lock lock(getLock());
     mLocked.presentation = Presentation::SPOT;
diff --git a/libs/input/PointerControllerContext.cpp b/libs/input/PointerControllerContext.cpp
index f30e8d8..c1545107 100644
--- a/libs/input/PointerControllerContext.cpp
+++ b/libs/input/PointerControllerContext.cpp
@@ -36,8 +36,8 @@
       : mPolicy(policy),
         mLooper(looper),
         mSpriteController(spriteController),
-        mHandler(new MessageHandler()),
-        mCallback(new LooperCallback()),
+        mHandler(sp<MessageHandler>::make()),
+        mCallback(sp<LooperCallback>::make()),
         mController(controller),
         mAnimator(*this) {
     std::scoped_lock lock(mLock);
diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp
index 130b204..d40f49e 100644
--- a/libs/input/SpriteController.cpp
+++ b/libs/input/SpriteController.cpp
@@ -31,12 +31,19 @@
                                    ParentSurfaceProvider parentSurfaceProvider)
       : mLooper(looper),
         mOverlayLayer(overlayLayer),
+        mHandler(sp<Handler>::make()),
         mParentSurfaceProvider(std::move(parentSurfaceProvider)) {
-    mHandler = new WeakMessageHandler(this);
     mLocked.transactionNestingCount = 0;
     mLocked.deferredSpriteUpdate = false;
 }
 
+void SpriteController::setHandlerController(const sp<android::SpriteController>& controller) {
+    // Initialize the weak message handler outside the constructor, because we cannot get a strong
+    // pointer to self in the constructor as the initial ref count is only incremented after
+    // construction.
+    mHandler->spriteController = controller;
+}
+
 SpriteController::~SpriteController() {
     mLooper->removeMessages(mHandler);
 
@@ -47,7 +54,7 @@
 }
 
 sp<Sprite> SpriteController::createSprite() {
-    return new SpriteImpl(this);
+    return sp<SpriteImpl>::make(sp<SpriteController>::fromExisting(this));
 }
 
 void SpriteController::openTransaction() {
@@ -65,7 +72,7 @@
     mLocked.transactionNestingCount -= 1;
     if (mLocked.transactionNestingCount == 0 && mLocked.deferredSpriteUpdate) {
         mLocked.deferredSpriteUpdate = false;
-        mLooper->sendMessage(mHandler, Message(MSG_UPDATE_SPRITES));
+        mLooper->sendMessage(mHandler, Message(Handler::MSG_UPDATE_SPRITES));
     }
 }
 
@@ -76,7 +83,7 @@
         if (mLocked.transactionNestingCount != 0) {
             mLocked.deferredSpriteUpdate = true;
         } else {
-            mLooper->sendMessage(mHandler, Message(MSG_UPDATE_SPRITES));
+            mLooper->sendMessage(mHandler, Message(Handler::MSG_UPDATE_SPRITES));
         }
     }
 }
@@ -85,18 +92,7 @@
     bool wasEmpty = mLocked.disposedSurfaces.empty();
     mLocked.disposedSurfaces.push_back(surfaceControl);
     if (wasEmpty) {
-        mLooper->sendMessage(mHandler, Message(MSG_DISPOSE_SURFACES));
-    }
-}
-
-void SpriteController::handleMessage(const Message& message) {
-    switch (message.what) {
-    case MSG_UPDATE_SPRITES:
-        doUpdateSprites();
-        break;
-    case MSG_DISPOSE_SURFACES:
-        doDisposeSurfaces();
-        break;
+        mLooper->sendMessage(mHandler, Message(Handler::MSG_DISPOSE_SURFACES));
     }
 }
 
@@ -327,7 +323,7 @@
 
 void SpriteController::ensureSurfaceComposerClient() {
     if (mSurfaceComposerClient == NULL) {
-        mSurfaceComposerClient = new SurfaceComposerClient();
+        mSurfaceComposerClient = sp<SurfaceComposerClient>::make();
     }
 }
 
@@ -353,11 +349,28 @@
     return surfaceControl;
 }
 
+// --- SpriteController::Handler ---
+
+void SpriteController::Handler::handleMessage(const android::Message& message) {
+    auto controller = spriteController.promote();
+    if (!controller) {
+        return;
+    }
+
+    switch (message.what) {
+        case MSG_UPDATE_SPRITES:
+            controller->doUpdateSprites();
+            break;
+        case MSG_DISPOSE_SURFACES:
+            controller->doDisposeSurfaces();
+            break;
+    }
+}
+
 // --- SpriteController::SpriteImpl ---
 
-SpriteController::SpriteImpl::SpriteImpl(const sp<SpriteController> controller) :
-        mController(controller) {
-}
+SpriteController::SpriteImpl::SpriteImpl(const sp<SpriteController>& controller)
+      : mController(controller) {}
 
 SpriteController::SpriteImpl::~SpriteImpl() {
     AutoMutex _m(mController->mLock);
@@ -461,7 +474,7 @@
     mLocked.state.dirty |= dirty;
 
     if (!wasDirty) {
-        mController->invalidateSpriteLocked(this);
+        mController->invalidateSpriteLocked(sp<SpriteImpl>::fromExisting(this));
     }
 }
 
diff --git a/libs/input/SpriteController.h b/libs/input/SpriteController.h
index 1f113c0..3144401 100644
--- a/libs/input/SpriteController.h
+++ b/libs/input/SpriteController.h
@@ -109,7 +109,7 @@
  *
  * Clients are responsible for animating sprites by periodically updating their properties.
  */
-class SpriteController : public MessageHandler {
+class SpriteController : public RefBase {
 protected:
     virtual ~SpriteController();
 
@@ -117,6 +117,9 @@
     using ParentSurfaceProvider = std::function<sp<SurfaceControl>(int /*displayId*/)>;
     SpriteController(const sp<Looper>& looper, int32_t overlayLayer, ParentSurfaceProvider parent);
 
+    /* Initialize the callback for the message handler. */
+    void setHandlerController(const sp<SpriteController>& controller);
+
     /* Creates a new sprite, initially invisible. */
     virtual sp<Sprite> createSprite();
 
@@ -129,9 +132,12 @@
     virtual void closeTransaction();
 
 private:
-    enum {
-        MSG_UPDATE_SPRITES,
-        MSG_DISPOSE_SURFACES,
+    class Handler : public virtual android::MessageHandler {
+    public:
+        enum { MSG_UPDATE_SPRITES, MSG_DISPOSE_SURFACES };
+
+        void handleMessage(const Message& message) override;
+        wp<SpriteController> spriteController;
     };
 
     enum {
@@ -192,7 +198,7 @@
         virtual ~SpriteImpl();
 
     public:
-        explicit SpriteImpl(const sp<SpriteController> controller);
+        explicit SpriteImpl(const sp<SpriteController>& controller);
 
         virtual void setIcon(const SpriteIcon& icon);
         virtual void setVisible(bool visible);
@@ -245,7 +251,7 @@
 
     sp<Looper> mLooper;
     const int32_t mOverlayLayer;
-    sp<WeakMessageHandler> mHandler;
+    sp<Handler> mHandler;
     ParentSurfaceProvider mParentSurfaceProvider;
 
     sp<SurfaceComposerClient> mSurfaceComposerClient;
@@ -260,7 +266,6 @@
     void invalidateSpriteLocked(const sp<SpriteImpl>& sprite);
     void disposeSurfaceLocked(const sp<SurfaceControl>& surfaceControl);
 
-    void handleMessage(const Message& message);
     void doUpdateSprites();
     void doDisposeSurfaces();
 
diff --git a/libs/input/TouchSpotController.cpp b/libs/input/TouchSpotController.cpp
index d9fe599..c212608 100644
--- a/libs/input/TouchSpotController.cpp
+++ b/libs/input/TouchSpotController.cpp
@@ -39,15 +39,15 @@
 
 // --- Spot ---
 
-void TouchSpotController::Spot::updateSprite(const SpriteIcon* icon, float x, float y,
+void TouchSpotController::Spot::updateSprite(const SpriteIcon* icon, float newX, float newY,
                                              int32_t displayId) {
     sprite->setLayer(Sprite::BASE_LAYER_SPOT + id);
     sprite->setAlpha(alpha);
     sprite->setTransformationMatrix(SpriteTransformationMatrix(scale, 0.0f, 0.0f, scale));
-    sprite->setPosition(x, y);
+    sprite->setPosition(newX, newY);
     sprite->setDisplayId(displayId);
-    this->x = x;
-    this->y = y;
+    x = newX;
+    y = newY;
 
     if (icon != mLastIcon) {
         mLastIcon = icon;