package com.simplecity.amp_library.utils; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.simplecity.amp_library.ShuttleApplication; import com.simplecity.amp_library.model.Album; import com.simplecity.amp_library.model.AlbumArtist; import com.simplecity.amp_library.model.Song; import java.util.Collections; import java.util.List; public class SortManager { private static SortManager sInstance; public static SortManager getInstance() { if (sInstance == null) { sInstance = new SortManager(); } return sInstance; } private SharedPreferences mPrefs; private SortManager() { mPrefs = PreferenceManager.getDefaultSharedPreferences(ShuttleApplication.getInstance()); } private void setSortOrder(String key, int sortOrder) { mPrefs.edit().putInt(key, sortOrder).apply(); } private void setAscending(String key, boolean ascending) { mPrefs.edit().putBoolean(key, ascending).apply(); } public void setArtistsSortOrder(@ArtistSort int sortOrder) { setSortOrder(Key.ARTISTS, sortOrder); } public int getArtistsSortOrder() { return mPrefs.getInt(Key.ARTISTS, ArtistSort.DEFAULT); } public void setArtistsAscending(boolean ascending) { setAscending(Key.ARTISTS_ASC, ascending); } public boolean getArtistsAscending() { return mPrefs.getBoolean(Key.ARTISTS_ASC, true); } public void setAlbumsSortOrder(@AlbumSort int sortOrder) { setSortOrder(Key.ALBUMS, sortOrder); } public int getAlbumsSortOrder() { return mPrefs.getInt(Key.ALBUMS, AlbumSort.DEFAULT); } public void setAlbumsAscending(boolean ascending) { setAscending(Key.ALBUMS_ASC, ascending); } public boolean getAlbumsAscending() { return mPrefs.getBoolean(Key.ALBUMS_ASC, true); } public void setSongsSortOrder(@SongSort int sortOrder) { setSortOrder(Key.SONGS, sortOrder); } public int getSongsSortOrder() { return mPrefs.getInt(Key.SONGS, SongSort.DEFAULT); } public void setSongsAscending(boolean ascending) { setAscending(Key.SONGS_ASC, ascending); } public boolean getSongsAscending() { return mPrefs.getBoolean(Key.SONGS_ASC, true); } //Detail Fragment: public void setDetailSongsSortOrder(@SongSort int sortOrder) { setSortOrder(Key.DETAIL_SONGS, sortOrder); } public int getDetailSongsSortOrder() { return mPrefs.getInt(Key.DETAIL_SONGS, SongSort.DETAIL_DEFAULT); } public void setDetailAlbumSongsSortOrder(@SongSort int sortOrder) { setSortOrder(Key.DETAIL_ALBUM_SONGS, sortOrder); } public int getDetailAlbumSongsSortOrder() { return mPrefs.getInt(Key.DETAIL_ALBUM_SONGS, SongSort.DETAIL_DEFAULT); } public void setDetailPlaylistSongsSortOrder(@SongSort int sortOrder) { setSortOrder(Key.DETAIL_PLAYLIST_SONGS, sortOrder); } public int getDetailPlaylistSongsSortOrder() { return mPrefs.getInt(Key.DETAIL_PLAYLIST_SONGS, SongSort.DETAIL_DEFAULT); } public void setDetailGenreSongsSortOrder(@SongSort int sortOrder) { setSortOrder(Key.DETAIL_GENRE_SONGS, sortOrder); } public int getDetailGenreSongsSortOrder() { return mPrefs.getInt(Key.DETAIL_GENRE_SONGS, SongSort.DEFAULT); } public void setDetailAlbumsSortOrder(@AlbumSort int sortOrder) { setSortOrder(Key.DETAIL_ALBUMS, sortOrder); } public int getDetailAlbumsSortOrder() { return mPrefs.getInt(Key.DETAIL_ALBUMS, AlbumSort.DEFAULT); } public void setDetailPlaylistAlbumsSortOrder(@AlbumSort int sortOrder) { setSortOrder(Key.DETAIL_PLAYLIST_ALBUMS, sortOrder); } public int getDetailPlaylistAlbumsSortOrder() { return mPrefs.getInt(Key.DETAIL_PLAYLIST_ALBUMS, AlbumSort.DEFAULT); } public void setDetailGenreAlbumsSortOrder(@AlbumSort int sortOrder) { setSortOrder(Key.DETAIL_GENRE_ALBUMS, sortOrder); } public int getDetailGenreAlbumsSortOrder() { return mPrefs.getInt(Key.DETAIL_GENRE_ALBUMS, AlbumSort.DEFAULT); } public void setDetailSongsAscending(boolean ascending) { setAscending(Key.DETAIL_SONGS_ASC, ascending); } public boolean getDetailSongsAscending() { return mPrefs.getBoolean(Key.DETAIL_SONGS_ASC, true); } public void setDetailPlaylistSongsAscending(boolean ascending) { setAscending(Key.DETAIL_PLAYLIST_SONGS_ASC, ascending); } public boolean getDetailPlaylistSongsAscending() { return mPrefs.getBoolean(Key.DETAIL_PLAYLIST_SONGS_ASC, true); } public void setDetailGenreSongsAscending(boolean ascending) { setAscending(Key.DETAIL_GENRE_SONGS_ASC, ascending); } public boolean getDetailGenreSongsAscending() { return mPrefs.getBoolean(Key.DETAIL_GENRE_SONGS_ASC, true); } public void setDetailAlbumsAscending(boolean ascending) { setAscending(Key.DETAIL_ALBUMS_ASC, ascending); } public boolean getDetailAlbumsAscending() { return mPrefs.getBoolean(Key.DETAIL_ALBUMS_ASC, true); } public void setDetailPlaylistAlbumsAscending(boolean ascending) { setAscending(Key.DETAIL_PLAYLIST_ALBUMS_ASC, ascending); } public boolean getDetailPlaylistAlbumsAscending() { return mPrefs.getBoolean(Key.DETAIL_PLAYLIST_ALBUMS_ASC, true); } public void setDetailGenreAlbumsAscending(boolean ascending) { setAscending(Key.DETAIL_GENRE_ALBUMS_ASC, ascending); } public boolean getDetailGenreAlbumsAscending() { return mPrefs.getBoolean(Key.DETAIL_GENRE_ALBUMS_ASC, true); } static int PREF_VERSION = 0; public interface Key { String ARTISTS = "key_artists_sort_order_" + PREF_VERSION; String ALBUMS = "key_albums_sort_order_" + PREF_VERSION; String SONGS = "key_songs_sort_order_" + PREF_VERSION; String DETAIL_ALBUMS = "key_detail_albums_sort_order_" + PREF_VERSION; String DETAIL_PLAYLIST_ALBUMS = "key_detail_playlist_albums_sort_order_" + PREF_VERSION; String DETAIL_GENRE_ALBUMS = "key_genre_albums_sort_order_" + PREF_VERSION; String DETAIL_SONGS = "key_detail_songs_sort_order_" + PREF_VERSION; String DETAIL_ALBUM_SONGS = "key_detail_album_songs_sort_order_" + PREF_VERSION; String DETAIL_PLAYLIST_SONGS = "key_detail_playlist_songs_sort_order_" + PREF_VERSION; String DETAIL_GENRE_SONGS = "key_genre_songs_sort_order_" + PREF_VERSION; String ARTISTS_ASC = "key_artists_sort_order_asc_" + PREF_VERSION; String ALBUMS_ASC = "key_albums_sort_order_asc_" + PREF_VERSION; String SONGS_ASC = "key_songs_sort_order_asc_" + PREF_VERSION; String DETAIL_SONGS_ASC = "key_detail_songs_sort_order_asc_" + PREF_VERSION; String DETAIL_PLAYLIST_SONGS_ASC = "key_playlist_songs_sort_order_asc_" + PREF_VERSION; String DETAIL_GENRE_SONGS_ASC = "key_genre_songs_sort_order_asc_" + PREF_VERSION; String DETAIL_ALBUMS_ASC = "key_detail_albums_sort_order_asc_" + PREF_VERSION; String DETAIL_PLAYLIST_ALBUMS_ASC = "key_detail_playlist_albums_sort_order_asc_" + PREF_VERSION; String DETAIL_GENRE_ALBUMS_ASC = "key_detail_genre_albums_sort_order_asc_" + PREF_VERSION; } public @interface ArtistSort { int DEFAULT = 0; int NAME = 1; } public @interface AlbumSort { int DEFAULT = 0; int NAME = 1; int YEAR = 2; int ARTIST_NAME = 3; } public @interface SongSort { int DEFAULT = 0; int NAME = 1; int TRACK_NUMBER = 2; int DURATION = 3; int DATE = 4; int YEAR = 5; int ALBUM_NAME = 6; int ARTIST_NAME = 7; int DETAIL_DEFAULT = 8; } public interface SortFiles { String DEFAULT = "default"; String FILE_NAME = "file_name"; String SIZE = "size"; String ARTIST_NAME = "artist_name"; String ALBUM_NAME = "album_name"; String TRACK_NAME = "track_name"; } public interface SortFolders { String DEFAULT = "default"; String COUNT = "count"; } public void sortAlbums(List<Album> albums) { sortAlbums(albums, getAlbumsSortOrder()); } public void sortAlbums(List<Album> albums, int key) { switch (key) { case AlbumSort.DEFAULT: Collections.sort(albums, Album::compareTo); break; case AlbumSort.NAME: Collections.sort(albums, (a, b) -> ComparisonUtils.compare(a.name, b.name)); Collections.sort(albums, (a, b) -> ComparisonUtils.compare(a.name, b.name)); break; case AlbumSort.YEAR: Collections.sort(albums, (a, b) -> ComparisonUtils.compareInt(b.year, a.year)); break; case AlbumSort.ARTIST_NAME: Collections.sort(albums, (a, b) -> ComparisonUtils.compare(a.albumArtistName, b.albumArtistName)); break; } } public void sortSongs(List<Song> songs) { sortSongs(songs, getSongsSortOrder()); } public void sortSongs(List<Song> songs, @SongSort int key) { switch (key) { case SongSort.DEFAULT: Collections.sort(songs, Song::compareTo); break; case SongSort.NAME: Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.name, b.name)); break; case SongSort.TRACK_NUMBER: Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.track, b.track)); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.discNumber, b.discNumber)); break; case SongSort.DURATION: Collections.sort(songs, (a, b) -> ComparisonUtils.compareLong(a.duration, b.duration)); break; case SongSort.DATE: Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(b.dateAdded, a.dateAdded)); break; case SongSort.YEAR: Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumArtistName, b.albumArtistName)); Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumName, b.albumName)); Collections.sort(songs, Song::compareTo); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(b.year, a.year)); break; case SongSort.ALBUM_NAME: Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumArtistName, b.albumArtistName)); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.track, b.track)); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.discNumber, b.discNumber)); Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumName, b.albumName)); break; case SongSort.ARTIST_NAME: Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumName, b.albumName)); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.track, b.track)); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.discNumber, b.discNumber)); Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumArtistName, b.albumArtistName)); break; case SongSort.DETAIL_DEFAULT: Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumArtistName, b.albumArtistName)); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(b.year, a.year)); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.track, b.track)); Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.discNumber, b.discNumber)); Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumName, b.albumName)); break; } } public void sortAlbumArtists(List<AlbumArtist> albumArtists) { int sortOrder = mPrefs.getInt(Key.ARTISTS, ArtistSort.DEFAULT); switch (sortOrder) { case ArtistSort.DEFAULT: Collections.sort(albumArtists, AlbumArtist::compareTo); break; case ArtistSort.NAME: Collections.sort(albumArtists, (a, b) -> ComparisonUtils.compare(a.name, b.name)); break; } } }