Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38e721ad authored by Hyundo Moon's avatar Hyundo Moon
Browse files

Do not use MediaCommunicationManager below Android S

Bug: 181649697
Test: Builds successfully
Change-Id: I2ea7107acfbedd36533e2b28f53409822050e16a
parent 7e3f7d10
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -47,6 +47,7 @@ java_library {
    static_libs: [
    static_libs: [
        "exoplayer2-extractor",
        "exoplayer2-extractor",
        "mediatranscoding_aidl_interface-java",
        "mediatranscoding_aidl_interface-java",
        "modules-annotation-minsdk",
        "modules-utils-build",
        "modules-utils-build",
    ],
    ],
    jarjar_rules: "jarjar_rules.txt",
    jarjar_rules: "jarjar_rules.txt",
@@ -108,7 +109,7 @@ filegroup {
filegroup {
filegroup {
    name: "mediaparser-srcs",
    name: "mediaparser-srcs",
    srcs: [
    srcs: [
        "java/android/media/MediaParser.java"
        "java/android/media/MediaParser.java",
    ],
    ],
    path: "java",
    path: "java",
}
}
+1 −1
Original line number Original line 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
rule com.google.android.exoplayer2.** android.media.internal.exo.@1
+3 −0
Original line number Original line Diff line number Diff line
@@ -27,12 +27,14 @@ import android.annotation.SystemService;
import android.content.Context;
import android.content.Context;
import android.media.session.MediaSession;
import android.media.session.MediaSession;
import android.media.session.MediaSessionManager;
import android.media.session.MediaSessionManager;
import android.os.Build;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserHandle;
import android.service.media.MediaBrowserService;
import android.service.media.MediaBrowserService;
import android.util.Log;
import android.util.Log;


import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.modules.annotation.MinSdk;
import com.android.modules.utils.build.SdkLevel;
import com.android.modules.utils.build.SdkLevel;


import java.util.Collections;
import java.util.Collections;
@@ -45,6 +47,7 @@ import java.util.concurrent.Executor;
 * Provides support for interacting with {@link android.media.MediaSession2 MediaSession2s}
 * Provides support for interacting with {@link android.media.MediaSession2 MediaSession2s}
 * that applications have published to express their ongoing media playback state.
 * that applications have published to express their ongoing media playback state.
 */
 */
@MinSdk(Build.VERSION_CODES.S)
@SystemService(Context.MEDIA_COMMUNICATION_SERVICE)
@SystemService(Context.MEDIA_COMMUNICATION_SERVICE)
public class MediaCommunicationManager {
public class MediaCommunicationManager {
    private static final String TAG = "MediaCommunicationManager";
    private static final String TAG = "MediaCommunicationManager";
+29 −5
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ import android.annotation.Nullable;
import android.app.PendingIntent;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.media.session.MediaSessionManager;
import android.media.session.MediaSessionManager.RemoteUserInfo;
import android.media.session.MediaSessionManager.RemoteUserInfo;
import android.os.BadParcelableException;
import android.os.BadParcelableException;
import android.os.Bundle;
import android.os.Bundle;
@@ -43,6 +44,8 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.Log;
import android.util.Log;


import com.android.modules.utils.build.SdkLevel;

import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashMap;
import java.util.List;
import java.util.List;
@@ -86,6 +89,7 @@ public class MediaSession2 implements AutoCloseable {
    private final String mSessionId;
    private final String mSessionId;
    private final PendingIntent mSessionActivity;
    private final PendingIntent mSessionActivity;
    private final Session2Token mSessionToken;
    private final Session2Token mSessionToken;
    private final MediaSessionManager mMediaSessionManager;
    private final MediaCommunicationManager mCommunicationManager;
    private final MediaCommunicationManager mCommunicationManager;
    private final Handler mResultHandler;
    private final Handler mResultHandler;


@@ -114,7 +118,13 @@ public class MediaSession2 implements AutoCloseable {
        mSessionStub = new Session2Link(this);
        mSessionStub = new Session2Link(this);
        mSessionToken = new Session2Token(Process.myUid(), TYPE_SESSION, context.getPackageName(),
        mSessionToken = new Session2Token(Process.myUid(), TYPE_SESSION, context.getPackageName(),
                mSessionStub, tokenExtras);
                mSessionStub, tokenExtras);
        if (SdkLevel.isAtLeastS()) {
            mCommunicationManager = mContext.getSystemService(MediaCommunicationManager.class);
            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.
        // NOTE: mResultHandler uses main looper, so this MUST NOT be blocked.
        mResultHandler = new Handler(context.getMainLooper());
        mResultHandler = new Handler(context.getMainLooper());
        mClosed = false;
        mClosed = false;
@@ -315,6 +325,14 @@ public class MediaSession2 implements AutoCloseable {
        return mCallback;
        return mCallback;
    }
    }


    boolean isTrustedForMediaControl(RemoteUserInfo remoteUserInfo) {
        if (SdkLevel.isAtLeastS()) {
            return mCommunicationManager.isTrustedForMediaControl(remoteUserInfo);
        } else {
            return mMediaSessionManager.isTrustedForMediaControl(remoteUserInfo);
        }
    }

    void setForegroundServiceEventCallback(ForegroundServiceEventCallback callback) {
    void setForegroundServiceEventCallback(ForegroundServiceEventCallback callback) {
        synchronized (mLock) {
        synchronized (mLock) {
            if (mForegroundServiceEventCallback == callback) {
            if (mForegroundServiceEventCallback == callback) {
@@ -350,7 +368,7 @@ public class MediaSession2 implements AutoCloseable {


        final ControllerInfo controllerInfo = new ControllerInfo(
        final ControllerInfo controllerInfo = new ControllerInfo(
                remoteUserInfo,
                remoteUserInfo,
                mCommunicationManager.isTrustedForMediaControl(remoteUserInfo),
                isTrustedForMediaControl(remoteUserInfo),
                controller,
                controller,
                connectionHints);
                connectionHints);
        mCallbackExecutor.execute(() -> {
        mCallbackExecutor.execute(() -> {
@@ -606,9 +624,15 @@ public class MediaSession2 implements AutoCloseable {
            // Notify framework about the newly create session after the constructor is finished.
            // Notify framework about the newly create session after the constructor is finished.
            // Otherwise, framework may access the session before the initialization is finished.
            // Otherwise, framework may access the session before the initialization is finished.
            try {
            try {
                if (SdkLevel.isAtLeastS()) {
                    MediaCommunicationManager manager =
                    MediaCommunicationManager manager =
                            mContext.getSystemService(MediaCommunicationManager.class);
                            mContext.getSystemService(MediaCommunicationManager.class);
                    manager.notifySession2Created(session2.getToken());
                    manager.notifySession2Created(session2.getToken());
                } else {
                    MediaSessionManager manager =
                            mContext.getSystemService(MediaSessionManager.class);
                    manager.notifySession2Created(session2.getToken());
                }
            } catch (Exception e) {
            } catch (Exception e) {
                session2.close();
                session2.close();
                throw e;
                throw e;