From c2ad4e4541b4baa5eea9a9252954e8cd975118c7 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sat, 2 Jan 2016 22:44:03 +0100 Subject: [PATCH] Completely rewritten the album model --- .../gramophone/adapter/SearchAdapter.java | 8 +- .../adapter/album/AlbumAdapter.java | 15 ++- .../adapter/album/HorizontalAlbumAdapter.java | 2 +- .../comparator/AlbumASCComparator.java | 15 +++ .../comparator/AlbumDESComparator.java | 15 +++ .../comparator/SongTrackComparator.java | 15 +++ .../glide/artistimage/ArtistImageFetcher.java | 3 - .../gramophone/loader/AlbumLoader.java | 117 +++++++----------- .../gramophone/loader/AlbumSongLoader.java | 33 ----- .../gramophone/loader/ArtistAlbumLoader.java | 26 ++-- .../gramophone/loader/PlaylistSongLoader.java | 52 ++++---- .../gramophone/loader/SongLoader.java | 51 ++++---- .../com/kabouzeid/gramophone/model/Album.java | 91 ++++++-------- .../gramophone/model/PlaylistSong.java | 5 +- .../com/kabouzeid/gramophone/model/Song.java | 98 ++++++++------- .../provider/MusicPlaybackQueueStore.java | 38 +++--- .../ui/activities/AlbumDetailActivity.java | 24 ++-- .../ui/activities/ArtistDetailActivity.java | 2 +- .../ui/activities/MainActivity.java | 4 +- .../tageditor/AlbumTagEditorActivity.java | 4 +- .../gramophone/util/ArtistSignatureUtil.java | 4 - 21 files changed, 291 insertions(+), 331 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumASCComparator.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumDESComparator.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/comparator/SongTrackComparator.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java index 214e2821..3f9a688f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java @@ -94,10 +94,10 @@ public class SearchAdapter extends RecyclerView.Adapter getSongList(@NonNull List albums) { final ArrayList songs = new ArrayList<>(); for (Album album : albums) { - songs.addAll(AlbumSongLoader.getAlbumSongList(activity, album.id)); + songs.addAll(album.songs); } return songs; } @@ -205,7 +204,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter { + @Override + public int compare(Album lhs, Album rhs) { + return lhs.getTitle().compareTo(rhs.getTitle()); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumDESComparator.java b/app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumDESComparator.java new file mode 100644 index 00000000..57c67582 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumDESComparator.java @@ -0,0 +1,15 @@ +package com.kabouzeid.gramophone.comparator; + +import com.kabouzeid.gramophone.model.Album; + +import java.util.Comparator; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class AlbumDESComparator implements Comparator { + @Override + public int compare(Album lhs, Album rhs) { + return rhs.getTitle().compareTo(lhs.getTitle()); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/comparator/SongTrackComparator.java b/app/src/main/java/com/kabouzeid/gramophone/comparator/SongTrackComparator.java new file mode 100644 index 00000000..62842d8b --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/comparator/SongTrackComparator.java @@ -0,0 +1,15 @@ +package com.kabouzeid.gramophone.comparator; + +import com.kabouzeid.gramophone.model.Song; + +import java.util.Comparator; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class SongTrackComparator implements Comparator { + @Override + public int compare(Song lhs, Song rhs) { + return lhs.trackNumber - rhs.trackNumber; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageFetcher.java b/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageFetcher.java index c2a95aef..868191a2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageFetcher.java +++ b/app/src/main/java/com/kabouzeid/gramophone/glide/artistimage/ArtistImageFetcher.java @@ -11,8 +11,6 @@ import com.kabouzeid.gramophone.util.MusicUtil; import java.io.InputStream; -import hugo.weaving.DebugLog; - /** * @author Karim Abou Zeid (kabouzeid) */ @@ -32,7 +30,6 @@ public class ArtistImageFetcher implements DataFetcher { return model.artistName; } - @DebugLog @Override public InputStream loadData(Priority priority) throws Exception { if (MusicUtil.isArtistNameUnknown(model.artistName)) return null; diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java index 841e6919..27c72ce8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java @@ -1,112 +1,81 @@ package com.kabouzeid.gramophone.loader; import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.provider.BaseColumns; -import android.provider.MediaStore; -import android.provider.MediaStore.Audio.AlbumColumns; import android.provider.MediaStore.Audio.AudioColumns; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.kabouzeid.gramophone.comparator.AlbumASCComparator; +import com.kabouzeid.gramophone.comparator.SongTrackComparator; import com.kabouzeid.gramophone.model.Album; +import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.PreferenceUtil; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +import hugo.weaving.DebugLog; /** * @author Karim Abou Zeid (kabouzeid) */ public class AlbumLoader { + @DebugLog @NonNull public static ArrayList getAllAlbums(@NonNull final Context context) { - Cursor cursor = makeAlbumCursor(context, null, null); - return getAlbums(cursor); + ArrayList songs = SongLoader.getSongs(SongLoader.makeSongCursor( + context, + null, + null, + PreferenceUtil.getInstance(context).getAlbumSongSortOrder()) + ); + return splitIntoAlbums(songs, new AlbumASCComparator()); } @NonNull public static ArrayList getAlbums(@NonNull final Context context, String query) { - Cursor cursor = makeAlbumCursor(context, AlbumColumns.ALBUM + " LIKE ?", new String[]{"%" + query + "%"}); - return getAlbums(cursor); + ArrayList songs = SongLoader.getSongs(SongLoader.makeSongCursor( + context, + AudioColumns.ALBUM + " LIKE ?", + new String[]{"%" + query + "%"}, + PreferenceUtil.getInstance(context).getAlbumSongSortOrder()) + ); + return splitIntoAlbums(songs, new AlbumASCComparator()); } @NonNull public static Album getAlbum(@NonNull final Context context, int albumId) { - Cursor cursor = makeAlbumCursor(context, BaseColumns._ID + "=?", new String[]{String.valueOf(albumId)}); - return getAlbum(cursor); + ArrayList songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, AudioColumns.ALBUM_ID + "=?", new String[]{String.valueOf(albumId)}, PreferenceUtil.getInstance(context).getAlbumSongSortOrder())); + Collections.sort(songs, new SongTrackComparator()); + return new Album(songs); } @NonNull - public static ArrayList getAlbums(@Nullable final Cursor cursor) { + public static ArrayList splitIntoAlbums(@Nullable final ArrayList songs, Comparator albumComparator) { ArrayList albums = new ArrayList<>(); - if (cursor != null && cursor.moveToFirst()) { - do { - albums.add(getAlbumFromCursorImpl(cursor)); - } while (cursor.moveToNext()); - } - if (cursor != null) { - cursor.close(); + if (songs != null) { + Collections.sort(songs, new SongTrackComparator()); + for (Song song : songs) { + Album album = get(albums, song.albumId); + if (album == null) { + album = new Album(); + albums.add(album); + } + album.songs.add(song); + } } + Collections.sort(albums, albumComparator); return albums; } - @NonNull - public static Album getAlbum(@Nullable final Cursor cursor) { - Album album = new Album(); - if (cursor != null && cursor.moveToFirst()) { - album = getAlbumFromCursorImpl(cursor); - } - - if (cursor != null) { - cursor.close(); - } - return album; - } - - @NonNull - private static Album getAlbumFromCursorImpl(@NonNull final Cursor cursor) { - final int id = cursor.getInt(0); - final String albumName = cursor.getString(1); - final String artist = cursor.getString(2); - final int artistId = cursor.getInt(3); - final int songCount = cursor.getInt(4); - final int year = cursor.getInt(5); - - return new Album(id, albumName, artist, artistId, songCount, year); - } - - @Nullable - public static Cursor makeAlbumCursor(@NonNull final Context context, final String selection, final String[] values) { - return makeAlbumCursor(context, selection, values, PreferenceUtil.getInstance(context).getAlbumSortOrder()); - } - - @Nullable - public static Cursor makeAlbumCursor(@NonNull final Context context, final String selection, final String[] values, final String sortOrder) { - return makeAlbumCursor(context, MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, selection, values, sortOrder); - } - - @Nullable - public static Cursor makeAlbumCursor(@NonNull final Context context, @NonNull final Uri contentUri, final String selection, final String[] values, final String sortOrder) { - try { - return context.getContentResolver().query(contentUri, - new String[]{ - /* 0 */ - BaseColumns._ID, - /* 1 */ - AlbumColumns.ALBUM, - /* 2 */ - AlbumColumns.ARTIST, - /* 3 */ - AudioColumns.ARTIST_ID, - /* 4 */ - AlbumColumns.NUMBER_OF_SONGS, - /* 5 */ - AlbumColumns.FIRST_YEAR, - }, selection, values, sortOrder); - } catch (SecurityException e) { - return null; + private static Album get(ArrayList albums, int albumId) { + for (Album album : albums) { + if (!album.songs.isEmpty() && album.songs.get(0).albumId == albumId) { + return album; + } } + return null; } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java deleted file mode 100644 index 4b7d6be1..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.kabouzeid.gramophone.loader; - -import android.content.Context; -import android.database.Cursor; -import android.provider.MediaStore; -import android.support.annotation.NonNull; - -import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.util.PreferenceUtil; - -import java.util.ArrayList; - -/** - * @author Karim Abou Zeid (kabouzeid) - */ -public class AlbumSongLoader { - - @NonNull - public static ArrayList getAlbumSongList(@NonNull final Context context, final int albumId) { - return SongLoader.getSongs(makeAlbumSongCursor(context, albumId)); - } - - public static Cursor makeAlbumSongCursor(@NonNull final Context context, final int albumId) { - return SongLoader.makeSongCursor( - context, - MediaStore.Audio.AudioColumns.ALBUM_ID + "=?", - new String[]{ - String.valueOf(albumId) - }, - PreferenceUtil.getInstance(context).getAlbumSongSortOrder() - ); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java index d5d04ac9..1c1a8daf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java @@ -1,11 +1,12 @@ package com.kabouzeid.gramophone.loader; import android.content.Context; -import android.database.Cursor; import android.provider.MediaStore; import android.support.annotation.NonNull; +import com.kabouzeid.gramophone.comparator.AlbumASCComparator; import com.kabouzeid.gramophone.model.Album; +import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.PreferenceUtil; import java.util.ArrayList; @@ -16,20 +17,13 @@ import java.util.ArrayList; public class ArtistAlbumLoader { @NonNull - public static ArrayList getArtistAlbumList(@NonNull final Context context, final int artistId) { - return AlbumLoader.getAlbums(makeArtistAlbumCursor(context, artistId)); - } - - public static Cursor makeArtistAlbumCursor(@NonNull final Context context, final int artistId) { - try { - return AlbumLoader.makeAlbumCursor(context, - MediaStore.Audio.Artists.Albums.getContentUri("external", artistId), - null, - null, - PreferenceUtil.getInstance(context).getArtistAlbumSortOrder() - ); - } catch (SecurityException e) { - return null; - } + public static ArrayList getAlbums(@NonNull final Context context, final int artistId) { + ArrayList songs = SongLoader.getSongs(SongLoader.makeSongCursor( + context, + MediaStore.Audio.AudioColumns.ARTIST_ID + "=?", + new String[]{String.valueOf(artistId)}, + PreferenceUtil.getInstance(context).getAlbumSongSortOrder() + )); + return AlbumLoader.splitIntoAlbums(songs, new AlbumASCComparator()); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java index 6ff4dedb..3f91684f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java @@ -31,17 +31,19 @@ public class PlaylistSongLoader { @NonNull private static PlaylistSong getPlaylistSongFromCursorImpl(@NonNull Cursor cursor, int playlistId) { final int id = cursor.getInt(0); - final String songName = cursor.getString(1); - final String artist = cursor.getString(2); - final String album = cursor.getString(3); + final String title = cursor.getString(1); + final int trackNumber = cursor.getInt(2); + final int year = cursor.getInt(3); final long duration = cursor.getLong(4); - final int trackNumber = cursor.getInt(5); - final int albumId = cursor.getInt(6); - final int artistId = cursor.getInt(7); - final String data = cursor.getString(8); - final int idInPlaylist = cursor.getInt(9); + final String data = cursor.getString(5); + final int dateModified = cursor.getInt(6); + final int albumId = cursor.getInt(7); + final String albumName = cursor.getString(8); + final int artistId = cursor.getInt(9); + final String artistName = cursor.getString(10); + final int idInPlaylist = cursor.getInt(11); - return new PlaylistSong(id, albumId, artistId, songName, artist, album, duration, trackNumber, data, playlistId, idInPlaylist); + return new PlaylistSong(id, title, trackNumber, year, duration, data, dateModified, albumId, albumName, artistId, artistName, playlistId, idInPlaylist); } public static Cursor makePlaylistSongCursor(@NonNull final Context context, final int playlistId) { @@ -49,26 +51,18 @@ public class PlaylistSongLoader { return context.getContentResolver().query( MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), new String[]{ - /* 0 */ - MediaStore.Audio.Playlists.Members.AUDIO_ID, - /* 1 */ - AudioColumns.TITLE, - /* 2 */ - AudioColumns.ARTIST, - /* 3 */ - AudioColumns.ALBUM, - /* 4 */ - AudioColumns.DURATION, - /* 5 */ - AudioColumns.TRACK, - /* 6 */ - AudioColumns.ALBUM_ID, - /* 7 */ - AudioColumns.ARTIST_ID, - /* 8 */ - AudioColumns.DATA, - /* 9 */ - MediaStore.Audio.Playlists.Members._ID + MediaStore.Audio.Playlists.Members.AUDIO_ID,// 0 + AudioColumns.TITLE,// 1 + AudioColumns.TRACK,// 2 + AudioColumns.YEAR,// 3 + AudioColumns.DURATION,// 4 + AudioColumns.DATA,// 5 + AudioColumns.DATE_MODIFIED,// 6 + AudioColumns.ALBUM_ID,// 7 + AudioColumns.ALBUM,// 8 + AudioColumns.ARTIST_ID,// 9 + AudioColumns.ARTIST,// 10 + MediaStore.Audio.Playlists.Members._ID // 11 }, SongLoader.BASE_SELECTION, null, MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER); } catch (SecurityException e) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java index 5a8676ee..cd20f547 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java @@ -53,9 +53,11 @@ public class SongLoader { @NonNull public static Song getSong(@Nullable Cursor cursor) { - Song song = new Song(); + Song song; if (cursor != null && cursor.moveToFirst()) { song = getSongFromCursorImpl(cursor); + } else { + song = new Song(); } if (cursor != null) { cursor.close(); @@ -66,15 +68,18 @@ public class SongLoader { @NonNull private static Song getSongFromCursorImpl(@NonNull Cursor cursor) { final int id = cursor.getInt(0); - final String songName = cursor.getString(1); - final String artist = cursor.getString(2); - final String album = cursor.getString(3); + final String title = cursor.getString(1); + final int trackNumber = cursor.getInt(2); + final int year = cursor.getInt(3); final long duration = cursor.getLong(4); - final int trackNumber = cursor.getInt(5); - final int artistId = cursor.getInt(6); + final String data = cursor.getString(5); + final long dateModified = cursor.getLong(6); final int albumId = cursor.getInt(7); - final String data = cursor.getString(8); - return new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, data); + final String albumName = cursor.getString(8); + final int artistId = cursor.getInt(9); + final String artistName = cursor.getString(10); + + return new Song(id, title, trackNumber, year, duration, data, dateModified, albumId, albumName, artistId, artistName); } @Nullable @@ -92,24 +97,18 @@ public class SongLoader { try { return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{ - /* 0 */ - BaseColumns._ID, - /* 1 */ - AudioColumns.TITLE, - /* 2 */ - AudioColumns.ARTIST, - /* 3 */ - AudioColumns.ALBUM, - /* 4 */ - AudioColumns.DURATION, - /* 5 */ - AudioColumns.TRACK, - /* 6 */ - AudioColumns.ARTIST_ID, - /* 7 */ - AudioColumns.ALBUM_ID, - /* 8 */ - AudioColumns.DATA + BaseColumns._ID,// 0 + AudioColumns.TITLE,// 1 + AudioColumns.TRACK,// 2 + AudioColumns.YEAR,// 3 + AudioColumns.DURATION,// 4 + AudioColumns.DATA,// 5 + AudioColumns.DATE_MODIFIED,// 6 + AudioColumns.ALBUM_ID,// 7 + AudioColumns.ALBUM,// 8 + AudioColumns.ARTIST_ID,// 9 + AudioColumns.ARTIST,// 10 + }, baseSelection, values, sortOrder); } catch (SecurityException e) { return null; diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java index 5175f4ed..7089ee6d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java @@ -3,34 +3,44 @@ package com.kabouzeid.gramophone.model; import android.os.Parcel; import android.os.Parcelable; +import java.util.ArrayList; + /** * @author Karim Abou Zeid (kabouzeid) */ public class Album implements Parcelable { - public final int id; - public final int artistId; - public final String title; - public final String artistName; - public final int songCount; - public final int year; + public final ArrayList songs; - public Album(final int id, final String title, final String artistName, final int artistId, - final int songNumber, final int albumYear) { - this.id = id; - this.title = title; - this.artistName = artistName; - this.artistId = artistId; - songCount = songNumber; - year = albumYear; + public Album(ArrayList songs) { + this.songs = songs; } public Album() { - this.id = -1; - this.title = ""; - this.artistName = ""; - this.artistId = -1; - songCount = -1; - year = -1; + this.songs = new ArrayList<>(); + } + + public int getId() { + return songs.get(0).albumId; + } + + public String getTitle() { + return songs.get(0).albumName; + } + + public int getArtistId() { + return songs.get(0).artistId; + } + + public String getArtistName() { + return songs.get(0).artistName; + } + + public int getYear() { + return songs.get(0).year; + } + + public int getSongCount() { + return songs.size(); } @Override @@ -38,41 +48,24 @@ public class Album implements Parcelable { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - Album album = (Album) o; + Album that = (Album) o; - if (id != album.id) return false; - if (artistId != album.artistId) return false; - if (songCount != album.songCount) return false; - if (year != album.year) return false; - if (title != null ? !title.equals(album.title) : album.title != null) return false; - return artistName != null ? artistName.equals(album.artistName) : album.artistName == null; + return songs != null ? songs.equals(that.songs) : that.songs == null; } @Override public int hashCode() { - int result = id; - result = 31 * result + artistId; - result = 31 * result + (title != null ? title.hashCode() : 0); - result = 31 * result + (artistName != null ? artistName.hashCode() : 0); - result = 31 * result + songCount; - result = 31 * result + year; - return result; + return songs != null ? songs.hashCode() : 0; } @Override public String toString() { return "Album{" + - "id=" + id + - ", artistId=" + artistId + - ", title='" + title + '\'' + - ", artistName='" + artistName + '\'' + - ", songCount=" + songCount + - ", year=" + year + + "songs=" + songs + '}'; } - @Override public int describeContents() { return 0; @@ -80,24 +73,14 @@ public class Album implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(this.id); - dest.writeInt(this.artistId); - dest.writeString(this.title); - dest.writeString(this.artistName); - dest.writeInt(this.songCount); - dest.writeInt(this.year); + dest.writeTypedList(songs); } protected Album(Parcel in) { - this.id = in.readInt(); - this.artistId = in.readInt(); - this.title = in.readString(); - this.artistName = in.readString(); - this.songCount = in.readInt(); - this.year = in.readInt(); + this.songs = in.createTypedArrayList(Song.CREATOR); } - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public static final Creator CREATOR = new Creator() { public Album createFromParcel(Parcel source) { return new Album(source); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java b/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java index 2cf2ed20..6283347a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java @@ -7,9 +7,8 @@ public class PlaylistSong extends Song { public final int playlistId; public final int idInPlayList; - public PlaylistSong(final int id, final int albumId, final int artistId, final String title, final String artistName, - final String albumName, final long duration, final int trackNumber, final String data, final int playlistId, final int idInPlayList) { - super(id, albumId, artistId, title, artistName, albumName, duration, trackNumber, data); + public PlaylistSong(int id, String title, int trackNumber, int year, long duration, String data, int dateModified, int albumId, String albumName, int artistId, String artistName, final int playlistId, final int idInPlayList) { + super(id, title, trackNumber, year, duration, data, dateModified, albumId, albumName, artistId, artistName); this.playlistId = playlistId; this.idInPlayList = idInPlayList; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java index da1a1709..9774efd3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java @@ -8,38 +8,43 @@ import android.os.Parcelable; */ public class Song implements Parcelable { public final int id; - public final int albumId; - public final int artistId; public final String title; - public final String artistName; - public final String albumName; - public final long duration; public final int trackNumber; + public final int year; + public final long duration; public final String data; + public final long dateModified; + public final int albumId; + public final String albumName; + public final int artistId; + public final String artistName; - public Song(final int id, final int albumId, final int artistId, final String title, final String artistName, - final String albumName, final long duration, final int trackNumber, final String data) { + public Song(int id, String title, int trackNumber, int year, long duration, String data, long dateModified, int albumId, String albumName, int artistId, String artistName) { this.id = id; - this.albumId = albumId; - this.artistId = artistId; this.title = title; - this.artistName = artistName; - this.albumName = albumName; - this.duration = duration; this.trackNumber = trackNumber; + this.year = year; + this.duration = duration; this.data = data; + this.dateModified = dateModified; + this.albumId = albumId; + this.albumName = albumName; + this.artistId = artistId; + this.artistName = artistName; } public Song() { this.id = -1; - this.albumId = -1; - this.artistId = -1; this.title = ""; - this.artistName = ""; - this.albumName = ""; - this.duration = -1; this.trackNumber = -1; + this.year = -1; + this.duration = -1; this.data = ""; + this.dateModified = -1; + this.albumId = -1; + this.albumName = ""; + this.artistId = -1; + this.artistName = ""; } @Override @@ -50,30 +55,33 @@ public class Song implements Parcelable { Song song = (Song) o; if (id != song.id) return false; + if (trackNumber != song.trackNumber) return false; + if (year != song.year) return false; + if (duration != song.duration) return false; + if (dateModified != song.dateModified) return false; if (albumId != song.albumId) return false; if (artistId != song.artistId) return false; - if (duration != song.duration) return false; - if (trackNumber != song.trackNumber) return false; if (title != null ? !title.equals(song.title) : song.title != null) return false; - if (artistName != null ? !artistName.equals(song.artistName) : song.artistName != null) - return false; + if (data != null ? !data.equals(song.data) : song.data != null) return false; if (albumName != null ? !albumName.equals(song.albumName) : song.albumName != null) return false; - return data != null ? data.equals(song.data) : song.data == null; + return artistName != null ? artistName.equals(song.artistName) : song.artistName == null; } @Override public int hashCode() { int result = id; - result = 31 * result + albumId; - result = 31 * result + artistId; result = 31 * result + (title != null ? title.hashCode() : 0); - result = 31 * result + (artistName != null ? artistName.hashCode() : 0); - result = 31 * result + (albumName != null ? albumName.hashCode() : 0); - result = 31 * result + (int) (duration ^ (duration >>> 32)); result = 31 * result + trackNumber; + result = 31 * result + year; + result = 31 * result + (int) (duration ^ (duration >>> 32)); result = 31 * result + (data != null ? data.hashCode() : 0); + result = 31 * result + (int) (dateModified ^ (dateModified >>> 32)); + result = 31 * result + albumId; + result = 31 * result + (albumName != null ? albumName.hashCode() : 0); + result = 31 * result + artistId; + result = 31 * result + (artistName != null ? artistName.hashCode() : 0); return result; } @@ -81,14 +89,16 @@ public class Song implements Parcelable { public String toString() { return "Song{" + "id=" + id + - ", albumId=" + albumId + - ", artistId=" + artistId + ", title='" + title + '\'' + - ", artistName='" + artistName + '\'' + - ", albumName='" + albumName + '\'' + - ", duration=" + duration + ", trackNumber=" + trackNumber + + ", year=" + year + + ", duration=" + duration + ", data='" + data + '\'' + + ", dateModified=" + dateModified + + ", albumId=" + albumId + + ", albumName='" + albumName + '\'' + + ", artistId=" + artistId + + ", artistName='" + artistName + '\'' + '}'; } @@ -101,26 +111,30 @@ public class Song implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.id); - dest.writeInt(this.albumId); - dest.writeInt(this.artistId); dest.writeString(this.title); - dest.writeString(this.artistName); - dest.writeString(this.albumName); - dest.writeLong(this.duration); dest.writeInt(this.trackNumber); + dest.writeInt(this.year); + dest.writeLong(this.duration); dest.writeString(this.data); + dest.writeLong(this.dateModified); + dest.writeInt(this.albumId); + dest.writeString(this.albumName); + dest.writeInt(this.artistId); + dest.writeString(this.artistName); } protected Song(Parcel in) { this.id = in.readInt(); - this.albumId = in.readInt(); - this.artistId = in.readInt(); this.title = in.readString(); - this.artistName = in.readString(); - this.albumName = in.readString(); - this.duration = in.readLong(); this.trackNumber = in.readInt(); + this.year = in.readInt(); + this.duration = in.readLong(); this.data = in.readString(); + this.dateModified = in.readLong(); + this.albumId = in.readInt(); + this.albumName = in.readString(); + this.artistId = in.readInt(); + this.artistName = in.readString(); } public static final Creator CREATOR = new Creator() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/provider/MusicPlaybackQueueStore.java b/app/src/main/java/com/kabouzeid/gramophone/provider/MusicPlaybackQueueStore.java index e1e2f5ac..921b13e1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/provider/MusicPlaybackQueueStore.java +++ b/app/src/main/java/com/kabouzeid/gramophone/provider/MusicPlaybackQueueStore.java @@ -41,7 +41,7 @@ public class MusicPlaybackQueueStore extends SQLiteOpenHelper { public static final String DATABASE_NAME = "music_playback_state.db"; public static final String PLAYING_QUEUE_TABLE_NAME = "playing_queue"; public static final String ORIGINAL_PLAYING_QUEUE_TABLE_NAME = "original_playing_queue"; - private static final int VERSION = 2; + private static final int VERSION = 3; /** * Constructor of MusicPlaybackState @@ -71,25 +71,31 @@ public class MusicPlaybackQueueStore extends SQLiteOpenHelper { builder.append(AudioColumns.TITLE); builder.append(" STRING NOT NULL,"); - builder.append(AudioColumns.ARTIST); - builder.append(" STRING NOT NULL,"); + builder.append(AudioColumns.TRACK); + builder.append(" INT NOT NULL,"); - builder.append(AudioColumns.ALBUM); - builder.append(" STRING NOT NULL,"); + builder.append(AudioColumns.YEAR); + builder.append(" INT NOT NULL,"); builder.append(AudioColumns.DURATION); builder.append(" LONG NOT NULL,"); - builder.append(AudioColumns.TRACK); - builder.append(" INT NOT NULL,"); + builder.append(AudioColumns.DATA); + builder.append(" STRING NOT NULL,"); - builder.append(AudioColumns.ARTIST_ID); - builder.append(" INT NOT NULL,"); + builder.append(AudioColumns.DATE_MODIFIED); + builder.append(" LONG NOT NULL,"); builder.append(AudioColumns.ALBUM_ID); builder.append(" INT NOT NULL,"); - builder.append(AudioColumns.DATA); + builder.append(AudioColumns.ALBUM); + builder.append(" STRING NOT NULL,"); + + builder.append(AudioColumns.ARTIST_ID); + builder.append(" INT NOT NULL,"); + + builder.append(AudioColumns.ARTIST); builder.append(" STRING NOT NULL);"); db.execSQL(builder.toString()); @@ -156,13 +162,15 @@ public class MusicPlaybackQueueStore extends SQLiteOpenHelper { values.put(BaseColumns._ID, song.id); values.put(AudioColumns.TITLE, song.title); - values.put(AudioColumns.ARTIST, song.artistName); - values.put(AudioColumns.ALBUM, song.albumName); - values.put(AudioColumns.DURATION, song.duration); values.put(AudioColumns.TRACK, song.trackNumber); - values.put(AudioColumns.ARTIST_ID, song.artistId); - values.put(AudioColumns.ALBUM_ID, song.albumId); + values.put(AudioColumns.YEAR, song.year); + values.put(AudioColumns.DURATION, song.duration); values.put(AudioColumns.DATA, song.data); + values.put(AudioColumns.DATE_MODIFIED, song.dateModified); + values.put(AudioColumns.ALBUM_ID, song.albumId); + values.put(AudioColumns.ALBUM, song.albumName); + values.put(AudioColumns.ARTIST_ID, song.artistId); + values.put(AudioColumns.ARTIST, song.artistName); database.insert(tableName, null, values); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 29a99a23..2e3b4cd7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -30,10 +30,8 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.loader.AlbumLoader; -import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks; import com.kabouzeid.gramophone.model.Album; -import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity; @@ -42,8 +40,6 @@ import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.Util; -import java.util.ArrayList; - import butterknife.Bind; import butterknife.ButterKnife; @@ -133,7 +129,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements Bundle intentExtras = getIntent().getExtras(); final int albumId = intentExtras.getInt(EXTRA_ALBUM_ID); album = AlbumLoader.getAlbum(this, albumId); - if (album.id == -1) { + if (album.songs.isEmpty()) { finish(); } } @@ -150,7 +146,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements } private void setUpViews() { - albumTitleView.setText(album.title); + albumTitleView.setText(album.getTitle()); setUpRecyclerViewView(); setUpSongsAdapter(); setUpAlbumArtAndApplyPalette(); @@ -158,7 +154,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements private void setUpAlbumArtAndApplyPalette() { Glide.with(this) - .loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id)) + .loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId())) .asBitmap() .transcode(new BitmapPaletteTranscoder(this), BitmapPaletteWrapper.class) .diskCacheStrategy(DiskCacheStrategy.NONE) @@ -234,7 +230,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements } private void setUpSongsAdapter() { - adapter = new AlbumSongAdapter(this, loadSongDataSet(), R.layout.item_list, false, this); + adapter = new AlbumSongAdapter(this, album.songs, R.layout.item_list, false, this); recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); recyclerView.setAdapter(adapter); adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @@ -247,11 +243,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements } private void reloadDataSet() { - adapter.swapDataSet(loadSongDataSet()); + adapter.swapDataSet(album.songs); } - private ArrayList loadSongDataSet() { - return AlbumSongLoader.getAlbumSongList(this, album.id); + private void reloadAlbum() { + album = AlbumLoader.getAlbum(this, album.getId()); } @Override @@ -292,11 +288,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements return true; case R.id.action_tag_editor: Intent intent = new Intent(this, AlbumTagEditorActivity.class); - intent.putExtra(AbsTagEditorActivity.EXTRA_ID, album.id); + intent.putExtra(AbsTagEditorActivity.EXTRA_ID, album.getId()); startActivityForResult(intent, TAG_EDITOR_REQUEST); return true; case R.id.action_go_to_artist: - NavigationUtil.goToArtist(this, album.artistId); + NavigationUtil.goToArtist(this, album.getArtistId()); return true; } return super.onOptionsItemSelected(item); @@ -307,7 +303,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAG_EDITOR_REQUEST) { getAlbumFromIntentExtras(); - albumTitleView.setText(album.title); + albumTitleView.setText(album.getTitle()); setUpAlbumArtAndApplyPalette(); setResult(RESULT_OK); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 73680ccf..cb04fd57 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -216,7 +216,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement } private ArrayList loadAlbumDataSet() { - return ArtistAlbumLoader.getArtistAlbumList(this, artist.id); + return ArtistAlbumLoader.getAlbums(this, artist.id); } private void loadBiography() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index c5784f20..64f6d91a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -47,7 +47,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.SearchQueryHelper; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; -import com.kabouzeid.gramophone.loader.AlbumSongLoader; +import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.loader.ArtistSongLoader; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.loader.SongLoader; @@ -532,7 +532,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity final int id = (int) parseIdFromIntent(intent, "albumId", "album"); if (id >= 0) { int position = intent.getIntExtra("position", 0); - MusicPlayerRemote.openQueue(AlbumSongLoader.getAlbumSongList(this, id), position, true); + MusicPlayerRemote.openQueue(AlbumLoader.getAlbum(this, id).songs, position, true); handled = true; } } else if (MediaStore.Audio.Artists.CONTENT_TYPE.equals(mimeType)) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java index 7ed14d55..e99a6ab2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java @@ -23,7 +23,7 @@ import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; import com.kabouzeid.gramophone.lastfm.rest.model.LastFmAlbum; -import com.kabouzeid.gramophone.loader.AlbumSongLoader; +import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.LastFMUtil; @@ -199,7 +199,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @NonNull @Override protected List getSongPaths() { - ArrayList songs = AlbumSongLoader.getAlbumSongList(this, getId()); + ArrayList songs = AlbumLoader.getAlbum(this, getId()).songs; ArrayList paths = new ArrayList<>(songs.size()); for (Song song : songs) { paths.add(song.data); diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ArtistSignatureUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ArtistSignatureUtil.java index faf10c6f..cef28810 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ArtistSignatureUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ArtistSignatureUtil.java @@ -7,8 +7,6 @@ import android.support.annotation.NonNull; import com.bumptech.glide.signature.StringSignature; -import hugo.weaving.DebugLog; - /** * @author Karim Abou Zeid (kabouzeid) */ @@ -30,13 +28,11 @@ public class ArtistSignatureUtil { return sInstance; } - @DebugLog @SuppressLint("CommitPrefEdits") public void updateArtistSignature(String artistName) { mPreferences.edit().putLong(artistName, System.currentTimeMillis()).commit(); } - @DebugLog public long getArtistSignatureRaw(String artistName) { return mPreferences.getLong(artistName, 0); }