From d64c425f32174a66a3974c63211bf457005a8d6a Mon Sep 17 00:00:00 2001 From: RoboErik Date: Fri, 21 Nov 2014 11:19:35 -0800 Subject: Delay calling onConnected until a session is set in MediaBrowser This will delay all calls to onConnected from the MediaBrowserService until a session token has been set. This also requires making it an exception to try setting the session twice. bug:18052336 Change-Id: Iecf186c53364183e1696af83a855c8db3294a5d0 --- .../android/service/media/MediaBrowserService.java | 34 +++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'media/java/android/service') diff --git a/media/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java index 0754fd4..779d486 100644 --- a/media/java/android/service/media/MediaBrowserService.java +++ b/media/java/android/service/media/MediaBrowserService.java @@ -189,8 +189,10 @@ public abstract class MediaBrowserService extends Service { } else { try { mConnections.put(b, connection); - callbacks.onConnect(connection.root.getRootId(), - mSession, connection.root.getExtras()); + if (mSession != null) { + callbacks.onConnect(connection.root.getRootId(), + mSession, connection.root.getExtras()); + } } catch (RemoteException ex) { Log.w(TAG, "Calling onConnect() failed. Dropping client. " + "pkg=" + pkg); @@ -319,16 +321,34 @@ public abstract class MediaBrowserService extends Service { /** * Call to set the media session. *

- * This must be called before onCreate returns. + * This should be called as soon as possible during the service's startup. + * It may only be called once. * * @return The media session token, must not be null. */ - public void setSessionToken(MediaSession.Token token) { + public void setSessionToken(final MediaSession.Token token) { if (token == null) { - throw new IllegalStateException(this.getClass().getName() - + ".onCreateSession() set invalid MediaSession.Token"); + throw new IllegalArgumentException("Session token may not be null."); } - mSession = token; + mHandler.post(new Runnable() { + @Override + public void run() { + if (mSession != null) { + throw new IllegalStateException("The session token has already been set."); + } + mSession = token; + for (IBinder key : mConnections.keySet()) { + ConnectionRecord connection = mConnections.get(key); + try { + connection.callbacks.onConnect(connection.root.getRootId(), mSession, + connection.root.getExtras()); + } catch (RemoteException e) { + Log.w(TAG, "Connection for " + connection.pkg + " is no longer valid."); + mConnections.remove(key); + } + } + } + }); } /** -- cgit v1.1