Completely rewritten the album model

This commit is contained in:
Karim Abou Zeid 2016-01-02 22:44:03 +01:00
commit c2ad4e4541
21 changed files with 292 additions and 332 deletions

View file

@ -94,10 +94,10 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
switch (getItemViewType(position)) {
case ALBUM:
final Album album = (Album) results.get(position);
holder.title.setText(album.title);
holder.text.setText(album.artistName);
holder.title.setText(album.getTitle());
holder.text.setText(album.getArtistName());
Glide.with(activity)
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id))
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId()))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(R.drawable.default_album_art)
.animate(android.R.anim.fade_in)
@ -182,7 +182,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
switch (getItemViewType()) {
case ALBUM:
NavigationUtil.goToAlbum(activity,
((Album) item).id,
((Album) item).getId(),
Pair.create(image,
activity.getResources().getString(R.string.transition_album_art)
));

View file

@ -23,7 +23,6 @@ import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ColorUtil;
@ -79,11 +78,11 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
}
protected String getAlbumTitle(Album album) {
return album.title;
return album.getTitle();
}
protected String getAlbumText(Album album) {
return album.artistName;
return album.getArtistName();
}
@Override
@ -121,7 +120,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
protected void loadAlbumCover(Album album, final ViewHolder holder) {
if (holder.image == null) return;
Glide.with(activity)
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id))
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId()))
.asBitmap()
.transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.NONE)
@ -149,7 +148,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
@Override
public long getItemId(int position) {
return dataSet.get(position).id;
return dataSet.get(position).getId();
}
@Override
@ -159,7 +158,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
@Override
protected String getName(Album album) {
return album.title;
return album.getTitle();
}
@Override
@ -181,7 +180,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
private ArrayList<Song> getSongList(@NonNull List<Album> albums) {
final ArrayList<Song> 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<AlbumAdapter.ViewHolder,
Pair.create(image,
activity.getResources().getString(R.string.transition_album_art)
)};
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).id, albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).getId(), albumPairs);
}
}

View file

@ -32,7 +32,7 @@ public class HorizontalAlbumAdapter extends AlbumAdapter {
@Override
protected String getAlbumText(Album album) {
return String.valueOf(album.year);
return String.valueOf(album.getYear());
}
@Override

View file

@ -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 AlbumASCComparator implements Comparator<Album> {
@Override
public int compare(Album lhs, Album rhs) {
return lhs.getTitle().compareTo(rhs.getTitle());
}
}

View file

@ -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<Album> {
@Override
public int compare(Album lhs, Album rhs) {
return rhs.getTitle().compareTo(lhs.getTitle());
}
}

View file

@ -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<Song> {
@Override
public int compare(Song lhs, Song rhs) {
return lhs.trackNumber - rhs.trackNumber;
}
}

View file

@ -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<InputStream> {
return model.artistName;
}
@DebugLog
@Override
public InputStream loadData(Priority priority) throws Exception {
if (MusicUtil.isArtistNameUnknown(model.artistName)) return null;

View file

@ -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<Album> getAllAlbums(@NonNull final Context context) {
Cursor cursor = makeAlbumCursor(context, null, null);
return getAlbums(cursor);
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
context,
null,
null,
PreferenceUtil.getInstance(context).getAlbumSongSortOrder())
);
return splitIntoAlbums(songs, new AlbumASCComparator());
}
@NonNull
public static ArrayList<Album> getAlbums(@NonNull final Context context, String query) {
Cursor cursor = makeAlbumCursor(context, AlbumColumns.ALBUM + " LIKE ?", new String[]{"%" + query + "%"});
return getAlbums(cursor);
ArrayList<Song> 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<Song> 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<Album> getAlbums(@Nullable final Cursor cursor) {
public static ArrayList<Album> splitIntoAlbums(@Nullable final ArrayList<Song> songs, Comparator<Album> albumComparator) {
ArrayList<Album> 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<Album> albums, int albumId) {
for (Album album : albums) {
if (!album.songs.isEmpty() && album.songs.get(0).albumId == albumId) {
return album;
}
}
return null;
}
}

View file

@ -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<Song> 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()
);
}
}

View file

@ -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<Album> 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<Album> getAlbums(@NonNull final Context context, final int artistId) {
ArrayList<Song> 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());
}
}

View file

@ -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) {

View file

@ -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;

View file

@ -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<Song> 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<Song> 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<Album> CREATOR = new Parcelable.Creator<Album>() {
public static final Creator<Album> CREATOR = new Creator<Album>() {
public Album createFromParcel(Parcel source) {
return new Album(source);
}

View file

@ -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;
}

View file

@ -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<Song> CREATOR = new Creator<Song>() {

View file

@ -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 <code>MusicPlaybackState</code>
@ -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);
}

View file

@ -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<Song> 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);
}

View file

@ -216,7 +216,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
}
private ArrayList<Album> loadAlbumDataSet() {
return ArtistAlbumLoader.getArtistAlbumList(this, artist.id);
return ArtistAlbumLoader.getAlbums(this, artist.id);
}
private void loadBiography() {

View file

@ -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)) {

View file

@ -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<String> getSongPaths() {
ArrayList<Song> songs = AlbumSongLoader.getAlbumSongList(this, getId());
ArrayList<Song> songs = AlbumLoader.getAlbum(this, getId()).songs;
ArrayList<String> paths = new ArrayList<>(songs.size());
for (Song song : songs) {
paths.add(song.data);

View file

@ -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);
}