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.Artist;
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/4.
*/
public class ArtistLoader {
private static Observable<Artist> getArtist(final Cursor cursor) {
return Observable.create(new Observable.OnSubscribe<Artist>() {
@Override
public void call(Subscriber<? super Artist> subscriber) {
Artist artist = new Artist();
if (cursor != null) {
if (cursor.moveToFirst())
artist = new Artist(cursor.getLong(0), cursor.getString(1), cursor.getInt(2), cursor.getInt(3));
}
if (cursor != null){
cursor.close();
}
subscriber.onNext(artist);
subscriber.onCompleted();
}
});
}
private static Observable<List<Artist>> getArtistsForCursor(final Cursor cursor) {
return Observable.create(new Observable.OnSubscribe<List<Artist>>() {
@Override
public void call(Subscriber<? super List<Artist>> subscriber) {
List<Artist> arrayList = new ArrayList<Artist>();
if ((cursor != null) && (cursor.moveToFirst()))
do {
arrayList.add(new Artist(cursor.getLong(0), cursor.getString(1), cursor.getInt(2), cursor.getInt(3)));
}
while (cursor.moveToNext());
if (cursor != null){
cursor.close();
}
subscriber.onNext(arrayList);
subscriber.onCompleted();
}
});
}
public static Observable<List<Artist>> getFavouriteArtists(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.artistId;
}
}).flatMap(new Func1<Song, Observable<Artist>>() {
@Override
public Observable<Artist> call(Song song) {
return ArtistLoader.getArtist(context, song.artistId);
}
}).toList();
}
public static Observable<List<Artist>> getRecentlyPlayedArtist(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.artistId;
}
}).flatMap(new Func1<Song, Observable<Artist>>() {
@Override
public Observable<Artist> call(Song song) {
return ArtistLoader.getArtist(context, song.artistId);
}
}).toList();
}
public static Observable<List<Artist>> getAllArtists(Context context) {
return getArtistsForCursor(makeArtistCursor(context, null, null));
}
public static Observable<Artist> getArtist(Context context, long id) {
return getArtist(makeArtistCursor(context, "_id=?", new String[]{String.valueOf(id)}));
}
public static Observable<List<Artist>> getArtists(Context context, String paramString) {
return getArtistsForCursor(makeArtistCursor(context, "artist LIKE ?", new String[]{"%" + paramString + "%"}));
}
private static Cursor makeArtistCursor(Context context, String selection, String[] paramArrayOfString) {
final String artistSortOrder = PreferencesUtility.getInstance(context).getArtistSortOrder();
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, new String[]{"_id", "artist", "number_of_albums", "number_of_tracks"}, selection, paramArrayOfString, artistSortOrder);
return cursor;
}
}