Merge "Do not use MediaCommunicationManager below Android S" into sc-dev

This commit is contained in:
Hyundo Moon
2021-03-04 07:07:03 +00:00
committed by Android (Google) Code Review
4 changed files with 35 additions and 7 deletions

View File

@@ -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",
}

View File

@@ -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

View File

@@ -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";

View File

@@ -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;