| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.android.onemedia; |
| |
| import android.content.Context; |
| import android.content.Intent; |
| import android.media.session.MediaSession; |
| import android.media.session.MediaSessionManager; |
| import android.media.session.MediaSessionToken; |
| import android.media.session.PlaybackState; |
| import android.media.session.TransportPerformer; |
| import android.os.Bundle; |
| import android.util.Log; |
| import android.view.KeyEvent; |
| |
| import com.android.onemedia.playback.LocalRenderer; |
| import com.android.onemedia.playback.Renderer; |
| import com.android.onemedia.playback.RendererFactory; |
| |
| public class PlayerSession { |
| private static final String TAG = "PlayerSession"; |
| |
| protected MediaSession mSession; |
| protected Context mContext; |
| protected RendererFactory mRendererFactory; |
| protected LocalRenderer mRenderer; |
| protected MediaSession.Callback mCallback; |
| protected Renderer.Listener mRenderListener; |
| protected TransportPerformer mPerformer; |
| |
| protected PlaybackState mPlaybackState; |
| protected Listener mListener; |
| |
| public PlayerSession(Context context) { |
| mContext = context; |
| mRendererFactory = new RendererFactory(); |
| mRenderer = new LocalRenderer(context, null); |
| mCallback = new ControllerCb(); |
| mRenderListener = new RenderListener(); |
| mPlaybackState = new PlaybackState(); |
| mPlaybackState.setActions(PlaybackState.ACTION_PAUSE |
| | PlaybackState.ACTION_PLAY); |
| |
| mRenderer.registerListener(mRenderListener); |
| } |
| |
| public void createSession() { |
| if (mSession != null) { |
| mSession.release(); |
| } |
| MediaSessionManager man = (MediaSessionManager) mContext |
| .getSystemService(Context.MEDIA_SESSION_SERVICE); |
| Log.d(TAG, "Creating session for package " + mContext.getBasePackageName()); |
| mSession = man.createSession("OneMedia"); |
| mSession.addCallback(mCallback); |
| mPerformer = mSession.setTransportPerformerEnabled(); |
| mPerformer.addListener(new TransportListener()); |
| mPerformer.setPlaybackState(mPlaybackState); |
| mSession.publish(); |
| } |
| |
| public void onDestroy() { |
| if (mSession != null) { |
| mSession.release(); |
| } |
| if (mRenderer != null) { |
| mRenderer.unregisterListener(mRenderListener); |
| mRenderer.onDestroy(); |
| } |
| } |
| |
| public void setListener(Listener listener) { |
| mListener = listener; |
| } |
| |
| public MediaSessionToken getSessionToken() { |
| return mSession.getSessionToken(); |
| } |
| |
| public void setContent(Bundle request) { |
| mRenderer.setContent(request); |
| } |
| |
| public void setNextContent(Bundle request) { |
| mRenderer.setNextContent(request); |
| } |
| |
| public interface Listener { |
| public void onPlayStateChanged(PlaybackState state); |
| } |
| |
| private class RenderListener implements Renderer.Listener { |
| |
| @Override |
| public void onError(int type, int extra, Bundle extras, Throwable error) { |
| Log.d(TAG, "Sending onError with type " + type + " and extra " + extra); |
| mPlaybackState.setState(PlaybackState.PLAYSTATE_ERROR); |
| if (error != null) { |
| mPlaybackState.setErrorMessage(error.getLocalizedMessage()); |
| } |
| mPerformer.setPlaybackState(mPlaybackState); |
| if (mListener != null) { |
| mListener.onPlayStateChanged(mPlaybackState); |
| } |
| } |
| |
| @Override |
| public void onStateChanged(int newState) { |
| if (newState != Renderer.STATE_ERROR) { |
| mPlaybackState.setErrorMessage(null); |
| } |
| switch (newState) { |
| case Renderer.STATE_ENDED: |
| case Renderer.STATE_STOPPED: |
| mPlaybackState.setState(PlaybackState.PLAYSTATE_STOPPED); |
| break; |
| case Renderer.STATE_INIT: |
| case Renderer.STATE_PREPARING: |
| mPlaybackState.setState(PlaybackState.PLAYSTATE_BUFFERING); |
| break; |
| case Renderer.STATE_ERROR: |
| mPlaybackState.setState(PlaybackState.PLAYSTATE_ERROR); |
| break; |
| case Renderer.STATE_PAUSED: |
| mPlaybackState.setState(PlaybackState.PLAYSTATE_PAUSED); |
| break; |
| case Renderer.STATE_PLAYING: |
| mPlaybackState.setState(PlaybackState.PLAYSTATE_PLAYING); |
| break; |
| default: |
| mPlaybackState.setState(PlaybackState.PLAYSTATE_ERROR); |
| mPlaybackState.setErrorMessage("unkown state"); |
| break; |
| } |
| mPlaybackState.setPosition(mRenderer.getSeekPosition()); |
| mPerformer.setPlaybackState(mPlaybackState); |
| if (mListener != null) { |
| mListener.onPlayStateChanged(mPlaybackState); |
| } |
| } |
| |
| @Override |
| public void onBufferingUpdate(int percent) { |
| } |
| |
| @Override |
| public void onFocusLost() { |
| Log.d(TAG, "Focus lost, changing state to " + Renderer.STATE_PAUSED); |
| mPlaybackState.setState(PlaybackState.PLAYSTATE_PAUSED); |
| mPlaybackState.setPosition(mRenderer.getSeekPosition()); |
| mPerformer.setPlaybackState(mPlaybackState); |
| if (mListener != null) { |
| mListener.onPlayStateChanged(mPlaybackState); |
| } |
| } |
| |
| @Override |
| public void onNextStarted() { |
| } |
| |
| } |
| |
| private class ControllerCb extends MediaSession.Callback { |
| |
| @Override |
| public void onMediaButton(Intent mediaRequestIntent) { |
| if (Intent.ACTION_MEDIA_BUTTON.equals(mediaRequestIntent.getAction())) { |
| KeyEvent event = (KeyEvent) mediaRequestIntent |
| .getParcelableExtra(Intent.EXTRA_KEY_EVENT); |
| switch (event.getKeyCode()) { |
| case KeyEvent.KEYCODE_MEDIA_PLAY: |
| Log.d(TAG, "play button received"); |
| mRenderer.onPlay(); |
| break; |
| case KeyEvent.KEYCODE_MEDIA_PAUSE: |
| Log.d(TAG, "pause button received"); |
| mRenderer.onPause(); |
| break; |
| } |
| } |
| } |
| } |
| |
| private class TransportListener extends TransportPerformer.Listener { |
| @Override |
| public void onPlay() { |
| mRenderer.onPlay(); |
| } |
| |
| @Override |
| public void onPause() { |
| mRenderer.onPause(); |
| } |
| } |
| |
| } |