From e34c09daf89fb888fe2638e71758573462d85173 Mon Sep 17 00:00:00 2001 From: RoboErik Date: Thu, 24 Jul 2014 10:20:41 -0700 Subject: [PATCH] Finish plumbing for launch intents in sessions This finishes out the plumbing for setting a launchable PendingIntent on a session and getting it from a controller to launch an app's UI. Change-Id: I0c9506e7c3f0ebf57070ca7e0d91324eb3fdd1e1 --- api/current.txt | 3 ++- media/java/android/media/session/ISession.aidl | 2 ++ .../media/session/ISessionController.aidl | 2 ++ .../android/media/session/MediaController.java | 16 ++++++++++++++++ .../java/android/media/session/MediaSession.java | 12 +++++++++--- .../android/server/media/MediaSessionRecord.java | 12 ++++++++++++ 6 files changed, 43 insertions(+), 4 deletions(-) diff --git a/api/current.txt b/api/current.txt index 292123ee0ab89..9b211c28201ff 100644 --- a/api/current.txt +++ b/api/current.txt @@ -16578,6 +16578,7 @@ package android.media.session { method public android.media.routing.MediaRouter.Delegate createMediaRouterDelegate(); method public boolean dispatchMediaButtonEvent(android.view.KeyEvent); method public long getFlags(); + method public android.app.PendingIntent getLaunchActivity(); method public android.media.MediaMetadata getMetadata(); method public android.media.session.PlaybackState getPlaybackState(); method public java.util.List getQueue(); @@ -16641,7 +16642,7 @@ package android.media.session { method public void setActive(boolean); method public void setExtras(android.os.Bundle); method public void setFlags(int); - method public void setLaunchPendingIntent(android.app.PendingIntent); + method public void setLaunchActivity(android.app.PendingIntent); method public void setMediaRouter(android.media.routing.MediaRouter); method public void setMetadata(android.media.MediaMetadata); method public void setPlaybackState(android.media.session.PlaybackState); diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl index 2c190b7884885..0b8b0d4a139e4 100644 --- a/media/java/android/media/session/ISession.aidl +++ b/media/java/android/media/session/ISession.aidl @@ -15,6 +15,7 @@ package android.media.session; +import android.app.PendingIntent; import android.content.ComponentName; import android.content.pm.ParceledListSlice; import android.media.AudioAttributes; @@ -37,6 +38,7 @@ interface ISession { void setActive(boolean active); void setMediaRouter(in IMediaRouter router); void setMediaButtonReceiver(in ComponentName mbr); + void setLaunchPendingIntent(in PendingIntent pi); void destroy(); // These commands are for the TransportPerformer diff --git a/media/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl index d20b0ad505eec..198309594b399 100644 --- a/media/java/android/media/session/ISessionController.aidl +++ b/media/java/android/media/session/ISessionController.aidl @@ -15,6 +15,7 @@ package android.media.session; +import android.app.PendingIntent; import android.content.Intent; import android.content.pm.ParceledListSlice; import android.media.MediaMetadata; @@ -44,6 +45,7 @@ interface ISessionController { void unregisterCallbackListener(in ISessionControllerCallback cb); boolean isTransportControlEnabled(); MediaSessionInfo getSessionInfo(); + PendingIntent getLaunchPendingIntent(); long getFlags(); ParcelableVolumeInfo getVolumeAttributes(); void adjustVolume(int direction, int flags); diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index 89c61c84f7f21..776bbaa75fbca 100644 --- a/media/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java @@ -18,6 +18,7 @@ package android.media.session; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.PendingIntent; import android.content.pm.ParceledListSlice; import android.media.AudioAttributes; import android.media.AudioManager; @@ -240,6 +241,21 @@ public final class MediaController { return null; } + /** + * Get an intent for launching UI associated with this session if one + * exists. + * + * @return A {@link PendingIntent} to launch UI or null. + */ + public @Nullable PendingIntent getLaunchActivity() { + try { + return mSessionBinder.getLaunchPendingIntent(); + } catch (RemoteException e) { + Log.wtf(TAG, "Error calling getPendingIntent.", e); + } + return null; + } + /** * Get the token for the session this is connected to. * diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index 866910de6b4f3..5833492cf5669 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -19,6 +19,7 @@ package android.media.session; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.Activity; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; @@ -222,12 +223,17 @@ public final class MediaSession { /** * Set an intent for launching UI for this Session. This can be used as a - * quick link to an ongoing media screen. + * quick link to an ongoing media screen. The intent should be for an + * activity that may be started using {@link Activity#startActivity(Intent)}. * * @param pi The intent to launch to show UI for this Session. */ - public void setLaunchPendingIntent(@Nullable PendingIntent pi) { - // TODO + public void setLaunchActivity(@Nullable PendingIntent pi) { + try { + mBinder.setLaunchPendingIntent(pi); + } catch (RemoteException e) { + Log.wtf(TAG, "Failure in setLaunchPendingIntent.", e); + } } /** diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index e9df507540a6a..4ceb21307aaa5 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -16,6 +16,7 @@ package com.android.server.media; +import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -99,6 +100,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { private long mFlags; private IMediaRouter mMediaRouter; private ComponentName mMediaButtonReceiver; + private PendingIntent mLaunchIntent; // TransportPerformer fields @@ -650,6 +652,11 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { mMediaButtonReceiver = mbr; } + @Override + public void setLaunchPendingIntent(PendingIntent pi) { + mLaunchIntent = pi; + } + @Override public void setMetadata(MediaMetadata metadata) { mMetadata = metadata; @@ -920,6 +927,11 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { return mSessionInfo; } + @Override + public PendingIntent getLaunchPendingIntent() { + return mLaunchIntent; + } + @Override public long getFlags() { return mFlags;