Merge "Do not use MediaCommunicationManager below Android S" into sc-dev
This commit is contained in:
@@ -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",
|
||||
@@ -108,7 +109,7 @@ filegroup {
|
||||
filegroup {
|
||||
name: "mediaparser-srcs",
|
||||
srcs: [
|
||||
"java/android/media/MediaParser.java"
|
||||
"java/android/media/MediaParser.java",
|
||||
],
|
||||
path: "java",
|
||||
}
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
@@ -114,7 +118,13 @@ public class MediaSession2 implements AutoCloseable {
|
||||
mSessionStub = new Session2Link(this);
|
||||
mSessionToken = new Session2Token(Process.myUid(), TYPE_SESSION, context.getPackageName(),
|
||||
mSessionStub, tokenExtras);
|
||||
mCommunicationManager = mContext.getSystemService(MediaCommunicationManager.class);
|
||||
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;
|
||||
@@ -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) {
|
||||
@@ -350,7 +368,7 @@ public class MediaSession2 implements AutoCloseable {
|
||||
|
||||
final ControllerInfo controllerInfo = new ControllerInfo(
|
||||
remoteUserInfo,
|
||||
mCommunicationManager.isTrustedForMediaControl(remoteUserInfo),
|
||||
isTrustedForMediaControl(remoteUserInfo),
|
||||
controller,
|
||||
connectionHints);
|
||||
mCallbackExecutor.execute(() -> {
|
||||
@@ -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 {
|
||||
MediaCommunicationManager manager =
|
||||
mContext.getSystemService(MediaCommunicationManager.class);
|
||||
manager.notifySession2Created(session2.getToken());
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user