MediaSessionManager: make the binder implementation static

Removing references to application resources on unregistering so that they
can be GCed as ealry as possible.

Bug: https://code.google.com/p/android/issues/detail?id=161398
Change-Id: Icc083f4a58bb5e738aa662247dc83d021a9dc5c3
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 6ac0efb..2364a13 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -202,7 +202,8 @@
                 Log.w(TAG, "Attempted to add session listener twice, ignoring.");
                 return;
             }
-            SessionsChangedWrapper wrapper = new SessionsChangedWrapper(sessionListener, handler);
+            SessionsChangedWrapper wrapper = new SessionsChangedWrapper(mContext, sessionListener,
+                    handler);
             try {
                 mService.addSessionsListener(wrapper.mStub, notificationListener, userId);
                 mListeners.put(sessionListener, wrapper);
@@ -229,6 +230,8 @@
                     mService.removeSessionsListener(wrapper.mStub);
                 } catch (RemoteException e) {
                     Log.e(TAG, "Error in removeOnActiveSessionsChangedListener.", e);
+                } finally {
+                    wrapper.release();
                 }
             }
         }
@@ -317,11 +320,14 @@
         public void onActiveSessionsChanged(@Nullable List<MediaController> controllers);
     }
 
-    private final class SessionsChangedWrapper {
-        private final OnActiveSessionsChangedListener mListener;
-        private final Handler mHandler;
+    private static final class SessionsChangedWrapper {
+        private Context mContext;
+        private OnActiveSessionsChangedListener mListener;
+        private Handler mHandler;
 
-        public SessionsChangedWrapper(OnActiveSessionsChangedListener listener, Handler handler) {
+        public SessionsChangedWrapper(Context context, OnActiveSessionsChangedListener listener,
+                Handler handler) {
+            mContext = context;
             mListener = listener;
             mHandler = handler;
         }
@@ -333,17 +339,25 @@
                     mHandler.post(new Runnable() {
                         @Override
                         public void run() {
-                            ArrayList<MediaController> controllers
-                                    = new ArrayList<MediaController>();
-                            int size = tokens.size();
-                            for (int i = 0; i < size; i++) {
-                                controllers.add(new MediaController(mContext, tokens.get(i)));
+                            if (mListener != null) {
+                                ArrayList<MediaController> controllers
+                                        = new ArrayList<MediaController>();
+                                int size = tokens.size();
+                                for (int i = 0; i < size; i++) {
+                                    controllers.add(new MediaController(mContext, tokens.get(i)));
+                                }
+                                mListener.onActiveSessionsChanged(controllers);
                             }
-                            mListener.onActiveSessionsChanged(controllers);
                         }
                     });
                 }
             }
         };
+
+        private void release() {
+            mContext = null;
+            mListener = null;
+            mHandler = null;
+        }
     }
 }