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;
         }
diff --git a/media/libmedia/include/media/DrmHal.h b/media/libmedia/include/media/DrmHal.h
index ec3a9b3..7a04458 100644
--- a/media/libmedia/include/media/DrmHal.h
+++ b/media/libmedia/include/media/DrmHal.h
@@ -119,7 +119,7 @@
     virtual status_t setPropertyString(String8 const &name, String8 const &value ) const;
     virtual status_t setPropertyByteArray(String8 const &name,
                                           Vector<uint8_t> const &value ) const;
-    virtual status_t getMetrics(MediaAnalyticsItem *item);
+    virtual status_t getMetrics(os::PersistableBundle *metrics);
 
     virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
                                         String8 const &algorithm);
diff --git a/media/libmedia/include/media/DrmMetrics.h b/media/libmedia/include/media/DrmMetrics.h
index bb7509b..b9b26c1 100644
--- a/media/libmedia/include/media/DrmMetrics.h
+++ b/media/libmedia/include/media/DrmMetrics.h
@@ -20,6 +20,7 @@
 #include <map>
 
 #include <android/hardware/drm/1.0/types.h>
+#include <binder/PersistableBundle.h>
 #include <media/CounterMetric.h>
 #include <media/EventMetric.h>
 
@@ -58,7 +59,7 @@
   // TODO: Add session start and end time support. These are a special case.
 
   // Export the metrics to a MediaAnalyticsItem.
-  void Export(MediaAnalyticsItem* item);
+  void Export(os::PersistableBundle* metricsBundle);
 };
 
 }  // namespace android
diff --git a/media/libmedia/include/media/IDrm.h b/media/libmedia/include/media/IDrm.h
index 994cade..c113240 100644
--- a/media/libmedia/include/media/IDrm.h
+++ b/media/libmedia/include/media/IDrm.h
@@ -15,6 +15,7 @@
  */
 
 #include <binder/IInterface.h>
+#include <binder/PersistableBundle.h>
 #include <media/stagefright/foundation/ABase.h>
 #include <media/drm/DrmAPI.h>
 #include <media/IDrmClient.h>
@@ -99,7 +100,7 @@
     virtual status_t setPropertyByteArray(String8 const &name,
                                           Vector<uint8_t> const &value) const = 0;
 
-    virtual status_t getMetrics(MediaAnalyticsItem *item) = 0;
+    virtual status_t getMetrics(os::PersistableBundle *metrics) = 0;
 
     virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
                                         String8 const &algorithm) = 0;