From 8e67b4d9f1d2a31732443437e2cb6d47a60631b7 Mon Sep 17 00:00:00 2001 From: kai Date: Tue, 29 Aug 2017 15:13:03 -0700 Subject: [PATCH] MediaBrowserService: Clean up ConnectionRecord when browser is dead This CL cleans up connectionRecords when binder dead and the connection is lost. Bug: 65132577 Test: check the number of ConnectionRecord, kill the media app, check the number again. Change-Id: I8b31745bcee220b9e70c3f43d7fc9d8dc3f6b83a --- .../service/media/MediaBrowserService.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/media/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java index b52906ddd1aed..4087e31660eef 100644 --- a/media/java/android/service/media/MediaBrowserService.java +++ b/media/java/android/service/media/MediaBrowserService.java @@ -110,12 +110,22 @@ public abstract class MediaBrowserService extends Service { /** * All the info about a connection. */ - private class ConnectionRecord { + private class ConnectionRecord implements IBinder.DeathRecipient { String pkg; Bundle rootHints; IMediaBrowserServiceCallbacks callbacks; BrowserRoot root; HashMap>> subscriptions = new HashMap<>(); + + @Override + public void binderDied() { + mHandler.post(new Runnable() { + @Override + public void run() { + mConnections.remove(callbacks.asBinder()); + } + }); + } } /** @@ -207,7 +217,6 @@ public abstract class MediaBrowserService extends Service { connection.pkg = pkg; connection.rootHints = rootHints; connection.callbacks = callbacks; - connection.root = MediaBrowserService.this.onGetRoot(pkg, uid, rootHints); // If they didn't return something, don't allow this client. @@ -223,6 +232,7 @@ public abstract class MediaBrowserService extends Service { } else { try { mConnections.put(b, connection); + b.linkToDeath(connection, 0); if (mSession != null) { callbacks.onConnect(connection.root.getRootId(), mSession, connection.root.getExtras()); @@ -248,6 +258,7 @@ public abstract class MediaBrowserService extends Service { final ConnectionRecord old = mConnections.remove(b); if (old != null) { // TODO + old.callbacks.asBinder().unlinkToDeath(old, 0); } } });