package io.hefuyi.listener.dataloader;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
import io.hefuyi.listener.mvp.model.Song;
import io.hefuyi.listener.provider.FavoriteSong;
import io.hefuyi.listener.provider.SongPlayCount;
import io.hefuyi.listener.util.PreferencesUtility;
import rx.Observable;
import rx.Subscriber;
/**
* Created by hefuyi on 2016/11/4.
*/
public class SongLoader {
public static Observable<List<Song>> getSongsForCursor(final Cursor cursor) {
return Observable.create(new Observable.OnSubscribe<List<Song>>() {
@Override
public void call(Subscriber<? super List<Song>> subscriber) {
List<Song> arrayList = new ArrayList<Song>();
if ((cursor != null) && (cursor.moveToFirst()))
do {
long id = cursor.getLong(0);
String title = cursor.getString(1);
String artist = cursor.getString(2);
String album = cursor.getString(3);
int duration = cursor.getInt(4);
int trackNumber = cursor.getInt(5);
long artistId = cursor.getInt(6);
long albumId = cursor.getLong(7);
String path = cursor.getString(8);
arrayList.add(new Song(id, albumId, artistId, title, artist, album, duration, trackNumber, path));
}
while (cursor.moveToNext());
if (cursor != null){
cursor.close();
}
subscriber.onNext(arrayList);
subscriber.onCompleted();
}
});
}
public static Observable<List<Song>> getFavoriteSong(final Context context) {
Cursor cursor = FavoriteSong.getInstance(context).getFavoriteSong();
SortedCursor retCursor = TopTracksLoader.makeSortedCursor(context, cursor, 0);
return SongLoader.getSongsForCursor(retCursor);
}
public static Observable<List<Song>> getSongsWithScoreForCursor(final Cursor cursor, final Cursor scoreCursor) {
return Observable.create(new Observable.OnSubscribe<List<Song>>() {
@Override
public void call(Subscriber<? super List<Song>> subscriber) {
List<Song> arrayList = new ArrayList<Song>();
if ((cursor != null&&scoreCursor!=null) && (cursor.moveToFirst()&&scoreCursor.moveToFirst()))
do {
long id = cursor.getLong(0);
String title = cursor.getString(1);
String artist = cursor.getString(2);
String album = cursor.getString(3);
int duration = cursor.getInt(4);
int trackNumber = cursor.getInt(5);
long artistId = cursor.getInt(6);
long albumId = cursor.getLong(7);
String path = cursor.getString(8);
Song song = new Song(id, albumId, artistId, title, artist, album, duration, trackNumber, path);
song.setPlayCountScore(scoreCursor.getFloat(scoreCursor.getColumnIndex(SongPlayCount.SongPlayCountColumns.PLAYCOUNTSCORE)));
arrayList.add(song);
}
while (cursor.moveToNext() && scoreCursor.moveToNext());
if (cursor != null){
cursor.close();
}
if (scoreCursor != null) {
scoreCursor.close();
}
subscriber.onNext(arrayList);
subscriber.onCompleted();
}
});
}
public static Observable<List<Song>> getAllSongs(Context context) {
return getSongsForCursor(makeSongCursor(context, null, null));
}
public static Observable<List<Song>> searchSongs(Context context, String searchString) {
return getSongsForCursor(makeSongCursor(context, "title LIKE ? or artist LIKE ? or album LIKE ? ",
new String[]{"%" + searchString + "%", "%" + searchString + "%", "%" + searchString + "%"}));
}
public static Observable<List<Song>> getSongListInFolder(Context context, String path) {
String[] whereArgs = new String[]{path + "%"};
return getSongsForCursor(makeSongCursor(context, MediaStore.Audio.Media.DATA + " LIKE ?", whereArgs, null));
}
public static Cursor makeSongCursor(Context context, String selection, String[] paramArrayOfString) {
final String songSortOrder = PreferencesUtility.getInstance(context).getSongSortOrder();
return makeSongCursor(context, selection, paramArrayOfString, songSortOrder);
}
private static Cursor makeSongCursor(Context context, String selection, String[] paramArrayOfString, String sortOrder) {
String selectionStatement = "is_music=1 AND title != ''";
if (!TextUtils.isEmpty(selection)) {
selectionStatement = selectionStatement + " AND " + selection;
}
return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{"_id", "title", "artist", "album", "duration", "track", "artist_id", "album_id", MediaStore.Audio.Media.DATA},
selectionStatement, paramArrayOfString, sortOrder);
}
}