/* This file is part of the Android Clementine Remote.
* Copyright (C) 2013, Andreas Muttscheller <asfa194@gmail.com>
*
* 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 de.qspool.clementineremote.backend.pb;
import java.util.LinkedList;
import de.qspool.clementineremote.App;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.DownloadItem;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.Message;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.MsgType;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.Repeat;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestChangeSong;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestConnect;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestDownloadSongs;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestInsertUrls;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestPlaylistSongs;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestRateSong;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestRemoveSongs;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestSetTrackPosition;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.RequestSetVolume;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.ResponseSongOffer;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.Shuffle;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer.ShuffleMode;
import de.qspool.clementineremote.backend.player.MySong;
/**
* Creates the protocol buffer messages
*/
public class ClementineMessageFactory {
private ClementineMessageFactory() {
}
/**
* Create a song offer response
*
* @return ResponseSongOffer Builder for protocol buffer message
*/
public static ClementineMessage buildSongOfferResponse(boolean accepted) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.SONG_OFFER_RESPONSE);
ResponseSongOffer.Builder offer = msg.getResponseSongOfferBuilder();
offer.setAccepted(accepted);
return new ClementineMessage(msg);
}
public static ClementineMessage buildDownloadSongsMessage(DownloadItem downloadItem) {
return buildDownloadSongsMessage(downloadItem, -1, null);
}
public static ClementineMessage buildDownloadSongsMessage(DownloadItem downloadItem, int playlistId) {
return buildDownloadSongsMessage(downloadItem, playlistId, null);
}
public static ClementineMessage buildDownloadSongsMessage(DownloadItem downloadItem, LinkedList<String> urls) {
return buildDownloadSongsMessage(downloadItem, -1, urls);
}
/**
* Create a download song message
*
* @return The built request
*/
public static ClementineMessage buildDownloadSongsMessage(DownloadItem downloadItem, int playlistId, LinkedList<String> urls) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.DOWNLOAD_SONGS);
RequestDownloadSongs.Builder request = msg.getRequestDownloadSongsBuilder();
request.setPlaylistId(playlistId);
request.setDownloadItem(downloadItem);
if (urls != null && !urls.isEmpty())
request.addAllUrls(urls);
return new ClementineMessage(msg);
}
/**
* Create the volume specific message
*
* @return the Volume message part
*/
public static ClementineMessage buildVolumeMessage(int volume) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.SET_VOLUME);
RequestSetVolume.Builder requestSetVolume = msg.getRequestSetVolumeBuilder();
requestSetVolume.setVolume(volume);
return new ClementineMessage(msg);
}
/**
* Create the connect specific message
*
* @return the connect message part
*/
public static ClementineMessage buildConnectMessage(String ip, int port, int authCode,
boolean getPlaylistSongs, boolean isDownloader) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.CONNECT);
RequestConnect.Builder requestConnect = msg.getRequestConnectBuilder();
requestConnect.setAuthCode(authCode);
requestConnect.setSendPlaylistSongs(getPlaylistSongs);
requestConnect.setDownloader(isDownloader);
ClementineMessage clementineMessage = new ClementineMessage(msg);
clementineMessage.setIp(ip);
clementineMessage.setPort(port);
return clementineMessage;
}
/**
* Build shuffle Message
*
* @return The created element
*/
public static ClementineMessage buildShuffle() {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.SHUFFLE);
Shuffle.Builder shuffle = msg.getShuffleBuilder();
switch (App.Clementine.getShuffleMode()) {
case OFF:
shuffle.setShuffleMode(ShuffleMode.Shuffle_Off);
break;
case ALL:
shuffle.setShuffleMode(ShuffleMode.Shuffle_All);
break;
case INSIDE_ALBUM:
shuffle.setShuffleMode(ShuffleMode.Shuffle_InsideAlbum);
break;
case ALBUMS:
shuffle.setShuffleMode(ShuffleMode.Shuffle_Albums);
break;
}
return new ClementineMessage(msg);
}
/**
* Build Repeat Message
*
* @return The created element
*/
public static ClementineMessage buildRepeat() {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.REPEAT);
Repeat.Builder repeat = msg.getRepeatBuilder();
switch (App.Clementine.getRepeatMode()) {
case OFF:
repeat.setRepeatMode(ClementineRemoteProtocolBuffer.RepeatMode.Repeat_Off);
break;
case TRACK:
repeat.setRepeatMode(ClementineRemoteProtocolBuffer.RepeatMode.Repeat_Track);
break;
case ALBUM:
repeat.setRepeatMode(ClementineRemoteProtocolBuffer.RepeatMode.Repeat_Album);
break;
case PLAYLIST:
repeat.setRepeatMode(ClementineRemoteProtocolBuffer.RepeatMode.Repeat_Playlist);
break;
}
return new ClementineMessage(msg);
}
/**
* Request all Songs in current playlist
*
* @return The Builder for the Message
*/
public static ClementineMessage buildRequestPlaylistSongs(int playlistId) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.REQUEST_PLAYLIST_SONGS);
RequestPlaylistSongs.Builder requestPlaylistSongs = msg.getRequestPlaylistSongsBuilder();
requestPlaylistSongs.setId(playlistId);
return new ClementineMessage(msg);
}
/**
* Request all Songs in current playlist
*
* @return The Builder for the Message
*/
public static ClementineMessage buildRequestChangeSong(int songIndex, int playlistId) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.CHANGE_SONG);
RequestChangeSong.Builder request = msg.getRequestChangeSongBuilder();
request.setSongIndex(songIndex);
request.setPlaylistId(playlistId);
return new ClementineMessage(msg);
}
/**
* Request to set the track position
*
* @return The Clementine message
*/
public static ClementineMessage buildTrackPosition(int position) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.SET_TRACK_POSITION);
RequestSetTrackPosition.Builder request = msg.getRequestSetTrackPositionBuilder();
request.setPosition(position);
return new ClementineMessage(msg);
}
/**
* Rate the current track
*
* @param rating the rating from 0 to 1. Multiply five times for star count
* @return the Clementine Message
*/
public static ClementineMessage buildRateTrack(float rating) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.RATE_SONG);
RequestRateSong.Builder request = msg.getRequestRateSongBuilder();
request.setRating(rating);
return new ClementineMessage(msg);
}
/**
* Inserts a song into given playlist
*
* @param playistId The id of the playlist
* @param urls The urls to the items
* @return the Clementine Message
*/
public static ClementineMessage buildInsertUrl(int playistId, LinkedList<String> urls) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.INSERT_URLS);
RequestInsertUrls.Builder insertUrls = msg.getRequestInsertUrlsBuilder();
insertUrls.setPlaylistId(playistId);
for (String url : urls) {
insertUrls.addUrls(url);
}
return new ClementineMessage(msg);
}
public static ClementineMessage buildInsertSongs(int playistId,
LinkedList<ClementineRemoteProtocolBuffer.SongMetadata> songs) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.INSERT_URLS);
RequestInsertUrls.Builder insertSongs = msg.getRequestInsertUrlsBuilder();
insertSongs.setPlaylistId(playistId);
insertSongs.addAllSongs(songs);
return new ClementineMessage(msg);
}
public static ClementineMessage buildRemoveSongFromPlaylist(int playlistId, MySong song) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.REMOVE_SONGS);
RequestRemoveSongs.Builder removeItems = msg.getRequestRemoveSongsBuilder();
removeItems.setPlaylistId(playlistId);
removeItems.addSongs(song.getIndex());
return new ClementineMessage(msg);
}
public static ClementineMessage buildRemoveMultipleSongsFromPlaylist(int playlistId,
LinkedList<MySong> songs) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.REMOVE_SONGS);
RequestRemoveSongs.Builder removeItems = msg.getRequestRemoveSongsBuilder();
removeItems.setPlaylistId(playlistId);
for (MySong s : songs) {
removeItems.addSongs(s.getIndex());
}
return new ClementineMessage(msg);
}
public static ClementineMessage buildClosePlaylist(int playlistId) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.CLOSE_PLAYLIST);
ClementineRemoteProtocolBuffer.RequestClosePlaylist.Builder requestClosePlaylist = msg
.getRequestClosePlaylistBuilder();
requestClosePlaylist.setPlaylistId(playlistId);
return new ClementineMessage(msg);
}
public static ClementineMessage buildGlobalSearch(String query) {
Message.Builder msg = ClementineMessage.getMessageBuilder(MsgType.GLOBAL_SEARCH);
ClementineRemoteProtocolBuffer.RequestGlobalSearch.Builder requestGlobalSearch = msg.
getRequestGlobalSearchBuilder();
requestGlobalSearch.setQuery(query);
return new ClementineMessage(msg);
}
}