package com.simplecity.amp_library.utils; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.net.Uri; import android.widget.Toast; import com.simplecity.amp_library.R; import com.simplecity.amp_library.model.Album; import com.simplecity.amp_library.model.AlbumArtist; import com.simplecity.amp_library.model.Song; import com.simplecity.amp_library.playback.MusicService; import java.util.ArrayList; import java.util.List; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; public class MusicUtils { private static final String TAG = "MusicUtils"; public interface Defs { int PLAY_NEXT = 1; int ADD_TO_PLAYLIST = 2; int USE_AS_RINGTONE = 3; int PLAYLIST_SELECTED = 4; int NEW_PLAYLIST = 5; int PLAY_SELECTION = 6; int SHUFFLE_ALL = 9; int TIMER = 10; int LYRICS = 11; int QUEUE = 13; int CHILD_MENU_BASE = 15; int REMOVE = 16; int DELETE_ITEM = 18; int SET_INITIAL_DIR = 20; int RENAME = 21; int TAGGER = 22; int EQUALIZER = 24; int CLEAR_QUEUE = 26; int RESCAN = 28; int VIEW_AS = 30; int OPTIONS = 31; int BLACKLIST = 42; int GO_TO = 43; int GO_TO_ARTIST = 44; int GO_TO_ALBUM = 45; int TOGGLE_QUEUE = 46; int VIEW_INFO = 47; int EDIT_ARTWORK = 48; int SHARE = 29; int ARTIST_FRAGMENT_GROUP_ID = 2; int ALBUM_FRAGMENT_GROUP_ID = 3; int SONG_FRAGMENT_GROUP_ID = 4; int PLAYLIST_FRAGMENT_GROUP_ID = 5; int FOLDER_FRAGMENT_GROUP_ID = 6; int QUEUE_FRAGMENT_GROUP_ID = 7; int SUGGESTED_FRAGMENT_GROUP_ID = 8; } public interface PlaylistIds { long RECENTLY_ADDED_PLAYLIST = -2; long MOST_PLAYED_PLAYLIST = -3; long PODCASTS_PLAYLIST = -4; long RECENTLY_PLAYED_PLAYLIST = -5; } public interface PlaylistMenuOrder { int DELETE_PLAYLIST = Defs.CHILD_MENU_BASE + 1; int CLEAR_PLAYLIST = Defs.CHILD_MENU_BASE + 2; int EDIT_PLAYLIST = Defs.CHILD_MENU_BASE + 3; int RENAME_PLAYLIST = Defs.CHILD_MENU_BASE + 4; int EXPORT_PLAYLIST = Defs.CHILD_MENU_BASE + 5; } public static void playAll(Context context, Observable<List<Song>> songsObservable) { songsObservable.observeOn(AndroidSchedulers.mainThread()) .subscribe(songs -> playAll(songs, () -> { final String message = context.getString(R.string.emptyplaylist); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); })); } /** * @param songs list of songs to play */ public static void playAll(List<Song> songs, Action0 onEmpty) { playAll(songs, 0, false, onEmpty); } /** * @param songs list of songs to play * @param position position of the pressed song */ public static void playAll(List<Song> songs, int position, Action0 onEmpty) { playAll(songs, position, false, onEmpty); } /** * Method playAll. * * @param songs List<Song> * @param position int * @param forceShuffle boolean */ public static void playAll(List<Song> songs, int position, boolean forceShuffle, Action0 onEmpty) { if (songs.size() == 0 || MusicServiceConnectionUtils.sServiceBinder == null || MusicServiceConnectionUtils.sServiceBinder.getService() == null) { onEmpty.call(); return; } if (position < 0) { position = 0; } MusicServiceConnectionUtils.sServiceBinder.getService().open(songs, forceShuffle ? -1 : position); MusicServiceConnectionUtils.sServiceBinder.getService().play(); } /** * Shuffles the passed in song list */ public static void shuffleAll(Context context, Observable<List<Song>> songsObservable) { songsObservable.observeOn(AndroidSchedulers.mainThread()) .subscribe(songs -> { setShuffleMode(MusicService.ShuffleMode.ON); playAll(songs, 0, true, () -> { final String message = context.getString(R.string.emptyplaylist); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); }); }); } /** * Shuffles all songs on the device */ public static void shuffleAll(Context context) { shuffleAll(context, DataManager.getInstance().getSongsRelay().first()); } /** * @param uri The source of the file */ public static void playFile(final Uri uri) { if (uri == null || MusicServiceConnectionUtils.sServiceBinder == null || MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return; } // If this is a file:// URI, just use the path directly instead // of going through the open-from-filedescriptor codepath. String filename; final String scheme = uri.getScheme(); if ("file".equals(scheme)) { filename = uri.getPath(); } else { filename = uri.toString(); } MusicServiceConnectionUtils.sServiceBinder.getService().stop(); MusicServiceConnectionUtils.sServiceBinder.getService().openFile(filename, () -> MusicServiceConnectionUtils.sServiceBinder.getService().play()); } /** * Method getIntPref. * * @param context Context * @param name String * @param def int * @return int */ public static int getIntPref(Context context, String name, int def) { final SharedPreferences prefs = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE); return prefs.getInt(name, def); } /** * Method setIntPref. * * @param context Context * @param name String * @param value int */ static void setIntPref(Context context, String name, int value) { final SharedPreferences prefs = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE); final Editor editor = prefs.edit(); editor.putInt(name, value); editor.apply(); } /** * @return {@link String} The path to the currently playing file */ public static String getFilePath() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getPath(); } return null; } /** * @return True if we're playing music, false otherwise. */ public static boolean isPlaying() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().isPlaying(); } return false; } /** * @return The current shuffle mode */ public static int getShuffleMode() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getShuffleMode(); } return 0; } /** * Sets the shuffle mode */ public static void setShuffleMode(int mode) { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().setShuffleMode(mode); } } /** * @return The current repeat mode */ public static int getRepeatMode() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getRepeatMode(); } return 0; } /** * Changes to the next track */ public static void next() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().next(); } } /** * Changes to the previous track * * @param allowTrackRestart if true, the track will restart if the track position is > 2 seconds */ public static void previous(boolean allowTrackRestart) { if (allowTrackRestart && getPosition() > 2000) { seekTo(0); if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().play(); } } else { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().prev(); } } } /** * Plays or pauses the music depending on the current state. */ public static void playOrPause() { try { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { if (MusicServiceConnectionUtils.sServiceBinder.getService().isPlaying()) { MusicServiceConnectionUtils.sServiceBinder.getService().pause(); } else { MusicServiceConnectionUtils.sServiceBinder.getService().play(); } } } catch (final Exception ignored) { } } /** * Method getArtistId. * * @return long */ public static long getArtistId() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getArtistId(); } return -1; } /** * Method getAlbumId. * * @return long */ public static long getAlbumId() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getAlbumId(); } return -1; } /** * Method getSong. * * @return long */ public static long getSongId() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getSongId(); } return -1; } public static int getAudioSessionId() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getAudioSessionId(); } return 0; } public static String getAlbumName() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getAlbumName(); } return null; } public static String getAlbumArtistName() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getAlbumArtistName(); } return null; } public static String getSongName() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getSongName(); } return null; } /** * Note: This does not return a fully populated album artist. * * @return a partial {@link AlbumArtist} containing a partial {@link Album} * which contains the current song. */ public static AlbumArtist getAlbumArtist() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { if (getSong() != null) { return getSong().getAlbumArtist(); } } return null; } /** * Note: This does not return a fully populated album. * * @return a partial {@link Album} containing this song. */ public static Album getAlbum() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { if (getSong() != null) { return getSong().getAlbum(); } } return null; } public static Song getSong() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getSong(); } return null; } /** * Method getPosition. * * @return {@link long} */ public static long getPosition() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { try { return MusicServiceConnectionUtils.sServiceBinder.getService().getPosition(); } catch (final Exception ignored) { } } return 0; } /** * Method duration. * * @return {@link long} */ public static long getDuration() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { try { return MusicServiceConnectionUtils.sServiceBinder.getService().getDuration(); } catch (Exception ignored) { } } return 0; } /** * Method seekTo. * * @param position the {@link long} position to seek to */ public static void seekTo(final long position) { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().seekTo(position); } } public static void moveQueueItem(final int from, final int to) { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().moveQueueItem(from, to); } } static Observable<Boolean> isFavorite() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().isFavorite(); } return Observable.just(false); } public static void toggleLockscreenArtwork() { if (MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return; } MusicServiceConnectionUtils.sServiceBinder.getService().notifyChange(MusicService.InternalIntents.META_CHANGED); } public static void toggleShuffleMode() { if (MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return; } MusicServiceConnectionUtils.sServiceBinder.getService().toggleShuffleMode(); } public static void cycleRepeat() { if (MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return; } MusicServiceConnectionUtils.sServiceBinder.getService().toggleRepeat(); } public static void addToQueue(Context context, List<Song> songs) { if (MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return; } MusicServiceConnectionUtils.sServiceBinder.getService().enqueue(songs, MusicService.EnqueueAction.LAST); final String message = context.getResources().getQuantityString(R.plurals.NNNtrackstoqueue, songs.size(), songs.size()); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } public static void playNext(Context context, List<Song> songs) { if (MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return; } MusicServiceConnectionUtils.sServiceBinder.getService().enqueue(songs, MusicService.EnqueueAction.NEXT); final String message = context.getResources().getQuantityString(R.plurals.NNNtrackstoqueue, songs.size(), songs.size()); Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } public static void setQueuePosition(final int position) { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().setQueuePosition(position); } } public static void clearQueue() { MusicServiceConnectionUtils.sServiceBinder.getService().clearQueue(); } public static void setTimer(int sleepNumber) { if (MusicServiceConnectionUtils.sServiceBinder == null || MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return; } MusicServiceConnectionUtils.sServiceBinder.getService().sleep(sleepNumber); } public static void stopTimer() { if (MusicServiceConnectionUtils.sServiceBinder == null || MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return; } MusicServiceConnectionUtils.sServiceBinder.getService().stopTimer(); } public static List<Song> getQueue() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getQueue(); } return new ArrayList<>(); } public static boolean getTimerActive() { if (MusicServiceConnectionUtils.sServiceBinder == null || MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return false; } return MusicServiceConnectionUtils.sServiceBinder.getService().isTimerActive(); } public static long getTimeRemaining() { if (MusicServiceConnectionUtils.sServiceBinder.getService() == null) { return 0; } return MusicServiceConnectionUtils.sServiceBinder.getService().timeRemaining(); } public static int getQueuePosition() { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { return MusicServiceConnectionUtils.sServiceBinder.getService().getQueuePosition(); } return 0; } public static void removeFromQueue(final Song song, boolean notify) { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().removeTrack(song, notify); } } public static void removeFromQueue(final List<Song> songs, boolean notify) { if (MusicServiceConnectionUtils.sServiceBinder != null && MusicServiceConnectionUtils.sServiceBinder.getService() != null) { MusicServiceConnectionUtils.sServiceBinder.getService().removeTracks(songs, notify); } } }