package io.hefuyi.listener.dataloader;
import android.content.Context;
import android.database.Cursor;
import android.provider.BaseColumns;
import java.util.ArrayList;
import java.util.List;
import io.hefuyi.listener.mvp.model.Song;
import io.hefuyi.listener.provider.RecentStore;
import io.hefuyi.listener.provider.SongPlayCount;
import rx.Observable;
public class TopTracksLoader extends SongLoader {
public static final int NUMBER_OF_SONGS = 99;
public static Observable<List<Song>> getTopPlaySongs(Context context) {
Cursor songsIdWithScore = SongPlayCount.getInstance(context).getTopPlayedResults(NUMBER_OF_SONGS);
SortedCursor retCursor=makeSortedCursor(context, songsIdWithScore,
songsIdWithScore.getColumnIndex(SongPlayCount.SongPlayCountColumns.ID));
if (retCursor != null) {
ArrayList<Long> missingIds = retCursor.getMissingIds();
if (missingIds != null && missingIds.size() > 0) {
for (long id : missingIds) {
SongPlayCount.getInstance(context).removeItem(id);
}
}
}
return SongLoader.getSongsWithScoreForCursor(retCursor, songsIdWithScore);
}
public static Observable<List<Song>> getTopRecentSongs(Context context) {
SortedCursor retCursor = makeRecentTracksCursor(context);
if (retCursor != null) {
ArrayList<Long> missingIds = retCursor.getMissingIds();
long[] ids = new long[missingIds.size()];
int i = 0;
if (missingIds != null && missingIds.size() > 0) {
for (long id : missingIds) {
ids[i] = id;
i++;
}
RecentStore.getInstance(context).removeItem(ids);
}
}
return SongLoader.getSongsForCursor(retCursor);
}
/**
* 获取最近播放歌曲的cursor
* @param context
* @return
*/
public static SortedCursor makeRecentTracksCursor(final Context context) {
Cursor songs = RecentStore.getInstance(context).queryRecentIds(null);
try {
return makeSortedCursor(context, songs,
songs.getColumnIndex(SongPlayCount.SongPlayCountColumns.ID));
} finally {
if (songs != null) {
songs.close();
}
}
}
/**
* 根据包含song id的cursor,获取排序好的song cursor
* @param context
* @param cursor
* @param idColumn
* @return
*/
public static SortedCursor makeSortedCursor(final Context context, final Cursor cursor,
final int idColumn) {
if (cursor != null && cursor.moveToFirst()) {
StringBuilder selection = new StringBuilder();
selection.append(BaseColumns._ID);
selection.append(" IN (");
long[] order = new long[cursor.getCount()];
long id = cursor.getLong(idColumn);
selection.append(id);
order[cursor.getPosition()] = id;
while (cursor.moveToNext()) {
selection.append(",");
id = cursor.getLong(idColumn);
order[cursor.getPosition()] = id;
selection.append(String.valueOf(id));
}
selection.append(")");
Cursor songCursor = makeSongCursor(context, selection.toString(), null);
if (songCursor != null) {
return new SortedCursor(songCursor, order, BaseColumns._ID, null);
}
}
if (cursor != null) {
cursor.close();
}
return null;
}
}