package de.calette.mephisto3.ui.radio; import callete.api.Callete; import callete.api.services.music.model.Stream; import callete.api.services.music.player.MusicPlayerPlaylist; import callete.api.services.music.player.PlaylistMetaData; import callete.api.services.music.player.PlaylistMetaDataChangeListener; import de.calette.mephisto3.control.ServiceController; import de.calette.mephisto3.control.ServiceState; import de.calette.mephisto3.ui.ControllablePanel; import javafx.application.Platform; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * All components for the Radio control. */ public class StreamsController extends ControllablePanel implements PlaylistMetaDataChangeListener { private final static Logger LOG = LoggerFactory.getLogger(StreamsController.class); private Stream selectedStream; private Stream activeStream; private PlaylistMetaData currentMetaData; private StreamsUI streamsUI; public StreamsController() { //initial station selection activeStream = (Stream) ServiceController.getInstance().getServiceState().getSelection(); selectedStream = activeStream; //create the basic UI panel streamsUI = new StreamsUI(this, activeStream); getChildren().add(streamsUI); } //--------------------------- UI control ---------------------------------------------- @Override public void pushed(ServiceState serviceState) { //reset meta data status currentMetaData = null; //save last selected state first Stream selection = (Stream) serviceState.getSelection(); //check if the push button was pressed for the current selection, select next station then if(selection.equals(activeStream)) { serviceState.incrementIndex(); activeStream = (Stream) serviceState.getSelection(); selectedStream = activeStream; serviceState.saveState(); streamsUI.updateSelection(); //well, play the selected stream playActiveStream(); return; } activeStream = selection; serviceState.saveState(); playActiveStream(); } @Override protected void serviceStateChanged(ServiceState serviceState) { selectedStream = (Stream) serviceState.getSelection(); updateUI(null); } //--------------------------- Event listeners ---------------------------------------------- @Override public void updateMetaData(final PlaylistMetaData metaData) { if(!metaData.getItem().equals(activeStream)) { return; } //store data for re-selection currentMetaData = metaData; //apply the labels if the current stream is the active stream updateUI(null); } // -------------------- Overridden UI states ----------------------------- @Override public void showPanel() { startStreaming(); Callete.getMusicPlayer().getPlaylist().addMetaDataChangeListener(this); streamsUI.showControl(); super.showPanel(); } @Override public void hidePanel() { Callete.getMusicPlayer().getPlaylist().removeMetaDataChangeListener(this); streamsUI.hideControl(); super.hidePanel(); } // ------------------- Helper -------------------------------------------- private void playActiveStream() { //well, play the selected stream final MusicPlayerPlaylist playlist = Callete.getMusicPlayer().getPlaylist(); playlist.setActiveItem(activeStream); Callete.getMusicPlayer().play(); //update the UI updateUI(activeStream); } private void updateUI(final Stream stream) { //if a stream is given, it's from a new selection, so activate it. if(stream != null) { streamsUI.activateStream(stream); } else if(selectedStream == activeStream) { streamsUI.selectActiveStream(activeStream, currentMetaData); } else { streamsUI.selectStream(); } } /** * No matter if the UI is build yet, start playing the stream. */ private void startStreaming() { final MusicPlayerPlaylist playlist = Callete.getMusicPlayer().getPlaylist(); playlist.setActiveItem(activeStream); Platform.runLater(new Runnable() { @Override public void run() { streamsUI.reset(); } }); Callete.getMusicPlayer().play(); LOG.info("Starting playback of last stream selection: " + activeStream); } }