Loading apex/media/framework/Android.bp +2 −1 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ java_library { static_libs: [ "exoplayer2-extractor", "mediatranscoding_aidl_interface-java", "modules-annotation-minsdk", "modules-utils-build", ], jarjar_rules: "jarjar_rules.txt", Loading Loading @@ -108,7 +109,7 @@ filegroup { filegroup { name: "mediaparser-srcs", srcs: [ "java/android/media/MediaParser.java" "java/android/media/MediaParser.java", ], path: "java", } Loading apex/media/framework/jarjar_rules.txt +1 −1 Original line number Diff line number Diff line rule com.android.modules.utils.** android.media.internal.utils.@1 rule com.android.modules.** android.media.internal.@1 rule com.google.android.exoplayer2.** android.media.internal.exo.@1 apex/media/framework/java/android/media/MediaCommunicationManager.java +3 −0 Original line number Diff line number Diff line Loading @@ -27,12 +27,14 @@ import android.annotation.SystemService; import android.content.Context; import android.media.session.MediaSession; import android.media.session.MediaSessionManager; import android.os.Build; import android.os.RemoteException; import android.os.UserHandle; import android.service.media.MediaBrowserService; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.modules.annotation.MinSdk; import com.android.modules.utils.build.SdkLevel; import java.util.Collections; Loading @@ -45,6 +47,7 @@ import java.util.concurrent.Executor; * Provides support for interacting with {@link android.media.MediaSession2 MediaSession2s} * that applications have published to express their ongoing media playback state. */ @MinSdk(Build.VERSION_CODES.S) @SystemService(Context.MEDIA_COMMUNICATION_SERVICE) public class MediaCommunicationManager { private static final String TAG = "MediaCommunicationManager"; Loading apex/media/framework/java/android/media/MediaSession2.java +29 −5 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.session.MediaSessionManager; import android.media.session.MediaSessionManager.RemoteUserInfo; import android.os.BadParcelableException; import android.os.Bundle; Loading @@ -43,6 +44,8 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import com.android.modules.utils.build.SdkLevel; import java.util.ArrayList; import java.util.HashMap; import java.util.List; Loading Loading @@ -86,6 +89,7 @@ public class MediaSession2 implements AutoCloseable { private final String mSessionId; private final PendingIntent mSessionActivity; private final Session2Token mSessionToken; private final MediaSessionManager mMediaSessionManager; private final MediaCommunicationManager mCommunicationManager; private final Handler mResultHandler; Loading Loading @@ -114,7 +118,13 @@ public class MediaSession2 implements AutoCloseable { mSessionStub = new Session2Link(this); mSessionToken = new Session2Token(Process.myUid(), TYPE_SESSION, context.getPackageName(), mSessionStub, tokenExtras); if (SdkLevel.isAtLeastS()) { mCommunicationManager = mContext.getSystemService(MediaCommunicationManager.class); mMediaSessionManager = null; } else { mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class); mCommunicationManager = null; } // NOTE: mResultHandler uses main looper, so this MUST NOT be blocked. mResultHandler = new Handler(context.getMainLooper()); mClosed = false; Loading Loading @@ -315,6 +325,14 @@ public class MediaSession2 implements AutoCloseable { return mCallback; } boolean isTrustedForMediaControl(RemoteUserInfo remoteUserInfo) { if (SdkLevel.isAtLeastS()) { return mCommunicationManager.isTrustedForMediaControl(remoteUserInfo); } else { return mMediaSessionManager.isTrustedForMediaControl(remoteUserInfo); } } void setForegroundServiceEventCallback(ForegroundServiceEventCallback callback) { synchronized (mLock) { if (mForegroundServiceEventCallback == callback) { Loading Loading @@ -350,7 +368,7 @@ public class MediaSession2 implements AutoCloseable { final ControllerInfo controllerInfo = new ControllerInfo( remoteUserInfo, mCommunicationManager.isTrustedForMediaControl(remoteUserInfo), isTrustedForMediaControl(remoteUserInfo), controller, connectionHints); mCallbackExecutor.execute(() -> { Loading Loading @@ -606,9 +624,15 @@ public class MediaSession2 implements AutoCloseable { // Notify framework about the newly create session after the constructor is finished. // Otherwise, framework may access the session before the initialization is finished. try { if (SdkLevel.isAtLeastS()) { MediaCommunicationManager manager = mContext.getSystemService(MediaCommunicationManager.class); manager.notifySession2Created(session2.getToken()); } else { MediaSessionManager manager = mContext.getSystemService(MediaSessionManager.class); manager.notifySession2Created(session2.getToken()); } } catch (Exception e) { session2.close(); throw e; Loading Loading
apex/media/framework/Android.bp +2 −1 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ java_library { static_libs: [ "exoplayer2-extractor", "mediatranscoding_aidl_interface-java", "modules-annotation-minsdk", "modules-utils-build", ], jarjar_rules: "jarjar_rules.txt", Loading Loading @@ -108,7 +109,7 @@ filegroup { filegroup { name: "mediaparser-srcs", srcs: [ "java/android/media/MediaParser.java" "java/android/media/MediaParser.java", ], path: "java", } Loading
apex/media/framework/jarjar_rules.txt +1 −1 Original line number Diff line number Diff line rule com.android.modules.utils.** android.media.internal.utils.@1 rule com.android.modules.** android.media.internal.@1 rule com.google.android.exoplayer2.** android.media.internal.exo.@1
apex/media/framework/java/android/media/MediaCommunicationManager.java +3 −0 Original line number Diff line number Diff line Loading @@ -27,12 +27,14 @@ import android.annotation.SystemService; import android.content.Context; import android.media.session.MediaSession; import android.media.session.MediaSessionManager; import android.os.Build; import android.os.RemoteException; import android.os.UserHandle; import android.service.media.MediaBrowserService; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.modules.annotation.MinSdk; import com.android.modules.utils.build.SdkLevel; import java.util.Collections; Loading @@ -45,6 +47,7 @@ import java.util.concurrent.Executor; * Provides support for interacting with {@link android.media.MediaSession2 MediaSession2s} * that applications have published to express their ongoing media playback state. */ @MinSdk(Build.VERSION_CODES.S) @SystemService(Context.MEDIA_COMMUNICATION_SERVICE) public class MediaCommunicationManager { private static final String TAG = "MediaCommunicationManager"; Loading
apex/media/framework/java/android/media/MediaSession2.java +29 −5 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.session.MediaSessionManager; import android.media.session.MediaSessionManager.RemoteUserInfo; import android.os.BadParcelableException; import android.os.Bundle; Loading @@ -43,6 +44,8 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import com.android.modules.utils.build.SdkLevel; import java.util.ArrayList; import java.util.HashMap; import java.util.List; Loading Loading @@ -86,6 +89,7 @@ public class MediaSession2 implements AutoCloseable { private final String mSessionId; private final PendingIntent mSessionActivity; private final Session2Token mSessionToken; private final MediaSessionManager mMediaSessionManager; private final MediaCommunicationManager mCommunicationManager; private final Handler mResultHandler; Loading Loading @@ -114,7 +118,13 @@ public class MediaSession2 implements AutoCloseable { mSessionStub = new Session2Link(this); mSessionToken = new Session2Token(Process.myUid(), TYPE_SESSION, context.getPackageName(), mSessionStub, tokenExtras); if (SdkLevel.isAtLeastS()) { mCommunicationManager = mContext.getSystemService(MediaCommunicationManager.class); mMediaSessionManager = null; } else { mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class); mCommunicationManager = null; } // NOTE: mResultHandler uses main looper, so this MUST NOT be blocked. mResultHandler = new Handler(context.getMainLooper()); mClosed = false; Loading Loading @@ -315,6 +325,14 @@ public class MediaSession2 implements AutoCloseable { return mCallback; } boolean isTrustedForMediaControl(RemoteUserInfo remoteUserInfo) { if (SdkLevel.isAtLeastS()) { return mCommunicationManager.isTrustedForMediaControl(remoteUserInfo); } else { return mMediaSessionManager.isTrustedForMediaControl(remoteUserInfo); } } void setForegroundServiceEventCallback(ForegroundServiceEventCallback callback) { synchronized (mLock) { if (mForegroundServiceEventCallback == callback) { Loading Loading @@ -350,7 +368,7 @@ public class MediaSession2 implements AutoCloseable { final ControllerInfo controllerInfo = new ControllerInfo( remoteUserInfo, mCommunicationManager.isTrustedForMediaControl(remoteUserInfo), isTrustedForMediaControl(remoteUserInfo), controller, connectionHints); mCallbackExecutor.execute(() -> { Loading Loading @@ -606,9 +624,15 @@ public class MediaSession2 implements AutoCloseable { // Notify framework about the newly create session after the constructor is finished. // Otherwise, framework may access the session before the initialization is finished. try { if (SdkLevel.isAtLeastS()) { MediaCommunicationManager manager = mContext.getSystemService(MediaCommunicationManager.class); manager.notifySession2Created(session2.getToken()); } else { MediaSessionManager manager = mContext.getSystemService(MediaSessionManager.class); manager.notifySession2Created(session2.getToken()); } } catch (Exception e) { session2.close(); throw e; Loading