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

Commit 38428ce1 authored by Jaewan Kim's avatar Jaewan Kim Committed by Android (Google) Code Review
Browse files

Merge changes from topics "public_browser2", "public_mediasession2"

* changes:
  MediaSession2: Public APIs for MediaBrowser2 and MediaLibraryService2
  MediaSession2: Public APIs for MediaSession2 and MediaController2
parents 1844568d 2bb5626f
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -61,6 +61,31 @@ public class MediaBrowser2Impl extends MediaController2Impl implements MediaBrow
        }
    }

    @Override
    public void subscribe_impl(String parentId, Bundle options) {
        // TODO(jaewan): Implement
    }

    @Override
    public void unsubscribe_impl(String parentId, Bundle options) {
        // TODO(jaewan): Implement
    }

    @Override
    public void getItem_impl(String mediaId) {
        // TODO(jaewan): Implement
    }

    @Override
    public void getChildren_impl(String parentId, int page, int pageSize, Bundle options) {
        // TODO(jaewan): Implement
    }

    @Override
    public void search_impl(String query, int page, int pageSize, Bundle extras) {
        // TODO(jaewan): Implement
    }

    public void onGetRootResult(
            final Bundle rootHints, final String rootMediaId, final Bundle rootExtra) {
        getCallbackExecutor().execute(() -> {
+122 −55
Original line number Diff line number Diff line
@@ -16,12 +16,15 @@

package com.android.media;

import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.media.IMediaSession2;
import android.media.IMediaSession2Callback;
import android.media.MediaController2.PlaybackInfo;
import android.media.MediaItem2;
import android.media.MediaSession2;
import android.media.MediaSession2.Command;
import android.media.MediaSession2.CommandButton;
@@ -29,14 +32,19 @@ import android.media.MediaSession2.CommandGroup;
import android.media.MediaController2;
import android.media.MediaController2.ControllerCallback;
import android.media.MediaPlayerBase;
import android.media.MediaSession2.PlaylistParam;
import android.media.MediaSessionService2;
import android.media.PlaybackState2;
import android.media.Rating2;
import android.media.SessionToken;
import android.media.session.PlaybackState;
import android.media.update.MediaController2Provider;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.support.annotation.GuardedBy;
import android.util.Log;

@@ -257,69 +265,128 @@ public class MediaController2Impl implements MediaController2Provider {
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // TODO(jaewan): Implement follows
    //////////////////////////////////////////////////////////////////////////////////////
    @Override
    public PlaybackState getPlaybackState_impl() {
        final IMediaSession2 binder = mSessionBinder;
        if (binder != null) {
            try {
                return binder.getPlaybackState();
            } catch (RemoteException e) {
                Log.w(TAG, "Cannot connect to the service or the session is gone", e);
    public PendingIntent getSessionActivity_impl() {
        // TODO(jaewan): Implement
        return null;
    }
        } else {
            Log.w(TAG, "Session isn't active", new IllegalStateException());

    @Override
    public int getRatingType_impl() {
        // TODO(jaewan): Implement
        return 0;
    }

    @Override
    public void setVolumeTo_impl(int value, int flags) {
        // TODO(jaewan): Implement
    }
        // TODO(jaewan): What to return for error case?

    @Override
    public void adjustVolume_impl(int direction, int flags) {
        // TODO(jaewan): Implement
    }

    @Override
    public PlaybackInfo getPlaybackInfo_impl() {
        // TODO(jaewan): Implement
        return null;
    }

    @Override
    public void addPlaybackListener_impl(
            MediaPlayerBase.PlaybackListener listener, Handler handler) {
        if (listener == null) {
            throw new IllegalArgumentException("listener shouldn't be null");
    public void prepareFromUri_impl(Uri uri, Bundle extras) {
        // TODO(jaewan): Implement
    }
        if (handler == null) {
            throw new IllegalArgumentException("handler shouldn't be null");

    @Override
    public void prepareFromSearch_impl(String query, Bundle extras) {
        // TODO(jaewan): Implement
    }
        boolean registerCallback;
        synchronized (mLock) {
            if (PlaybackListenerHolder.contains(mPlaybackListeners, listener)) {
                throw new IllegalArgumentException("listener is already added. Ignoring.");

    @Override
    public void prepareMediaId_impl(String mediaId, Bundle extras) {
        // TODO(jaewan): Implement
    }
            registerCallback = mPlaybackListeners.isEmpty();
            mPlaybackListeners.add(new PlaybackListenerHolder(listener, handler));

    @Override
    public void playFromSearch_impl(String query, Bundle extras) {
        // TODO(jaewan): Implement
    }
        if (registerCallback) {
            registerCallbackForPlaybackNotLocked();

    @Override
    public void playFromUri_impl(String uri, Bundle extras) {
        // TODO(jaewan): Implement
    }

    @Override
    public void playFromMediaId_impl(String mediaId, Bundle extras) {
        // TODO(jaewan): Implement
    }

    @Override
    public void removePlaybackListener_impl(MediaPlayerBase.PlaybackListener listener) {
        if (listener == null) {
            throw new IllegalArgumentException("listener shouldn't be null");
    public void setRating_impl(Rating2 rating) {
        // TODO(jaewan): Implement
    }
        boolean unregisterCallback;
        synchronized (mLock) {
            int idx = PlaybackListenerHolder.indexOf(mPlaybackListeners, listener);
            if (idx >= 0) {
                mPlaybackListeners.get(idx).removeCallbacksAndMessages(null);
                mPlaybackListeners.remove(idx);

    @Override
    public void sendCustomCommand_impl(Command command, Bundle args, ResultReceiver cb) {
        // TODO(jaewan): Implement
    }
            unregisterCallback = mPlaybackListeners.isEmpty();

    @Override
    public List<MediaItem2> getPlaylist_impl() {
        // TODO(jaewan): Implement
        return null;
    }
        if (unregisterCallback) {
            final IMediaSession2 binder = mSessionBinder;
            if (binder != null) {
                // Lazy unregister
                try {
                    binder.unregisterCallback(mSessionCallbackStub, CALLBACK_FLAG_PLAYBACK);
                } catch (RemoteException e) {
                    Log.e(TAG, "Cannot connect to the service or the session is gone", e);

    @Override
    public void prepare_impl() {
        // TODO(jaewan): Implement
    }

    @Override
    public void fastForward_impl() {
        // TODO(jaewan): Implement
    }

    @Override
    public void rewind_impl() {
        // TODO(jaewan): Implement
    }

    @Override
    public void seekTo_impl(long pos) {
        // TODO(jaewan): Implement
    }

    @Override
    public void setCurrentPlaylistItem_impl(int index) {
        // TODO(jaewan): Implement
    }

    @Override
    public PlaybackState2 getPlaybackState_impl() {
        // TODO(jaewan): Implement
        return null;
    }

    @Override
    public void removePlaylistItem_impl(MediaItem2 index) {
        // TODO(jaewan): Implement
    }

    @Override
    public void addPlaylistItem_impl(int index, MediaItem2 item) {
    // TODO(jaewan): Implement
    }

    @Override
    public PlaylistParam getPlaylistParam_impl() {
        // TODO(jaewan): Implement
        return null;
    }

    ///////////////////////////////////////////////////
+35 −0
Original line number Diff line number Diff line
@@ -16,12 +16,20 @@

package com.android.media;

import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.MediaLibraryService2;
import android.media.MediaLibraryService2.MediaLibrarySession;
import android.media.MediaLibraryService2.MediaLibrarySessionCallback;
import android.media.MediaPlayerBase;
import android.media.MediaSession2;
import android.media.MediaSession2.ControllerInfo;
import android.media.MediaSession2.SessionCallback;
import android.media.MediaSessionService2;
import android.media.VolumeProvider;
import android.media.update.MediaLibraryService2Provider;
import android.os.Bundle;

public class MediaLibraryService2Impl extends MediaSessionService2Impl implements
        MediaLibraryService2Provider {
@@ -51,4 +59,31 @@ public class MediaLibraryService2Impl extends MediaSessionService2Impl implement
        serviceIntent.setAction(MediaLibraryService2.SERVICE_INTERFACE);
        return serviceIntent;
    }

    public static class MediaLibrarySessionImpl extends MediaSession2Impl
            implements MediaLibrarySessionProvider {
        private final MediaLibrarySession mInstance;
        private final MediaLibrarySessionCallback mCallback;

        public MediaLibrarySessionImpl(MediaLibrarySession instance, Context context,
                MediaPlayerBase player, String id,
                MediaLibrarySessionCallback callback, VolumeProvider volumeProvider, int ratingType,
                PendingIntent sessionActivity) {
            super(instance, context, player, id, callback, volumeProvider, ratingType,
                    sessionActivity);
            mInstance = instance;
            mCallback = callback;
        }

        @Override
        public void notifyChildrenChanged_impl(ControllerInfo controller, String parentId,
                Bundle options) {
            // TODO(jaewan): Implements
        }

        @Override
        public void notifyChildrenChanged_impl(String parentId, Bundle options) {
            // TODO(jaewan): Implements
        }
    }
}
+74 −40
Original line number Diff line number Diff line
@@ -17,25 +17,32 @@
package com.android.media;

import android.Manifest.permission;
import android.app.PendingIntent;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.media.AudioAttributes;
import android.media.IMediaSession2Callback;
import android.media.MediaController2;
import android.media.MediaItem2;
import android.media.MediaPlayerBase;
import android.media.MediaSession2;
import android.media.MediaSession2.Builder;
import android.media.MediaSession2.Command;
import android.media.MediaSession2.CommandButton;
import android.media.MediaSession2.CommandGroup;
import android.media.MediaSession2.ControllerInfo;
import android.media.MediaSession2.PlaylistParam;
import android.media.MediaSession2.SessionCallback;
import android.media.SessionToken;
import android.media.VolumeProvider;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.media.update.MediaSession2Provider;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.ResultReceiver;
import android.util.Log;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -67,10 +74,15 @@ public class MediaSession2Impl implements MediaSession2Provider {
     * @param player
     * @param id
     * @param callback
     * @param volumeProvider
     * @param ratingType
     * @param sessionActivity
     */
    public MediaSession2Impl(MediaSession2 instance, Context context, MediaPlayerBase player,
            String id, SessionCallback callback) {
            String id, SessionCallback callback, VolumeProvider volumeProvider, int ratingType,
            PendingIntent sessionActivity) {
        mInstance = instance;
        // TODO(jaewan): Keep other params.

        // Argument checks are done by builder already.
        // Initialize finals first.
@@ -103,7 +115,7 @@ public class MediaSession2Impl implements MediaSession2Provider {
    //               setPlayer(null). Token can be available when player is null, and
    //               controller can also attach to session.
    @Override
    public void setPlayer_impl(MediaPlayerBase player) throws IllegalArgumentException {
    public void setPlayer_impl(MediaPlayerBase player, VolumeProvider volumeProvider) throws IllegalArgumentException {
        ensureCallingThread();
        if (player == null) {
            throw new IllegalArgumentException("player shouldn't be null");
@@ -202,52 +214,74 @@ public class MediaSession2Impl implements MediaSession2Provider {
    }

    @Override
    public PlaybackState getPlaybackState_impl() {
    public void setCustomLayout_impl(ControllerInfo controller, List<CommandButton> layout) {
        ensureCallingThread();
        ensurePlayer();
        return mPlayer.getPlaybackState();
        if (controller == null) {
            throw new IllegalArgumentException("controller shouldn't be null");
        }
        if (layout == null) {
            throw new IllegalArgumentException("layout shouldn't be null");
        }
        mSessionStub.notifyCustomLayoutNotLocked(controller, layout);
    }

    //////////////////////////////////////////////////////////////////////////////////////
    // TODO(jaewan): Implement follows
    //////////////////////////////////////////////////////////////////////////////////////
    @Override
    public void addPlaybackListener_impl(
            MediaPlayerBase.PlaybackListener listener, Handler handler) {
        if (listener == null) {
            throw new IllegalArgumentException("listener shouldn't be null");
    public void setPlayer_impl(MediaPlayerBase player) {
        // TODO(jaewan): Implement
    }
        if (handler == null) {
            throw new IllegalArgumentException("handler shouldn't be null");

    @Override
    public void setAllowedCommands_impl(ControllerInfo controller, CommandGroup commands) {
        // TODO(jaewan): Implement
    }
        ensureCallingThread();
        if (PlaybackListenerHolder.contains(mListeners, listener)) {
            Log.w(TAG, "listener is already added. Ignoring.");
            return;

    @Override
    public void notifyMetadataChanged_impl() {
        // TODO(jaewan): Implement
    }
        mListeners.add(new PlaybackListenerHolder(listener, handler));

    @Override
    public void sendCustomCommand_impl(ControllerInfo controller, Command command, Bundle args,
            ResultReceiver receiver) {
        // TODO(jaewan): Implement
    }

    @Override
    public void removePlaybackListener_impl(MediaPlayerBase.PlaybackListener listener) {
        if (listener == null) {
            throw new IllegalArgumentException("listener shouldn't be null");
    public void sendCustomCommand_impl(Command command, Bundle args) {
        // TODO(jaewan): Implement
    }
        ensureCallingThread();
        int idx = PlaybackListenerHolder.indexOf(mListeners, listener);
        if (idx >= 0) {
            mListeners.get(idx).removeCallbacksAndMessages(null);
            mListeners.remove(idx);

    @Override
    public void setPlaylist_impl(List<MediaItem2> playlist, PlaylistParam param) {
        // TODO(jaewan): Implement
    }

    @Override
    public void prepare_impl() {
        // TODO(jaewan): Implement
    }

    @Override
    public void setCustomLayout_impl(ControllerInfo controller, List<CommandButton> layout) {
        ensureCallingThread();
        if (controller == null) {
            throw new IllegalArgumentException("controller shouldn't be null");
    public void fastForward_impl() {
        // TODO(jaewan): Implement
    }
        if (layout == null) {
            throw new IllegalArgumentException("layout shouldn't be null");

    @Override
    public void rewind_impl() {
        // TODO(jaewan): Implement
    }
        mSessionStub.notifyCustomLayoutNotLocked(controller, layout);

    @Override
    public void seekTo_impl(long pos) {
        // TODO(jaewan): Implement
    }

    @Override
    public void setCurrentPlaylistItem_impl(int index) {
        // TODO(jaewan): Implement
    }

    ///////////////////////////////////////////////////
+1 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static com.android.media.MediaController2Impl.CALLBACK_FLAG_PLAYBACK;
import android.content.Context;
import android.media.IMediaSession2;
import android.media.IMediaSession2Callback;
import android.media.MediaLibraryService2.BrowserRoot;
import android.media.MediaLibraryService2.MediaLibrarySessionCallback;
import android.media.MediaSession2;
import android.media.MediaSession2.Command;
@@ -36,7 +37,6 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.service.media.MediaBrowserService.BrowserRoot;
import android.support.annotation.GuardedBy;
import android.util.ArrayMap;
import android.util.Log;
Loading