OSDN Git Service

skip MediaController callbacks if it's been unregistered
authorRoboErik <epastern@google.com>
Tue, 4 Nov 2014 22:47:44 +0000 (14:47 -0800)
committerRoboErik <epastern@google.com>
Wed, 5 Nov 2014 21:07:38 +0000 (13:07 -0800)
This gives slightly better gaurantees around when an app will receive
a callback. As long as they remove a callback on the same thread calls
get posted on they won't receive any callbacks after the remove.

bug:18104724
Change-Id: Id9878186f005bf0b35c0380cd35f8fd7e67d1d90

media/java/android/media/session/MediaController.java

index e490c2b..dd6bd20 100644 (file)
@@ -449,6 +449,7 @@ public final class MediaController {
         }
         MessageHandler holder = new MessageHandler(handler.getLooper(), cb);
         mCallbacks.add(holder);
+        holder.mRegistered = true;
 
         if (!mCbRegistered) {
             try {
@@ -467,6 +468,7 @@ public final class MediaController {
             if (cb == handler.mCallback) {
                 mCallbacks.remove(i);
                 success = true;
+                handler.mRegistered = false;
             }
         }
         if (mCbRegistered && mCallbacks.size() == 0) {
@@ -956,6 +958,7 @@ public final class MediaController {
 
     private final static class MessageHandler extends Handler {
         private final MediaController.Callback mCallback;
+        private boolean mRegistered = false;
 
         public MessageHandler(Looper looper, MediaController.Callback cb) {
             super(looper, null, true);
@@ -964,6 +967,9 @@ public final class MediaController {
 
         @Override
         public void handleMessage(Message msg) {
+            if (!mRegistered) {
+                return;
+            }
             switch (msg.what) {
                 case MSG_EVENT:
                     mCallback.onSessionEvent((String) msg.obj, msg.getData());