package io.hefuyi.listener.dataloader;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import java.util.ArrayList;
import java.util.List;
import io.hefuyi.listener.mvp.model.Album;
import io.hefuyi.listener.mvp.model.Song;
import io.hefuyi.listener.util.PreferencesUtility;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Func1;
/**
* Created by hefuyi on 2016/11/3.
*/
public class AlbumLoader {
private static Observable<Album> getAlbum(final Cursor cursor) {
return Observable.create(new Observable.OnSubscribe<Album>() {
@Override
public void call(Subscriber<? super Album> subscriber) {
Album album = new Album();
if (cursor != null) {
if (cursor.moveToFirst())
album = new Album(cursor.getLong(0), cursor.getString(1), cursor.getString(2), cursor.getLong(3), cursor.getInt(4), cursor.getInt(5));
}
if (cursor != null){
cursor.close();
}
subscriber.onNext(album);
subscriber.onCompleted();
}
});
}
public static Observable<List<Album>> getFavourateAlbums(final Context context) {
return SongLoader.getFavoriteSong(context).flatMap(new Func1<List<Song>, Observable<Song>>() {
@Override
public Observable<Song> call(List<Song> songList) {
return Observable.from(songList);
}
}).distinct(new Func1<Song, Long>() {
@Override
public Long call(Song song) {
return song.albumId;
}
}).flatMap(new Func1<Song, Observable<Album>>() {
@Override
public Observable<Album> call(Song song) {
return AlbumLoader.getAlbum(context, song.albumId);
}
}).toList();
}
public static Observable<List<Album>> getRecentlyPlayedAlbums(final Context context) {
return TopTracksLoader.getTopRecentSongs(context).flatMap(new Func1<List<Song>, Observable<Song>>() {
@Override
public Observable<Song> call(List<Song> songList) {
return Observable.from(songList);
}
}).distinct(new Func1<Song, Long>() {
@Override
public Long call(Song song) {
return song.albumId;
}
}).flatMap(new Func1<Song, Observable<Album>>() {
@Override
public Observable<Album> call(Song song) {
return AlbumLoader.getAlbum(context, song.albumId);
}
}).toList();
}
private static Observable<List<Album>> getAlbumsForCursor(final Cursor cursor) {
return Observable.create(new Observable.OnSubscribe<List<Album>>() {
@Override
public void call(Subscriber<? super List<Album>> subscriber) {
List<Album> arrayList = new ArrayList<Album>();
if ((cursor != null) && (cursor.moveToFirst()))
do {
arrayList.add(new Album(cursor.getLong(0), cursor.getString(1), cursor.getString(2), cursor.getLong(3), cursor.getInt(4), cursor.getInt(5)));
}
while (cursor.moveToNext());
if (cursor != null) {
cursor.close();
}
subscriber.onNext(arrayList);
subscriber.onCompleted();
}
});
}
public static Observable<List<Album>> getAllAlbums(Context context) {
return getAlbumsForCursor(makeAlbumCursor(context, null, null));
}
public static Observable<Album> getAlbum(Context context, long id) {
return getAlbum(makeAlbumCursor(context, "_id=?", new String[]{String.valueOf(id)}));
}
public static Observable<List<Album>> getAlbums(Context context, String paramString) {
return getAlbumsForCursor(makeAlbumCursor(context, "album LIKE ? or artist LIKE ? ",
new String[]{"%" + paramString + "%", "%" + paramString + "%"}));
}
private static Cursor makeAlbumCursor(Context context, String selection, String[] paramArrayOfString) {
final String albumSortOrder = PreferencesUtility.getInstance(context).getAlbumSortOrder();
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new String[]{"_id", "album", "artist", "artist_id", "numsongs", "minyear"}, selection, paramArrayOfString, albumSortOrder);
return cursor;
}
}