Completely rewritten the album model
This commit is contained in:
parent
d80c8f62bf
commit
c2ad4e4541
21 changed files with 292 additions and 332 deletions
|
|
@ -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)
|
||||||
));
|
));
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>() {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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)) {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue