Convert IResourceManagerService to stable AIDL
Convert with minimal change to the interface itself.
Add additional test to cover DrmSessionManager's usage
of possible negative value field (which is signed now).
bug: 142396029
test: ResourceManagerService_test, DrmSessionManager_test,
CTS ResourceManagerServiceTest;
Manually check battery stats reporting.
Change-Id: I5c537a54efc2663281c96ddbdbd4ee56f23c1adf
diff --git a/drm/libmediadrm/DrmHal.cpp b/drm/libmediadrm/DrmHal.cpp
index bd4b521..cac90ea 100644
--- a/drm/libmediadrm/DrmHal.cpp
+++ b/drm/libmediadrm/DrmHal.cpp
@@ -25,6 +25,7 @@
#include <android/hardware/drm/1.2/types.h>
#include <android/hidl/manager/1.2/IServiceManager.h>
+#include <android/media/BnResourceManagerClient.h>
#include <hidl/ServiceManagement.h>
#include <media/EventMetric.h>
#include <media/PluginMetricsReporting.h>
@@ -295,21 +296,43 @@
Mutex DrmHal::mLock;
-bool DrmHal::DrmSessionClient::reclaimResource() {
+struct DrmHal::DrmSessionClient : public android::media::BnResourceManagerClient {
+ explicit DrmSessionClient(DrmHal* drm, const Vector<uint8_t>& sessionId)
+ : mSessionId(sessionId),
+ mDrm(drm) {}
+
+ ::android::binder::Status reclaimResource(bool* _aidl_return) override;
+ ::android::binder::Status getName(::std::string* _aidl_return) override;
+
+ const Vector<uint8_t> mSessionId;
+
+protected:
+ virtual ~DrmSessionClient();
+
+private:
+ wp<DrmHal> mDrm;
+
+ DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient);
+};
+
+::android::binder::Status DrmHal::DrmSessionClient::reclaimResource(bool* _aidl_return) {
sp<DrmHal> drm = mDrm.promote();
if (drm == NULL) {
- return true;
+ *_aidl_return = true;
+ return ::android::binder::Status::ok();
}
status_t err = drm->closeSession(mSessionId);
if (err != OK) {
- return false;
+ *_aidl_return = false;
+ return ::android::binder::Status::ok();
}
drm->sendEvent(EventType::SESSION_RECLAIMED,
toHidlVec(mSessionId), hidl_vec<uint8_t>());
- return true;
+ *_aidl_return = true;
+ return ::android::binder::Status::ok();
}
-String8 DrmHal::DrmSessionClient::getName() {
+::android::binder::Status DrmHal::DrmSessionClient::getName(::std::string* _aidl_return) {
String8 name;
sp<DrmHal> drm = mDrm.promote();
if (drm == NULL) {
@@ -323,7 +346,8 @@
name.appendFormat("%02x", mSessionId[i]);
}
name.append("]");
- return name;
+ *_aidl_return = name;
+ return ::android::binder::Status::ok();
}
DrmHal::DrmSessionClient::~DrmSessionClient() {
diff --git a/drm/libmediadrm/DrmSessionManager.cpp b/drm/libmediadrm/DrmSessionManager.cpp
index 0b927ef..0b91b85 100644
--- a/drm/libmediadrm/DrmSessionManager.cpp
+++ b/drm/libmediadrm/DrmSessionManager.cpp
@@ -18,11 +18,12 @@
#define LOG_TAG "DrmSessionManager"
#include <utils/Log.h>
+#include <android/media/IResourceManagerClient.h>
+#include <android/media/IResourceManagerService.h>
#include <binder/IPCThreadState.h>
#include <binder/IProcessInfoService.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
-#include <media/IResourceManagerClient.h>
#include <media/MediaResource.h>
#include <mediadrm/DrmSessionManager.h>
#include <unistd.h>
@@ -33,6 +34,7 @@
#include "ResourceManagerService.h"
namespace android {
+using android::binder::Status;
static String8 GetSessionIdString(const Vector<uint8_t> &sessionId) {
String8 sessionIdStr;
@@ -52,16 +54,16 @@
return reinterpret_cast<int64_t>(drm.get());
}
-static Vector<MediaResource> toResourceVec(const Vector<uint8_t> &sessionId) {
- Vector<MediaResource> resources;
- // use UINT64_MAX to decrement through addition overflow
- resources.push_back(MediaResource(MediaResource::kDrmSession, toStdVec(sessionId), UINT64_MAX));
+static std::vector<MediaResourceParcel> toResourceVec(
+ const Vector<uint8_t> &sessionId, int64_t value) {
+ std::vector<MediaResourceParcel> resources;
+ resources.push_back(MediaResource::DrmSessionResource(toStdVec(sessionId), value));
return resources;
}
static sp<IResourceManagerService> getResourceManagerService() {
if (property_get_bool("persist.device_config.media_native.mediadrmserver", 1)) {
- return new ResourceManagerService();
+ return new android::media::ResourceManagerService();
}
sp<IServiceManager> sm = defaultServiceManager();
if (sm == NULL) {
@@ -131,7 +133,7 @@
int64_t clientId = toClientId(drm);
mSessionMap[toStdVec(sessionId)] = (SessionInfo){pid, uid, clientId};
- mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId));
+ mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId, INT64_MAX));
}
void DrmSessionManager::useSession(const Vector<uint8_t> &sessionId) {
@@ -144,7 +146,7 @@
}
auto info = it->second;
- mService->addResource(info.pid, info.uid, info.clientId, NULL, toResourceVec(sessionId));
+ mService->addResource(info.pid, info.uid, info.clientId, NULL, toResourceVec(sessionId, -1));
}
void DrmSessionManager::removeSession(const Vector<uint8_t> &sessionId) {
@@ -157,7 +159,7 @@
}
auto info = it->second;
- mService->removeResource(info.pid, info.clientId, toResourceVec(sessionId));
+ mService->removeResource(info.pid, info.clientId, toResourceVec(sessionId, INT64_MAX));
mSessionMap.erase(it);
}
@@ -176,7 +178,9 @@
// cannot update mSessionMap because we do not know which sessionId is reclaimed;
// we rely on IResourceManagerClient to removeSession in reclaimResource
Vector<uint8_t> dummy;
- return service->reclaimResource(callingPid, toResourceVec(dummy));
+ bool success;
+ Status status = service->reclaimResource(callingPid, toResourceVec(dummy, INT64_MAX), &success);
+ return status.isOk() && success;
}
size_t DrmSessionManager::getSessionCount() const {
diff --git a/drm/libmediadrm/include/mediadrm/DrmHal.h b/drm/libmediadrm/include/mediadrm/DrmHal.h
index 542d300..0431c93 100644
--- a/drm/libmediadrm/include/mediadrm/DrmHal.h
+++ b/drm/libmediadrm/include/mediadrm/DrmHal.h
@@ -26,7 +26,6 @@
#include <android/hardware/drm/1.2/IDrmPlugin.h>
#include <android/hardware/drm/1.2/IDrmPluginListener.h>
-#include <media/IResourceManagerService.h>
#include <media/MediaAnalyticsItem.h>
#include <mediadrm/DrmMetrics.h>
#include <mediadrm/DrmSessionManager.h>
@@ -62,24 +61,7 @@
public IBinder::DeathRecipient,
public IDrmPluginListener_V1_2 {
- struct DrmSessionClient : public BnResourceManagerClient {
- explicit DrmSessionClient(DrmHal* drm, const Vector<uint8_t>& sessionId)
- : mSessionId(sessionId),
- mDrm(drm) {}
-
- virtual bool reclaimResource();
- virtual String8 getName();
-
- const Vector<uint8_t> mSessionId;
-
- protected:
- virtual ~DrmSessionClient();
-
- private:
- wp<DrmHal> mDrm;
-
- DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient);
- };
+ struct DrmSessionClient;
DrmHal();
virtual ~DrmHal();
diff --git a/drm/libmediadrm/include/mediadrm/DrmSessionManager.h b/drm/libmediadrm/include/mediadrm/DrmSessionManager.h
index b1ad580..3258f7a 100644
--- a/drm/libmediadrm/include/mediadrm/DrmSessionManager.h
+++ b/drm/libmediadrm/include/mediadrm/DrmSessionManager.h
@@ -19,7 +19,6 @@
#define DRM_SESSION_MANAGER_H_
#include <binder/IBinder.h>
-#include <media/IResourceManagerService.h>
#include <media/stagefright/foundation/ABase.h>
#include <utils/RefBase.h>
#include <utils/KeyedVector.h>
@@ -33,7 +32,13 @@
namespace android {
class DrmSessionManagerTest;
+
+namespace media {
class IResourceManagerClient;
+class IResourceManagerService;
+}
+using android::media::IResourceManagerClient;
+using android::media::IResourceManagerService;
bool isEqualSessionId(const Vector<uint8_t> &sessionId1, const Vector<uint8_t> &sessionId2);