transcoding: add more dumps for jobs

bug: 154733526
test: run the following to monitor transcoding status:

watch -n 1 adb shell dumpsys media.transcoding

Change-Id: I167bae9adcff2f80b26aefb520b4ab6d493e3f9d
diff --git a/media/libmediatranscoding/TranscodingClientManager.cpp b/media/libmediatranscoding/TranscodingClientManager.cpp
index d9f3f28..3f79705 100644
--- a/media/libmediatranscoding/TranscodingClientManager.cpp
+++ b/media/libmediatranscoding/TranscodingClientManager.cpp
@@ -282,16 +282,16 @@
     char buffer[SIZE];
     std::scoped_lock lock{mLock};
 
-    snprintf(buffer, SIZE, "    Total num of Clients: %zu\n", mClientIdToClientMap.size());
-    result.append(buffer);
-
     if (mClientIdToClientMap.size() > 0) {
-        snprintf(buffer, SIZE, "========== Dumping all clients =========\n");
+        snprintf(buffer, SIZE, "\n========== Dumping all clients =========\n");
         result.append(buffer);
     }
 
+    snprintf(buffer, SIZE, "  Total num of Clients: %zu\n", mClientIdToClientMap.size());
+    result.append(buffer);
+
     for (const auto& iter : mClientIdToClientMap) {
-        snprintf(buffer, SIZE, "    -- Client id: %lld  name: %s\n", (long long)iter.first,
+        snprintf(buffer, SIZE, "    Client %lld:  pkg: %s\n", (long long)iter.first,
                  iter.second->mClientName.c_str());
         result.append(buffer);
     }
diff --git a/media/libmediatranscoding/TranscodingJobScheduler.cpp b/media/libmediatranscoding/TranscodingJobScheduler.cpp
index 8045043..d3a1836 100644
--- a/media/libmediatranscoding/TranscodingJobScheduler.cpp
+++ b/media/libmediatranscoding/TranscodingJobScheduler.cpp
@@ -21,6 +21,7 @@
 
 #include <inttypes.h>
 #include <media/TranscodingJobScheduler.h>
+#include <media/TranscodingUidPolicy.h>
 #include <utils/Log.h>
 
 #include <utility>
@@ -36,6 +37,21 @@
     return String8::format("{client:%lld, job:%d}", (long long)jobKey.first, jobKey.second);
 }
 
+//static
+const char* TranscodingJobScheduler::jobStateToString(const Job::State jobState) {
+    switch (jobState) {
+    case Job::State::NOT_STARTED:
+        return "NOT_STARTED";
+    case Job::State::RUNNING:
+        return "RUNNING";
+    case Job::State::PAUSED:
+        return "PAUSED";
+    default:
+        break;
+    }
+    return "(unknown)";
+}
+
 TranscodingJobScheduler::TranscodingJobScheduler(
         const std::shared_ptr<TranscoderInterface>& transcoder,
         const std::shared_ptr<UidPolicyInterface>& uidPolicy,
@@ -60,24 +76,46 @@
     char buffer[SIZE];
     std::scoped_lock lock{mLock};
 
-    snprintf(buffer, SIZE, " \n\n   Total num of Jobs: %zu\n", mJobMap.size());
+    snprintf(buffer, SIZE, "\n========== Dumping all jobs queues =========\n");
+    result.append(buffer);
+    snprintf(buffer, SIZE, "  Total num of Jobs: %zu\n", mJobMap.size());
     result.append(buffer);
 
-    if (mJobMap.size() > 0) {
-        snprintf(buffer, SIZE, "========== Dumping all jobs =========\n");
-        result.append(buffer);
+    std::vector<int32_t> uids(mUidSortedList.begin(), mUidSortedList.end());
+    // Exclude last uid, which is for offline queue
+    uids.pop_back();
+    std::vector<std::string> packageNames;
+    if (TranscodingUidPolicy::getNamesForUids(uids, &packageNames)) {
+        uids.push_back(OFFLINE_UID);
+        packageNames.push_back("(offline)");
     }
 
-    for (auto uidIt = mUidSortedList.begin(); uidIt != mUidSortedList.end(); uidIt++) {
-        for (auto jobIt = mJobQueues[*uidIt].begin(); jobIt != mJobQueues[*uidIt].end(); jobIt++) {
-            if (mJobMap.count(*jobIt) != 0) {
-                TranscodingRequestParcel& request = mJobMap[*jobIt].request;
-                snprintf(buffer, SIZE, "Job: %s Client: %d\n", request.sourceFilePath.c_str(),
-                         request.clientUid);
+    for (int32_t i = 0; i < uids.size(); i++) {
+        const uid_t uid = uids[i];
 
-            } else {
-                snprintf(buffer, SIZE, "Failed to look up Job %s  \n", jobToString(*jobIt).c_str());
+        if (mJobQueues[uid].empty()) {
+            continue;
+        }
+        snprintf(buffer, SIZE, "    Uid: %d, pkg: %s\n", uid,
+                 packageNames.empty() ? "(unknown)" : packageNames[i].c_str());
+        result.append(buffer);
+        snprintf(buffer, SIZE, "      Num of jobs: %zu\n", mJobQueues[uid].size());
+        result.append(buffer);
+        for (auto& jobKey : mJobQueues[uid]) {
+            auto jobIt = mJobMap.find(jobKey);
+            if (jobIt == mJobMap.end()) {
+                snprintf(buffer, SIZE, "Failed to look up Job %s  \n", jobToString(jobKey).c_str());
+                result.append(buffer);
+                continue;
             }
+            Job& job = jobIt->second;
+            TranscodingRequestParcel& request = job.request;
+            snprintf(buffer, SIZE, "      Job: %s, %s, %d%%\n", jobToString(jobKey).c_str(),
+                     jobStateToString(job.state), job.lastProgress);
+            result.append(buffer);
+            snprintf(buffer, SIZE, "        Src: %s\n", request.sourceFilePath.c_str());
+            result.append(buffer);
+            snprintf(buffer, SIZE, "        Dst: %s\n", request.destinationFilePath.c_str());
             result.append(buffer);
         }
     }
@@ -240,6 +278,7 @@
     mJobMap[jobKey].key = jobKey;
     mJobMap[jobKey].uid = uid;
     mJobMap[jobKey].state = Job::NOT_STARTED;
+    mJobMap[jobKey].lastProgress = 0;
     mJobMap[jobKey].request = request;
     mJobMap[jobKey].callback = callback;
 
@@ -431,6 +470,7 @@
         if (callback != nullptr) {
             callback->onProgressUpdate(jobId, progress);
         }
+        mJobMap[jobKey].lastProgress = progress;
     });
 }
 
@@ -509,15 +549,15 @@
                         "mUidList and mJobQueues size mismatch");
 
     int32_t totalJobs = 0;
-    for (auto uidIt = mUidSortedList.begin(); uidIt != mUidSortedList.end(); uidIt++) {
-        LOG_ALWAYS_FATAL_IF(mJobQueues.count(*uidIt) != 1, "mJobQueues count for uid %d is not 1",
-                            *uidIt);
-        for (auto jobIt = mJobQueues[*uidIt].begin(); jobIt != mJobQueues[*uidIt].end(); jobIt++) {
-            LOG_ALWAYS_FATAL_IF(mJobMap.count(*jobIt) != 1, "mJobs count for job %s is not 1",
-                                jobToString(*jobIt).c_str());
+    for (auto uid : mUidSortedList) {
+        LOG_ALWAYS_FATAL_IF(mJobQueues.count(uid) != 1, "mJobQueues count for uid %d is not 1",
+                            uid);
+        for (auto& jobKey : mJobQueues[uid]) {
+            LOG_ALWAYS_FATAL_IF(mJobMap.count(jobKey) != 1, "mJobs count for job %s is not 1",
+                                jobToString(jobKey).c_str());
         }
 
-        totalJobs += mJobQueues[*uidIt].size();
+        totalJobs += mJobQueues[uid].size();
     }
     LOG_ALWAYS_FATAL_IF(mJobMap.size() != totalJobs,
                         "mJobs size doesn't match total jobs counted from uid queues");
diff --git a/media/libmediatranscoding/TranscodingUidPolicy.cpp b/media/libmediatranscoding/TranscodingUidPolicy.cpp
index fd41f65..f0d4945 100644
--- a/media/libmediatranscoding/TranscodingUidPolicy.cpp
+++ b/media/libmediatranscoding/TranscodingUidPolicy.cpp
@@ -21,7 +21,9 @@
 #include <aidl/android/media/IResourceManagerService.h>
 #include <android/binder_manager.h>
 #include <android/binder_process.h>
+#include <android/content/pm/IPackageManagerNative.h>
 #include <binder/ActivityManager.h>
+#include <binder/IServiceManager.h>
 #include <cutils/misc.h>  // FIRST_APPLICATION_UID
 #include <inttypes.h>
 #include <media/TranscodingUidPolicy.h>
@@ -109,6 +111,28 @@
 
 ////////////////////////////////////////////////////////////////////////////
 
+//static
+bool TranscodingUidPolicy::getNamesForUids(const std::vector<int32_t>& uids,
+                                           std::vector<std::string>* names) {
+    names->clear();
+    sp<IServiceManager> sm(defaultServiceManager());
+    sp<IBinder> binder(sm->getService(String16("package_native")));
+    if (binder == nullptr) {
+        ALOGE("getService package_native failed");
+        return false;
+    }
+
+    sp<content::pm::IPackageManagerNative> packageMgr =
+            interface_cast<content::pm::IPackageManagerNative>(binder);
+    binder::Status status = packageMgr->getNamesForUids(uids, names);
+
+    if (!status.isOk() || names->size() != uids.size()) {
+        names->clear();
+        return false;
+    }
+    return true;
+}
+
 TranscodingUidPolicy::TranscodingUidPolicy()
       : mAm(std::make_shared<ActivityManager>()),
         mUidObserver(new UidObserver(this)),
diff --git a/media/libmediatranscoding/include/media/TranscodingJobScheduler.h b/media/libmediatranscoding/include/media/TranscodingJobScheduler.h
index b6efa59..7a656d5 100644
--- a/media/libmediatranscoding/include/media/TranscodingJobScheduler.h
+++ b/media/libmediatranscoding/include/media/TranscodingJobScheduler.h
@@ -82,11 +82,12 @@
     struct Job {
         JobKeyType key;
         uid_t uid;
-        enum JobState {
+        enum State {
             NOT_STARTED,
             RUNNING,
             PAUSED,
         } state;
+        int32_t lastProgress;
         TranscodingRequest request;
         std::weak_ptr<ITranscodingClientCallback> callback;
     };
@@ -127,6 +128,7 @@
     void validateState_l();
 
     static String8 jobToString(const JobKeyType& jobKey);
+    static const char* jobStateToString(const Job::State jobState);
 };
 
 }  // namespace android
diff --git a/media/libmediatranscoding/include/media/TranscodingUidPolicy.h b/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
index 8319eee..42052cb 100644
--- a/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
+++ b/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
@@ -47,6 +47,9 @@
     void unregisterMonitorUid(uid_t uid) override;
     std::unordered_set<uid_t> getTopUids() const override;
     void setCallback(const std::shared_ptr<UidPolicyCallbackInterface>& cb) override;
+    // ~UidPolicyInterface
+
+    static bool getNamesForUids(const std::vector<int32_t>& uids, std::vector<std::string>* names);
 
 private:
     void onUidStateChanged(uid_t uid, int32_t procState);
diff --git a/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp b/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
index 41f3ada..c2ca9b4 100644
--- a/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
+++ b/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
@@ -235,19 +235,19 @@
     ~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
 
     void addMultipleClients() {
-        EXPECT_EQ(mClientManager->addClient(mClientCallback1, kClientName,
-                                            kClientPackage, &mClient1),
-                  OK);
+        EXPECT_EQ(
+                mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &mClient1),
+                OK);
         EXPECT_NE(mClient1, nullptr);
 
-        EXPECT_EQ(mClientManager->addClient(mClientCallback2, kClientName,
-                                            kClientPackage, &mClient2),
-                  OK);
+        EXPECT_EQ(
+                mClientManager->addClient(mClientCallback2, kClientName, kClientPackage, &mClient2),
+                OK);
         EXPECT_NE(mClient2, nullptr);
 
-        EXPECT_EQ(mClientManager->addClient(mClientCallback3, kClientName,
-                                            kClientPackage, &mClient3),
-                  OK);
+        EXPECT_EQ(
+                mClientManager->addClient(mClientCallback3, kClientName, kClientPackage, &mClient3),
+                OK);
         EXPECT_NE(mClient3, nullptr);
 
         EXPECT_EQ(mClientManager->getNumOfClients(), 3);
@@ -273,8 +273,7 @@
 TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientCallback) {
     // Add a client with null callback and expect failure.
     std::shared_ptr<ITranscodingClient> client;
-    status_t err = mClientManager->addClient(nullptr, kClientName,
-                                             kClientPackage, &client);
+    status_t err = mClientManager->addClient(nullptr, kClientName, kClientPackage, &client);
     EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
 }
 //
@@ -289,24 +288,24 @@
 TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientName) {
     // Add a client with invalid name and expect failure.
     std::shared_ptr<ITranscodingClient> client;
-    status_t err = mClientManager->addClient(mClientCallback1,
-                                             kInvalidClientName, kClientPackage, &client);
+    status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientName, kClientPackage,
+                                             &client);
     EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
 }
 
 TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
     // Add a client with invalid packagename and expect failure.
     std::shared_ptr<ITranscodingClient> client;
-    status_t err = mClientManager->addClient(mClientCallback1, kClientName,
-                                             kInvalidClientPackage, &client);
+    status_t err = mClientManager->addClient(mClientCallback1, kClientName, kInvalidClientPackage,
+                                             &client);
     EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
 }
 
 TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
     // Add a valid client, should succeed.
     std::shared_ptr<ITranscodingClient> client;
-    status_t err = mClientManager->addClient(mClientCallback1, kClientName,
-                                             kClientPackage, &client);
+    status_t err =
+            mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client);
     EXPECT_EQ(err, OK);
     EXPECT_NE(client.get(), nullptr);
     EXPECT_EQ(mClientManager->getNumOfClients(), 1);
@@ -319,15 +318,14 @@
 
 TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) {
     std::shared_ptr<ITranscodingClient> client;
-    status_t err = mClientManager->addClient(mClientCallback1, kClientName,
-                                             kClientPackage, &client);
+    status_t err =
+            mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client);
     EXPECT_EQ(err, OK);
     EXPECT_NE(client.get(), nullptr);
     EXPECT_EQ(mClientManager->getNumOfClients(), 1);
 
     std::shared_ptr<ITranscodingClient> dupClient;
-    err = mClientManager->addClient(mClientCallback1, "dupClient",
-                                    "dupPackage", &dupClient);
+    err = mClientManager->addClient(mClientCallback1, "dupClient", "dupPackage", &dupClient);
     EXPECT_EQ(err, IMediaTranscodingService::ERROR_ALREADY_EXISTS);
     EXPECT_EQ(dupClient.get(), nullptr);
     EXPECT_EQ(mClientManager->getNumOfClients(), 1);
@@ -474,8 +472,8 @@
 TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
     // Add a client.
     std::shared_ptr<ITranscodingClient> client;
-    status_t err = mClientManager->addClient(mClientCallback1, kClientName,
-                                             kClientPackage, &client);
+    status_t err =
+            mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client);
     EXPECT_EQ(err, OK);
     EXPECT_NE(client.get(), nullptr);