Fix DrmHal implementation to return all metrics

This change in DrmHal allows us to transfer a PersistableBundle containing
previously unavailable metrics.

Bug: 64001676
Test: CTS test for metrics and GPlay test
Change-Id: I1fa87c76dd980a3f91b4e2d02b37329f6c0a88ec
diff --git a/drm/libmediadrm/DrmHal.cpp b/drm/libmediadrm/DrmHal.cpp
index 07cec01..84456e2 100644
--- a/drm/libmediadrm/DrmHal.cpp
+++ b/drm/libmediadrm/DrmHal.cpp
@@ -54,6 +54,7 @@
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 using ::android::hidl::manager::V1_0::IServiceManager;
+using ::android::os::PersistableBundle;
 using ::android::sp;
 
 namespace {
@@ -1086,7 +1087,7 @@
     return toStatusT(status);
 }
 
-status_t DrmHal::getMetrics(MediaAnalyticsItem* item) {
+status_t DrmHal::getMetrics(PersistableBundle* item) {
     if (item == nullptr) {
       return UNEXPECTED_NULL;
     }
diff --git a/drm/libmediadrm/DrmMetrics.cpp b/drm/libmediadrm/DrmMetrics.cpp
index 258c4b0..856effd 100644
--- a/drm/libmediadrm/DrmMetrics.cpp
+++ b/drm/libmediadrm/DrmMetrics.cpp
@@ -19,6 +19,7 @@
 
 using ::android::hardware::drm::V1_0::EventType;
 using ::android::hardware::drm::V1_0::KeyStatusType;
+using ::android::os::PersistableBundle;
 
 namespace {
 
@@ -49,9 +50,9 @@
 
 template<typename T>
 void ExportCounterMetric(const android::CounterMetric<T>& counter,
-                         android::MediaAnalyticsItem* item) {
-  if (!item) {
-    ALOGE("item was unexpectedly null.");
+                         PersistableBundle* metrics) {
+  if (!metrics) {
+    ALOGE("metrics was unexpectedly null.");
     return;
   }
   std::string success_count_name = counter.metric_name() + ".ok.count";
@@ -59,13 +60,15 @@
   counter.ExportValues(
       [&] (const android::status_t status, const int64_t value) {
           if (status == android::OK) {
-              item->setInt64(success_count_name.c_str(), value);
+              metrics->putLong(android::String16(success_count_name.c_str()),
+                               value);
           } else {
               int64_t total_errors(0);
-              item->getInt64(error_count_name.c_str(), &total_errors);
-              item->setInt64(error_count_name.c_str(), total_errors + value);
+              metrics->getLong(android::String16(error_count_name.c_str()),
+                               &total_errors);
+              metrics->putLong(android::String16(error_count_name.c_str()),
+                               total_errors + value);
               // TODO: Add support for exporting the list of error values.
-              // This probably needs to be added to MediaAnalyticsItem.
           }
       });
 }
@@ -73,24 +76,24 @@
 template<typename T>
 void ExportCounterMetricWithAttributeNames(
     const android::CounterMetric<T>& counter,
-    android::MediaAnalyticsItem* item) {
-  if (!item) {
-    ALOGE("item was unexpectedly null.");
+    PersistableBundle* metrics) {
+  if (!metrics) {
+    ALOGE("metrics was unexpectedly null.");
     return;
   }
   counter.ExportValues(
       [&] (const T& attribute, const int64_t value) {
           std::string name = counter.metric_name()
               + "." + GetAttributeName(attribute) + ".count";
-          item->setInt64(name.c_str(), value);
+          metrics->putLong(android::String16(name.c_str()), value);
       });
 }
 
 template<typename T>
 void ExportEventMetric(const android::EventMetric<T>& event,
-                       android::MediaAnalyticsItem* item) {
-  if (!item) {
-    ALOGE("item was unexpectedly null.");
+                       PersistableBundle* metrics) {
+  if (!metrics) {
+    ALOGE("metrics was unexpectedly null.");
     return;
   }
   std::string success_count_name = event.metric_name() + ".ok.count";
@@ -100,15 +103,17 @@
       [&] (const android::status_t& status,
            const android::EventStatistics& value) {
           if (status == android::OK) {
-              item->setInt64(success_count_name.c_str(), value.count);
-              item->setInt64(timing_name.c_str(), value.mean);
+              metrics->putLong(android::String16(success_count_name.c_str()),
+                               value.count);
+              metrics->putLong(android::String16(timing_name.c_str()),
+                               value.mean);
           } else {
               int64_t total_errors(0);
-              item->getInt64(error_count_name.c_str(), &total_errors);
-              item->setInt64(error_count_name.c_str(),
-                             total_errors + value.count);
+              metrics->getLong(android::String16(error_count_name.c_str()),
+                               &total_errors);
+              metrics->putLong(android::String16(error_count_name.c_str()),
+                               total_errors + value.count);
               // TODO: Add support for exporting the list of error values.
-              // This probably needs to be added to MediaAnalyticsItem.
           }
       });
 }
@@ -133,20 +138,20 @@
           "drm.mediadrm.get_device_unique_id", "status") {
 }
 
-void MediaDrmMetrics::Export(MediaAnalyticsItem* item) {
-  if (!item) {
-    ALOGE("item was unexpectedly null.");
+void MediaDrmMetrics::Export(PersistableBundle* metrics) {
+  if (!metrics) {
+    ALOGE("metrics was unexpectedly null.");
     return;
   }
-  ExportCounterMetric(mOpenSessionCounter, item);
-  ExportCounterMetric(mCloseSessionCounter, item);
-  ExportEventMetric(mGetKeyRequestTiming, item);
-  ExportEventMetric(mProvideKeyResponseTiming, item);
-  ExportCounterMetric(mGetProvisionRequestCounter, item);
-  ExportCounterMetric(mProvideProvisionResponseCounter, item);
-  ExportCounterMetricWithAttributeNames(mKeyStatusChangeCounter, item);
-  ExportCounterMetricWithAttributeNames(mEventCounter, item);
-  ExportCounterMetric(mGetDeviceUniqueIdCounter, item);
+  ExportCounterMetric(mOpenSessionCounter, metrics);
+  ExportCounterMetric(mCloseSessionCounter, metrics);
+  ExportEventMetric(mGetKeyRequestTiming, metrics);
+  ExportEventMetric(mProvideKeyResponseTiming, metrics);
+  ExportCounterMetric(mGetProvisionRequestCounter, metrics);
+  ExportCounterMetric(mProvideProvisionResponseCounter, metrics);
+  ExportCounterMetricWithAttributeNames(mKeyStatusChangeCounter, metrics);
+  ExportCounterMetricWithAttributeNames(mEventCounter, metrics);
+  ExportCounterMetric(mGetDeviceUniqueIdCounter, metrics);
 }
 
 }  // namespace android
diff --git a/drm/libmediadrm/IDrm.cpp b/drm/libmediadrm/IDrm.cpp
index 63a9562..802e16f 100644
--- a/drm/libmediadrm/IDrm.cpp
+++ b/drm/libmediadrm/IDrm.cpp
@@ -508,7 +508,7 @@
         return reply.readInt32();
     }
 
-    virtual status_t getMetrics(MediaAnalyticsItem *item) {
+    virtual status_t getMetrics(os::PersistableBundle *metrics) {
         Parcel data, reply;
         data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
 
@@ -517,7 +517,7 @@
             return status;
         }
 
-        item->readFromParcel(reply);
+        metrics->readFromParcel(&reply);
         return reply.readInt32();
     }
 
@@ -1034,9 +1034,9 @@
         {
             CHECK_INTERFACE(IDrm, data, reply);
 
-            MediaAnalyticsItem item;
-            status_t result = getMetrics(&item);
-            item.writeToParcel(reply);
+            os::PersistableBundle metrics;
+            status_t result = getMetrics(&metrics);
+            metrics.writeToParcel(reply);
             reply->writeInt32(result);
             return OK;
         }