Major cleanup, minor fixes

This commit is contained in:
Nite 2020-06-25 14:33:44 +02:00
parent 8c60e09914
commit b83631107c
No known key found for this signature in database
GPG Key ID: 1D1AD59B1C6386C1
27 changed files with 453 additions and 547 deletions

View File

@ -960,7 +960,7 @@
<issue <issue
id="StaticFieldLeak" id="StaticFieldLeak"
message="This AsyncTask class should be static or leaks might occur (org.moire.ultrasonic.service.DownloadServiceLifecycleSupport.SerializeTask)" message="This AsyncTask class should be static or leaks might occur (org.moire.ultrasonic.service.MediaPlayerLifecycleSupport.SerializeTask)"
errorLine1=" private class SerializeTask extends AsyncTask&lt;Void, Void, Void>" errorLine1=" private class SerializeTask extends AsyncTask&lt;Void, Void, Void>"
errorLine2=" ~~~~~~~~~~~~~"> errorLine2=" ~~~~~~~~~~~~~">
<location <location
@ -971,7 +971,7 @@
<issue <issue
id="StaticFieldLeak" id="StaticFieldLeak"
message="This AsyncTask class should be static or leaks might occur (org.moire.ultrasonic.service.DownloadServiceLifecycleSupport.DeserializeTask)" message="This AsyncTask class should be static or leaks might occur (org.moire.ultrasonic.service.MediaPlayerLifecycleSupport.DeserializeTask)"
errorLine1=" private class DeserializeTask extends AsyncTask&lt;Void, Void, Void>" errorLine1=" private class DeserializeTask extends AsyncTask&lt;Void, Void, Void>"
errorLine2=" ~~~~~~~~~~~~~~~"> errorLine2=" ~~~~~~~~~~~~~~~">
<location <location

View File

@ -206,8 +206,8 @@ public class BookmarkActivity extends SubsonicTabActivity
if (!getSelectedSongs(albumListView).isEmpty()) if (!getSelectedSongs(albumListView).isEmpty())
{ {
int position = songs.get(0).getBookmarkPosition(); int position = songs.get(0).getBookmarkPosition();
if (getDownloadService() == null) return; if (getMediaPlayerController() == null) return;
getDownloadService().restore(songs, 0, position, true, true); getMediaPlayerController().restore(songs, 0, position, true, true);
selectAll(false, false); selectAll(false, false);
} }
} }
@ -296,7 +296,7 @@ public class BookmarkActivity extends SubsonicTabActivity
private void enableButtons() private void enableButtons()
{ {
if (getDownloadService() == null) if (getMediaPlayerController() == null)
{ {
return; return;
} }
@ -345,7 +345,7 @@ public class BookmarkActivity extends SubsonicTabActivity
private void downloadBackground(final boolean save, final List<MusicDirectory.Entry> songs) private void downloadBackground(final boolean save, final List<MusicDirectory.Entry> songs)
{ {
if (getDownloadService() == null) if (getMediaPlayerController() == null)
{ {
return; return;
} }
@ -356,7 +356,7 @@ public class BookmarkActivity extends SubsonicTabActivity
public void run() public void run()
{ {
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
getDownloadService().downloadBackground(songs, save); getMediaPlayerController().downloadBackground(songs, save);
if (save) if (save)
{ {
@ -382,19 +382,19 @@ public class BookmarkActivity extends SubsonicTabActivity
songs = getSelectedSongs(albumListView); songs = getSelectedSongs(albumListView);
} }
if (getDownloadService() != null) if (getMediaPlayerController() != null)
{ {
getDownloadService().delete(songs); getMediaPlayerController().delete(songs);
} }
} }
private void unpin() private void unpin()
{ {
if (getDownloadService() != null) if (getMediaPlayerController() != null)
{ {
List<MusicDirectory.Entry> songs = getSelectedSongs(albumListView); List<MusicDirectory.Entry> songs = getSelectedSongs(albumListView);
Util.toast(BookmarkActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_unpinned, songs.size(), songs.size())); Util.toast(BookmarkActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_unpinned, songs.size(), songs.size()));
getDownloadService().unpin(songs); getMediaPlayerController().unpin(songs);
} }
} }

View File

@ -60,7 +60,7 @@ import org.moire.ultrasonic.domain.RepeatMode;
import org.moire.ultrasonic.featureflags.Feature; import org.moire.ultrasonic.featureflags.Feature;
import org.moire.ultrasonic.featureflags.FeatureStorage; import org.moire.ultrasonic.featureflags.FeatureStorage;
import org.moire.ultrasonic.service.DownloadFile; import org.moire.ultrasonic.service.DownloadFile;
import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.service.MusicService; import org.moire.ultrasonic.service.MusicService;
import org.moire.ultrasonic.service.MusicServiceFactory; import org.moire.ultrasonic.service.MusicServiceFactory;
import org.moire.ultrasonic.util.Constants; import org.moire.ultrasonic.util.Constants;
@ -257,7 +257,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
getDownloadService().previous(); getMediaPlayerController().previous();
return null; return null;
} }
@ -295,7 +295,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
{ {
if (downloader.getValue().getCurrentPlayingIndex() < downloader.getValue().downloadList.size() - 1) if (downloader.getValue().getCurrentPlayingIndex() < downloader.getValue().downloadList.size() - 1)
{ {
getDownloadService().next(); getMediaPlayerController().next();
return true; return true;
} }
else else
@ -337,7 +337,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
getDownloadService().pause(); getMediaPlayerController().pause();
return null; return null;
} }
@ -361,7 +361,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
getDownloadService().reset(); getMediaPlayerController().reset();
return null; return null;
} }
@ -406,7 +406,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
public void onClick(final View view) public void onClick(final View view)
{ {
getDownloadService().shuffle(); getMediaPlayerController().shuffle();
Util.toast(DownloadActivity.this, R.string.download_menu_shuffle_notification); Util.toast(DownloadActivity.this, R.string.download_menu_shuffle_notification);
} }
}); });
@ -416,9 +416,9 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
public void onClick(final View view) public void onClick(final View view)
{ {
final RepeatMode repeatMode = getDownloadService().getRepeatMode().next(); final RepeatMode repeatMode = getMediaPlayerController().getRepeatMode().next();
getDownloadService().setRepeatMode(repeatMode); getMediaPlayerController().setRepeatMode(repeatMode);
onDownloadListChanged(); onDownloadListChanged();
switch (repeatMode) switch (repeatMode)
@ -448,7 +448,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
getDownloadService().seekTo(getProgressBar().getProgress()); getMediaPlayerController().seekTo(getProgressBar().getProgress());
return null; return null;
} }
@ -483,7 +483,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
getDownloadService().play(position); getMediaPlayerController().play(position);
return null; return null;
} }
@ -499,15 +499,15 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
registerForContextMenu(playlistView); registerForContextMenu(playlistView);
final DownloadService downloadService = getDownloadService(); final MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService != null && getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, false)) if (mediaPlayerController != null && getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, false))
{ {
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
downloadService.setShufflePlayEnabled(true); mediaPlayerController.setShufflePlayEnabled(true);
} }
visualizerAvailable = (downloadService != null) && (downloadService.getVisualizerController() != null); visualizerAvailable = (mediaPlayerController != null) && (mediaPlayerController.getVisualizerController() != null);
equalizerAvailable = (downloadService != null) && (downloadService.getEqualizerController() != null); equalizerAvailable = (mediaPlayerController != null) && (mediaPlayerController.getEqualizerController() != null);
new Thread(new Runnable() new Thread(new Runnable()
{ {
@ -516,8 +516,8 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
{ {
try try
{ {
DownloadService downloadService = getDownloadService(); MediaPlayerController mediaPlayerController = getMediaPlayerController();
jukeboxAvailable = (downloadService != null) && (downloadService.isJukeboxAvailable()); jukeboxAvailable = (mediaPlayerController != null) && (mediaPlayerController.isJukeboxAvailable());
} }
catch (Exception e) catch (Exception e)
{ {
@ -549,7 +549,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
public boolean onTouch(final View view, final MotionEvent motionEvent) public boolean onTouch(final View view, final MotionEvent motionEvent)
{ {
visualizerView.setActive(!visualizerView.isActive()); visualizerView.setActive(!visualizerView.isActive());
getDownloadService().setShowVisualization(visualizerView.isActive()); getMediaPlayerController().setShowVisualization(visualizerView.isActive());
return true; return true;
} }
}); });
@ -565,9 +565,9 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
{ {
super.onResume(); super.onResume();
final DownloadService downloadService = getDownloadService(); final MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService == null || player.getValue().currentPlaying == null) if (mediaPlayerController == null || localMediaPlayer.getValue().currentPlaying == null)
{ {
playlistFlipper.setDisplayedChild(1); playlistFlipper.setDisplayedChild(1);
} }
@ -592,7 +592,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
executorService = Executors.newSingleThreadScheduledExecutor(); executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleWithFixedDelay(runnable, 0L, 250L, TimeUnit.MILLISECONDS); executorService.scheduleWithFixedDelay(runnable, 0L, 250L, TimeUnit.MILLISECONDS);
if (downloadService != null && downloadService.getKeepScreenOn()) if (mediaPlayerController != null && mediaPlayerController.getKeepScreenOn())
{ {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} }
@ -603,7 +603,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
if (visualizerView != null) if (visualizerView != null)
{ {
visualizerView.setActive(downloadService != null && downloadService.getShowVisualization()); visualizerView.setActive(mediaPlayerController != null && mediaPlayerController.getShowVisualization());
} }
invalidateOptionsMenu(); invalidateOptionsMenu();
@ -612,7 +612,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
// Scroll to current playing/downloading. // Scroll to current playing/downloading.
private void scrollToCurrent() private void scrollToCurrent()
{ {
if (getDownloadService() == null) if (getMediaPlayerController() == null)
{ {
return; return;
} }
@ -706,7 +706,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
{ {
if (id == DIALOG_SAVE_PLAYLIST) if (id == DIALOG_SAVE_PLAYLIST)
{ {
final String playlistName = (getDownloadService() != null) ? getDownloadService().getSuggestedPlaylistName() : null; final String playlistName = (getMediaPlayerController() != null) ? getMediaPlayerController().getSuggestedPlaylistName() : null;
if (playlistName != null) if (playlistName != null)
{ {
playlistNameView.setText(playlistName); playlistNameView.setText(playlistName);
@ -778,11 +778,11 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
visualizerMenuItem.setVisible(visualizerAvailable); visualizerMenuItem.setVisible(visualizerAvailable);
} }
final DownloadService downloadService = getDownloadService(); final MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService != null) if (mediaPlayerController != null)
{ {
DownloadFile downloadFile = player.getValue().currentPlaying; DownloadFile downloadFile = localMediaPlayer.getValue().currentPlaying;
if (downloadFile != null) if (downloadFile != null)
{ {
@ -807,7 +807,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
} }
if (downloadService.getKeepScreenOn()) if (mediaPlayerController.getKeepScreenOn())
{ {
if (screenOption != null) if (screenOption != null)
{ {
@ -827,7 +827,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
jukeboxOption.setEnabled(jukeboxAvailable); jukeboxOption.setEnabled(jukeboxAvailable);
jukeboxOption.setVisible(jukeboxAvailable); jukeboxOption.setVisible(jukeboxAvailable);
if (downloadService.isJukeboxEnabled()) if (mediaPlayerController.isJukeboxEnabled())
{ {
jukeboxOption.setTitle(R.string.download_menu_jukebox_off); jukeboxOption.setTitle(R.string.download_menu_jukebox_off);
} }
@ -967,23 +967,23 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
startActivityForResultWithoutTransition(this, intent); startActivityForResultWithoutTransition(this, intent);
return true; return true;
case R.id.menu_remove: case R.id.menu_remove:
getDownloadService().remove(song); getMediaPlayerController().remove(song);
onDownloadListChanged(); onDownloadListChanged();
return true; return true;
case R.id.menu_item_screen_on_off: case R.id.menu_item_screen_on_off:
if (getDownloadService().getKeepScreenOn()) if (getMediaPlayerController().getKeepScreenOn())
{ {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getDownloadService().setKeepScreenOn(false); getMediaPlayerController().setKeepScreenOn(false);
} }
else else
{ {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getDownloadService().setKeepScreenOn(true); getMediaPlayerController().setKeepScreenOn(true);
} }
return true; return true;
case R.id.menu_shuffle: case R.id.menu_shuffle:
getDownloadService().shuffle(); getMediaPlayerController().shuffle();
Util.toast(this, R.string.download_menu_shuffle_notification); Util.toast(this, R.string.download_menu_shuffle_notification);
return true; return true;
case R.id.menu_item_equalizer: case R.id.menu_item_equalizer:
@ -1002,20 +1002,20 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
visualizerViewLayout.setVisibility(View.VISIBLE); visualizerViewLayout.setVisibility(View.VISIBLE);
} }
getDownloadService().setShowVisualization(visualizerView.isActive()); getMediaPlayerController().setShowVisualization(visualizerView.isActive());
Util.toast(DownloadActivity.this, active ? R.string.download_visualizer_on : R.string.download_visualizer_off); Util.toast(DownloadActivity.this, active ? R.string.download_visualizer_on : R.string.download_visualizer_off);
return true; return true;
case R.id.menu_item_jukebox: case R.id.menu_item_jukebox:
final boolean jukeboxEnabled = !getDownloadService().isJukeboxEnabled(); final boolean jukeboxEnabled = !getMediaPlayerController().isJukeboxEnabled();
getDownloadService().setJukeboxEnabled(jukeboxEnabled); getMediaPlayerController().setJukeboxEnabled(jukeboxEnabled);
Util.toast(DownloadActivity.this, jukeboxEnabled ? R.string.download_jukebox_on : R.string.download_jukebox_off, false); Util.toast(DownloadActivity.this, jukeboxEnabled ? R.string.download_jukebox_on : R.string.download_jukebox_off, false);
return true; return true;
case R.id.menu_item_toggle_list: case R.id.menu_item_toggle_list:
toggleFullScreenAlbumArt(); toggleFullScreenAlbumArt();
return true; return true;
case R.id.menu_item_clear_playlist: case R.id.menu_item_clear_playlist:
getDownloadService().setShufflePlayEnabled(false); getMediaPlayerController().setShufflePlayEnabled(false);
getDownloadService().clear(); getMediaPlayerController().clear();
onDownloadListChanged(); onDownloadListChanged();
return true; return true;
case R.id.menu_item_save_playlist: case R.id.menu_item_save_playlist:
@ -1077,7 +1077,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
} }
final String songId = currentSong.getId(); final String songId = currentSong.getId();
final int playerPosition = getDownloadService().getPlayerPosition(); final int playerPosition = getMediaPlayerController().getPlayerPosition();
currentSong.setBookmarkPosition(playerPosition); currentSong.setBookmarkPosition(playerPosition);
@ -1137,10 +1137,10 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
return true; return true;
case R.id.menu_item_share: case R.id.menu_item_share:
DownloadService downloadService = getDownloadService(); MediaPlayerController mediaPlayerController = getMediaPlayerController();
List<Entry> entries = new ArrayList<Entry>(); List<Entry> entries = new ArrayList<Entry>();
if (downloadService != null) if (mediaPlayerController != null)
{ {
List<DownloadFile> downloadServiceSongs = downloader.getValue().downloadList; List<DownloadFile> downloadServiceSongs = downloader.getValue().downloadList;
@ -1170,7 +1170,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private void update() private void update()
{ {
if (getDownloadService() == null) if (getMediaPlayerController() == null)
{ {
return; return;
} }
@ -1180,7 +1180,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
onDownloadListChanged(); onDownloadListChanged();
} }
if (currentPlaying != player.getValue().currentPlaying) if (currentPlaying != localMediaPlayer.getValue().currentPlaying)
{ {
onCurrentChanged(); onCurrentChanged();
} }
@ -1192,7 +1192,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private void savePlaylistInBackground(final String playlistName) private void savePlaylistInBackground(final String playlistName)
{ {
Util.toast(DownloadActivity.this, getResources().getString(R.string.download_playlist_saving, playlistName)); Util.toast(DownloadActivity.this, getResources().getString(R.string.download_playlist_saving, playlistName));
getDownloadService().setSuggestedPlaylistName(playlistName); getMediaPlayerController().setSuggestedPlaylistName(playlistName);
new SilentBackgroundTask<Void>(this) new SilentBackgroundTask<Void>(this)
{ {
@Override @Override
@ -1243,7 +1243,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private void start() private void start()
{ {
final DownloadService service = getDownloadService(); final MediaPlayerController service = getMediaPlayerController();
final PlayerState state = service.getPlayerState(); final PlayerState state = service.getPlayerState();
if (state == PAUSED || state == COMPLETED || state == STOPPED) if (state == PAUSED || state == COMPLETED || state == STOPPED)
@ -1269,8 +1269,8 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private void onDownloadListChanged() private void onDownloadListChanged()
{ {
final DownloadService downloadService = getDownloadService(); final MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService == null) if (mediaPlayerController == null)
{ {
return; return;
} }
@ -1306,18 +1306,18 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
public void remove(int which) public void remove(int which)
{ {
DownloadFile item = adapter.getItem(which); DownloadFile item = adapter.getItem(which);
DownloadService downloadService = getDownloadService(); MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (item == null || downloadService == null) if (item == null || mediaPlayerController == null)
{ {
return; return;
} }
DownloadFile currentPlaying = player.getValue().currentPlaying; DownloadFile currentPlaying = localMediaPlayer.getValue().currentPlaying;
if (currentPlaying == item) if (currentPlaying == item)
{ {
getDownloadService().next(); getMediaPlayerController().next();
} }
adapter.remove(item); adapter.remove(item);
@ -1335,7 +1335,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
emptyTextView.setVisibility(list.isEmpty() ? View.VISIBLE : View.GONE); emptyTextView.setVisibility(list.isEmpty() ? View.VISIBLE : View.GONE);
currentRevision = downloader.getValue().getDownloadListUpdateRevision(); currentRevision = downloader.getValue().getDownloadListUpdateRevision();
switch (downloadService.getRepeatMode()) switch (mediaPlayerController.getRepeatMode())
{ {
case OFF: case OFF:
repeatButton.setImageDrawable(Util.getDrawableFromAttribute(this, R.attr.media_repeat_off)); repeatButton.setImageDrawable(Util.getDrawableFromAttribute(this, R.attr.media_repeat_off));
@ -1353,14 +1353,14 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private void onCurrentChanged() private void onCurrentChanged()
{ {
DownloadService downloadService = getDownloadService(); MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService == null) if (mediaPlayerController == null)
{ {
return; return;
} }
currentPlaying = player.getValue().currentPlaying; currentPlaying = localMediaPlayer.getValue().currentPlaying;
scrollToCurrent(); scrollToCurrent();
@ -1398,16 +1398,16 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private void onSliderProgressChanged() private void onSliderProgressChanged()
{ {
DownloadService downloadService = getDownloadService(); MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService == null || onProgressChangedTask != null) if (mediaPlayerController == null || onProgressChangedTask != null)
{ {
return; return;
} }
onProgressChangedTask = new SilentBackgroundTask<Void>(this) onProgressChangedTask = new SilentBackgroundTask<Void>(this)
{ {
DownloadService downloadService; MediaPlayerController mediaPlayerController;
boolean isJukeboxEnabled; boolean isJukeboxEnabled;
int millisPlayed; int millisPlayed;
Integer duration; Integer duration;
@ -1416,11 +1416,11 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
downloadService = getDownloadService(); this.mediaPlayerController = getMediaPlayerController();
isJukeboxEnabled = downloadService.isJukeboxEnabled(); isJukeboxEnabled = this.mediaPlayerController.isJukeboxEnabled();
millisPlayed = Math.max(0, downloadService.getPlayerPosition()); millisPlayed = Math.max(0, this.mediaPlayerController.getPlayerPosition());
duration = downloadService.getPlayerDuration(); duration = this.mediaPlayerController.getPlayerDuration();
playerState = getDownloadService().getPlayerState(); playerState = getMediaPlayerController().getPlayerState();
return null; return null;
} }
@ -1457,9 +1457,9 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
setActionBarSubtitle(R.string.download_playerstate_buffering); setActionBarSubtitle(R.string.download_playerstate_buffering);
break; break;
case STARTED: case STARTED:
final DownloadService downloadService = getDownloadService(); final MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService != null && downloadService.isShufflePlayEnabled()) if (mediaPlayerController != null && mediaPlayerController.isShufflePlayEnabled())
{ {
setActionBarSubtitle(R.string.download_playerstate_playing_shuffle); setActionBarSubtitle(R.string.download_playerstate_playing_shuffle);
} }
@ -1503,7 +1503,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
break; break;
} }
// TODO: It would be a lot nicer if DownloadService would send an event when this is necessary instead of updating every time // TODO: It would be a lot nicer if MediaPlayerController would send an event when this is necessary instead of updating every time
displaySongRating(); displaySongRating();
onProgressChangedTask = null; onProgressChangedTask = null;
@ -1514,8 +1514,8 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private void changeProgress(final int ms) private void changeProgress(final int ms)
{ {
final DownloadService downloadService = getDownloadService(); final MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService == null) if (mediaPlayerController == null)
{ {
return; return;
} }
@ -1529,12 +1529,12 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override @Override
protected Void doInBackground() throws Throwable protected Void doInBackground() throws Throwable
{ {
msPlayed = Math.max(0, downloadService.getPlayerPosition()); msPlayed = Math.max(0, mediaPlayerController.getPlayerPosition());
duration = downloadService.getPlayerDuration(); duration = mediaPlayerController.getPlayerDuration();
final int msTotal = duration; final int msTotal = duration;
seekTo = msPlayed + ms > msTotal ? msTotal : msPlayed + ms; seekTo = msPlayed + ms > msTotal ? msTotal : msPlayed + ms;
downloadService.seekTo(seekTo); mediaPlayerController.seekTo(seekTo);
return null; return null;
} }
@ -1562,9 +1562,9 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY) public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY)
{ {
final DownloadService downloadService = getDownloadService(); final MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService == null || e1 == null || e2 == null) if (mediaPlayerController == null || e1 == null || e2 == null)
{ {
return false; return false;
} }
@ -1582,7 +1582,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
if (downloader.getValue().getCurrentPlayingIndex() < downloader.getValue().downloadList.size() - 1) if (downloader.getValue().getCurrentPlayingIndex() < downloader.getValue().downloadList.size() - 1)
{ {
downloadService.next(); mediaPlayerController.next();
onCurrentChanged(); onCurrentChanged();
onSliderProgressChanged(); onSliderProgressChanged();
} }
@ -1593,7 +1593,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
if (e2X - e1X > swipeDistance && absX > swipeVelocity) if (e2X - e1X > swipeDistance && absX > swipeVelocity)
{ {
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
downloadService.previous(); mediaPlayerController.previous();
onCurrentChanged(); onCurrentChanged();
onSliderProgressChanged(); onSliderProgressChanged();
return true; return true;
@ -1603,7 +1603,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
if (e2Y - e1Y > swipeDistance && absY > swipeVelocity) if (e2Y - e1Y > swipeDistance && absY > swipeVelocity)
{ {
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
downloadService.seekTo(downloadService.getPlayerPosition() + 30000); mediaPlayerController.seekTo(mediaPlayerController.getPlayerPosition() + 30000);
onSliderProgressChanged(); onSliderProgressChanged();
return true; return true;
} }
@ -1612,7 +1612,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
if (e1Y - e2Y > swipeDistance && absY > swipeVelocity) if (e1Y - e2Y > swipeDistance && absY > swipeVelocity)
{ {
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
downloadService.seekTo(downloadService.getPlayerPosition() - 8000); mediaPlayerController.seekTo(mediaPlayerController.getPlayerPosition() - 8000);
onSliderProgressChanged(); onSliderProgressChanged();
return true; return true;
} }
@ -1663,6 +1663,6 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
return; return;
displaySongRating(); displaySongRating();
getDownloadService().setSongRating(rating); getMediaPlayerController().setSongRating(rating);
} }
} }

View File

@ -32,8 +32,7 @@ import android.widget.TextView;
import org.moire.ultrasonic.R; import org.moire.ultrasonic.R;
import org.moire.ultrasonic.audiofx.EqualizerController; import org.moire.ultrasonic.audiofx.EqualizerController;
import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.service.DownloadServiceImpl;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -56,7 +55,7 @@ public class EqualizerActivity extends ResultActivity
private EqualizerController equalizerController; private EqualizerController equalizerController;
private Equalizer equalizer; private Equalizer equalizer;
private Lazy<DownloadServiceImpl> downloadServiceImpl = inject(DownloadServiceImpl.class); private Lazy<MediaPlayerController> mediaPlayerControllerLazy = inject(MediaPlayerController.class);
@Override @Override
public void onCreate(Bundle bundle) public void onCreate(Bundle bundle)
@ -129,7 +128,7 @@ public class EqualizerActivity extends ResultActivity
private void setup() private void setup()
{ {
equalizerController = downloadServiceImpl.getValue().getEqualizerController(); equalizerController = mediaPlayerControllerLazy.getValue().getEqualizerController();
equalizer = equalizerController.getEqualizer(); equalizer = equalizerController.getEqualizer();
initEqualizer(); initEqualizer();

View File

@ -34,11 +34,8 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import org.moire.ultrasonic.R; import org.moire.ultrasonic.R;
import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.service.DownloadServiceImpl; import org.moire.ultrasonic.service.MediaPlayerLifecycleSupport;
import org.moire.ultrasonic.service.DownloadServiceLifecycleSupport;
import org.moire.ultrasonic.service.ExternalStorageMonitor;
import org.moire.ultrasonic.service.MediaPlayerService;
import org.moire.ultrasonic.service.MusicService; import org.moire.ultrasonic.service.MusicService;
import org.moire.ultrasonic.service.MusicServiceFactory; import org.moire.ultrasonic.service.MusicServiceFactory;
import org.moire.ultrasonic.util.Constants; import org.moire.ultrasonic.util.Constants;
@ -73,7 +70,7 @@ public class MainActivity extends SubsonicTabActivity
private static boolean infoDialogDisplayed; private static boolean infoDialogDisplayed;
private static boolean shouldUseId3; private static boolean shouldUseId3;
private Lazy<DownloadServiceLifecycleSupport> lifecycleSupport = inject(DownloadServiceLifecycleSupport.class); private Lazy<MediaPlayerLifecycleSupport> lifecycleSupport = inject(MediaPlayerLifecycleSupport.class);
/** /**
* Called when the activity is first created. * Called when the activity is first created.
@ -87,9 +84,9 @@ public class MainActivity extends SubsonicTabActivity
{ {
setResult(Constants.RESULT_CLOSE_ALL); setResult(Constants.RESULT_CLOSE_ALL);
if (getDownloadService() != null) if (getMediaPlayerController() != null)
{ {
getDownloadService().stopJukeboxService(); getMediaPlayerController().stopJukeboxService();
} }
if (getImageLoader() != null) if (getImageLoader() != null)
@ -464,7 +461,7 @@ public class MainActivity extends SubsonicTabActivity
private void setActiveServer(final int instance) private void setActiveServer(final int instance)
{ {
final DownloadService service = getDownloadService(); final MediaPlayerController service = getMediaPlayerController();
if (Util.getActiveServer(this) != instance) if (Util.getActiveServer(this) != instance)
{ {

View File

@ -37,7 +37,7 @@ import org.moire.ultrasonic.domain.MusicDirectory;
import org.moire.ultrasonic.domain.MusicDirectory.Entry; import org.moire.ultrasonic.domain.MusicDirectory.Entry;
import org.moire.ultrasonic.domain.SearchCriteria; import org.moire.ultrasonic.domain.SearchCriteria;
import org.moire.ultrasonic.domain.SearchResult; import org.moire.ultrasonic.domain.SearchResult;
import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.service.MusicService; import org.moire.ultrasonic.service.MusicService;
import org.moire.ultrasonic.service.MusicServiceFactory; import org.moire.ultrasonic.service.MusicServiceFactory;
import org.moire.ultrasonic.util.BackgroundTask; import org.moire.ultrasonic.util.BackgroundTask;
@ -322,7 +322,7 @@ public class SearchActivity extends SubsonicTabActivity
{ {
songs.add(entry); songs.add(entry);
Util.toast(SearchActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_unpinned, songs.size(), songs.size())); Util.toast(SearchActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_unpinned, songs.size(), songs.size()));
getDownloadService().unpin(songs); getMediaPlayerController().unpin(songs);
} }
break; break;
case R.id.menu_item_share: case R.id.menu_item_share:
@ -341,7 +341,7 @@ public class SearchActivity extends SubsonicTabActivity
private void downloadBackground(final boolean save, final List<MusicDirectory.Entry> songs) private void downloadBackground(final boolean save, final List<MusicDirectory.Entry> songs)
{ {
if (getDownloadService() == null) if (getMediaPlayerController() == null)
{ {
return; return;
} }
@ -352,7 +352,7 @@ public class SearchActivity extends SubsonicTabActivity
public void run() public void run()
{ {
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
getDownloadService().downloadBackground(songs, save); getMediaPlayerController().downloadBackground(songs, save);
} }
}; };
@ -508,19 +508,19 @@ public class SearchActivity extends SubsonicTabActivity
private void onSongSelected(MusicDirectory.Entry song, boolean save, boolean append, boolean autoplay, boolean playNext) private void onSongSelected(MusicDirectory.Entry song, boolean save, boolean append, boolean autoplay, boolean playNext)
{ {
DownloadService downloadService = getDownloadService(); MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (downloadService != null) if (mediaPlayerController != null)
{ {
if (!append && !playNext) if (!append && !playNext)
{ {
downloadService.clear(); mediaPlayerController.clear();
} }
downloadService.download(Collections.singletonList(song), save, false, playNext, false, false); mediaPlayerController.download(Collections.singletonList(song), save, false, playNext, false, false);
if (autoplay) if (autoplay)
{ {
downloadService.play(downloader.getValue().downloadList.size() - 1); mediaPlayerController.play(downloader.getValue().downloadList.size() - 1);
} }
Util.toast(SearchActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_added, 1, 1)); Util.toast(SearchActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_added, 1, 1));

View File

@ -1010,7 +1010,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity
private void enableButtons() private void enableButtons()
{ {
if (getDownloadService() == null) if (getMediaPlayerController() == null)
{ {
return; return;
} }
@ -1061,7 +1061,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity
private void downloadBackground(final boolean save, final List<MusicDirectory.Entry> songs) private void downloadBackground(final boolean save, final List<MusicDirectory.Entry> songs)
{ {
if (getDownloadService() == null) if (getMediaPlayerController() == null)
{ {
return; return;
} }
@ -1072,7 +1072,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity
public void run() public void run()
{ {
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
getDownloadService().downloadBackground(songs, save); getMediaPlayerController().downloadBackground(songs, save);
if (save) if (save)
{ {
@ -1098,19 +1098,19 @@ public class SelectAlbumActivity extends SubsonicTabActivity
songs = getSelectedSongs(albumListView); songs = getSelectedSongs(albumListView);
} }
if (getDownloadService() != null) if (getMediaPlayerController() != null)
{ {
getDownloadService().delete(songs); getMediaPlayerController().delete(songs);
} }
} }
private void unpin() private void unpin()
{ {
if (getDownloadService() != null) if (getMediaPlayerController() != null)
{ {
List<MusicDirectory.Entry> songs = getSelectedSongs(albumListView); List<MusicDirectory.Entry> songs = getSelectedSongs(albumListView);
Util.toast(SelectAlbumActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_unpinned, songs.size(), songs.size())); Util.toast(SelectAlbumActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_unpinned, songs.size(), songs.size()));
getDownloadService().unpin(songs); getMediaPlayerController().unpin(songs);
} }
} }

View File

@ -76,10 +76,10 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
private static final String STATE_ACTIVE_POSITION = "org.moire.ultrasonic.activePosition"; private static final String STATE_ACTIVE_POSITION = "org.moire.ultrasonic.activePosition";
private static final int DIALOG_ASK_FOR_SHARE_DETAILS = 102; private static final int DIALOG_ASK_FOR_SHARE_DETAILS = 102;
private Lazy<DownloadServiceImpl> downloadServiceImpl = inject(DownloadServiceImpl.class); private Lazy<MediaPlayerController> mediaPlayerControllerLazy = inject(MediaPlayerController.class);
private Lazy<DownloadServiceLifecycleSupport> lifecycleSupport = inject(DownloadServiceLifecycleSupport.class); private Lazy<MediaPlayerLifecycleSupport> lifecycleSupport = inject(MediaPlayerLifecycleSupport.class);
protected Lazy<Downloader> downloader = inject(Downloader.class); protected Lazy<Downloader> downloader = inject(Downloader.class);
protected Lazy<Player> player = inject(Player.class); protected Lazy<LocalMediaPlayer> localMediaPlayer = inject(LocalMediaPlayer.class);
public MenuDrawer menuDrawer; public MenuDrawer menuDrawer;
@ -211,11 +211,11 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
boolean isVolumeDown = keyCode == KeyEvent.KEYCODE_VOLUME_DOWN; boolean isVolumeDown = keyCode == KeyEvent.KEYCODE_VOLUME_DOWN;
boolean isVolumeUp = keyCode == KeyEvent.KEYCODE_VOLUME_UP; boolean isVolumeUp = keyCode == KeyEvent.KEYCODE_VOLUME_UP;
boolean isVolumeAdjust = isVolumeDown || isVolumeUp; boolean isVolumeAdjust = isVolumeDown || isVolumeUp;
boolean isJukebox = getDownloadService() != null && getDownloadService().isJukeboxEnabled(); boolean isJukebox = getMediaPlayerController() != null && getMediaPlayerController().isJukeboxEnabled();
if (isVolumeAdjust && isJukebox) if (isVolumeAdjust && isJukebox)
{ {
getDownloadService().adjustJukeboxVolume(isVolumeUp); getMediaPlayerController().adjustJukeboxVolume(isVolumeUp);
return true; return true;
} }
@ -265,16 +265,16 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
if (nowPlayingView != null) if (nowPlayingView != null)
{ {
PlayerState playerState = downloadServiceImpl.getValue().getPlayerState(); PlayerState playerState = mediaPlayerControllerLazy.getValue().getPlayerState();
if (playerState.equals(PlayerState.PAUSED) || playerState.equals(PlayerState.STARTED)) if (playerState.equals(PlayerState.PAUSED) || playerState.equals(PlayerState.STARTED))
{ {
DownloadFile file = player.getValue().currentPlaying; DownloadFile file = localMediaPlayer.getValue().currentPlaying;
if (file != null) if (file != null)
{ {
final Entry song = file.getSong(); final Entry song = file.getSong();
showNowPlaying(SubsonicTabActivity.this, downloadServiceImpl.getValue(), song, playerState); showNowPlaying(SubsonicTabActivity.this, mediaPlayerControllerLazy.getValue(), song, playerState);
} }
} }
else else
@ -309,9 +309,9 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
} }
} }
private void showNowPlaying(final Context context, final DownloadService downloadService, final Entry song, final PlayerState playerState) private void showNowPlaying(final Context context, final MediaPlayerController mediaPlayerController, final Entry song, final PlayerState playerState)
{ {
if (context == null || downloadService == null || song == null || playerState == null) if (context == null || mediaPlayerController == null || song == null || playerState == null)
{ {
return; return;
} }
@ -390,7 +390,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
ImageView nowPlayingControlPlay = (ImageView) nowPlayingView.findViewById(R.id.now_playing_control_play); ImageView nowPlayingControlPlay = (ImageView) nowPlayingView.findViewById(R.id.now_playing_control_play);
SwipeDetector swipeDetector = new SwipeDetector(SubsonicTabActivity.this, downloadService); SwipeDetector swipeDetector = new SwipeDetector(SubsonicTabActivity.this, mediaPlayerController);
setOnTouchListenerOnUiThread(nowPlayingView, swipeDetector); setOnTouchListenerOnUiThread(nowPlayingView, swipeDetector);
setOnClickListenerOnUiThread(nowPlayingView, new OnClickListener() setOnClickListenerOnUiThread(nowPlayingView, new OnClickListener()
@ -406,7 +406,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
@Override @Override
public void onClick(View view) public void onClick(View view)
{ {
downloadService.togglePlayPause(); mediaPlayerController.togglePlayPause();
} }
}); });
@ -765,9 +765,9 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
} }
} }
public DownloadService getDownloadService() public MediaPlayerController getMediaPlayerController()
{ {
return downloadServiceImpl.getValue(); return mediaPlayerControllerLazy.getValue();
} }
protected void warnIfNetworkOrStorageUnavailable() protected void warnIfNetworkOrStorageUnavailable()
@ -818,7 +818,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
void download(final boolean append, final boolean save, final boolean autoPlay, final boolean playNext, final boolean shuffle, final List<Entry> songs) void download(final boolean append, final boolean save, final boolean autoPlay, final boolean playNext, final boolean shuffle, final List<Entry> songs)
{ {
if (getDownloadService() == null) if (getMediaPlayerController() == null)
{ {
return; return;
} }
@ -830,16 +830,16 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
{ {
if (!append && !playNext) if (!append && !playNext)
{ {
getDownloadService().clear(); getMediaPlayerController().clear();
} }
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
getDownloadService().download(songs, save, autoPlay, playNext, shuffle, false); getMediaPlayerController().download(songs, save, autoPlay, playNext, shuffle, false);
String playlistName = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME); String playlistName = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME);
if (playlistName != null) if (playlistName != null)
{ {
getDownloadService().setSuggestedPlaylistName(playlistName); getMediaPlayerController().setSuggestedPlaylistName(playlistName);
} }
if (autoPlay) if (autoPlay)
@ -994,23 +994,23 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
Collections.sort(songs, new EntryByDiscAndTrackComparator()); Collections.sort(songs, new EntryByDiscAndTrackComparator());
} }
DownloadService downloadService = getDownloadService(); MediaPlayerController mediaPlayerController = getMediaPlayerController();
if (!songs.isEmpty() && downloadService != null) if (!songs.isEmpty() && mediaPlayerController != null)
{ {
if (!append && !playNext && !unpin && !background) if (!append && !playNext && !unpin && !background)
{ {
downloadService.clear(); mediaPlayerController.clear();
} }
warnIfNetworkOrStorageUnavailable(); warnIfNetworkOrStorageUnavailable();
if (!background) if (!background)
{ {
if (unpin) if (unpin)
{ {
downloadService.unpin(songs); mediaPlayerController.unpin(songs);
} }
else else
{ {
downloadService.download(songs, save, autoplay, playNext, shuffle, false); mediaPlayerController.download(songs, save, autoplay, playNext, shuffle, false);
if (!append && Util.getShouldTransitionOnPlaybackPreference(SubsonicTabActivity.this)) if (!append && Util.getShouldTransitionOnPlaybackPreference(SubsonicTabActivity.this))
{ {
startActivityForResultWithoutTransition(SubsonicTabActivity.this, DownloadActivity.class); startActivityForResultWithoutTransition(SubsonicTabActivity.this, DownloadActivity.class);
@ -1021,11 +1021,11 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
{ {
if (unpin) if (unpin)
{ {
downloadService.unpin(songs); mediaPlayerController.unpin(songs);
} }
else else
{ {
downloadService.downloadBackground(songs, save); mediaPlayerController.downloadBackground(songs, save);
} }
} }
} }
@ -1353,15 +1353,15 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
protected class SwipeDetector implements OnTouchListener protected class SwipeDetector implements OnTouchListener
{ {
public SwipeDetector(SubsonicTabActivity activity, final DownloadService downloadService) public SwipeDetector(SubsonicTabActivity activity, final MediaPlayerController mediaPlayerController)
{ {
this.downloadService = downloadService; this.mediaPlayerController = mediaPlayerController;
this.activity = activity; this.activity = activity;
} }
private static final int MIN_DISTANCE = 30; private static final int MIN_DISTANCE = 30;
private float downX, downY, upX, upY; private float downX, downY, upX, upY;
private DownloadService downloadService; private MediaPlayerController mediaPlayerController;
private SubsonicTabActivity activity; private SubsonicTabActivity activity;
@Override @Override
@ -1388,12 +1388,12 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
// left or right // left or right
if (deltaX < 0) if (deltaX < 0)
{ {
downloadService.previous(); mediaPlayerController.previous();
return false; return false;
} }
if (deltaX > 0) if (deltaX > 0)
{ {
downloadService.next(); mediaPlayerController.next();
return false; return false;
} }
} }

View File

@ -16,8 +16,7 @@ import org.moire.ultrasonic.activity.SubsonicTabActivity;
import org.moire.ultrasonic.featureflags.Feature; import org.moire.ultrasonic.featureflags.Feature;
import org.moire.ultrasonic.featureflags.FeatureStorage; import org.moire.ultrasonic.featureflags.FeatureStorage;
import org.moire.ultrasonic.provider.SearchSuggestionProvider; import org.moire.ultrasonic.provider.SearchSuggestionProvider;
import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.service.DownloadServiceImpl;
import org.moire.ultrasonic.util.*; import org.moire.ultrasonic.util.*;
import java.io.File; import java.io.File;
@ -66,7 +65,7 @@ public class SettingsFragment extends PreferenceFragment
private SharedPreferences settings; private SharedPreferences settings;
private int activeServers; private int activeServers;
private Lazy<DownloadServiceImpl> downloadServiceImpl = inject(DownloadServiceImpl.class); private Lazy<MediaPlayerController> mediaPlayerControllerLazy = inject(MediaPlayerController.class);
@Override @Override
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
@ -407,6 +406,6 @@ public class SettingsFragment extends PreferenceFragment
} }
// Clear download queue. // Clear download queue.
downloadServiceImpl.getValue().clear(); mediaPlayerControllerLazy.getValue().clear();
} }
} }

View File

@ -17,7 +17,7 @@ import org.moire.ultrasonic.R;
import org.moire.ultrasonic.activity.DownloadActivity; import org.moire.ultrasonic.activity.DownloadActivity;
import org.moire.ultrasonic.activity.MainActivity; import org.moire.ultrasonic.activity.MainActivity;
import org.moire.ultrasonic.domain.MusicDirectory; import org.moire.ultrasonic.domain.MusicDirectory;
import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.util.Constants; import org.moire.ultrasonic.util.Constants;
import org.moire.ultrasonic.util.FileUtil; import org.moire.ultrasonic.util.FileUtil;
@ -67,7 +67,7 @@ public class UltraSonicAppWidgetProvider extends AppWidgetProvider
} }
/** /**
* Handle a change notification coming over from {@link DownloadService} * Handle a change notification coming over from {@link MediaPlayerController}
*/ */
public void notifyChange(Context context, MusicDirectory.Entry currentSong, boolean playing, boolean setAlbum) public void notifyChange(Context context, MusicDirectory.Entry currentSong, boolean playing, boolean setAlbum)
{ {

View File

@ -5,9 +5,9 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import org.moire.ultrasonic.domain.MusicDirectory.Entry; import org.moire.ultrasonic.domain.MusicDirectory.Entry;
import org.moire.ultrasonic.service.DownloadServiceImpl; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.service.Downloader; import org.moire.ultrasonic.service.Downloader;
import org.moire.ultrasonic.service.Player; import org.moire.ultrasonic.service.LocalMediaPlayer;
import kotlin.Lazy; import kotlin.Lazy;
@ -16,19 +16,19 @@ import static org.koin.java.standalone.KoinJavaComponent.inject;
public class A2dpIntentReceiver extends BroadcastReceiver public class A2dpIntentReceiver extends BroadcastReceiver
{ {
private static final String PLAYSTATUS_RESPONSE = "com.android.music.playstatusresponse"; private static final String PLAYSTATUS_RESPONSE = "com.android.music.playstatusresponse";
private Lazy<DownloadServiceImpl> downloadServiceImpl = inject(DownloadServiceImpl.class); private Lazy<MediaPlayerController> mediaPlayerControllerLazy = inject(MediaPlayerController.class);
private Lazy<Downloader> downloader = inject(Downloader.class); private Lazy<Downloader> downloader = inject(Downloader.class);
protected Lazy<Player> player = inject(Player.class); protected Lazy<LocalMediaPlayer> localMediaPlayer = inject(LocalMediaPlayer.class);
@Override @Override
public void onReceive(Context context, Intent intent) public void onReceive(Context context, Intent intent)
{ {
if (player.getValue().currentPlaying == null) if (localMediaPlayer.getValue().currentPlaying == null)
{ {
return; return;
} }
Entry song = player.getValue().currentPlaying.getSong(); Entry song = localMediaPlayer.getValue().currentPlaying.getSong();
if (song == null) if (song == null)
{ {
@ -38,7 +38,7 @@ public class A2dpIntentReceiver extends BroadcastReceiver
Intent avrcpIntent = new Intent(PLAYSTATUS_RESPONSE); Intent avrcpIntent = new Intent(PLAYSTATUS_RESPONSE);
Integer duration = song.getDuration(); Integer duration = song.getDuration();
int playerPosition = downloadServiceImpl.getValue().getPlayerPosition(); int playerPosition = mediaPlayerControllerLazy.getValue().getPlayerPosition();
int listSize = downloader.getValue().getDownloads().size(); int listSize = downloader.getValue().getDownloads().size();
if (duration != null) if (duration != null)
@ -49,7 +49,7 @@ public class A2dpIntentReceiver extends BroadcastReceiver
avrcpIntent.putExtra("position", (long) playerPosition); avrcpIntent.putExtra("position", (long) playerPosition);
avrcpIntent.putExtra("ListSize", (long) listSize); avrcpIntent.putExtra("ListSize", (long) listSize);
switch (downloadServiceImpl.getValue().getPlayerState()) switch (mediaPlayerControllerLazy.getValue().getPlayerState())
{ {
case STARTED: case STARTED:
avrcpIntent.putExtra("playing", true); avrcpIntent.putExtra("playing", true);

View File

@ -25,7 +25,7 @@ import android.os.Bundle;
import android.os.Parcelable; import android.os.Parcelable;
import android.util.Log; import android.util.Log;
import org.moire.ultrasonic.service.DownloadServiceLifecycleSupport; import org.moire.ultrasonic.service.MediaPlayerLifecycleSupport;
import org.moire.ultrasonic.util.Constants; import org.moire.ultrasonic.util.Constants;
import org.moire.ultrasonic.util.Util; import org.moire.ultrasonic.util.Util;
@ -39,7 +39,7 @@ import static org.koin.java.standalone.KoinJavaComponent.inject;
public class MediaButtonIntentReceiver extends BroadcastReceiver public class MediaButtonIntentReceiver extends BroadcastReceiver
{ {
private static final String TAG = MediaButtonIntentReceiver.class.getSimpleName(); private static final String TAG = MediaButtonIntentReceiver.class.getSimpleName();
private Lazy<DownloadServiceLifecycleSupport> lifecycleSupport = inject(DownloadServiceLifecycleSupport.class); private Lazy<MediaPlayerLifecycleSupport> lifecycleSupport = inject(MediaPlayerLifecycleSupport.class);
@Override @Override
public void onReceive(Context context, Intent intent) public void onReceive(Context context, Intent intent)

View File

@ -26,29 +26,31 @@ public class Downloader
{ {
private static final String TAG = Downloader.class.getSimpleName(); private static final String TAG = Downloader.class.getSimpleName();
private final ShufflePlayBuffer shufflePlayBuffer;
private final ExternalStorageMonitor externalStorageMonitor;
private final Player player;
public Lazy<JukeboxService> jukeboxService = inject(JukeboxService.class);
public final List<DownloadFile> downloadList = new ArrayList<>(); public final List<DownloadFile> downloadList = new ArrayList<>();
public final List<DownloadFile> backgroundDownloadList = new ArrayList<>(); public final List<DownloadFile> backgroundDownloadList = new ArrayList<>();
public DownloadFile currentDownloading;
private final ShufflePlayBuffer shufflePlayBuffer;
private final ExternalStorageMonitor externalStorageMonitor;
private final LocalMediaPlayer localMediaPlayer;
private final Context context;
// TODO: This is a circular reference, try to remove
private Lazy<JukeboxMediaPlayer> jukeboxMediaPlayer = inject(JukeboxMediaPlayer.class);
private final List<DownloadFile> cleanupCandidates = new ArrayList<>(); private final List<DownloadFile> cleanupCandidates = new ArrayList<>();
private final LRUCache<MusicDirectory.Entry, DownloadFile> downloadFileCache = new LRUCache<>(100); private final LRUCache<MusicDirectory.Entry, DownloadFile> downloadFileCache = new LRUCache<>(100);
public DownloadFile currentDownloading;
public static long revision;
private ScheduledExecutorService executorService; private ScheduledExecutorService executorService;
private Context context; private long revision;
public Downloader(Context context, ShufflePlayBuffer shufflePlayBuffer, ExternalStorageMonitor externalStorageMonitor, public Downloader(Context context, ShufflePlayBuffer shufflePlayBuffer, ExternalStorageMonitor externalStorageMonitor,
Player player) LocalMediaPlayer localMediaPlayer)
{ {
this.context = context; this.context = context;
this.shufflePlayBuffer = shufflePlayBuffer; this.shufflePlayBuffer = shufflePlayBuffer;
this.externalStorageMonitor = externalStorageMonitor; this.externalStorageMonitor = externalStorageMonitor;
this.player = player; this.localMediaPlayer = localMediaPlayer;
} }
public void onCreate() public void onCreate()
@ -78,6 +80,8 @@ public class Downloader
public void onDestroy() public void onDestroy()
{ {
executorService.shutdown(); executorService.shutdown();
clear();
clearBackground();
Log.i(TAG, "Downloader destroyed"); Log.i(TAG, "Downloader destroyed");
} }
@ -93,7 +97,7 @@ public class Downloader
checkShufflePlay(context); checkShufflePlay(context);
} }
if (jukeboxService.getValue().isEnabled() || !Util.isNetworkConnected(context)) if (jukeboxMediaPlayer.getValue().isEnabled() || !Util.isNetworkConnected(context))
{ {
return; return;
} }
@ -104,7 +108,7 @@ public class Downloader
} }
// Need to download current playing? // Need to download current playing?
if (player.currentPlaying != null && player.currentPlaying != currentDownloading && !player.currentPlaying.isWorkDone()) if (localMediaPlayer.currentPlaying != null && localMediaPlayer.currentPlaying != currentDownloading && !localMediaPlayer.currentPlaying.isWorkDone())
{ {
// Cancel current download, if necessary. // Cancel current download, if necessary.
if (currentDownloading != null) if (currentDownloading != null)
@ -112,7 +116,7 @@ public class Downloader
currentDownloading.cancelDownload(); currentDownloading.cancelDownload();
} }
currentDownloading = player.currentPlaying; currentDownloading = localMediaPlayer.currentPlaying;
currentDownloading.download(); currentDownloading.download();
cleanupCandidates.add(currentDownloading); cleanupCandidates.add(currentDownloading);
@ -138,7 +142,7 @@ public class Downloader
if (n != 0) if (n != 0)
{ {
int start = player.currentPlaying == null ? 0 : getCurrentPlayingIndex(); int start = localMediaPlayer.currentPlaying == null ? 0 : getCurrentPlayingIndex();
if (start == -1) start = 0; if (start == -1) start = 0;
int i = start; int i = start;
@ -154,12 +158,12 @@ public class Downloader
cleanupCandidates.add(currentDownloading); cleanupCandidates.add(currentDownloading);
if (i == (start + 1)) if (i == (start + 1))
{ {
player.setNextPlayerState(DOWNLOADING); localMediaPlayer.setNextPlayerState(DOWNLOADING);
} }
break; break;
} }
} }
else if (player.currentPlaying != downloadFile) else if (localMediaPlayer.currentPlaying != downloadFile)
{ {
preloaded++; preloaded++;
} }
@ -201,7 +205,7 @@ public class Downloader
public synchronized int getCurrentPlayingIndex() public synchronized int getCurrentPlayingIndex()
{ {
return downloadList.indexOf(player.currentPlaying); return downloadList.indexOf(localMediaPlayer.currentPlaying);
} }
public long getDownloadListDuration() public long getDownloadListDuration()
@ -237,11 +241,6 @@ public class Downloader
return temp; return temp;
} }
public List<DownloadFile> getBackgroundDownloads()
{
return backgroundDownloadList;
}
public long getDownloadListUpdateRevision() public long getDownloadListUpdateRevision()
{ {
return revision; return revision;
@ -258,7 +257,7 @@ public class Downloader
} }
} }
public synchronized void clearBackground() private void clearBackground()
{ {
if (currentDownloading != null && backgroundDownloadList.contains(currentDownloading)) if (currentDownloading != null && backgroundDownloadList.contains(currentDownloading))
{ {
@ -337,25 +336,14 @@ public class Downloader
public synchronized void shuffle() public synchronized void shuffle()
{ {
Collections.shuffle(downloadList); Collections.shuffle(downloadList);
if (player.currentPlaying != null) if (localMediaPlayer.currentPlaying != null)
{ {
downloadList.remove(getCurrentPlayingIndex()); downloadList.remove(getCurrentPlayingIndex());
downloadList.add(0, player.currentPlaying); downloadList.add(0, localMediaPlayer.currentPlaying);
} }
revision++; revision++;
} }
public synchronized void setFirstPlaying()
{
if (player.currentPlaying == null && downloadList.size() > 0)
{
player.currentPlaying = downloadList.get(0);
player.currentPlaying.setPlaying(true);
}
checkDownloads();
}
public synchronized DownloadFile getDownloadFileForSong(MusicDirectory.Entry song) public synchronized DownloadFile getDownloadFileForSong(MusicDirectory.Entry song)
{ {
for (DownloadFile downloadFile : downloadList) for (DownloadFile downloadFile : downloadList)
@ -388,7 +376,7 @@ public class Downloader
while (iterator.hasNext()) while (iterator.hasNext())
{ {
DownloadFile downloadFile = iterator.next(); DownloadFile downloadFile = iterator.next();
if (downloadFile != player.currentPlaying && downloadFile != currentDownloading) if (downloadFile != localMediaPlayer.currentPlaying && downloadFile != currentDownloading)
{ {
if (downloadFile.cleanup()) if (downloadFile.cleanup())
{ {
@ -418,7 +406,7 @@ public class Downloader
} }
} }
int currIndex = player.currentPlaying == null ? 0 : getCurrentPlayingIndex(); int currIndex = localMediaPlayer.currentPlaying == null ? 0 : getCurrentPlayingIndex();
// Only shift playlist if playing song #5 or later. // Only shift playlist if playing song #5 or later.
if (currIndex > 4) if (currIndex > 4)
@ -435,19 +423,19 @@ public class Downloader
if (revisionBefore != revision) if (revisionBefore != revision)
{ {
jukeboxService.getValue().updatePlaylist(); jukeboxMediaPlayer.getValue().updatePlaylist();
} }
if (wasEmpty && !downloadList.isEmpty()) if (wasEmpty && !downloadList.isEmpty())
{ {
if (jukeboxService.getValue().isEnabled()) if (jukeboxMediaPlayer.getValue().isEnabled())
{ {
jukeboxService.getValue().skip(0, 0); jukeboxMediaPlayer.getValue().skip(0, 0);
player.setPlayerState(STARTED); localMediaPlayer.setPlayerState(STARTED);
} }
else else
{ {
player.play(downloadList.get(0)); localMediaPlayer.play(downloadList.get(0));
} }
} }
} }

View File

@ -27,6 +27,7 @@ import android.view.View;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
import org.jetbrains.annotations.NotNull;
import org.moire.ultrasonic.R; import org.moire.ultrasonic.R;
import org.moire.ultrasonic.api.subsonic.ApiNotSupportedException; import org.moire.ultrasonic.api.subsonic.ApiNotSupportedException;
import org.moire.ultrasonic.domain.JukeboxStatus; import org.moire.ultrasonic.domain.JukeboxStatus;
@ -54,9 +55,9 @@ import static org.koin.java.standalone.KoinJavaComponent.inject;
* @author Sindre Mehus * @author Sindre Mehus
* @version $Id$ * @version $Id$
*/ */
public class JukeboxService public class JukeboxMediaPlayer
{ {
private static final String TAG = JukeboxService.class.getSimpleName(); private static final String TAG = JukeboxMediaPlayer.class.getSimpleName();
private static final long STATUS_UPDATE_INTERVAL_SECONDS = 5L; private static final long STATUS_UPDATE_INTERVAL_SECONDS = 5L;
private final TaskQueue tasks = new TaskQueue(); private final TaskQueue tasks = new TaskQueue();
@ -72,7 +73,7 @@ public class JukeboxService
private Context context; private Context context;
// TODO: These create circular references, try to refactor // TODO: These create circular references, try to refactor
private Lazy<DownloadServiceImpl> downloadServiceImpl = inject(DownloadServiceImpl.class); private Lazy<MediaPlayerControllerImpl> mediaPlayerControllerLazy = inject(MediaPlayerControllerImpl.class);
private final Downloader downloader; private final Downloader downloader;
// TODO: Report warning if queue fills up. // TODO: Report warning if queue fills up.
@ -81,7 +82,7 @@ public class JukeboxService
// TODO: Persist RC state? // TODO: Persist RC state?
// TODO: Minimize status updates. // TODO: Minimize status updates.
public JukeboxService(Context context, Downloader downloader) public JukeboxMediaPlayer(Context context, Downloader downloader)
{ {
this.context = context; this.context = context;
this.downloader = downloader; this.downloader = downloader;
@ -187,7 +188,7 @@ public class JukeboxService
if (index != null && index != -1 && index != downloader.getCurrentPlayingIndex()) if (index != null && index != -1 && index != downloader.getCurrentPlayingIndex())
{ {
downloadServiceImpl.getValue().setCurrentPlaying(index); mediaPlayerControllerLazy.getValue().setCurrentPlaying(index);
} }
} }
@ -224,7 +225,7 @@ public class JukeboxService
} }
}); });
downloadServiceImpl.getValue().setJukeboxEnabled(false); mediaPlayerControllerLazy.getValue().setJukeboxEnabled(false);
} }
public void updatePlaylist() public void updatePlaylist()
@ -258,7 +259,7 @@ public class JukeboxService
} }
tasks.add(new Skip(index, offsetSeconds)); tasks.add(new Skip(index, offsetSeconds));
downloadServiceImpl.getValue().setPlayerState(PlayerState.STARTED); mediaPlayerControllerLazy.getValue().setPlayerState(PlayerState.STARTED);
} }
public void stop() public void stop()
@ -290,10 +291,8 @@ public class JukeboxService
tasks.remove(SetGain.class); tasks.remove(SetGain.class);
tasks.add(new SetGain(gain)); tasks.add(new SetGain(gain));
if (volumeToast == null) if (volumeToast == null) volumeToast = new VolumeToast(context);
{
volumeToast = new VolumeToast(context);
}
volumeToast.setVolume(gain); volumeToast.setVolume(gain);
} }
@ -377,10 +376,11 @@ public class JukeboxService
} }
} }
private abstract class JukeboxTask private abstract static class JukeboxTask
{ {
abstract JukeboxStatus execute() throws Exception; abstract JukeboxStatus execute() throws Exception;
@NotNull
@Override @Override
public String toString() public String toString()
{ {

View File

@ -18,6 +18,7 @@ import android.os.PowerManager;
import android.util.Log; import android.util.Log;
import android.widget.SeekBar; import android.widget.SeekBar;
import org.jetbrains.annotations.NotNull;
import org.moire.ultrasonic.activity.DownloadActivity; import org.moire.ultrasonic.activity.DownloadActivity;
import org.moire.ultrasonic.audiofx.EqualizerController; import org.moire.ultrasonic.audiofx.EqualizerController;
import org.moire.ultrasonic.audiofx.VisualizerController; import org.moire.ultrasonic.audiofx.VisualizerController;
@ -32,6 +33,7 @@ import org.moire.ultrasonic.util.Util;
import java.io.File; import java.io.File;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Locale;
import static org.moire.ultrasonic.domain.PlayerState.COMPLETED; import static org.moire.ultrasonic.domain.PlayerState.COMPLETED;
import static org.moire.ultrasonic.domain.PlayerState.DOWNLOADING; import static org.moire.ultrasonic.domain.PlayerState.DOWNLOADING;
@ -41,37 +43,9 @@ import static org.moire.ultrasonic.domain.PlayerState.PREPARED;
import static org.moire.ultrasonic.domain.PlayerState.PREPARING; import static org.moire.ultrasonic.domain.PlayerState.PREPARING;
import static org.moire.ultrasonic.domain.PlayerState.STARTED; import static org.moire.ultrasonic.domain.PlayerState.STARTED;
public class Player public class LocalMediaPlayer
{ {
private static final String TAG = Player.class.getSimpleName(); private static final String TAG = LocalMediaPlayer.class.getSimpleName();
private final Context context;
private PowerManager.WakeLock wakeLock;
public DownloadFile currentPlaying;
public DownloadFile nextPlaying;
private static boolean nextSetup;
private static CancellableTask nextPlayingTask;
private MediaPlayer mediaPlayer;
private MediaPlayer nextMediaPlayer;
private Looper mediaPlayerLooper;
private Handler mediaPlayerHandler;
public static int cachedPosition;
private StreamProxy proxy;
public PlayerState playerState = IDLE;
public PlayerState nextPlayerState = IDLE;
private AudioManager audioManager;
public RemoteControlClient remoteControlClient;
public static boolean equalizerAvailable;
public static boolean visualizerAvailable;
private EqualizerController equalizerController;
private VisualizerController visualizerController;
private CancellableTask bufferTask;
private PositionCache positionCache;
private int secondaryProgress = -1;
public Consumer<DownloadFile> onCurrentPlayingChanged; public Consumer<DownloadFile> onCurrentPlayingChanged;
public Consumer<DownloadFile> onSongCompleted; public Consumer<DownloadFile> onSongCompleted;
@ -79,6 +53,35 @@ public class Player
public Runnable onPrepared; public Runnable onPrepared;
public Runnable onNextSongRequested; public Runnable onNextSongRequested;
public static boolean equalizerAvailable;
public static boolean visualizerAvailable;
public PlayerState playerState = IDLE;
public DownloadFile currentPlaying;
public DownloadFile nextPlaying;
private PlayerState nextPlayerState = IDLE;
private boolean nextSetup;
private CancellableTask nextPlayingTask;
private PowerManager.WakeLock wakeLock;
private MediaPlayer mediaPlayer;
private MediaPlayer nextMediaPlayer;
private Looper mediaPlayerLooper;
private Handler mediaPlayerHandler;
private int cachedPosition;
private StreamProxy proxy;
private AudioManager audioManager;
private RemoteControlClient remoteControlClient;
private EqualizerController equalizerController;
private VisualizerController visualizerController;
private CancellableTask bufferTask;
private PositionCache positionCache;
private int secondaryProgress = -1;
private final Context context;
static static
{ {
try try
@ -105,7 +108,7 @@ public class Player
} }
} }
public Player(Context context) public LocalMediaPlayer(Context context)
{ {
this.context = context; this.context = context;
} }
@ -134,7 +137,7 @@ public class Player
@Override @Override
public boolean onError(MediaPlayer mediaPlayer, int what, int more) public boolean onError(MediaPlayer mediaPlayer, int what, int more)
{ {
handleError(new Exception(String.format("MediaPlayer error: %d (%d)", what, more))); handleError(new Exception(String.format(Locale.getDefault(), "MediaPlayer error: %d (%d)", what, more)));
return false; return false;
} }
}); });
@ -187,7 +190,7 @@ public class Player
} }
} }
Log.i(TAG, "Player created"); Log.i(TAG, "LocalMediaPlayer created");
} }
public void onDestroy() public void onDestroy()
@ -237,7 +240,7 @@ public class Player
{ {
} }
Log.i(TAG, "Player destroyed"); Log.i(TAG, "LocalMediaPlayer destroyed");
} }
public EqualizerController getEqualizerController() public EqualizerController getEqualizerController()
@ -452,28 +455,18 @@ public class Player
Log.i(TAG, String.format("In updateRemoteControl, playerState: %s [%d]", playerState, getPlayerPosition())); Log.i(TAG, String.format("In updateRemoteControl, playerState: %s [%d]", playerState, getPlayerPosition()));
switch (playerState) if (playerState == STARTED) {
{ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
case STARTED: remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) } else {
{ remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING, getPlayerPosition(), 1.0f);
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); }
} } else {
else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
{ remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING, getPlayerPosition(), 1.0f); } else {
} remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED, getPlayerPosition(), 1.0f);
break; }
default:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2)
{
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);
}
else
{
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED, getPlayerPosition(), 1.0f);
}
break;
} }
if (currentPlaying != null) if (currentPlaying != null)
@ -486,7 +479,7 @@ public class Player
String album = currentSong.getAlbum(); String album = currentSong.getAlbum();
String title = currentSong.getTitle(); String title = currentSong.getTitle();
Integer currentSongDuration = currentSong.getDuration(); Integer currentSongDuration = currentSong.getDuration();
Long duration = 0L; long duration = 0L;
if (currentSongDuration != null) duration = (long) currentSongDuration * 1000; if (currentSongDuration != null) duration = (long) currentSongDuration * 1000;
@ -653,7 +646,8 @@ public class Player
proxy.start(); proxy.start();
} }
dataSource = String.format("http://127.0.0.1:%d/%s", proxy.getPort(), URLEncoder.encode(dataSource, Constants.UTF_8)); dataSource = String.format(Locale.getDefault(), "http://127.0.0.1:%d/%s",
proxy.getPort(), URLEncoder.encode(dataSource, Constants.UTF_8));
Log.i(TAG, String.format("Data Source: %s", dataSource)); Log.i(TAG, String.format("Data Source: %s", dataSource));
} }
else if (proxy != null) else if (proxy != null)
@ -708,7 +702,7 @@ public class Player
DownloadActivity.getProgressBar().setSecondaryProgress(100 * progressBar.getMax()); DownloadActivity.getProgressBar().setSecondaryProgress(100 * progressBar.getMax());
} }
synchronized (Player.this) synchronized (LocalMediaPlayer.this)
{ {
if (position != 0) if (position != 0)
{ {
@ -856,15 +850,11 @@ public class Player
if (Util.getGaplessPlaybackPreference(context) && nextPlaying != null && nextPlayerState == PlayerState.PREPARED) if (Util.getGaplessPlaybackPreference(context) && nextPlaying != null && nextPlayerState == PlayerState.PREPARED)
{ {
if (!nextSetup) if (nextSetup)
{
playNext();
}
else
{ {
nextSetup = false; nextSetup = false;
playNext();
} }
playNext();
} }
else else
{ {
@ -978,6 +968,7 @@ public class Player
return completeFileAvailable || size >= expectedFileSize; return completeFileAvailable || size >= expectedFileSize;
} }
@NotNull
@Override @Override
public String toString() public String toString()
{ {
@ -1041,6 +1032,7 @@ public class Player
return completeFileAvailable && (playerState == PlayerState.STARTED || playerState == PlayerState.PAUSED); return completeFileAvailable && (playerState == PlayerState.STARTED || playerState == PlayerState.PAUSED);
} }
@NotNull
@Override @Override
public String toString() public String toString()
{ {

View File

@ -30,7 +30,7 @@ import java.util.List;
* @author Sindre Mehus * @author Sindre Mehus
* @version $Id$ * @version $Id$
*/ */
public interface DownloadService public interface MediaPlayerController
{ {
void download(List<Entry> songs, boolean save, boolean autoplay, boolean playNext, boolean shuffle, boolean newPlaylist); void download(List<Entry> songs, boolean save, boolean autoplay, boolean playNext, boolean shuffle, boolean newPlaylist);
@ -53,10 +53,6 @@ public interface DownloadService
boolean getShowVisualization(); boolean getShowVisualization();
boolean getEqualizerAvailable();
boolean getVisualizerAvailable();
void setShowVisualization(boolean showVisualization); void setShowVisualization(boolean showVisualization);
void clear(); void clear();
@ -103,8 +99,6 @@ public interface DownloadService
boolean isJukeboxAvailable(); boolean isJukeboxAvailable();
boolean isSharingAvailable();
void setJukeboxEnabled(boolean b); void setJukeboxEnabled(boolean b);
void adjustJukeboxVolume(boolean up); void adjustJukeboxVolume(boolean up);
@ -113,14 +107,10 @@ public interface DownloadService
void setVolume(float volume); void setVolume(float volume);
void swap(boolean mainList, int from, int to);
void restore(List<Entry> songs, int currentPlayingIndex, int currentPlayingPosition, boolean autoPlay, boolean newPlaylist); void restore(List<Entry> songs, int currentPlayingIndex, int currentPlayingPosition, boolean autoPlay, boolean newPlaylist);
void stopJukeboxService(); void stopJukeboxService();
void startJukeboxService();
void updateNotification(); void updateNotification();
void setSongRating(final int rating); void setSongRating(final int rating);

View File

@ -20,7 +20,6 @@ package org.moire.ultrasonic.service;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Handler;
import android.util.Log; import android.util.Log;
import org.koin.java.standalone.KoinJavaComponent; import org.koin.java.standalone.KoinJavaComponent;
@ -47,9 +46,9 @@ import static org.koin.java.standalone.KoinJavaComponent.inject;
* @author Sindre Mehus, Joshua Bahnsen * @author Sindre Mehus, Joshua Bahnsen
* @version $Id$ * @version $Id$
*/ */
public class DownloadServiceImpl implements DownloadService public class MediaPlayerControllerImpl implements MediaPlayerController
{ {
private static final String TAG = DownloadServiceImpl.class.getSimpleName(); private static final String TAG = MediaPlayerControllerImpl.class.getSimpleName();
private String suggestedPlaylistName; private String suggestedPlaylistName;
private boolean keepScreenOn; private boolean keepScreenOn;
@ -58,20 +57,20 @@ public class DownloadServiceImpl implements DownloadService
private boolean autoPlayStart; private boolean autoPlayStart;
private Context context; private Context context;
public Lazy<JukeboxService> jukeboxService = inject(JukeboxService.class); private Lazy<JukeboxMediaPlayer> jukeboxMediaPlayer = inject(JukeboxMediaPlayer.class);
private Lazy<DownloadQueueSerializer> downloadQueueSerializer = inject(DownloadQueueSerializer.class); private Lazy<DownloadQueueSerializer> downloadQueueSerializer = inject(DownloadQueueSerializer.class);
private Lazy<ExternalStorageMonitor> externalStorageMonitor = inject(ExternalStorageMonitor.class); private Lazy<ExternalStorageMonitor> externalStorageMonitor = inject(ExternalStorageMonitor.class);
private final Downloader downloader; private final Downloader downloader;
private final ShufflePlayBuffer shufflePlayBuffer; private final ShufflePlayBuffer shufflePlayBuffer;
private final Player player; private final LocalMediaPlayer localMediaPlayer;
public DownloadServiceImpl(Context context, Downloader downloader, ShufflePlayBuffer shufflePlayBuffer, public MediaPlayerControllerImpl(Context context, Downloader downloader, ShufflePlayBuffer shufflePlayBuffer,
Player player) LocalMediaPlayer localMediaPlayer)
{ {
this.context = context; this.context = context;
this.downloader = downloader; this.downloader = downloader;
this.shufflePlayBuffer = shufflePlayBuffer; this.shufflePlayBuffer = shufflePlayBuffer;
this.player = player; this.localMediaPlayer = localMediaPlayer;
externalStorageMonitor.getValue().onCreate(new Runnable() { externalStorageMonitor.getValue().onCreate(new Runnable() {
@Override @Override
@ -83,14 +82,14 @@ public class DownloadServiceImpl implements DownloadService
int instance = Util.getActiveServer(context); int instance = Util.getActiveServer(context);
setJukeboxEnabled(Util.getJukeboxEnabled(context, instance)); setJukeboxEnabled(Util.getJukeboxEnabled(context, instance));
Log.i(TAG, "DownloadServiceImpl created"); Log.i(TAG, "MediaPlayerControllerImpl created");
} }
public void onDestroy() public void onDestroy()
{ {
externalStorageMonitor.getValue().onDestroy(); externalStorageMonitor.getValue().onDestroy();
context.stopService(new Intent(context, MediaPlayerService.class)); context.stopService(new Intent(context, MediaPlayerService.class));
Log.i(TAG, "DownloadServiceImpl destroyed"); Log.i(TAG, "MediaPlayerControllerImpl destroyed");
} }
private void executeOnStartedMediaPlayerService(final Consumer<MediaPlayerService> taskToExecute) private void executeOnStartedMediaPlayerService(final Consumer<MediaPlayerService> taskToExecute)
@ -120,20 +119,20 @@ public class DownloadServiceImpl implements DownloadService
} }
}); });
if (player.currentPlaying != null) if (localMediaPlayer.currentPlaying != null)
{ {
if (autoPlay && jukeboxService.getValue().isEnabled()) if (autoPlay && jukeboxMediaPlayer.getValue().isEnabled())
{ {
jukeboxService.getValue().skip(downloader.getCurrentPlayingIndex(), currentPlayingPosition / 1000); jukeboxMediaPlayer.getValue().skip(downloader.getCurrentPlayingIndex(), currentPlayingPosition / 1000);
} }
else else
{ {
if (player.currentPlaying.isCompleteFileAvailable()) if (localMediaPlayer.currentPlaying.isCompleteFileAvailable())
{ {
executeOnStartedMediaPlayerService(new Consumer<MediaPlayerService>() { executeOnStartedMediaPlayerService(new Consumer<MediaPlayerService>() {
@Override @Override
public void accept(MediaPlayerService mediaPlayerService) { public void accept(MediaPlayerService mediaPlayerService) {
player.doPlay(player.currentPlaying, currentPlayingPosition, autoPlay); localMediaPlayer.doPlay(localMediaPlayer.currentPlaying, currentPlayingPosition, autoPlay);
} }
}); });
} }
@ -167,7 +166,7 @@ public class DownloadServiceImpl implements DownloadService
@Override @Override
public synchronized void togglePlayPause() public synchronized void togglePlayPause()
{ {
if (player.playerState == PlayerState.IDLE) autoPlayStart = true; if (localMediaPlayer.playerState == PlayerState.IDLE) autoPlayStart = true;
executeOnStartedMediaPlayerService(new Consumer<MediaPlayerService>() { executeOnStartedMediaPlayerService(new Consumer<MediaPlayerService>() {
@Override @Override
public void accept(MediaPlayerService mediaPlayerService) { public void accept(MediaPlayerService mediaPlayerService) {
@ -224,7 +223,7 @@ public class DownloadServiceImpl implements DownloadService
public synchronized void download(List<MusicDirectory.Entry> songs, boolean save, boolean autoPlay, boolean playNext, boolean shuffle, boolean newPlaylist) public synchronized void download(List<MusicDirectory.Entry> songs, boolean save, boolean autoPlay, boolean playNext, boolean shuffle, boolean newPlaylist)
{ {
downloader.download(songs, save, autoPlay, playNext, newPlaylist); downloader.download(songs, save, autoPlay, playNext, newPlaylist);
jukeboxService.getValue().updatePlaylist(); jukeboxMediaPlayer.getValue().updatePlaylist();
if (shuffle) shuffle(); if (shuffle) shuffle();
@ -240,7 +239,13 @@ public class DownloadServiceImpl implements DownloadService
} }
else else
{ {
downloader.setFirstPlaying(); if (localMediaPlayer.currentPlaying == null && downloader.downloadList.size() > 0)
{
localMediaPlayer.currentPlaying = downloader.downloadList.get(0);
localMediaPlayer.currentPlaying.setPlaying(true);
}
downloader.checkDownloads();
} }
downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloader.getCurrentPlayingIndex(), getPlayerPosition()); downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloader.getCurrentPlayingIndex(), getPlayerPosition());
@ -256,7 +261,7 @@ public class DownloadServiceImpl implements DownloadService
public synchronized void setCurrentPlaying(DownloadFile currentPlaying) public synchronized void setCurrentPlaying(DownloadFile currentPlaying)
{ {
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) player.setCurrentPlaying(currentPlaying); if (mediaPlayerService != null) localMediaPlayer.setCurrentPlaying(currentPlaying);
} }
public synchronized void setCurrentPlaying(int index) public synchronized void setCurrentPlaying(int index)
@ -268,19 +273,13 @@ public class DownloadServiceImpl implements DownloadService
public synchronized void setPlayerState(PlayerState state) public synchronized void setPlayerState(PlayerState state)
{ {
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) player.setPlayerState(state); if (mediaPlayerService != null) localMediaPlayer.setPlayerState(state);
} }
@Override @Override
public void stopJukeboxService() public void stopJukeboxService()
{ {
jukeboxService.getValue().stopJukeboxService(); jukeboxMediaPlayer.getValue().stopJukeboxService();
}
@Override
public void startJukeboxService()
{
jukeboxService.getValue().startJukeboxService();
} }
@Override @Override
@ -306,7 +305,7 @@ public class DownloadServiceImpl implements DownloadService
downloader.shuffle(); downloader.shuffle();
downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloader.getCurrentPlayingIndex(), getPlayerPosition()); downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloader.getCurrentPlayingIndex(), getPlayerPosition());
jukeboxService.getValue().updatePlaylist(); jukeboxMediaPlayer.getValue().updatePlaylist();
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) mediaPlayerService.setNextPlaying(); if (mediaPlayerService != null) mediaPlayerService.setNextPlaying();
@ -361,7 +360,7 @@ public class DownloadServiceImpl implements DownloadService
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) mediaPlayerService.clear(serialize); if (mediaPlayerService != null) mediaPlayerService.clear(serialize);
jukeboxService.getValue().updatePlaylist(); jukeboxMediaPlayer.getValue().updatePlaylist();
} }
@Override @Override
@ -380,13 +379,13 @@ public class DownloadServiceImpl implements DownloadService
} }
downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloader.getCurrentPlayingIndex(), getPlayerPosition()); downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloader.getCurrentPlayingIndex(), getPlayerPosition());
jukeboxService.getValue().updatePlaylist(); jukeboxMediaPlayer.getValue().updatePlaylist();
} }
@Override @Override
public synchronized void remove(DownloadFile downloadFile) public synchronized void remove(DownloadFile downloadFile)
{ {
if (downloadFile == player.currentPlaying) if (downloadFile == localMediaPlayer.currentPlaying)
{ {
reset(); reset();
setCurrentPlaying(null); setCurrentPlaying(null);
@ -395,9 +394,9 @@ public class DownloadServiceImpl implements DownloadService
downloader.removeDownloadFile(downloadFile); downloader.removeDownloadFile(downloadFile);
downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloader.getCurrentPlayingIndex(), getPlayerPosition()); downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloader.getCurrentPlayingIndex(), getPlayerPosition());
jukeboxService.getValue().updatePlaylist(); jukeboxMediaPlayer.getValue().updatePlaylist();
if (downloadFile == player.nextPlaying) if (downloadFile == localMediaPlayer.nextPlaying)
{ {
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) mediaPlayerService.setNextPlaying(); if (mediaPlayerService != null) mediaPlayerService.setNextPlaying();
@ -456,7 +455,7 @@ public class DownloadServiceImpl implements DownloadService
public synchronized void reset() public synchronized void reset()
{ {
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) player.reset(); if (mediaPlayerService != null) localMediaPlayer.reset();
} }
@Override @Override
@ -470,9 +469,9 @@ public class DownloadServiceImpl implements DownloadService
@Override @Override
public synchronized int getPlayerDuration() public synchronized int getPlayerDuration()
{ {
if (player.currentPlaying != null) if (localMediaPlayer.currentPlaying != null)
{ {
Integer duration = player.currentPlaying.getSong().getDuration(); Integer duration = localMediaPlayer.currentPlaying.getSong().getDuration();
if (duration != null) if (duration != null)
{ {
return duration * 1000; return duration * 1000;
@ -485,7 +484,7 @@ public class DownloadServiceImpl implements DownloadService
} }
@Override @Override
public PlayerState getPlayerState() { return player.playerState; } public PlayerState getPlayerState() { return localMediaPlayer.playerState; }
@Override @Override
public void setSuggestedPlaylistName(String name) public void setSuggestedPlaylistName(String name)
@ -499,21 +498,12 @@ public class DownloadServiceImpl implements DownloadService
return suggestedPlaylistName; return suggestedPlaylistName;
} }
@Override
public boolean getEqualizerAvailable() { return player.equalizerAvailable; }
@Override
public boolean getVisualizerAvailable()
{
return player.visualizerAvailable;
}
@Override @Override
public EqualizerController getEqualizerController() public EqualizerController getEqualizerController()
{ {
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService == null) return null; if (mediaPlayerService == null) return null;
return player.getEqualizerController(); return localMediaPlayer.getEqualizerController();
} }
@Override @Override
@ -521,13 +511,13 @@ public class DownloadServiceImpl implements DownloadService
{ {
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService == null) return null; if (mediaPlayerService == null) return null;
return player.getVisualizerController(); return localMediaPlayer.getVisualizerController();
} }
@Override @Override
public boolean isJukeboxEnabled() public boolean isJukeboxEnabled()
{ {
return jukeboxService.getValue().isEnabled(); return jukeboxMediaPlayer.getValue().isEnabled();
} }
@Override @Override
@ -547,32 +537,15 @@ public class DownloadServiceImpl implements DownloadService
return false; return false;
} }
@Override
public boolean isSharingAvailable()
{
try
{
String username = Util.getUserName(context, Util.getActiveServer(context));
UserInfo user = MusicServiceFactory.getMusicService(context).getUser(username, context, null);
return user.getShareRole();
}
catch (Exception e)
{
Log.w(TAG, "Error getting user information", e);
}
return false;
}
@Override @Override
public void setJukeboxEnabled(boolean jukeboxEnabled) public void setJukeboxEnabled(boolean jukeboxEnabled)
{ {
jukeboxService.getValue().setEnabled(jukeboxEnabled); jukeboxMediaPlayer.getValue().setEnabled(jukeboxEnabled);
setPlayerState(PlayerState.IDLE); setPlayerState(PlayerState.IDLE);
if (jukeboxEnabled) if (jukeboxEnabled)
{ {
jukeboxService.getValue().startJukeboxService(); jukeboxMediaPlayer.getValue().startJukeboxService();
reset(); reset();
@ -584,59 +557,28 @@ public class DownloadServiceImpl implements DownloadService
} }
else else
{ {
jukeboxService.getValue().stopJukeboxService(); jukeboxMediaPlayer.getValue().stopJukeboxService();
} }
} }
@Override @Override
public void adjustJukeboxVolume(boolean up) public void adjustJukeboxVolume(boolean up)
{ {
jukeboxService.getValue().adjustVolume(up); jukeboxMediaPlayer.getValue().adjustVolume(up);
} }
@Override @Override
public void setVolume(float volume) public void setVolume(float volume)
{ {
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) player.setVolume(volume); if (mediaPlayerService != null) localMediaPlayer.setVolume(volume);
}
@Override
public synchronized void swap(boolean mainList, int from, int to)
{
List<DownloadFile> list = mainList ? downloader.downloadList : downloader.backgroundDownloadList;
int max = list.size();
if (to >= max)
{
to = max - 1;
}
else if (to < 0)
{
to = 0;
}
int currentPlayingIndex = downloader.getCurrentPlayingIndex();
DownloadFile movedSong = list.remove(from);
list.add(to, movedSong);
if (jukeboxService.getValue().isEnabled() && mainList)
{
jukeboxService.getValue().updatePlaylist();
}
else if (mainList && (movedSong == player.nextPlaying || (currentPlayingIndex + 1) == to))
{
// Moving next playing or moving a song to be next playing
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) mediaPlayerService.setNextPlaying();
}
} }
@Override @Override
public void updateNotification() public void updateNotification()
{ {
MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance(); MediaPlayerService mediaPlayerService = MediaPlayerService.getRunningInstance();
if (mediaPlayerService != null) mediaPlayerService.updateNotification(player.playerState, player.currentPlaying); if (mediaPlayerService != null) mediaPlayerService.updateNotification(localMediaPlayer.playerState, localMediaPlayer.currentPlaying);
} }
public void setSongRating(final int rating) public void setSongRating(final int rating)
@ -644,10 +586,10 @@ public class DownloadServiceImpl implements DownloadService
if (!KoinJavaComponent.get(FeatureStorage.class).isFeatureEnabled(Feature.FIVE_STAR_RATING)) if (!KoinJavaComponent.get(FeatureStorage.class).isFeatureEnabled(Feature.FIVE_STAR_RATING))
return; return;
if (player.currentPlaying == null) if (localMediaPlayer.currentPlaying == null)
return; return;
final Entry song = player.currentPlaying.getSong(); final Entry song = localMediaPlayer.currentPlaying.getSong();
song.setUserRating(rating); song.setUserRating(rating);
new Thread(new Runnable() new Thread(new Runnable()

View File

@ -18,7 +18,6 @@
*/ */
package org.moire.ultrasonic.service; package org.moire.ultrasonic.service;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -43,20 +42,20 @@ import static org.koin.java.standalone.KoinJavaComponent.inject;
/** /**
* @author Sindre Mehus * @author Sindre Mehus
*/ */
public class DownloadServiceLifecycleSupport public class MediaPlayerLifecycleSupport
{ {
private static final String TAG = DownloadServiceLifecycleSupport.class.getSimpleName(); private static final String TAG = MediaPlayerLifecycleSupport.class.getSimpleName();
private Lazy<DownloadQueueSerializer> downloadQueueSerializer = inject(DownloadQueueSerializer.class); private Lazy<DownloadQueueSerializer> downloadQueueSerializer = inject(DownloadQueueSerializer.class);
private final DownloadServiceImpl downloadService; // From DI private final MediaPlayerControllerImpl mediaPlayerController; // From DI
private final Downloader downloader; // From DI private final Downloader downloader; // From DI
private BroadcastReceiver headsetEventReceiver;
private Context context; private Context context;
public DownloadServiceLifecycleSupport(Context context, final DownloadServiceImpl downloadService, final Downloader downloader) private BroadcastReceiver headsetEventReceiver;
public MediaPlayerLifecycleSupport(Context context, final MediaPlayerControllerImpl mediaPlayerController, final Downloader downloader)
{ {
this.downloadService = downloadService; this.mediaPlayerController = mediaPlayerController;
this.context = context; this.context = context;
this.downloader = downloader; this.downloader = downloader;
@ -80,11 +79,11 @@ public class DownloadServiceLifecycleSupport
@Override @Override
public void accept(State state) { public void accept(State state) {
// TODO: here the autoPlay = false creates problems when Ultrasonic is started by a Play MediaButton as the player won't start this way. // TODO: here the autoPlay = false creates problems when Ultrasonic is started by a Play MediaButton as the player won't start this way.
downloadService.restore(state.songs, state.currentPlayingIndex, state.currentPlayingPosition, false, false); mediaPlayerController.restore(state.songs, state.currentPlayingIndex, state.currentPlayingPosition, false, false);
// Work-around: Serialize again, as the restore() method creates a serialization without current playing info. // Work-around: Serialize again, as the restore() method creates a serialization without current playing info.
downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList,
downloader.getCurrentPlayingIndex(), downloadService.getPlayerPosition()); downloader.getCurrentPlayingIndex(), mediaPlayerController.getPlayerPosition());
} }
}); });
@ -94,13 +93,26 @@ public class DownloadServiceLifecycleSupport
public void onDestroy() public void onDestroy()
{ {
downloadService.clear(false); mediaPlayerController.clear(false);
context.unregisterReceiver(headsetEventReceiver); context.unregisterReceiver(headsetEventReceiver);
context.unregisterReceiver(intentReceiver); context.unregisterReceiver(intentReceiver);
downloadService.onDestroy(); mediaPlayerController.onDestroy();
Log.i(TAG, "LifecycleSupport destroyed"); Log.i(TAG, "LifecycleSupport destroyed");
} }
public void receiveIntent(Intent intent)
{
Log.i(TAG, "Received intent");
if (intent != null && intent.getExtras() != null)
{
KeyEvent event = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT);
if (event != null)
{
handleKeyEvent(event);
}
}
}
private void registerHeadsetReceiver() { private void registerHeadsetReceiver() {
// Pause when headset is unplugged. // Pause when headset is unplugged.
final SharedPreferences sp = Util.getPreferences(context); final SharedPreferences sp = Util.getPreferences(context);
@ -119,38 +131,32 @@ public class DownloadServiceLifecycleSupport
Log.i(TAG, String.format("Headset event for: %s", extras.get("name"))); Log.i(TAG, String.format("Headset event for: %s", extras.get("name")));
final int state = extras.getInt("state"); final int state = extras.getInt("state");
if (state == 0) { if (state == 0) {
if (!downloadService.isJukeboxEnabled()) { if (!mediaPlayerController.isJukeboxEnabled()) {
downloadService.pause(); mediaPlayerController.pause();
} }
} else if (state == 1) { } else if (state == 1) {
if (!downloadService.isJukeboxEnabled() && if (!mediaPlayerController.isJukeboxEnabled() &&
sp.getBoolean(spKey, false) && sp.getBoolean(spKey, false) &&
downloadService.getPlayerState() == PlayerState.PAUSED) { mediaPlayerController.getPlayerState() == PlayerState.PAUSED) {
downloadService.start(); mediaPlayerController.start();
} }
} }
} }
}; };
@SuppressLint("InlinedApi")
IntentFilter headsetIntentFilter = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) ?
new IntentFilter(AudioManager.ACTION_HEADSET_PLUG) : IntentFilter headsetIntentFilter;
new IntentFilter(Intent.ACTION_HEADSET_PLUG); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
headsetIntentFilter = new IntentFilter(AudioManager.ACTION_HEADSET_PLUG);
}
else
{
headsetIntentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
}
context.registerReceiver(headsetEventReceiver, headsetIntentFilter); context.registerReceiver(headsetEventReceiver, headsetIntentFilter);
} }
public void receiveIntent(Intent intent)
{
Log.i(TAG, "Received intent");
if (intent != null && intent.getExtras() != null)
{
KeyEvent event = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT);
if (event != null)
{
handleKeyEvent(event);
}
}
}
private void handleKeyEvent(KeyEvent event) private void handleKeyEvent(KeyEvent event)
{ {
if (event.getAction() != KeyEvent.ACTION_DOWN || event.getRepeatCount() > 0) if (event.getAction() != KeyEvent.ACTION_DOWN || event.getRepeatCount() > 0)
@ -162,47 +168,47 @@ public class DownloadServiceLifecycleSupport
{ {
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
case KeyEvent.KEYCODE_HEADSETHOOK: case KeyEvent.KEYCODE_HEADSETHOOK:
downloadService.togglePlayPause(); mediaPlayerController.togglePlayPause();
break; break;
case KeyEvent.KEYCODE_MEDIA_PREVIOUS: case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
downloadService.previous(); mediaPlayerController.previous();
break; break;
case KeyEvent.KEYCODE_MEDIA_NEXT: case KeyEvent.KEYCODE_MEDIA_NEXT:
if (downloader.getCurrentPlayingIndex() < downloader.downloadList.size() - 1) if (downloader.getCurrentPlayingIndex() < downloader.downloadList.size() - 1)
{ {
downloadService.next(); mediaPlayerController.next();
} }
break; break;
case KeyEvent.KEYCODE_MEDIA_STOP: case KeyEvent.KEYCODE_MEDIA_STOP:
downloadService.stop(); mediaPlayerController.stop();
break; break;
case KeyEvent.KEYCODE_MEDIA_PLAY: case KeyEvent.KEYCODE_MEDIA_PLAY:
if (downloadService.getPlayerState() == PlayerState.IDLE) if (mediaPlayerController.getPlayerState() == PlayerState.IDLE)
{ {
downloadService.play(); mediaPlayerController.play();
} }
else if (downloadService.getPlayerState() != PlayerState.STARTED) else if (mediaPlayerController.getPlayerState() != PlayerState.STARTED)
{ {
downloadService.start(); mediaPlayerController.start();
} }
break; break;
case KeyEvent.KEYCODE_MEDIA_PAUSE: case KeyEvent.KEYCODE_MEDIA_PAUSE:
downloadService.pause(); mediaPlayerController.pause();
break; break;
case KeyEvent.KEYCODE_1: case KeyEvent.KEYCODE_1:
downloadService.setSongRating(1); mediaPlayerController.setSongRating(1);
break; break;
case KeyEvent.KEYCODE_2: case KeyEvent.KEYCODE_2:
downloadService.setSongRating(2); mediaPlayerController.setSongRating(2);
break; break;
case KeyEvent.KEYCODE_3: case KeyEvent.KEYCODE_3:
downloadService.setSongRating(3); mediaPlayerController.setSongRating(3);
break; break;
case KeyEvent.KEYCODE_4: case KeyEvent.KEYCODE_4:
downloadService.setSongRating(4); mediaPlayerController.setSongRating(4);
break; break;
case KeyEvent.KEYCODE_5: case KeyEvent.KEYCODE_5:
downloadService.setSongRating(5); mediaPlayerController.setSongRating(5);
break; break;
default: default:
break; break;
@ -224,20 +230,20 @@ public class DownloadServiceLifecycleSupport
switch(action) switch(action)
{ {
case Constants.CMD_PLAY: case Constants.CMD_PLAY:
downloadService.play(); mediaPlayerController.play();
break; break;
case Constants.CMD_NEXT: case Constants.CMD_NEXT:
downloadService.next(); mediaPlayerController.next();
break; break;
case Constants.CMD_PREVIOUS: case Constants.CMD_PREVIOUS:
downloadService.previous(); mediaPlayerController.previous();
break; break;
case Constants.CMD_TOGGLEPAUSE: case Constants.CMD_TOGGLEPAUSE:
downloadService.togglePlayPause(); mediaPlayerController.togglePlayPause();
break; break;
case Constants.CMD_STOP: case Constants.CMD_STOP:
downloadService.pause(); mediaPlayerController.pause();
downloadService.seekTo(0); mediaPlayerController.seekTo(0);
break; break;
case Constants.CMD_PROCESS_KEYCODE: case Constants.CMD_PROCESS_KEYCODE:
receiveIntent(intent); receiveIntent(intent);

View File

@ -59,12 +59,12 @@ public class MediaPlayerService extends Service
private final IBinder binder = new SimpleServiceBinder<>(this); private final IBinder binder = new SimpleServiceBinder<>(this);
private final Scrobbler scrobbler = new Scrobbler(); private final Scrobbler scrobbler = new Scrobbler();
public Lazy<JukeboxService> jukeboxService = inject(JukeboxService.class); public Lazy<JukeboxMediaPlayer> jukeboxMediaPlayer = inject(JukeboxMediaPlayer.class);
private Lazy<DownloadQueueSerializer> downloadQueueSerializer = inject(DownloadQueueSerializer.class); private Lazy<DownloadQueueSerializer> downloadQueueSerializer = inject(DownloadQueueSerializer.class);
private Lazy<ShufflePlayBuffer> shufflePlayBufferLazy = inject(ShufflePlayBuffer.class); private Lazy<ShufflePlayBuffer> shufflePlayBufferLazy = inject(ShufflePlayBuffer.class);
private Lazy<Downloader> downloaderLazy = inject(Downloader.class); private Lazy<Downloader> downloaderLazy = inject(Downloader.class);
private Lazy<Player> playerLazy = inject(Player.class); private Lazy<LocalMediaPlayer> localMediaPlayerLazy = inject(LocalMediaPlayer.class);
private Player player; private LocalMediaPlayer localMediaPlayer;
private Downloader downloader; private Downloader downloader;
private ShufflePlayBuffer shufflePlayBuffer; private ShufflePlayBuffer shufflePlayBuffer;
@ -112,24 +112,24 @@ public class MediaPlayerService extends Service
super.onCreate(); super.onCreate();
downloader = downloaderLazy.getValue(); downloader = downloaderLazy.getValue();
player = playerLazy.getValue(); localMediaPlayer = localMediaPlayerLazy.getValue();
shufflePlayBuffer = shufflePlayBufferLazy.getValue(); shufflePlayBuffer = shufflePlayBufferLazy.getValue();
downloader.onCreate(); downloader.onCreate();
shufflePlayBuffer.onCreate(); shufflePlayBuffer.onCreate();
player.onCreate(); localMediaPlayer.onCreate();
setupOnCurrentPlayingChangedHandler(); setupOnCurrentPlayingChangedHandler();
setupOnPlayerStateChangedHandler(); setupOnPlayerStateChangedHandler();
setupOnSongCompletedHandler(); setupOnSongCompletedHandler();
player.onPrepared = new Runnable() { localMediaPlayer.onPrepared = new Runnable() {
@Override @Override
public void run() { public void run() {
downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList,
downloader.getCurrentPlayingIndex(), getPlayerPosition()); downloader.getCurrentPlayingIndex(), getPlayerPosition());
} }
}; };
player.onNextSongRequested = new Runnable() { localMediaPlayer.onNextSongRequested = new Runnable() {
@Override @Override
public void run() { public void run() {
setNextPlaying(); setNextPlaying();
@ -171,7 +171,7 @@ public class MediaPlayerService extends Service
try try
{ {
player.onDestroy(); localMediaPlayer.onDestroy();
shufflePlayBuffer.onDestroy(); shufflePlayBuffer.onDestroy();
downloader.onDestroy(); downloader.onDestroy();
} }
@ -184,37 +184,37 @@ public class MediaPlayerService extends Service
public synchronized void seekTo(int position) public synchronized void seekTo(int position)
{ {
if (jukeboxService.getValue().isEnabled()) if (jukeboxMediaPlayer.getValue().isEnabled())
{ {
jukeboxService.getValue().skip(downloader.getCurrentPlayingIndex(), position / 1000); jukeboxMediaPlayer.getValue().skip(downloader.getCurrentPlayingIndex(), position / 1000);
} }
else else
{ {
player.seekTo(position); localMediaPlayer.seekTo(position);
} }
} }
public synchronized int getPlayerPosition() public synchronized int getPlayerPosition()
{ {
if (player.playerState == IDLE || player.playerState == DOWNLOADING || player.playerState == PREPARING) if (localMediaPlayer.playerState == IDLE || localMediaPlayer.playerState == DOWNLOADING || localMediaPlayer.playerState == PREPARING)
{ {
return 0; return 0;
} }
return jukeboxService.getValue().isEnabled() ? jukeboxService.getValue().getPositionSeconds() * 1000 : return jukeboxMediaPlayer.getValue().isEnabled() ? jukeboxMediaPlayer.getValue().getPositionSeconds() * 1000 :
player.getPlayerPosition(); localMediaPlayer.getPlayerPosition();
} }
public synchronized int getPlayerDuration() public synchronized int getPlayerDuration()
{ {
return player.getPlayerDuration(); return localMediaPlayer.getPlayerDuration();
} }
public synchronized void setCurrentPlaying(int currentPlayingIndex) public synchronized void setCurrentPlaying(int currentPlayingIndex)
{ {
try try
{ {
player.setCurrentPlaying(downloader.downloadList.get(currentPlayingIndex)); localMediaPlayer.setCurrentPlaying(downloader.downloadList.get(currentPlayingIndex));
} }
catch (IndexOutOfBoundsException x) catch (IndexOutOfBoundsException x)
{ {
@ -224,7 +224,7 @@ public class MediaPlayerService extends Service
public void setupOnCurrentPlayingChangedHandler() public void setupOnCurrentPlayingChangedHandler()
{ {
player.onCurrentPlayingChanged = new Consumer<DownloadFile>() { localMediaPlayer.onCurrentPlayingChanged = new Consumer<DownloadFile>() {
@Override @Override
public void accept(DownloadFile currentPlaying) { public void accept(DownloadFile currentPlaying) {
if (currentPlaying != null) if (currentPlaying != null)
@ -241,7 +241,7 @@ public class MediaPlayerService extends Service
} }
// Update widget // Update widget
PlayerState playerState = player.playerState; PlayerState playerState = localMediaPlayer.playerState;
MusicDirectory.Entry song = currentPlaying == null? null : currentPlaying.getSong(); MusicDirectory.Entry song = currentPlaying == null? null : currentPlaying.getSong();
UltraSonicAppWidgetProvider4x1.getInstance().notifyChange(MediaPlayerService.this, song, playerState == PlayerState.STARTED, false); UltraSonicAppWidgetProvider4x1.getInstance().notifyChange(MediaPlayerService.this, song, playerState == PlayerState.STARTED, false);
UltraSonicAppWidgetProvider4x2.getInstance().notifyChange(MediaPlayerService.this, song, playerState == PlayerState.STARTED, true); UltraSonicAppWidgetProvider4x2.getInstance().notifyChange(MediaPlayerService.this, song, playerState == PlayerState.STARTED, true);
@ -253,7 +253,7 @@ public class MediaPlayerService extends Service
if (currentPlaying != null) if (currentPlaying != null)
{ {
if (tabInstance != null) { if (tabInstance != null) {
updateNotification(player.playerState, currentPlaying); updateNotification(localMediaPlayer.playerState, currentPlaying);
tabInstance.showNowPlaying(); tabInstance.showNowPlaying();
} }
} }
@ -263,7 +263,7 @@ public class MediaPlayerService extends Service
{ {
tabInstance.hideNowPlaying(); tabInstance.hideNowPlaying();
stopForeground(true); stopForeground(true);
player.clearRemoteControl(); localMediaPlayer.clearRemoteControl();
isInForeground = false; isInForeground = false;
stopSelf(); stopSelf();
} }
@ -278,7 +278,7 @@ public class MediaPlayerService extends Service
if (!gaplessPlayback) if (!gaplessPlayback)
{ {
player.setNextPlaying(null); localMediaPlayer.setNextPlaying(null);
return; return;
} }
@ -295,35 +295,34 @@ public class MediaPlayerService extends Service
index = (index + 1) % downloader.downloadList.size(); index = (index + 1) % downloader.downloadList.size();
break; break;
case SINGLE: case SINGLE:
break;
default: default:
break; break;
} }
} }
player.clearNextPlaying(); localMediaPlayer.clearNextPlaying();
if (index < downloader.downloadList.size() && index != -1) if (index < downloader.downloadList.size() && index != -1)
{ {
player.setNextPlaying(downloader.downloadList.get(index)); localMediaPlayer.setNextPlaying(downloader.downloadList.get(index));
} }
else else
{ {
player.setNextPlaying(null); localMediaPlayer.setNextPlaying(null);
} }
} }
public synchronized void togglePlayPause() public synchronized void togglePlayPause()
{ {
if (player.playerState == PAUSED || player.playerState == COMPLETED || player.playerState == STOPPED) if (localMediaPlayer.playerState == PAUSED || localMediaPlayer.playerState == COMPLETED || localMediaPlayer.playerState == STOPPED)
{ {
start(); start();
} }
else if (player.playerState == IDLE) else if (localMediaPlayer.playerState == IDLE)
{ {
play(); play();
} }
else if (player.playerState == STARTED) else if (localMediaPlayer.playerState == STARTED)
{ {
pause(); pause();
} }
@ -361,14 +360,14 @@ public class MediaPlayerService extends Service
{ {
if (start) if (start)
{ {
if (jukeboxService.getValue().isEnabled()) if (jukeboxMediaPlayer.getValue().isEnabled())
{ {
jukeboxService.getValue().skip(index, 0); jukeboxMediaPlayer.getValue().skip(index, 0);
player.setPlayerState(STARTED); localMediaPlayer.setPlayerState(STARTED);
} }
else else
{ {
player.play(downloader.downloadList.get(index)); localMediaPlayer.play(downloader.downloadList.get(index));
} }
} }
@ -379,60 +378,60 @@ public class MediaPlayerService extends Service
private synchronized void resetPlayback() private synchronized void resetPlayback()
{ {
player.reset(); localMediaPlayer.reset();
player.setCurrentPlaying(null); localMediaPlayer.setCurrentPlaying(null);
downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList, downloadQueueSerializer.getValue().serializeDownloadQueue(downloader.downloadList,
downloader.getCurrentPlayingIndex(), getPlayerPosition()); downloader.getCurrentPlayingIndex(), getPlayerPosition());
} }
public synchronized void pause() public synchronized void pause()
{ {
if (player.playerState == STARTED) if (localMediaPlayer.playerState == STARTED)
{ {
if (jukeboxService.getValue().isEnabled()) if (jukeboxMediaPlayer.getValue().isEnabled())
{ {
jukeboxService.getValue().stop(); jukeboxMediaPlayer.getValue().stop();
} }
else else
{ {
player.pause(); localMediaPlayer.pause();
} }
player.setPlayerState(PAUSED); localMediaPlayer.setPlayerState(PAUSED);
} }
} }
public synchronized void stop() public synchronized void stop()
{ {
if (player.playerState == STARTED) if (localMediaPlayer.playerState == STARTED)
{ {
if (jukeboxService.getValue().isEnabled()) if (jukeboxMediaPlayer.getValue().isEnabled())
{ {
jukeboxService.getValue().stop(); jukeboxMediaPlayer.getValue().stop();
} }
else else
{ {
player.pause(); localMediaPlayer.pause();
} }
} }
player.setPlayerState(STOPPED); localMediaPlayer.setPlayerState(STOPPED);
} }
public synchronized void start() public synchronized void start()
{ {
if (jukeboxService.getValue().isEnabled()) if (jukeboxMediaPlayer.getValue().isEnabled())
{ {
jukeboxService.getValue().start(); jukeboxMediaPlayer.getValue().start();
} }
else else
{ {
player.start(); localMediaPlayer.start();
} }
player.setPlayerState(STARTED); localMediaPlayer.setPlayerState(STARTED);
} }
public void setupOnPlayerStateChangedHandler() public void setupOnPlayerStateChangedHandler()
{ {
player.onPlayerStateChanged = new BiConsumer<PlayerState, DownloadFile>() { localMediaPlayer.onPlayerStateChanged = new BiConsumer<PlayerState, DownloadFile>() {
@Override @Override
public void accept(PlayerState playerState, DownloadFile currentPlaying) { public void accept(PlayerState playerState, DownloadFile currentPlaying) {
if (playerState == PAUSED) if (playerState == PAUSED)
@ -442,13 +441,13 @@ public class MediaPlayerService extends Service
boolean showWhenPaused = (playerState != PlayerState.STOPPED && Util.isNotificationAlwaysEnabled(MediaPlayerService.this)); boolean showWhenPaused = (playerState != PlayerState.STOPPED && Util.isNotificationAlwaysEnabled(MediaPlayerService.this));
boolean show = playerState == PlayerState.STARTED || showWhenPaused; boolean show = playerState == PlayerState.STARTED || showWhenPaused;
MusicDirectory.Entry song = currentPlaying == null? null : currentPlaying.getSong();
Util.broadcastPlaybackStatusChange(MediaPlayerService.this, playerState); Util.broadcastPlaybackStatusChange(MediaPlayerService.this, playerState);
Util.broadcastA2dpPlayStatusChange(MediaPlayerService.this, playerState, currentPlaying.getSong(), Util.broadcastA2dpPlayStatusChange(MediaPlayerService.this, playerState, song,
downloader.downloadList.size() + downloader.backgroundDownloadList.size(), downloader.downloadList.size() + downloader.backgroundDownloadList.size(),
downloader.downloadList.indexOf(currentPlaying) + 1, getPlayerPosition()); downloader.downloadList.indexOf(currentPlaying) + 1, getPlayerPosition());
MusicDirectory.Entry song = currentPlaying.getSong();
// Update widget // Update widget
UltraSonicAppWidgetProvider4x1.getInstance().notifyChange(MediaPlayerService.this, song, playerState == PlayerState.STARTED, false); UltraSonicAppWidgetProvider4x1.getInstance().notifyChange(MediaPlayerService.this, song, playerState == PlayerState.STARTED, false);
UltraSonicAppWidgetProvider4x2.getInstance().notifyChange(MediaPlayerService.this, song, playerState == PlayerState.STARTED, true); UltraSonicAppWidgetProvider4x2.getInstance().notifyChange(MediaPlayerService.this, song, playerState == PlayerState.STARTED, true);
@ -460,7 +459,7 @@ public class MediaPlayerService extends Service
{ {
if (tabInstance != null) if (tabInstance != null)
{ {
// Only update notification is player state is one that will change the icon // Only update notification is localMediaPlayer state is one that will change the icon
if (playerState == PlayerState.STARTED || playerState == PlayerState.PAUSED) if (playerState == PlayerState.STARTED || playerState == PlayerState.PAUSED)
{ {
updateNotification(playerState, currentPlaying); updateNotification(playerState, currentPlaying);
@ -473,7 +472,7 @@ public class MediaPlayerService extends Service
if (tabInstance != null) if (tabInstance != null)
{ {
stopForeground(true); stopForeground(true);
player.clearRemoteControl(); localMediaPlayer.clearRemoteControl();
isInForeground = false; isInForeground = false;
tabInstance.hideNowPlaying(); tabInstance.hideNowPlaying();
stopSelf(); stopSelf();
@ -494,7 +493,7 @@ public class MediaPlayerService extends Service
private void setupOnSongCompletedHandler() private void setupOnSongCompletedHandler()
{ {
player.onSongCompleted = new Consumer<DownloadFile>() { localMediaPlayer.onSongCompleted = new Consumer<DownloadFile>() {
@Override @Override
public void accept(DownloadFile currentPlaying) { public void accept(DownloadFile currentPlaying) {
int index = downloader.getCurrentPlayingIndex(); int index = downloader.getCurrentPlayingIndex();
@ -527,7 +526,7 @@ public class MediaPlayerService extends Service
if (Util.getShouldClearPlaylist(MediaPlayerService.this)) if (Util.getShouldClearPlaylist(MediaPlayerService.this))
{ {
clear(true); clear(true);
jukeboxService.getValue().updatePlaylist(); jukeboxMediaPlayer.getValue().updatePlaylist();
} }
resetPlayback(); resetPlayback();
@ -552,9 +551,9 @@ public class MediaPlayerService extends Service
public synchronized void clear(boolean serialize) public synchronized void clear(boolean serialize)
{ {
player.reset(); localMediaPlayer.reset();
downloader.clear(); downloader.clear();
player.setCurrentPlaying(null); localMediaPlayer.setCurrentPlaying(null);
setNextPlaying(); setNextPlaying();
@ -567,7 +566,7 @@ public class MediaPlayerService extends Service
public void updateNotification(PlayerState playerState, DownloadFile currentPlaying) public void updateNotification(PlayerState playerState, DownloadFile currentPlaying)
{ {
if (Util.isNotificationEnabled(this)) { if (Util.isNotificationEnabled(this)) {
if (isInForeground == true) { if (isInForeground) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, buildForegroundNotification(playerState, currentPlaying)); notificationManager.notify(NOTIFICATION_ID, buildForegroundNotification(playerState, currentPlaying));

View File

@ -54,11 +54,7 @@ import org.moire.ultrasonic.domain.*;
import org.moire.ultrasonic.domain.MusicDirectory.Entry; import org.moire.ultrasonic.domain.MusicDirectory.Entry;
import org.moire.ultrasonic.receiver.MediaButtonIntentReceiver; import org.moire.ultrasonic.receiver.MediaButtonIntentReceiver;
import org.moire.ultrasonic.service.DownloadFile; import org.moire.ultrasonic.service.DownloadFile;
import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.service.DownloadServiceImpl;
import org.moire.ultrasonic.service.DownloadServiceLifecycleSupport;
import org.moire.ultrasonic.service.Downloader;
import org.moire.ultrasonic.service.MediaPlayerService;
import org.moire.ultrasonic.service.MusicServiceFactory; import org.moire.ultrasonic.service.MusicServiceFactory;
import java.io.*; import java.io.*;
@ -1183,22 +1179,22 @@ public class Util extends DownloadActivity
@Override @Override
public void onAudioFocusChange(int focusChange) public void onAudioFocusChange(int focusChange)
{ {
DownloadService downloadService = (DownloadService) context; MediaPlayerController mediaPlayerController = (MediaPlayerController) context;
if ((focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT || focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) && !downloadService.isJukeboxEnabled()) if ((focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT || focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) && !mediaPlayerController.isJukeboxEnabled())
{ {
if (downloadService.getPlayerState() == PlayerState.STARTED) if (mediaPlayerController.getPlayerState() == PlayerState.STARTED)
{ {
SharedPreferences preferences = getPreferences(context); SharedPreferences preferences = getPreferences(context);
int lossPref = Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_TEMP_LOSS, "1")); int lossPref = Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_TEMP_LOSS, "1"));
if (lossPref == 2 || (lossPref == 1 && focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)) if (lossPref == 2 || (lossPref == 1 && focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK))
{ {
lowerFocus = true; lowerFocus = true;
downloadService.setVolume(0.1f); mediaPlayerController.setVolume(0.1f);
} }
else if (lossPref == 0 || (lossPref == 1)) else if (lossPref == 0 || (lossPref == 1))
{ {
pauseFocus = true; pauseFocus = true;
downloadService.pause(); mediaPlayerController.pause();
} }
} }
} }
@ -1207,18 +1203,18 @@ public class Util extends DownloadActivity
if (pauseFocus) if (pauseFocus)
{ {
pauseFocus = false; pauseFocus = false;
downloadService.start(); mediaPlayerController.start();
} }
else if (lowerFocus) else if (lowerFocus)
{ {
lowerFocus = false; lowerFocus = false;
downloadService.setVolume(1.0f); mediaPlayerController.setVolume(1.0f);
} }
} }
else if (focusChange == AudioManager.AUDIOFOCUS_LOSS && !downloadService.isJukeboxEnabled()) else if (focusChange == AudioManager.AUDIOFOCUS_LOSS && !mediaPlayerController.isJukeboxEnabled())
{ {
hasFocus = false; hasFocus = false;
downloadService.pause(); mediaPlayerController.pause();
audioManager.abandonAudioFocus(this); audioManager.abandonAudioFocus(this);
} }
} }

View File

@ -41,7 +41,7 @@ public enum VideoPlayerType
public void playVideo(final Activity activity, MusicDirectory.Entry entry) throws Exception public void playVideo(final Activity activity, MusicDirectory.Entry entry) throws Exception
{ {
// Check if MX Player is installed. // Check if MX LocalMediaPlayer is installed.
boolean installedAd = Util.isPackageInstalled(activity, PACKAGE_NAME_MX_AD); boolean installedAd = Util.isPackageInstalled(activity, PACKAGE_NAME_MX_AD);
boolean installedPro = Util.isPackageInstalled(activity, PACKAGE_NAME_MX_PRO); boolean installedPro = Util.isPackageInstalled(activity, PACKAGE_NAME_MX_PRO);

View File

@ -37,12 +37,10 @@ import org.moire.ultrasonic.domain.MusicDirectory.Entry;
import org.moire.ultrasonic.featureflags.Feature; import org.moire.ultrasonic.featureflags.Feature;
import org.moire.ultrasonic.featureflags.FeatureStorage; import org.moire.ultrasonic.featureflags.FeatureStorage;
import org.moire.ultrasonic.service.DownloadFile; import org.moire.ultrasonic.service.DownloadFile;
import org.moire.ultrasonic.service.DownloadService;
import org.moire.ultrasonic.service.DownloadServiceImpl;
import org.moire.ultrasonic.service.Downloader; import org.moire.ultrasonic.service.Downloader;
import org.moire.ultrasonic.service.MusicService; import org.moire.ultrasonic.service.MusicService;
import org.moire.ultrasonic.service.MusicServiceFactory; import org.moire.ultrasonic.service.MusicServiceFactory;
import org.moire.ultrasonic.service.Player; import org.moire.ultrasonic.service.LocalMediaPlayer;
import org.moire.ultrasonic.util.Util; import org.moire.ultrasonic.util.Util;
import org.moire.ultrasonic.util.VideoPlayerType; import org.moire.ultrasonic.util.VideoPlayerType;
@ -85,7 +83,7 @@ public class SongView extends UpdateView implements Checkable
private boolean useFiveStarRating; private boolean useFiveStarRating;
private Lazy<Downloader> downloader = inject(Downloader.class); private Lazy<Downloader> downloader = inject(Downloader.class);
protected Lazy<Player> player = inject(Player.class); protected Lazy<LocalMediaPlayer> localMediaPlayer = inject(LocalMediaPlayer.class);
public SongView(Context context) public SongView(Context context)
{ {
@ -413,7 +411,7 @@ public class SongView extends UpdateView implements Checkable
viewHolder.fiveStar4.setImageDrawable(rating > 3 ? starDrawable : starHollowDrawable); viewHolder.fiveStar4.setImageDrawable(rating > 3 ? starDrawable : starHollowDrawable);
viewHolder.fiveStar5.setImageDrawable(rating > 4 ? starDrawable : starHollowDrawable); viewHolder.fiveStar5.setImageDrawable(rating > 4 ? starDrawable : starHollowDrawable);
boolean playing = player.getValue().currentPlaying == downloadFile; boolean playing = localMediaPlayer.getValue().currentPlaying == downloadFile;
if (playing) if (playing)
{ {

View File

@ -27,8 +27,7 @@ import android.view.View;
import org.moire.ultrasonic.audiofx.VisualizerController; import org.moire.ultrasonic.audiofx.VisualizerController;
import org.moire.ultrasonic.domain.PlayerState; import org.moire.ultrasonic.domain.PlayerState;
import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.MediaPlayerController;
import org.moire.ultrasonic.service.DownloadServiceImpl;
import kotlin.Lazy; import kotlin.Lazy;
@ -51,7 +50,7 @@ public class VisualizerView extends View
private float[] points; private float[] points;
private boolean active; private boolean active;
private Lazy<DownloadServiceImpl> downloadServiceImpl = inject(DownloadServiceImpl.class); private Lazy<MediaPlayerController> mediaPlayerControllerLazy = inject(MediaPlayerController.class);
public VisualizerView(Context context) public VisualizerView(Context context)
{ {
@ -104,7 +103,7 @@ public class VisualizerView extends View
private Visualizer getVizualizer() private Visualizer getVizualizer()
{ {
VisualizerController visualizerController = downloadServiceImpl.getValue().getVisualizerController(); VisualizerController visualizerController = mediaPlayerControllerLazy.getValue().getVisualizerController();
return visualizerController == null ? null : visualizerController.getVisualizer(); return visualizerController == null ? null : visualizerController.getVisualizer();
} }
@ -124,7 +123,7 @@ public class VisualizerView extends View
return; return;
} }
if (downloadServiceImpl.getValue().getPlayerState() != PlayerState.STARTED) if (mediaPlayerControllerLazy.getValue().getPlayerState() != PlayerState.STARTED)
{ {
return; return;
} }

View File

@ -113,12 +113,13 @@ val musicServiceModule = module(MUSIC_SERVICE_CONTEXT) {
single { SubsonicImageLoader(getProperty(DiProperties.APP_CONTEXT), get()) } single { SubsonicImageLoader(getProperty(DiProperties.APP_CONTEXT), get()) }
single { DownloadServiceImpl(androidContext(), get(), get(), get()) } single<MediaPlayerController> { MediaPlayerControllerImpl(androidContext(), get(), get(), get()) }
single { JukeboxService(androidContext(), get()) } single { MediaPlayerControllerImpl(androidContext(), get(), get(), get()) }
single { DownloadServiceLifecycleSupport(androidContext(), get(), get()) } single { JukeboxMediaPlayer(androidContext(), get()) }
single { MediaPlayerLifecycleSupport(androidContext(), get(), get()) }
single { DownloadQueueSerializer(androidContext()) } single { DownloadQueueSerializer(androidContext()) }
single { ExternalStorageMonitor(androidContext()) } single { ExternalStorageMonitor(androidContext()) }
single { ShufflePlayBuffer(androidContext()) } single { ShufflePlayBuffer(androidContext()) }
single { Downloader(androidContext(), get(), get(), get()) } single { Downloader(androidContext(), get(), get(), get()) }
single { Player(androidContext()) } single { LocalMediaPlayer(androidContext()) }
} }

View File

@ -334,7 +334,7 @@
<string name="util.bytes_format.megabyte">0.00 MB</string> <string name="util.bytes_format.megabyte">0.00 MB</string>
<string name="util.no_time">-:--</string> <string name="util.no_time">-:--</string>
<string name="util.zero_time">0:00</string> <string name="util.zero_time">0:00</string>
<string name="video.get_mx_player_text">O player MX não está instalado. Baixe da graça pela Play Store ou modifique as configurações de vídeo.</string> <string name="video.get_mx_player_text">O localMediaPlayer MX não está instalado. Baixe da graça pela Play Store ou modifique as configurações de vídeo.</string>
<string name="video.get_mx_player_button">Baixar Player MX</string> <string name="video.get_mx_player_button">Baixar Player MX</string>
<string name="widget.initial_text">Toque para selecionar a música</string> <string name="widget.initial_text">Toque para selecionar a música</string>
<string name="widget.sdcard_busy">Cartão SD indisponível</string> <string name="widget.sdcard_busy">Cartão SD indisponível</string>

View File

@ -334,7 +334,7 @@
<string name="util.bytes_format.megabyte">0.00 MB</string> <string name="util.bytes_format.megabyte">0.00 MB</string>
<string name="util.no_time">&#8212;:&#8212;&#8212;</string> <string name="util.no_time">&#8212;:&#8212;&#8212;</string>
<string name="util.zero_time">0:00</string> <string name="util.zero_time">0:00</string>
<string name="video.get_mx_player_text">O player MX não está instalado. Descarregue da graça pela Play Store ou modifique as configurações de vídeo.</string> <string name="video.get_mx_player_text">O localMediaPlayer MX não está instalado. Descarregue da graça pela Play Store ou modifique as configurações de vídeo.</string>
<string name="video.get_mx_player_button">Descarregar Player MX</string> <string name="video.get_mx_player_button">Descarregar Player MX</string>
<string name="widget.initial_text">Toque para selecionar a música</string> <string name="widget.initial_text">Toque para selecionar a música</string>
<string name="widget.sdcard_busy">Cartão SD indisponível</string> <string name="widget.sdcard_busy">Cartão SD indisponível</string>

View File

@ -314,7 +314,7 @@
<string name="settings.use_id3">Browse Using ID3 Tags</string> <string name="settings.use_id3">Browse Using ID3 Tags</string>
<string name="settings.use_id3_summary">Use ID3 tag methods instead of file system based methods</string> <string name="settings.use_id3_summary">Use ID3 tag methods instead of file system based methods</string>
<string name="settings.video_title">Video</string> <string name="settings.video_title">Video</string>
<string name="settings.video_player">Video player</string> <string name="settings.video_player">Video localMediaPlayer</string>
<string name="settings.view_refresh">View Refresh</string> <string name="settings.view_refresh">View Refresh</string>
<string name="settings.view_refresh_500">.5 seconds</string> <string name="settings.view_refresh_500">.5 seconds</string>
<string name="settings.view_refresh_1000">1 second</string> <string name="settings.view_refresh_1000">1 second</string>