From 3e0cfcda31301e53c92cb2f91ed8be1cd6efd8bc Mon Sep 17 00:00:00 2001 From: RoboErik Date: Tue, 4 Nov 2014 14:47:44 -0800 Subject: [PATCH] skip MediaController callbacks if it's been unregistered 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 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index e490c2be8f9c8..dd6bd208d5915 100644 --- a/media/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java @@ -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());