Close all open drm sessions before destroying a plugin.

MediaDrm relies on each plugin to close its open sessions
when the plugin is destroyed. This change ensures that all
sessions will be closed even if the plugin does not do it.

b/38323088

Change-Id: I8b6e36182f3b3bc765963819101868fc46001527
diff --git a/drm/libmediadrm/DrmHal.cpp b/drm/libmediadrm/DrmHal.cpp
index 386546f..6d54fa5 100644
--- a/drm/libmediadrm/DrmHal.cpp
+++ b/drm/libmediadrm/DrmHal.cpp
@@ -194,7 +194,18 @@
      mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) {
 }
 
+void DrmHal::closeOpenSessions() {
+    if (mPlugin != NULL) {
+        for (size_t i = 0; i < mOpenSessions.size(); i++) {
+            mPlugin->closeSession(toHidlVec(mOpenSessions[i]));
+            DrmSessionManager::Instance()->removeSession(mOpenSessions[i]);
+        }
+    }
+    mOpenSessions.clear();
+}
+
 DrmHal::~DrmHal() {
+    closeOpenSessions();
     DrmSessionManager::Instance()->removeDrm(mDrmSessionClient);
 }
 
@@ -405,11 +416,11 @@
 
 status_t DrmHal::destroyPlugin() {
     Mutex::Autolock autoLock(mLock);
-
     if (mInitCheck != OK) {
         return mInitCheck;
     }
 
+    closeOpenSessions();
     setListener(NULL);
     if (mPlugin != NULL) {
         mPlugin->setListener(NULL);
@@ -461,6 +472,7 @@
     if (err == OK) {
         DrmSessionManager::Instance()->addSession(getCallingPid(),
                 mDrmSessionClient, sessionId);
+        mOpenSessions.push(sessionId);
     }
     return err;
 }
@@ -475,6 +487,12 @@
     Status status = mPlugin->closeSession(toHidlVec(sessionId));
     if (status == Status::OK) {
         DrmSessionManager::Instance()->removeSession(sessionId);
+        for (size_t i = 0; i < mOpenSessions.size(); i++) {
+            if (mOpenSessions[i] == sessionId) {
+                mOpenSessions.removeAt(i);
+                break;
+            }
+        }
     }
     return toStatusT(status);
 }
@@ -962,6 +980,7 @@
 void DrmHal::binderDied(const wp<IBinder> &the_late_who __unused)
 {
     Mutex::Autolock autoLock(mLock);
+    closeOpenSessions();
     setListener(NULL);
     if (mPlugin != NULL) {
         mPlugin->setListener(NULL);