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

@ -1,112 +1,81 @@
package com.kabouzeid.gramophone.loader;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.AlbumColumns;
import android.provider.MediaStore.Audio.AudioColumns;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.kabouzeid.gramophone.comparator.AlbumASCComparator;
import com.kabouzeid.gramophone.comparator.SongTrackComparator;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import hugo.weaving.DebugLog;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumLoader {
@DebugLog
@NonNull
public static ArrayList<Album> getAllAlbums(@NonNull final Context context) {
Cursor cursor = makeAlbumCursor(context, null, null);
return getAlbums(cursor);
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
context,
null,
null,
PreferenceUtil.getInstance(context).getAlbumSongSortOrder())
);
return splitIntoAlbums(songs, new AlbumASCComparator());
}
@NonNull
public static ArrayList<Album> getAlbums(@NonNull final Context context, String query) {
Cursor cursor = makeAlbumCursor(context, AlbumColumns.ALBUM + " LIKE ?", new String[]{"%" + query + "%"});
return getAlbums(cursor);
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
context,
AudioColumns.ALBUM + " LIKE ?",
new String[]{"%" + query + "%"},
PreferenceUtil.getInstance(context).getAlbumSongSortOrder())
);
return splitIntoAlbums(songs, new AlbumASCComparator());
}
@NonNull
public static Album getAlbum(@NonNull final Context context, int albumId) {
Cursor cursor = makeAlbumCursor(context, BaseColumns._ID + "=?", new String[]{String.valueOf(albumId)});
return getAlbum(cursor);
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, AudioColumns.ALBUM_ID + "=?", new String[]{String.valueOf(albumId)}, PreferenceUtil.getInstance(context).getAlbumSongSortOrder()));
Collections.sort(songs, new SongTrackComparator());
return new Album(songs);
}
@NonNull
public static ArrayList<Album> getAlbums(@Nullable final Cursor cursor) {
public static ArrayList<Album> splitIntoAlbums(@Nullable final ArrayList<Song> songs, Comparator<Album> albumComparator) {
ArrayList<Album> albums = new ArrayList<>();
if (cursor != null && cursor.moveToFirst()) {
do {
albums.add(getAlbumFromCursorImpl(cursor));
} while (cursor.moveToNext());
}
if (cursor != null) {
cursor.close();
if (songs != null) {
Collections.sort(songs, new SongTrackComparator());
for (Song song : songs) {
Album album = get(albums, song.albumId);
if (album == null) {
album = new Album();
albums.add(album);
}
album.songs.add(song);
}
}
Collections.sort(albums, albumComparator);
return albums;
}
@NonNull
public static Album getAlbum(@Nullable final Cursor cursor) {
Album album = new Album();
if (cursor != null && cursor.moveToFirst()) {
album = getAlbumFromCursorImpl(cursor);
}
if (cursor != null) {
cursor.close();
}
return album;
}
@NonNull
private static Album getAlbumFromCursorImpl(@NonNull final Cursor cursor) {
final int id = cursor.getInt(0);
final String albumName = cursor.getString(1);
final String artist = cursor.getString(2);
final int artistId = cursor.getInt(3);
final int songCount = cursor.getInt(4);
final int year = cursor.getInt(5);
return new Album(id, albumName, artist, artistId, songCount, year);
}
@Nullable
public static Cursor makeAlbumCursor(@NonNull final Context context, final String selection, final String[] values) {
return makeAlbumCursor(context, selection, values, PreferenceUtil.getInstance(context).getAlbumSortOrder());
}
@Nullable
public static Cursor makeAlbumCursor(@NonNull final Context context, final String selection, final String[] values, final String sortOrder) {
return makeAlbumCursor(context, MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, selection, values, sortOrder);
}
@Nullable
public static Cursor makeAlbumCursor(@NonNull final Context context, @NonNull final Uri contentUri, final String selection, final String[] values, final String sortOrder) {
try {
return context.getContentResolver().query(contentUri,
new String[]{
/* 0 */
BaseColumns._ID,
/* 1 */
AlbumColumns.ALBUM,
/* 2 */
AlbumColumns.ARTIST,
/* 3 */
AudioColumns.ARTIST_ID,
/* 4 */
AlbumColumns.NUMBER_OF_SONGS,
/* 5 */
AlbumColumns.FIRST_YEAR,
}, selection, values, sortOrder);
} catch (SecurityException e) {
return null;
private static Album get(ArrayList<Album> albums, int albumId) {
for (Album album : albums) {
if (!album.songs.isEmpty() && album.songs.get(0).albumId == albumId) {
return album;
}
}
return null;
}
}

View file

@ -1,33 +0,0 @@
package com.kabouzeid.gramophone.loader;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumSongLoader {
@NonNull
public static ArrayList<Song> getAlbumSongList(@NonNull final Context context, final int albumId) {
return SongLoader.getSongs(makeAlbumSongCursor(context, albumId));
}
public static Cursor makeAlbumSongCursor(@NonNull final Context context, final int albumId) {
return SongLoader.makeSongCursor(
context,
MediaStore.Audio.AudioColumns.ALBUM_ID + "=?",
new String[]{
String.valueOf(albumId)
},
PreferenceUtil.getInstance(context).getAlbumSongSortOrder()
);
}
}

View file

@ -1,11 +1,12 @@
package com.kabouzeid.gramophone.loader;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import com.kabouzeid.gramophone.comparator.AlbumASCComparator;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
@ -16,20 +17,13 @@ import java.util.ArrayList;
public class ArtistAlbumLoader {
@NonNull
public static ArrayList<Album> getArtistAlbumList(@NonNull final Context context, final int artistId) {
return AlbumLoader.getAlbums(makeArtistAlbumCursor(context, artistId));
}
public static Cursor makeArtistAlbumCursor(@NonNull final Context context, final int artistId) {
try {
return AlbumLoader.makeAlbumCursor(context,
MediaStore.Audio.Artists.Albums.getContentUri("external", artistId),
null,
null,
PreferenceUtil.getInstance(context).getArtistAlbumSortOrder()
);
} catch (SecurityException e) {
return null;
}
public static ArrayList<Album> getAlbums(@NonNull final Context context, final int artistId) {
ArrayList<Song> songs = SongLoader.getSongs(SongLoader.makeSongCursor(
context,
MediaStore.Audio.AudioColumns.ARTIST_ID + "=?",
new String[]{String.valueOf(artistId)},
PreferenceUtil.getInstance(context).getAlbumSongSortOrder()
));
return AlbumLoader.splitIntoAlbums(songs, new AlbumASCComparator());
}
}

View file

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

View file

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