Completely rewritten the album model
This commit is contained in:
parent
d80c8f62bf
commit
c2ad4e4541
21 changed files with 292 additions and 332 deletions
|
|
@ -1,112 +1,81 @@
|
|||
package com.kabouzeid.gramophone.loader;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.provider.BaseColumns;
|
||||
import android.provider.MediaStore;
|
||||
import android.provider.MediaStore.Audio.AlbumColumns;
|
||||
import android.provider.MediaStore.Audio.AudioColumns;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.kabouzeid.gramophone.comparator.AlbumASCComparator;
|
||||
import com.kabouzeid.gramophone.comparator.SongTrackComparator;
|
||||
import com.kabouzeid.gramophone.model.Album;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
|
||||
import hugo.weaving.DebugLog;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class AlbumLoader {
|
||||
|
||||
@DebugLog
|
||||
@NonNull
|
||||
public static ArrayList<Album> getAllAlbums(@NonNull final Context context) {
|
||||
Cursor cursor = makeAlbumCursor(context, null, null);
|
||||
return getAlbums(cursor);
|
||||
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
|
||||
context,
|
||||
null,
|
||||
null,
|
||||
PreferenceUtil.getInstance(context).getAlbumSongSortOrder())
|
||||
);
|
||||
return splitIntoAlbums(songs, new AlbumASCComparator());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ArrayList<Album> getAlbums(@NonNull final Context context, String query) {
|
||||
Cursor cursor = makeAlbumCursor(context, AlbumColumns.ALBUM + " LIKE ?", new String[]{"%" + query + "%"});
|
||||
return getAlbums(cursor);
|
||||
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
|
||||
context,
|
||||
AudioColumns.ALBUM + " LIKE ?",
|
||||
new String[]{"%" + query + "%"},
|
||||
PreferenceUtil.getInstance(context).getAlbumSongSortOrder())
|
||||
);
|
||||
return splitIntoAlbums(songs, new AlbumASCComparator());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static Album getAlbum(@NonNull final Context context, int albumId) {
|
||||
Cursor cursor = makeAlbumCursor(context, BaseColumns._ID + "=?", new String[]{String.valueOf(albumId)});
|
||||
return getAlbum(cursor);
|
||||
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, AudioColumns.ALBUM_ID + "=?", new String[]{String.valueOf(albumId)}, PreferenceUtil.getInstance(context).getAlbumSongSortOrder()));
|
||||
Collections.sort(songs, new SongTrackComparator());
|
||||
return new Album(songs);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ArrayList<Album> getAlbums(@Nullable final Cursor cursor) {
|
||||
public static ArrayList<Album> splitIntoAlbums(@Nullable final ArrayList<Song> songs, Comparator<Album> albumComparator) {
|
||||
ArrayList<Album> albums = new ArrayList<>();
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
do {
|
||||
albums.add(getAlbumFromCursorImpl(cursor));
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
if (songs != null) {
|
||||
Collections.sort(songs, new SongTrackComparator());
|
||||
for (Song song : songs) {
|
||||
Album album = get(albums, song.albumId);
|
||||
if (album == null) {
|
||||
album = new Album();
|
||||
albums.add(album);
|
||||
}
|
||||
album.songs.add(song);
|
||||
}
|
||||
}
|
||||
Collections.sort(albums, albumComparator);
|
||||
return albums;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static Album getAlbum(@Nullable final Cursor cursor) {
|
||||
Album album = new Album();
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
album = getAlbumFromCursorImpl(cursor);
|
||||
}
|
||||
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
return album;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private static Album getAlbumFromCursorImpl(@NonNull final Cursor cursor) {
|
||||
final int id = cursor.getInt(0);
|
||||
final String albumName = cursor.getString(1);
|
||||
final String artist = cursor.getString(2);
|
||||
final int artistId = cursor.getInt(3);
|
||||
final int songCount = cursor.getInt(4);
|
||||
final int year = cursor.getInt(5);
|
||||
|
||||
return new Album(id, albumName, artist, artistId, songCount, year);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Cursor makeAlbumCursor(@NonNull final Context context, final String selection, final String[] values) {
|
||||
return makeAlbumCursor(context, selection, values, PreferenceUtil.getInstance(context).getAlbumSortOrder());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Cursor makeAlbumCursor(@NonNull final Context context, final String selection, final String[] values, final String sortOrder) {
|
||||
return makeAlbumCursor(context, MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, selection, values, sortOrder);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Cursor makeAlbumCursor(@NonNull final Context context, @NonNull final Uri contentUri, final String selection, final String[] values, final String sortOrder) {
|
||||
try {
|
||||
return context.getContentResolver().query(contentUri,
|
||||
new String[]{
|
||||
/* 0 */
|
||||
BaseColumns._ID,
|
||||
/* 1 */
|
||||
AlbumColumns.ALBUM,
|
||||
/* 2 */
|
||||
AlbumColumns.ARTIST,
|
||||
/* 3 */
|
||||
AudioColumns.ARTIST_ID,
|
||||
/* 4 */
|
||||
AlbumColumns.NUMBER_OF_SONGS,
|
||||
/* 5 */
|
||||
AlbumColumns.FIRST_YEAR,
|
||||
}, selection, values, sortOrder);
|
||||
} catch (SecurityException e) {
|
||||
return null;
|
||||
private static Album get(ArrayList<Album> albums, int albumId) {
|
||||
for (Album album : albums) {
|
||||
if (!album.songs.isEmpty() && album.songs.get(0).albumId == albumId) {
|
||||
return album;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.provider.MediaStore;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.kabouzeid.gramophone.comparator.AlbumASCComparator;
|
||||
import com.kabouzeid.gramophone.model.Album;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -16,20 +17,13 @@ import java.util.ArrayList;
|
|||
public class ArtistAlbumLoader {
|
||||
|
||||
@NonNull
|
||||
public static ArrayList<Album> getArtistAlbumList(@NonNull final Context context, final int artistId) {
|
||||
return AlbumLoader.getAlbums(makeArtistAlbumCursor(context, artistId));
|
||||
}
|
||||
|
||||
public static Cursor makeArtistAlbumCursor(@NonNull final Context context, final int artistId) {
|
||||
try {
|
||||
return AlbumLoader.makeAlbumCursor(context,
|
||||
MediaStore.Audio.Artists.Albums.getContentUri("external", artistId),
|
||||
null,
|
||||
null,
|
||||
PreferenceUtil.getInstance(context).getArtistAlbumSortOrder()
|
||||
);
|
||||
} catch (SecurityException e) {
|
||||
return null;
|
||||
}
|
||||
public static ArrayList<Album> getAlbums(@NonNull final Context context, final int artistId) {
|
||||
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
|
||||
context,
|
||||
MediaStore.Audio.AudioColumns.ARTIST_ID + "=?",
|
||||
new String[]{String.valueOf(artistId)},
|
||||
PreferenceUtil.getInstance(context).getAlbumSongSortOrder()
|
||||
));
|
||||
return AlbumLoader.splitIntoAlbums(songs, new AlbumASCComparator());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,17 +31,19 @@ public class PlaylistSongLoader {
|
|||
@NonNull
|
||||
private static PlaylistSong getPlaylistSongFromCursorImpl(@NonNull Cursor cursor, int playlistId) {
|
||||
final int id = cursor.getInt(0);
|
||||
final String songName = cursor.getString(1);
|
||||
final String artist = cursor.getString(2);
|
||||
final String album = cursor.getString(3);
|
||||
final String title = cursor.getString(1);
|
||||
final int trackNumber = cursor.getInt(2);
|
||||
final int year = cursor.getInt(3);
|
||||
final long duration = cursor.getLong(4);
|
||||
final int trackNumber = cursor.getInt(5);
|
||||
final int albumId = cursor.getInt(6);
|
||||
final int artistId = cursor.getInt(7);
|
||||
final String data = cursor.getString(8);
|
||||
final int idInPlaylist = cursor.getInt(9);
|
||||
final String data = cursor.getString(5);
|
||||
final int dateModified = cursor.getInt(6);
|
||||
final int albumId = cursor.getInt(7);
|
||||
final String albumName = cursor.getString(8);
|
||||
final int artistId = cursor.getInt(9);
|
||||
final String artistName = cursor.getString(10);
|
||||
final int idInPlaylist = cursor.getInt(11);
|
||||
|
||||
return new PlaylistSong(id, albumId, artistId, songName, artist, album, duration, trackNumber, data, playlistId, idInPlaylist);
|
||||
return new PlaylistSong(id, title, trackNumber, year, duration, data, dateModified, albumId, albumName, artistId, artistName, playlistId, idInPlaylist);
|
||||
}
|
||||
|
||||
public static Cursor makePlaylistSongCursor(@NonNull final Context context, final int playlistId) {
|
||||
|
|
@ -49,26 +51,18 @@ public class PlaylistSongLoader {
|
|||
return context.getContentResolver().query(
|
||||
MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId),
|
||||
new String[]{
|
||||
/* 0 */
|
||||
MediaStore.Audio.Playlists.Members.AUDIO_ID,
|
||||
/* 1 */
|
||||
AudioColumns.TITLE,
|
||||
/* 2 */
|
||||
AudioColumns.ARTIST,
|
||||
/* 3 */
|
||||
AudioColumns.ALBUM,
|
||||
/* 4 */
|
||||
AudioColumns.DURATION,
|
||||
/* 5 */
|
||||
AudioColumns.TRACK,
|
||||
/* 6 */
|
||||
AudioColumns.ALBUM_ID,
|
||||
/* 7 */
|
||||
AudioColumns.ARTIST_ID,
|
||||
/* 8 */
|
||||
AudioColumns.DATA,
|
||||
/* 9 */
|
||||
MediaStore.Audio.Playlists.Members._ID
|
||||
MediaStore.Audio.Playlists.Members.AUDIO_ID,// 0
|
||||
AudioColumns.TITLE,// 1
|
||||
AudioColumns.TRACK,// 2
|
||||
AudioColumns.YEAR,// 3
|
||||
AudioColumns.DURATION,// 4
|
||||
AudioColumns.DATA,// 5
|
||||
AudioColumns.DATE_MODIFIED,// 6
|
||||
AudioColumns.ALBUM_ID,// 7
|
||||
AudioColumns.ALBUM,// 8
|
||||
AudioColumns.ARTIST_ID,// 9
|
||||
AudioColumns.ARTIST,// 10
|
||||
MediaStore.Audio.Playlists.Members._ID // 11
|
||||
}, SongLoader.BASE_SELECTION, null,
|
||||
MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER);
|
||||
} catch (SecurityException e) {
|
||||
|
|
|
|||
|
|
@ -53,9 +53,11 @@ public class SongLoader {
|
|||
|
||||
@NonNull
|
||||
public static Song getSong(@Nullable Cursor cursor) {
|
||||
Song song = new Song();
|
||||
Song song;
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
song = getSongFromCursorImpl(cursor);
|
||||
} else {
|
||||
song = new Song();
|
||||
}
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
|
|
@ -66,15 +68,18 @@ public class SongLoader {
|
|||
@NonNull
|
||||
private static Song getSongFromCursorImpl(@NonNull Cursor cursor) {
|
||||
final int id = cursor.getInt(0);
|
||||
final String songName = cursor.getString(1);
|
||||
final String artist = cursor.getString(2);
|
||||
final String album = cursor.getString(3);
|
||||
final String title = cursor.getString(1);
|
||||
final int trackNumber = cursor.getInt(2);
|
||||
final int year = cursor.getInt(3);
|
||||
final long duration = cursor.getLong(4);
|
||||
final int trackNumber = cursor.getInt(5);
|
||||
final int artistId = cursor.getInt(6);
|
||||
final String data = cursor.getString(5);
|
||||
final long dateModified = cursor.getLong(6);
|
||||
final int albumId = cursor.getInt(7);
|
||||
final String data = cursor.getString(8);
|
||||
return new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, data);
|
||||
final String albumName = cursor.getString(8);
|
||||
final int artistId = cursor.getInt(9);
|
||||
final String artistName = cursor.getString(10);
|
||||
|
||||
return new Song(id, title, trackNumber, year, duration, data, dateModified, albumId, albumName, artistId, artistName);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
|
@ -92,24 +97,18 @@ public class SongLoader {
|
|||
try {
|
||||
return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
|
||||
new String[]{
|
||||
/* 0 */
|
||||
BaseColumns._ID,
|
||||
/* 1 */
|
||||
AudioColumns.TITLE,
|
||||
/* 2 */
|
||||
AudioColumns.ARTIST,
|
||||
/* 3 */
|
||||
AudioColumns.ALBUM,
|
||||
/* 4 */
|
||||
AudioColumns.DURATION,
|
||||
/* 5 */
|
||||
AudioColumns.TRACK,
|
||||
/* 6 */
|
||||
AudioColumns.ARTIST_ID,
|
||||
/* 7 */
|
||||
AudioColumns.ALBUM_ID,
|
||||
/* 8 */
|
||||
AudioColumns.DATA
|
||||
BaseColumns._ID,// 0
|
||||
AudioColumns.TITLE,// 1
|
||||
AudioColumns.TRACK,// 2
|
||||
AudioColumns.YEAR,// 3
|
||||
AudioColumns.DURATION,// 4
|
||||
AudioColumns.DATA,// 5
|
||||
AudioColumns.DATE_MODIFIED,// 6
|
||||
AudioColumns.ALBUM_ID,// 7
|
||||
AudioColumns.ALBUM,// 8
|
||||
AudioColumns.ARTIST_ID,// 9
|
||||
AudioColumns.ARTIST,// 10
|
||||
|
||||
}, baseSelection, values, sortOrder);
|
||||
} catch (SecurityException e) {
|
||||
return null;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue