/*
* Copyright (C) 2017 Team Gateship-One
* (Hendrik Borghorst & Frederik Luetkes)
*
* The AUTHORS.md file contains a detailed contributors list:
* <https://github.com/gateship-one/odyssey/blob/master/AUTHORS.md>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.gateshipone.odyssey.playbackservice;
import android.os.Message;
import android.os.RemoteException;
import org.gateshipone.odyssey.models.TrackModel;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
public class OdysseyPlaybackServiceInterface extends IOdysseyPlaybackService.Stub {
// Holds the actual playback service for handling reasons
private final WeakReference<PlaybackService> mService;
public OdysseyPlaybackServiceInterface(PlaybackService service) {
mService = new WeakReference<>(service);
}
/**
* Following are methods which call the handler thread (which runs at
* audio priority) so that handling of playback is done in a seperate
* thread for performance reasons.
*/
@Override
public void play(TrackModel track) throws RemoteException {
// Create play control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_PLAY, track);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void pause() throws RemoteException {
// Create pause control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_PAUSE);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void stop() throws RemoteException {
// Create stop control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_STOP);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void setNextTrack(String uri) throws RemoteException {
// Create nexttrack control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_SETNEXTRACK, uri);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueueTracks(List<TrackModel> tracks) throws RemoteException {
// Create enqueuetracks control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUETRACKS, (ArrayList<TrackModel>) tracks);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueueTrack(TrackModel track, boolean asNext) throws RemoteException {
// Create enqueuetrack control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUETRACK, track, asNext);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void getCurrentList(List<TrackModel> list) throws RemoteException {
for (TrackModel track : mService.get().getCurrentList()) {
list.add(track);
}
}
@Override
public void toggleRandom() throws RemoteException {
// Create random control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_RANDOM);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void toggleRepeat() throws RemoteException {
// Create repeat control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_REPEAT);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public String getArtist() throws RemoteException {
TrackModel track = mService.get().getCurrentTrack();
if (track != null) {
return track.getTrackArtistName();
}
return "";
}
@Override
public String getAlbum() throws RemoteException {
TrackModel track = mService.get().getCurrentTrack();
if (track != null) {
return track.getTrackAlbumName();
}
return "";
}
@Override
public String getTrackname() throws RemoteException {
TrackModel track = mService.get().getCurrentTrack();
if (track != null) {
return track.getTrackName();
}
return "";
}
@Override
public int getTrackNo() throws RemoteException {
TrackModel track = mService.get().getCurrentTrack();
if (track != null) {
return track.getTrackNumber();
}
return 0;
}
@Override
public void hideArtworkChanged(boolean enabled) throws RemoteException {
mService.get().hideArtwork(enabled);
}
@Override
public boolean isBusy() throws RemoteException {
return mService.get().isBusy();
}
@Override
public void seekTo(int position) throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_SEEKTO, position);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void jumpTo(int position) throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_JUMPTO, position);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void clearPlaylist() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_CLEARPLAYLIST);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void resume() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_RESUME);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void next() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_NEXT);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void previous() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_PREVIOUS);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void togglePause() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_TOGGLEPAUSE);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public int getTrackPosition() throws RemoteException {
return mService.get().getTrackPosition();
}
@Override
public int getTrackDuration() throws RemoteException {
return mService.get().getTrackDuration();
}
@Override
public TrackModel getCurrentSong() throws RemoteException {
return mService.get().getCurrentTrack();
}
public NowPlayingInformation getNowPlayingInformation() throws RemoteException {
return mService.get().getNowPlayingInformation();
}
@Override
public void dequeueTrack(int index) throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_DEQUEUETRACK, index);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void dequeueTracks(int index) throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_DEQUEUETRACKS, index);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public TrackModel getPlaylistSong(int index) throws RemoteException {
return mService.get().getPlaylistTrack(index);
}
@Override
public int getPlaylistSize() throws RemoteException {
return mService.get().getPlaylistSize();
}
@Override
public void shufflePlaylist() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_SHUFFLEPLAYLIST);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void playAllTracksShuffled() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_PLAYALLTRACKSSHUFFLED);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void playAllTracks() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_PLAYALLTRACKS);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public int getCurrentIndex() throws RemoteException {
return mService.get().getCurrentIndex();
}
@Override
public void savePlaylist(String name) throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_SAVEPLAYLIST, name);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueuePlaylist(long playlistId) throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUEPLAYLIST, playlistId);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueueAlbum(String albumKey) throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUEALBUM, albumKey);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueueRecentAlbums() throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUERECENTALBUMS);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueueArtist(long artistId, String orderKey) throws RemoteException {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUEARTIST, artistId, orderKey);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void resumeBookmark(long timestamp) throws RemoteException {
// create resume bookmark control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_RESUMEBOOKMARK, timestamp);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void deleteBookmark(long timestamp) throws RemoteException {
// create delete bookmark control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_DELETEBOOKMARK, timestamp);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void createBookmark(String bookmarkTitle) throws RemoteException {
// create create bookmark control object
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_CREATEBOOKMARK, bookmarkTitle);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueueFile(String filePath, boolean asNext) {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUEFILE, filePath, asNext);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueueDirectory(String directoryPath) {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUEDIRECTORY, directoryPath);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
@Override
public void enqueueDirectoryAndSubDirectories(String directoryPath) {
ControlObject obj = new ControlObject(ControlObject.PLAYBACK_ACTION.ODYSSEY_ENQUEUEDIRECTORYANDSUBDIRECTORIES, directoryPath);
Message msg = mService.get().getHandler().obtainMessage();
msg.obj = obj;
mService.get().getHandler().sendMessage(msg);
}
}