MediaTranscodingService: Implement service's add/remove client APIs.

Bug: 145233472
Test: Unit test.

Change-Id: Ice22f86942bf3838c80b100c71af46ff6e217744
diff --git a/media/libmediatranscoding/TranscodingClientManager.cpp b/media/libmediatranscoding/TranscodingClientManager.cpp
index 5013a51..e26dbaa 100644
--- a/media/libmediatranscoding/TranscodingClientManager.cpp
+++ b/media/libmediatranscoding/TranscodingClientManager.cpp
@@ -17,12 +17,12 @@
 // #define LOG_NDEBUG 0
 #define LOG_TAG "TranscodingClientManager"
 
+#include <inttypes.h>
 #include <media/TranscodingClientManager.h>
 #include <utils/Log.h>
 
 namespace android {
 
-class DeathNotifier;
 using Status = ::ndk::ScopedAStatus;
 
 // static
@@ -31,9 +31,17 @@
     return sInstance;
 }
 
+// static
+void TranscodingClientManager::BinderDiedCallback(void* cookie) {
+    int32_t clientId = static_cast<int32_t>(reinterpret_cast<intptr_t>(cookie));
+    ALOGD("Client %" PRId32 " is dead", clientId);
+    // Don't check for pid validity since we know it's already dead.
+    sp<TranscodingClientManager> manager = TranscodingClientManager::getInstance();
+    manager->removeClient(clientId);
+}
+
 TranscodingClientManager::TranscodingClientManager()
-    : mDeathRecipient(AIBinder_DeathRecipient_new(
-              TranscodingClientManager::DeathNotifier::BinderDiedCallback)) {
+    : mDeathRecipient(AIBinder_DeathRecipient_new(BinderDiedCallback)) {
     ALOGD("TranscodingClientManager started");
 }
 
@@ -77,14 +85,13 @@
 
 status_t TranscodingClientManager::addClient(std::unique_ptr<ClientInfo> client) {
     // Validate the client.
-    if (client == nullptr || client->mClientId <= 0 || client->mClientPid <= 0 ||
-        client->mClientUid <= 0 || client->mClientOpPackageName.empty() ||
+    if (client == nullptr || client->mClientId < 0 || client->mClientPid < 0 ||
+        client->mClientUid < 0 || client->mClientOpPackageName.empty() ||
         client->mClientOpPackageName == "") {
         ALOGE("Invalid client");
         return BAD_VALUE;
     }
 
-    ALOGD("Adding client id %d %s", client->mClientId, client->mClientOpPackageName.c_str());
     std::scoped_lock lock{mLock};
 
     // Check if the client already exists.
@@ -93,10 +100,11 @@
         return ALREADY_EXISTS;
     }
 
-    // Listen to the death of the client.
-    client->mDeathNotifier = new DeathNotifier();
+    ALOGD("Adding client id %d pid: %d uid: %d %s", client->mClientId, client->mClientPid,
+          client->mClientUid, client->mClientOpPackageName.c_str());
+
     AIBinder_linkToDeath(client->mClient->asBinder().get(), mDeathRecipient.get(),
-                         client->mDeathNotifier.get());
+                         reinterpret_cast<void*>(client->mClientId));
 
     // Adds the new client to the map.
     mClientIdToClientInfoMap[client->mClientId] = std::move(client);
@@ -120,7 +128,7 @@
     // Check if the client still live. If alive, unlink the death.
     if (client) {
         AIBinder_unlinkToDeath(client->asBinder().get(), mDeathRecipient.get(),
-                               it->second->mDeathNotifier.get());
+                               reinterpret_cast<void*>(clientId));
     }
 
     // Erase the entry.
@@ -134,13 +142,4 @@
     return mClientIdToClientInfoMap.size();
 }
 
-// static
-void TranscodingClientManager::DeathNotifier::BinderDiedCallback(void* cookie) {
-    int32_t* pClientId = static_cast<int32_t*>(cookie);
-    ALOGD("Client %d is dead", *pClientId);
-    // Don't check for pid validity since we know it's already dead.
-    sp<TranscodingClientManager> manager = TranscodingClientManager::getInstance();
-    manager->removeClient(*pClientId);
-}
-
 }  // namespace android
diff --git a/media/libmediatranscoding/aidl/android/media/IMediaTranscodingService.aidl b/media/libmediatranscoding/aidl/android/media/IMediaTranscodingService.aidl
index 798300a..07b6c1a 100644
--- a/media/libmediatranscoding/aidl/android/media/IMediaTranscodingService.aidl
+++ b/media/libmediatranscoding/aidl/android/media/IMediaTranscodingService.aidl
@@ -75,6 +75,11 @@
     boolean unregisterClient(in int clientId);
 
     /**
+    * Returns the number of clients. This is used for debugging.
+    */
+    int getNumOfClients();
+
+    /**
      * Submits a transcoding request to MediaTranscodingService.
      *
      * @param clientId assigned Id of the client.
diff --git a/media/libmediatranscoding/include/media/TranscodingClientManager.h b/media/libmediatranscoding/include/media/TranscodingClientManager.h
index dbf837c..74a000f 100644
--- a/media/libmediatranscoding/include/media/TranscodingClientManager.h
+++ b/media/libmediatranscoding/include/media/TranscodingClientManager.h
@@ -46,10 +46,6 @@
  * TODO(hkuang): Hook up with MediaMetrics to log all the transactions.
  */
 class TranscodingClientManager : public RefBase {
-   private:
-    // Forward declare it as it will be used in ClientInfo below.
-    class DeathNotifier;
-
    public:
     virtual ~TranscodingClientManager();
 
@@ -67,8 +63,6 @@
         int32_t mClientUid;
         /* Package name of the client. */
         std::string mClientOpPackageName;
-        /* Listener for the death of the client. */
-        sp<DeathNotifier> mDeathNotifier;
 
         ClientInfo(const std::shared_ptr<ITranscodingServiceClient>& client, int64_t clientId,
                    int32_t pid, int32_t uid, const std::string& opPackageName)
@@ -76,8 +70,7 @@
               mClientId(clientId),
               mClientPid(pid),
               mClientUid(uid),
-              mClientOpPackageName(opPackageName),
-              mDeathNotifier(nullptr) {}
+              mClientOpPackageName(opPackageName) {}
     };
 
     /**
@@ -121,26 +114,17 @@
     friend class MediaTranscodingService;
     friend class TranscodingClientManagerTest;
 
-    class DeathNotifier : public RefBase {
-       public:
-        DeathNotifier() = default;
-
-        ~DeathNotifier() = default;
-
-        // Implement death recipient
-        static void BinderDiedCallback(void* cookie);
-    };
-
     /** Get the singleton instance of the TranscodingClientManager. */
     static sp<TranscodingClientManager> getInstance();
 
     TranscodingClientManager();
 
+    static void BinderDiedCallback(void* cookie);
+
     mutable std::mutex mLock;
     std::unordered_map<int32_t, std::unique_ptr<ClientInfo>> mClientIdToClientInfoMap
             GUARDED_BY(mLock);
 
-    std::vector<sp<DeathNotifier>> mDeathNotifiers GUARDED_BY(mLock);
     ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
 };