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)) { switch (getItemViewType(position)) {
case ALBUM: case ALBUM:
final Album album = (Album) results.get(position); final Album album = (Album) results.get(position);
holder.title.setText(album.title); holder.title.setText(album.getTitle());
holder.text.setText(album.artistName); holder.text.setText(album.getArtistName());
Glide.with(activity) Glide.with(activity)
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id)) .loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId()))
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
.error(R.drawable.default_album_art) .error(R.drawable.default_album_art)
.animate(android.R.anim.fade_in) .animate(android.R.anim.fade_in)
@ -182,7 +182,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
switch (getItemViewType()) { switch (getItemViewType()) {
case ALBUM: case ALBUM:
NavigationUtil.goToAlbum(activity, NavigationUtil.goToAlbum(activity,
((Album) item).id, ((Album) item).getId(),
Pair.create(image, Pair.create(image,
activity.getResources().getString(R.string.transition_album_art) 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.glide.palette.BitmapPaletteWrapper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.ColorUtil;
@ -79,11 +78,11 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
} }
protected String getAlbumTitle(Album album) { protected String getAlbumTitle(Album album) {
return album.title; return album.getTitle();
} }
protected String getAlbumText(Album album) { protected String getAlbumText(Album album) {
return album.artistName; return album.getArtistName();
} }
@Override @Override
@ -121,7 +120,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
protected void loadAlbumCover(Album album, final ViewHolder holder) { protected void loadAlbumCover(Album album, final ViewHolder holder) {
if (holder.image == null) return; if (holder.image == null) return;
Glide.with(activity) Glide.with(activity)
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id)) .loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId()))
.asBitmap() .asBitmap()
.transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class) .transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
@ -149,7 +148,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
@Override @Override
public long getItemId(int position) { public long getItemId(int position) {
return dataSet.get(position).id; return dataSet.get(position).getId();
} }
@Override @Override
@ -159,7 +158,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
@Override @Override
protected String getName(Album album) { protected String getName(Album album) {
return album.title; return album.getTitle();
} }
@Override @Override
@ -181,7 +180,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
private ArrayList<Song> getSongList(@NonNull List<Album> albums) { private ArrayList<Song> getSongList(@NonNull List<Album> albums) {
final ArrayList<Song> songs = new ArrayList<>(); final ArrayList<Song> songs = new ArrayList<>();
for (Album album : albums) { for (Album album : albums) {
songs.addAll(AlbumSongLoader.getAlbumSongList(activity, album.id)); songs.addAll(album.songs);
} }
return songs; return songs;
} }
@ -205,7 +204,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
Pair.create(image, Pair.create(image,
activity.getResources().getString(R.string.transition_album_art) 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 @Override
protected String getAlbumText(Album album) { protected String getAlbumText(Album album) {
return String.valueOf(album.year); return String.valueOf(album.getYear());
} }
@Override @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 java.io.InputStream;
import hugo.weaving.DebugLog;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
@ -32,7 +30,6 @@ public class ArtistImageFetcher implements DataFetcher<InputStream> {
return model.artistName; return model.artistName;
} }
@DebugLog
@Override @Override
public InputStream loadData(Priority priority) throws Exception { public InputStream loadData(Priority priority) throws Exception {
if (MusicUtil.isArtistNameUnknown(model.artistName)) return null; if (MusicUtil.isArtistNameUnknown(model.artistName)) return null;

View file

@ -1,112 +1,81 @@
package com.kabouzeid.gramophone.loader; package com.kabouzeid.gramophone.loader;
import android.content.Context; 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.provider.MediaStore.Audio.AudioColumns;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; 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.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import hugo.weaving.DebugLog;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class AlbumLoader { public class AlbumLoader {
@DebugLog
@NonNull @NonNull
public static ArrayList<Album> getAllAlbums(@NonNull final Context context) { public static ArrayList<Album> getAllAlbums(@NonNull final Context context) {
Cursor cursor = makeAlbumCursor(context, null, null); ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
return getAlbums(cursor); context,
null,
null,
PreferenceUtil.getInstance(context).getAlbumSongSortOrder())
);
return splitIntoAlbums(songs, new AlbumASCComparator());
} }
@NonNull @NonNull
public static ArrayList<Album> getAlbums(@NonNull final Context context, String query) { public static ArrayList<Album> getAlbums(@NonNull final Context context, String query) {
Cursor cursor = makeAlbumCursor(context, AlbumColumns.ALBUM + " LIKE ?", new String[]{"%" + query + "%"}); ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
return getAlbums(cursor); context,
AudioColumns.ALBUM + " LIKE ?",
new String[]{"%" + query + "%"},
PreferenceUtil.getInstance(context).getAlbumSongSortOrder())
);
return splitIntoAlbums(songs, new AlbumASCComparator());
} }
@NonNull @NonNull
public static Album getAlbum(@NonNull final Context context, int albumId) { public static Album getAlbum(@NonNull final Context context, int albumId) {
Cursor cursor = makeAlbumCursor(context, BaseColumns._ID + "=?", new String[]{String.valueOf(albumId)}); ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, AudioColumns.ALBUM_ID + "=?", new String[]{String.valueOf(albumId)}, PreferenceUtil.getInstance(context).getAlbumSongSortOrder()));
return getAlbum(cursor); Collections.sort(songs, new SongTrackComparator());
return new Album(songs);
} }
@NonNull @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<>(); ArrayList<Album> albums = new ArrayList<>();
if (cursor != null && cursor.moveToFirst()) { if (songs != null) {
do { Collections.sort(songs, new SongTrackComparator());
albums.add(getAlbumFromCursorImpl(cursor)); for (Song song : songs) {
} while (cursor.moveToNext()); Album album = get(albums, song.albumId);
if (album == null) {
album = new Album();
albums.add(album);
} }
if (cursor != null) { album.songs.add(song);
cursor.close();
} }
}
Collections.sort(albums, albumComparator);
return albums; return albums;
} }
@NonNull private static Album get(ArrayList<Album> albums, int albumId) {
public static Album getAlbum(@Nullable final Cursor cursor) { for (Album album : albums) {
Album album = new Album(); if (!album.songs.isEmpty() && album.songs.get(0).albumId == albumId) {
if (cursor != null && cursor.moveToFirst()) {
album = getAlbumFromCursorImpl(cursor);
}
if (cursor != null) {
cursor.close();
}
return album; 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; 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; package com.kabouzeid.gramophone.loader;
import android.content.Context; import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import com.kabouzeid.gramophone.comparator.AlbumASCComparator;
import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList; import java.util.ArrayList;
@ -16,20 +17,13 @@ import java.util.ArrayList;
public class ArtistAlbumLoader { public class ArtistAlbumLoader {
@NonNull @NonNull
public static ArrayList<Album> getArtistAlbumList(@NonNull final Context context, final int artistId) { public static ArrayList<Album> getAlbums(@NonNull final Context context, final int artistId) {
return AlbumLoader.getAlbums(makeArtistAlbumCursor(context, artistId)); ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
} context,
MediaStore.Audio.AudioColumns.ARTIST_ID + "=?",
public static Cursor makeArtistAlbumCursor(@NonNull final Context context, final int artistId) { new String[]{String.valueOf(artistId)},
try { PreferenceUtil.getInstance(context).getAlbumSongSortOrder()
return AlbumLoader.makeAlbumCursor(context, ));
MediaStore.Audio.Artists.Albums.getContentUri("external", artistId), return AlbumLoader.splitIntoAlbums(songs, new AlbumASCComparator());
null,
null,
PreferenceUtil.getInstance(context).getArtistAlbumSortOrder()
);
} catch (SecurityException e) {
return null;
}
} }
} }

View file

@ -31,17 +31,19 @@ public class PlaylistSongLoader {
@NonNull @NonNull
private static PlaylistSong getPlaylistSongFromCursorImpl(@NonNull Cursor cursor, int playlistId) { private static PlaylistSong getPlaylistSongFromCursorImpl(@NonNull Cursor cursor, int playlistId) {
final int id = cursor.getInt(0); final int id = cursor.getInt(0);
final String songName = cursor.getString(1); final String title = cursor.getString(1);
final String artist = cursor.getString(2); final int trackNumber = cursor.getInt(2);
final String album = cursor.getString(3); final int year = cursor.getInt(3);
final long duration = cursor.getLong(4); final long duration = cursor.getLong(4);
final int trackNumber = cursor.getInt(5); final String data = cursor.getString(5);
final int albumId = cursor.getInt(6); final int dateModified = cursor.getInt(6);
final int artistId = cursor.getInt(7); final int albumId = cursor.getInt(7);
final String data = cursor.getString(8); final String albumName = cursor.getString(8);
final int idInPlaylist = cursor.getInt(9); 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) { public static Cursor makePlaylistSongCursor(@NonNull final Context context, final int playlistId) {
@ -49,26 +51,18 @@ public class PlaylistSongLoader {
return context.getContentResolver().query( return context.getContentResolver().query(
MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId),
new String[]{ new String[]{
/* 0 */ MediaStore.Audio.Playlists.Members.AUDIO_ID,// 0
MediaStore.Audio.Playlists.Members.AUDIO_ID, AudioColumns.TITLE,// 1
/* 1 */ AudioColumns.TRACK,// 2
AudioColumns.TITLE, AudioColumns.YEAR,// 3
/* 2 */ AudioColumns.DURATION,// 4
AudioColumns.ARTIST, AudioColumns.DATA,// 5
/* 3 */ AudioColumns.DATE_MODIFIED,// 6
AudioColumns.ALBUM, AudioColumns.ALBUM_ID,// 7
/* 4 */ AudioColumns.ALBUM,// 8
AudioColumns.DURATION, AudioColumns.ARTIST_ID,// 9
/* 5 */ AudioColumns.ARTIST,// 10
AudioColumns.TRACK, MediaStore.Audio.Playlists.Members._ID // 11
/* 6 */
AudioColumns.ALBUM_ID,
/* 7 */
AudioColumns.ARTIST_ID,
/* 8 */
AudioColumns.DATA,
/* 9 */
MediaStore.Audio.Playlists.Members._ID
}, SongLoader.BASE_SELECTION, null, }, SongLoader.BASE_SELECTION, null,
MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER); MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER);
} catch (SecurityException e) { } catch (SecurityException e) {

View file

@ -53,9 +53,11 @@ public class SongLoader {
@NonNull @NonNull
public static Song getSong(@Nullable Cursor cursor) { public static Song getSong(@Nullable Cursor cursor) {
Song song = new Song(); Song song;
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
song = getSongFromCursorImpl(cursor); song = getSongFromCursorImpl(cursor);
} else {
song = new Song();
} }
if (cursor != null) { if (cursor != null) {
cursor.close(); cursor.close();
@ -66,15 +68,18 @@ public class SongLoader {
@NonNull @NonNull
private static Song getSongFromCursorImpl(@NonNull Cursor cursor) { private static Song getSongFromCursorImpl(@NonNull Cursor cursor) {
final int id = cursor.getInt(0); final int id = cursor.getInt(0);
final String songName = cursor.getString(1); final String title = cursor.getString(1);
final String artist = cursor.getString(2); final int trackNumber = cursor.getInt(2);
final String album = cursor.getString(3); final int year = cursor.getInt(3);
final long duration = cursor.getLong(4); final long duration = cursor.getLong(4);
final int trackNumber = cursor.getInt(5); final String data = cursor.getString(5);
final int artistId = cursor.getInt(6); final long dateModified = cursor.getLong(6);
final int albumId = cursor.getInt(7); final int albumId = cursor.getInt(7);
final String data = cursor.getString(8); final String albumName = cursor.getString(8);
return new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, data); 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 @Nullable
@ -92,24 +97,18 @@ public class SongLoader {
try { try {
return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{ new String[]{
/* 0 */ BaseColumns._ID,// 0
BaseColumns._ID, AudioColumns.TITLE,// 1
/* 1 */ AudioColumns.TRACK,// 2
AudioColumns.TITLE, AudioColumns.YEAR,// 3
/* 2 */ AudioColumns.DURATION,// 4
AudioColumns.ARTIST, AudioColumns.DATA,// 5
/* 3 */ AudioColumns.DATE_MODIFIED,// 6
AudioColumns.ALBUM, AudioColumns.ALBUM_ID,// 7
/* 4 */ AudioColumns.ALBUM,// 8
AudioColumns.DURATION, AudioColumns.ARTIST_ID,// 9
/* 5 */ AudioColumns.ARTIST,// 10
AudioColumns.TRACK,
/* 6 */
AudioColumns.ARTIST_ID,
/* 7 */
AudioColumns.ALBUM_ID,
/* 8 */
AudioColumns.DATA
}, baseSelection, values, sortOrder); }, baseSelection, values, sortOrder);
} catch (SecurityException e) { } catch (SecurityException e) {
return null; return null;

View file

@ -3,34 +3,44 @@ package com.kabouzeid.gramophone.model;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import java.util.ArrayList;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class Album implements Parcelable { public class Album implements Parcelable {
public final int id; public final ArrayList<Song> songs;
public final int artistId;
public final String title;
public final String artistName;
public final int songCount;
public final int year;
public Album(final int id, final String title, final String artistName, final int artistId, public Album(ArrayList<Song> songs) {
final int songNumber, final int albumYear) { this.songs = songs;
this.id = id;
this.title = title;
this.artistName = artistName;
this.artistId = artistId;
songCount = songNumber;
year = albumYear;
} }
public Album() { public Album() {
this.id = -1; this.songs = new ArrayList<>();
this.title = ""; }
this.artistName = "";
this.artistId = -1; public int getId() {
songCount = -1; return songs.get(0).albumId;
year = -1; }
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 @Override
@ -38,41 +48,24 @@ public class Album implements Parcelable {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
Album album = (Album) o; Album that = (Album) o;
if (id != album.id) return false; return songs != null ? songs.equals(that.songs) : that.songs == null;
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;
} }
@Override @Override
public int hashCode() { public int hashCode() {
int result = id; return songs != null ? songs.hashCode() : 0;
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;
} }
@Override @Override
public String toString() { public String toString() {
return "Album{" + return "Album{" +
"id=" + id + "songs=" + songs +
", artistId=" + artistId +
", title='" + title + '\'' +
", artistName='" + artistName + '\'' +
", songCount=" + songCount +
", year=" + year +
'}'; '}';
} }
@Override @Override
public int describeContents() { public int describeContents() {
return 0; return 0;
@ -80,24 +73,14 @@ public class Album implements Parcelable {
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id); dest.writeTypedList(songs);
dest.writeInt(this.artistId);
dest.writeString(this.title);
dest.writeString(this.artistName);
dest.writeInt(this.songCount);
dest.writeInt(this.year);
} }
protected Album(Parcel in) { protected Album(Parcel in) {
this.id = in.readInt(); this.songs = in.createTypedArrayList(Song.CREATOR);
this.artistId = in.readInt();
this.title = in.readString();
this.artistName = in.readString();
this.songCount = in.readInt();
this.year = in.readInt();
} }
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) { public Album createFromParcel(Parcel source) {
return new Album(source); return new Album(source);
} }

View file

@ -7,9 +7,8 @@ public class PlaylistSong extends Song {
public final int playlistId; public final int playlistId;
public final int idInPlayList; public final int idInPlayList;
public PlaylistSong(final int id, final int albumId, final int artistId, final String title, final String artistName, 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) {
final String albumName, final long duration, final int trackNumber, final String data, final int playlistId, final int idInPlayList) { super(id, title, trackNumber, year, duration, data, dateModified, albumId, albumName, artistId, artistName);
super(id, albumId, artistId, title, artistName, albumName, duration, trackNumber, data);
this.playlistId = playlistId; this.playlistId = playlistId;
this.idInPlayList = idInPlayList; this.idInPlayList = idInPlayList;
} }

View file

@ -8,38 +8,43 @@ import android.os.Parcelable;
*/ */
public class Song implements Parcelable { public class Song implements Parcelable {
public final int id; public final int id;
public final int albumId;
public final int artistId;
public final String title; public final String title;
public final String artistName;
public final String albumName;
public final long duration;
public final int trackNumber; public final int trackNumber;
public final int year;
public final long duration;
public final String data; 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, public Song(int id, String title, int trackNumber, int year, long duration, String data, long dateModified, int albumId, String albumName, int artistId, String artistName) {
final String albumName, final long duration, final int trackNumber, final String data) {
this.id = id; this.id = id;
this.albumId = albumId;
this.artistId = artistId;
this.title = title; this.title = title;
this.artistName = artistName;
this.albumName = albumName;
this.duration = duration;
this.trackNumber = trackNumber; this.trackNumber = trackNumber;
this.year = year;
this.duration = duration;
this.data = data; this.data = data;
this.dateModified = dateModified;
this.albumId = albumId;
this.albumName = albumName;
this.artistId = artistId;
this.artistName = artistName;
} }
public Song() { public Song() {
this.id = -1; this.id = -1;
this.albumId = -1;
this.artistId = -1;
this.title = ""; this.title = "";
this.artistName = "";
this.albumName = "";
this.duration = -1;
this.trackNumber = -1; this.trackNumber = -1;
this.year = -1;
this.duration = -1;
this.data = ""; this.data = "";
this.dateModified = -1;
this.albumId = -1;
this.albumName = "";
this.artistId = -1;
this.artistName = "";
} }
@Override @Override
@ -50,30 +55,33 @@ public class Song implements Parcelable {
Song song = (Song) o; Song song = (Song) o;
if (id != song.id) return false; 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 (albumId != song.albumId) return false;
if (artistId != song.artistId) 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 (title != null ? !title.equals(song.title) : song.title != null) return false;
if (artistName != null ? !artistName.equals(song.artistName) : song.artistName != null) if (data != null ? !data.equals(song.data) : song.data != null) return false;
return false;
if (albumName != null ? !albumName.equals(song.albumName) : song.albumName != null) if (albumName != null ? !albumName.equals(song.albumName) : song.albumName != null)
return false; return false;
return data != null ? data.equals(song.data) : song.data == null; return artistName != null ? artistName.equals(song.artistName) : song.artistName == null;
} }
@Override @Override
public int hashCode() { public int hashCode() {
int result = id; int result = id;
result = 31 * result + albumId;
result = 31 * result + artistId;
result = 31 * result + (title != null ? title.hashCode() : 0); 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 + trackNumber;
result = 31 * result + year;
result = 31 * result + (int) (duration ^ (duration >>> 32));
result = 31 * result + (data != null ? data.hashCode() : 0); 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; return result;
} }
@ -81,14 +89,16 @@ public class Song implements Parcelable {
public String toString() { public String toString() {
return "Song{" + return "Song{" +
"id=" + id + "id=" + id +
", albumId=" + albumId +
", artistId=" + artistId +
", title='" + title + '\'' + ", title='" + title + '\'' +
", artistName='" + artistName + '\'' +
", albumName='" + albumName + '\'' +
", duration=" + duration +
", trackNumber=" + trackNumber + ", trackNumber=" + trackNumber +
", year=" + year +
", duration=" + duration +
", data='" + data + '\'' + ", data='" + data + '\'' +
", dateModified=" + dateModified +
", albumId=" + albumId +
", albumName='" + albumName + '\'' +
", artistId=" + artistId +
", artistName='" + artistName + '\'' +
'}'; '}';
} }
@ -101,26 +111,30 @@ public class Song implements Parcelable {
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id); dest.writeInt(this.id);
dest.writeInt(this.albumId);
dest.writeInt(this.artistId);
dest.writeString(this.title); dest.writeString(this.title);
dest.writeString(this.artistName);
dest.writeString(this.albumName);
dest.writeLong(this.duration);
dest.writeInt(this.trackNumber); dest.writeInt(this.trackNumber);
dest.writeInt(this.year);
dest.writeLong(this.duration);
dest.writeString(this.data); 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) { protected Song(Parcel in) {
this.id = in.readInt(); this.id = in.readInt();
this.albumId = in.readInt();
this.artistId = in.readInt();
this.title = in.readString(); this.title = in.readString();
this.artistName = in.readString();
this.albumName = in.readString();
this.duration = in.readLong();
this.trackNumber = in.readInt(); this.trackNumber = in.readInt();
this.year = in.readInt();
this.duration = in.readLong();
this.data = in.readString(); 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>() { 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 DATABASE_NAME = "music_playback_state.db";
public static final String PLAYING_QUEUE_TABLE_NAME = "playing_queue"; public static final String PLAYING_QUEUE_TABLE_NAME = "playing_queue";
public static final String ORIGINAL_PLAYING_QUEUE_TABLE_NAME = "original_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> * Constructor of <code>MusicPlaybackState</code>
@ -71,25 +71,31 @@ public class MusicPlaybackQueueStore extends SQLiteOpenHelper {
builder.append(AudioColumns.TITLE); builder.append(AudioColumns.TITLE);
builder.append(" STRING NOT NULL,"); builder.append(" STRING NOT NULL,");
builder.append(AudioColumns.ARTIST); builder.append(AudioColumns.TRACK);
builder.append(" STRING NOT NULL,"); builder.append(" INT NOT NULL,");
builder.append(AudioColumns.ALBUM); builder.append(AudioColumns.YEAR);
builder.append(" STRING NOT NULL,"); builder.append(" INT NOT NULL,");
builder.append(AudioColumns.DURATION); builder.append(AudioColumns.DURATION);
builder.append(" LONG NOT NULL,"); builder.append(" LONG NOT NULL,");
builder.append(AudioColumns.TRACK); builder.append(AudioColumns.DATA);
builder.append(" INT NOT NULL,"); builder.append(" STRING NOT NULL,");
builder.append(AudioColumns.ARTIST_ID); builder.append(AudioColumns.DATE_MODIFIED);
builder.append(" INT NOT NULL,"); builder.append(" LONG NOT NULL,");
builder.append(AudioColumns.ALBUM_ID); builder.append(AudioColumns.ALBUM_ID);
builder.append(" INT NOT NULL,"); 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);"); builder.append(" STRING NOT NULL);");
db.execSQL(builder.toString()); db.execSQL(builder.toString());
@ -156,13 +162,15 @@ public class MusicPlaybackQueueStore extends SQLiteOpenHelper {
values.put(BaseColumns._ID, song.id); values.put(BaseColumns._ID, song.id);
values.put(AudioColumns.TITLE, song.title); 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.TRACK, song.trackNumber);
values.put(AudioColumns.ARTIST_ID, song.artistId); values.put(AudioColumns.YEAR, song.year);
values.put(AudioColumns.ALBUM_ID, song.albumId); values.put(AudioColumns.DURATION, song.duration);
values.put(AudioColumns.DATA, song.data); 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); 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.CabHolder;
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks; import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.model.Album; 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.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity; 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.NavigationUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
import java.util.ArrayList;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@ -133,7 +129,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
Bundle intentExtras = getIntent().getExtras(); Bundle intentExtras = getIntent().getExtras();
final int albumId = intentExtras.getInt(EXTRA_ALBUM_ID); final int albumId = intentExtras.getInt(EXTRA_ALBUM_ID);
album = AlbumLoader.getAlbum(this, albumId); album = AlbumLoader.getAlbum(this, albumId);
if (album.id == -1) { if (album.songs.isEmpty()) {
finish(); finish();
} }
} }
@ -150,7 +146,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
} }
private void setUpViews() { private void setUpViews() {
albumTitleView.setText(album.title); albumTitleView.setText(album.getTitle());
setUpRecyclerViewView(); setUpRecyclerViewView();
setUpSongsAdapter(); setUpSongsAdapter();
setUpAlbumArtAndApplyPalette(); setUpAlbumArtAndApplyPalette();
@ -158,7 +154,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
private void setUpAlbumArtAndApplyPalette() { private void setUpAlbumArtAndApplyPalette() {
Glide.with(this) Glide.with(this)
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id)) .loadFromMediaStore(MusicUtil.getAlbumArtUri(album.getId()))
.asBitmap() .asBitmap()
.transcode(new BitmapPaletteTranscoder(this), BitmapPaletteWrapper.class) .transcode(new BitmapPaletteTranscoder(this), BitmapPaletteWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE)
@ -234,7 +230,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
} }
private void setUpSongsAdapter() { 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.setLayoutManager(new GridLayoutManager(this, 1));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@ -247,11 +243,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
} }
private void reloadDataSet() { private void reloadDataSet() {
adapter.swapDataSet(loadSongDataSet()); adapter.swapDataSet(album.songs);
} }
private ArrayList<Song> loadSongDataSet() { private void reloadAlbum() {
return AlbumSongLoader.getAlbumSongList(this, album.id); album = AlbumLoader.getAlbum(this, album.getId());
} }
@Override @Override
@ -292,11 +288,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
return true; return true;
case R.id.action_tag_editor: case R.id.action_tag_editor:
Intent intent = new Intent(this, AlbumTagEditorActivity.class); 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); startActivityForResult(intent, TAG_EDITOR_REQUEST);
return true; return true;
case R.id.action_go_to_artist: case R.id.action_go_to_artist:
NavigationUtil.goToArtist(this, album.artistId); NavigationUtil.goToArtist(this, album.getArtistId());
return true; return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
@ -307,7 +303,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TAG_EDITOR_REQUEST) { if (requestCode == TAG_EDITOR_REQUEST) {
getAlbumFromIntentExtras(); getAlbumFromIntentExtras();
albumTitleView.setText(album.title); albumTitleView.setText(album.getTitle());
setUpAlbumArtAndApplyPalette(); setUpAlbumArtAndApplyPalette();
setResult(RESULT_OK); setResult(RESULT_OK);
} }

View file

@ -216,7 +216,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
} }
private ArrayList<Album> loadAlbumDataSet() { private ArrayList<Album> loadAlbumDataSet() {
return ArtistAlbumLoader.getArtistAlbumList(this, artist.id); return ArtistAlbumLoader.getAlbums(this, artist.id);
} }
private void loadBiography() { 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.helper.SearchQueryHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; 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.ArtistSongLoader;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.loader.SongLoader;
@ -532,7 +532,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
final int id = (int) parseIdFromIntent(intent, "albumId", "album"); final int id = (int) parseIdFromIntent(intent, "albumId", "album");
if (id >= 0) { if (id >= 0) {
int position = intent.getIntExtra("position", 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; handled = true;
} }
} else if (MediaStore.Audio.Artists.CONTENT_TYPE.equals(mimeType)) { } 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.glide.palette.BitmapPaletteWrapper;
import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.LastFmAlbum; 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.model.Song;
import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.LastFMUtil; import com.kabouzeid.gramophone.util.LastFMUtil;
@ -199,7 +199,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@NonNull @NonNull
@Override @Override
protected List<String> getSongPaths() { 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()); ArrayList<String> paths = new ArrayList<>(songs.size());
for (Song song : songs) { for (Song song : songs) {
paths.add(song.data); paths.add(song.data);

View file

@ -7,8 +7,6 @@ import android.support.annotation.NonNull;
import com.bumptech.glide.signature.StringSignature; import com.bumptech.glide.signature.StringSignature;
import hugo.weaving.DebugLog;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
@ -30,13 +28,11 @@ public class ArtistSignatureUtil {
return sInstance; return sInstance;
} }
@DebugLog
@SuppressLint("CommitPrefEdits") @SuppressLint("CommitPrefEdits")
public void updateArtistSignature(String artistName) { public void updateArtistSignature(String artistName) {
mPreferences.edit().putLong(artistName, System.currentTimeMillis()).commit(); mPreferences.edit().putLong(artistName, System.currentTimeMillis()).commit();
} }
@DebugLog
public long getArtistSignatureRaw(String artistName) { public long getArtistSignatureRaw(String artistName) {
return mPreferences.getLong(artistName, 0); return mPreferences.getLong(artistName, 0);
} }