MediaPlayer2: clear MediaDrm objects upon close/reset

Bug: 112555913
Test: MediaPlayer2DrmTest
Change-Id: I3b60b0d8df4ae3273e17527975c154c80713b328
diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java
index 925ca0d..012d967 100644
--- a/media/apex/java/android/media/MediaPlayer2.java
+++ b/media/apex/java/android/media/MediaPlayer2.java
@@ -63,6 +63,8 @@
 import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -408,6 +410,7 @@
         synchronized (mDrmEventCallbackLock) {
             mDrmEventCallback = null;
         }
+        clearMediaDrmObjects();
 
         native_release();
 
@@ -418,6 +421,16 @@
         mReleased = true;
     }
 
+    void clearMediaDrmObjects() {
+        Collection<MediaDrm> drmObjs = mDrmObjs.values();
+        synchronized (mDrmObjs) {
+            for (MediaDrm drmObj : drmObjs) {
+                drmObj.close();
+            }
+            mDrmObjs.clear();
+        }
+    }
+
     private native void native_release();
 
     // Have to declare protected for finalize() since it is protected
@@ -442,6 +455,7 @@
     // This is a synchronous call.
     public void reset() {
         clearSourceInfos();
+        clearMediaDrmObjects();
 
         stayAwake(false);
         native_reset();
@@ -4504,7 +4518,7 @@
     };
 
     // Modular DRM
-    private final Map<UUID, MediaDrm> mDrmObjs = new HashMap<>();
+    private final Map<UUID, MediaDrm> mDrmObjs = Collections.synchronizedMap(new HashMap<>());
     private class DrmHandle {
 
         static final int PROVISION_TIMEOUT_MS = 60000;
@@ -4891,10 +4905,6 @@
                 mDrmObj.closeSession(mDrmSessionId);
                 mDrmSessionId = null;
             }
-            if (mDrmObj != null) {
-                mDrmObj.close();
-                mDrmObj = null;
-            }
         }
 
         void release() throws NoDrmSchemeException {