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.Artist; import io.hefuyi.listener.mvp.model.Song; import rx.Observable; import rx.Subscriber; import rx.functions.Func1; /** * Created by hefuyi on 2016/11/4. */ public class LastAddedLoader { public static Observable<List<Song>> getLastAddedSongs(final Context context) { return Observable.create(new Observable.OnSubscribe<List<Song>>() { @Override public void call(Subscriber<? super List<Song>> subscriber) { List<Song> mSongList = new ArrayList<>(); Cursor mCursor = makeLastAddedCursor(context); if (mCursor != null && mCursor.moveToFirst()) { do { long id = mCursor.getLong(0); String title = mCursor.getString(1); String artist = mCursor.getString(2); String album = mCursor.getString(3); int duration = mCursor.getInt(4); int trackNumber = mCursor.getInt(5); long artistId = mCursor.getInt(6); long albumId = mCursor.getLong(7); final Song song = new Song(id, albumId, artistId, title, artist, album, duration, trackNumber); mSongList.add(song); } while (mCursor.moveToNext()); } if (mCursor != null) { mCursor.close(); mCursor = null; } subscriber.onNext(mSongList); subscriber.onCompleted(); } }); } public static Observable<List<Album>> getLastAddedAlbums(final Context context) { return getLastAddedSongs(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<Artist>> getLastAddedArtist(final Context context){ return getLastAddedSongs(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(); } private static Cursor makeLastAddedCursor(final Context context) { //four weeks ago long fourWeeksAgo = (System.currentTimeMillis() / 1000) - (4 * 3600 * 24 * 7); long cutoff = 0L; // use the most recent of the two timestamps if (cutoff < fourWeeksAgo) { cutoff = fourWeeksAgo; } final StringBuilder selection = new StringBuilder(); selection.append(MediaStore.Audio.AudioColumns.IS_MUSIC + "=1"); selection.append(" AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''"); selection.append(" AND " + MediaStore.Audio.Media.DATE_ADDED + ">"); selection.append(cutoff); return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{"_id", "title", "artist", "album", "duration", "track", "artist_id", "album_id"}, selection.toString(), null, MediaStore.Audio.Media.DATE_ADDED + " DESC"); } }