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

Commit 9132c5ab authored by Bart Sears's avatar Bart Sears Committed by Android (Google) Code Review
Browse files

Merge "Revert "Remove incomplete media router API."" into mnc-dev

parents 70280a20 a8cc0584
Loading
Loading
Loading
Loading

Android.mk

0 → 100644
+1098 −0

File added.

Preview size limit exceeded, changes collapsed.

+3 −0
Original line number Diff line number Diff line
@@ -9,6 +9,9 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) \
LOCAL_PACKAGE_NAME := OneMedia
LOCAL_CERTIFICATE := platform

LOCAL_STATIC_JAVA_LIBRARIES := \
    android-support-media-protocols

LOCAL_JAVA_LIBRARIES += org.apache.http.legacy

LOCAL_PROGUARD_ENABLED := disabled
+9 −0
Original line number Diff line number Diff line
@@ -27,6 +27,15 @@
            android:name="com.android.onemedia.OnePlayerService"
            android:exported="true"
            android:process="com.android.onemedia.service" />
        <service
            android:name=".provider.OneMediaRouteProvider"
            android:permission="android.permission.BIND_MEDIA_ROUTE_SERVICE"
            android:exported="true"
            android:process="com.android.onemedia.provider">
            <intent-filter>
                <action android:name="android.media.routing.MediaRouteService" />
            </intent-filter>
          </service>
    </application>

</manifest>
+83 −0
Original line number Diff line number Diff line
@@ -19,17 +19,25 @@ import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaMetadata;
import android.media.routing.MediaRouteSelector;
import android.media.routing.MediaRouter;
import android.media.routing.MediaRouter.ConnectionRequest;
import android.media.routing.MediaRouter.DestinationInfo;
import android.media.routing.MediaRouter.RouteInfo;
import android.media.session.MediaSession;
import android.media.session.MediaSession.QueueItem;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.os.Bundle;
import android.support.media.protocols.MediaPlayerProtocol;
import android.support.media.protocols.MediaPlayerProtocol.MediaStatus;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Log;
import android.view.KeyEvent;

import com.android.onemedia.playback.LocalRenderer;
import com.android.onemedia.playback.OneMRPRenderer;
import com.android.onemedia.playback.Renderer;
import com.android.onemedia.playback.RequestUtils;

@@ -40,6 +48,7 @@ public class PlayerSession {
    private static final String TAG = "PlayerSession";

    protected MediaSession mSession;
    protected MediaRouter mRouter;
    protected Context mContext;
    protected Renderer mRenderer;
    protected MediaSession.Callback mCallback;
@@ -75,11 +84,22 @@ public class PlayerSession {
                .getSystemService(Context.MEDIA_SESSION_SERVICE);
        Log.d(TAG, "Creating session for package " + mContext.getBasePackageName());

        mRouter = new MediaRouter(mContext);
        mRouter.addSelector(new MediaRouteSelector.Builder()
                .addRequiredProtocol(MediaPlayerProtocol.class)
                .build());
        mRouter.addSelector(new MediaRouteSelector.Builder()
                .setRequiredFeatures(MediaRouter.ROUTE_FEATURE_LIVE_AUDIO)
                .setOptionalFeatures(MediaRouter.ROUTE_FEATURE_LIVE_VIDEO)
                .build());
        mRouter.setRoutingCallback(new RoutingCallback(), null);

        mSession = new MediaSession(mContext, "OneMedia");
        mSession.setCallback(mCallback);
        mSession.setPlaybackState(mPlaybackState);
        mSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS
                | MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
        mSession.setMediaRouter(mRouter);
        mSession.setActive(true);
        updateMetadata();
    }
@@ -97,6 +117,10 @@ public class PlayerSession {
            mSession.release();
            mSession = null;
        }
        if (mRouter != null) {
            mRouter.release();
            mRouter = null;
        }
    }

    public void setListener(Listener listener) {
@@ -254,4 +278,63 @@ public class PlayerSession {
            mRenderer.onPause();
        }
    }

    private class RoutingCallback extends MediaRouter.RoutingCallback {
        @Override
        public void onConnectionStateChanged(int state) {
            if (state == MediaRouter.CONNECTION_STATE_CONNECTING) {
                if (mRenderer != null) {
                    mRenderer.onStop();
                }
                mRenderer = null;
                updateState(PlaybackState.STATE_CONNECTING);
                return;
            }

            MediaRouter.ConnectionInfo connection = mRouter.getConnection();
            if (connection != null) {
                MediaPlayerProtocol protocol =
                        connection.getProtocolObject(MediaPlayerProtocol.class);
                if (protocol != null) {
                    Log.d(TAG, "Connected to route using media player protocol");

                    protocol.setCallback(new PlayerCallback(), null);
                    mRenderer = new OneMRPRenderer(protocol);
                    updateState(PlaybackState.STATE_NONE);
                    return;
                }
            }

            // Use local route
            mRenderer = new LocalRenderer(mContext, null);
            mRenderer.registerListener(mRenderListener);
            updateState(PlaybackState.STATE_NONE);
        }
    }

    private class PlayerCallback extends MediaPlayerProtocol.Callback {
        @Override
        public void onStatusUpdated(MediaStatus status, Bundle extras) {
            if (status != null) {
                Log.d(TAG, "Received status update: " + status.toBundle());
                switch (status.getPlayerState()) {
                    case MediaStatus.PLAYER_STATE_BUFFERING:
                        updateState(PlaybackState.STATE_BUFFERING);
                        break;
                    case MediaStatus.PLAYER_STATE_IDLE:
                        updateState(PlaybackState.STATE_STOPPED);
                        break;
                    case MediaStatus.PLAYER_STATE_PAUSED:
                        updateState(PlaybackState.STATE_PAUSED);
                        break;
                    case MediaStatus.PLAYER_STATE_PLAYING:
                        updateState(PlaybackState.STATE_PLAYING);
                        break;
                    case MediaStatus.PLAYER_STATE_UNKNOWN:
                        updateState(PlaybackState.STATE_NONE);
                        break;
                }
            }
        }
    }
}
+47 −0
Original line number Diff line number Diff line
package com.android.onemedia.playback;

import android.os.Bundle;
import android.support.media.protocols.MediaPlayerProtocol;
import android.support.media.protocols.MediaPlayerProtocol.MediaInfo;

/**
 * Renderer for communicating with the OneMRP route
 */
public class OneMRPRenderer extends Renderer {
    private final MediaPlayerProtocol mProtocol;

    public OneMRPRenderer(MediaPlayerProtocol protocol) {
        super(null, null);
        mProtocol = protocol;
    }

    @Override
    public void setContent(Bundle request) {
        MediaInfo mediaInfo = new MediaInfo(request.getString(RequestUtils.EXTRA_KEY_SOURCE),
                MediaInfo.STREAM_TYPE_BUFFERED, "audio/mp3");
        mProtocol.load(mediaInfo, true, 0, null);
    }

    @Override
    public boolean onStop() {
        mProtocol.stop(null);
        return true;
    }

    @Override
    public boolean onPlay() {
        mProtocol.play(null);
        return true;
    }

    @Override
    public boolean onPause() {
        mProtocol.pause(null);
        return true;
    }

    @Override
    public long getSeekPosition() {
        return -1;
    }
}
Loading