/*
* 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.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.session.MediaSession;
import android.media.session.PlaybackState;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.android.onemedia.playback.IRequestCallback;
import com.android.onemedia.playback.RequestUtils;
import java.util.ArrayList;
public class PlayerService extends Service {
private static final String TAG = "PlayerService";
private PlayerBinder mBinder;
private PlayerSession mSession;
private NotificationHelper mNotifyHelper;
private Intent mIntent;
private boolean mStarted = false;
private ArrayList<IPlayerCallback> mCbs = new ArrayList<IPlayerCallback>();
@Override
public void onCreate() {
Log.d(TAG, "onCreate");
mIntent = onCreateServiceIntent();
if (mSession == null) {
mSession = onCreatePlayerController();
mSession.createSession();
mSession.setListener(mPlayerListener);
mNotifyHelper = new NotificationHelper(this, mSession.mSession);
}
}
@Override
public IBinder onBind(Intent intent) {
if (mBinder == null) {
mBinder = new PlayerBinder();
}
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return START_STICKY;
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
mSession.onDestroy();
mSession = null;
}
public void onPlaybackStarted() {
if (!mStarted) {
Log.d(TAG, "Starting self");
startService(onCreateServiceIntent());
mNotifyHelper.onStart();
mStarted = true;
}
}
public void onPlaybackEnded() {
if (mStarted) {
Log.d(TAG, "Stopping self");
mNotifyHelper.onStop();
stopSelf();
mStarted = false;
}
}
protected Intent onCreateServiceIntent() {
return new Intent(this, PlayerService.class).setPackage(getBasePackageName());
}
protected PlayerSession onCreatePlayerController() {
return new PlayerSession(this);
}
protected ArrayList<String> getAllowedPackages() {
return null;
}
private final PlayerSession.Listener mPlayerListener = new PlayerSession.Listener() {
@Override
public void onPlayStateChanged(PlaybackState state) {
switch (state.getState()) {
case PlaybackState.STATE_PLAYING:
onPlaybackStarted();
break;
case PlaybackState.STATE_STOPPED:
case PlaybackState.STATE_ERROR:
onPlaybackEnded();
break;
}
}
};
public class PlayerBinder extends IPlayerService.Stub {
@Override
public void sendRequest(String action, Bundle params, IRequestCallback cb) {
if (RequestUtils.ACTION_SET_CONTENT.equals(action)) {
mSession.setContent(params);
} else if (RequestUtils.ACTION_SET_NEXT_CONTENT.equals(action)) {
mSession.setNextContent(params);
}
}
@Override
public void registerCallback(final IPlayerCallback cb) throws RemoteException {
if (!mCbs.contains(cb)) {
mCbs.add(cb);
cb.asBinder().linkToDeath(new IBinder.DeathRecipient() {
@Override
public void binderDied() {
mCbs.remove(cb);
}
}, 0);
}
try {
cb.onSessionChanged(getSessionToken());
} catch (RemoteException e) {
mCbs.remove(cb);
throw e;
}
}
@Override
public void unregisterCallback(IPlayerCallback cb) throws RemoteException {
mCbs.remove(cb);
}
@Override
public MediaSession.Token getSessionToken() throws RemoteException {
if (mSession == null) {
Log.e(TAG, "Error in PlayerService: mSession=null in getSessionToken()");
return null;
}
return mSession.getSessionToken();
}
@Override
public void setIcon(Bitmap icon) {
mSession.setIcon(icon);
}
}
}