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;