package io.hefuyi.listener.dataloader; import android.content.Context; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; import android.provider.BaseColumns; import android.provider.MediaStore; import java.util.ArrayList; import java.util.List; import io.hefuyi.listener.mvp.model.Playlist; import io.hefuyi.listener.util.ListenerUtil; import rx.Observable; import rx.Subscriber; import static io.hefuyi.listener.util.ListenerUtil.MUSIC_ONLY_SELECTION; /** * Created by hefuyi on 2016/11/4. */ public class PlaylistLoader { private static ArrayList<Playlist> mPlaylistList; public static Observable<List<Playlist>> getPlaylists(final Context context, final boolean defaultIncluded) { return Observable.create(new Observable.OnSubscribe<List<Playlist>>() { @Override public void call(Subscriber<? super List<Playlist>> subscriber) { mPlaylistList = new ArrayList<>(); if (defaultIncluded) makeDefaultPlaylists(context); Cursor mCursor = makePlaylistCursor(context); if (mCursor != null && mCursor.moveToFirst()) { do { final long id = mCursor.getLong(0); final String name = mCursor.getString(1); final int songCount = getSongCountForPlaylist(context, id); final Playlist playlist = new Playlist(id, name, songCount); mPlaylistList.add(playlist); } while (mCursor.moveToNext()); } if (mCursor != null) { mCursor.close(); mCursor = null; } subscriber.onNext(mPlaylistList); subscriber.onCompleted(); } }); } private static void makeDefaultPlaylists(Context context) { final Resources resources = context.getResources(); final Playlist topTracks = new Playlist(ListenerUtil.PlaylistType.Favourate.mId, resources.getString(ListenerUtil.PlaylistType.Favourate.mTitleId), -1); mPlaylistList.add(topTracks); } private static Cursor makePlaylistCursor(final Context context) { return context.getContentResolver().query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, new String[]{ BaseColumns._ID, MediaStore.Audio.PlaylistsColumns.NAME }, null, null, MediaStore.Audio.Playlists.DEFAULT_SORT_ORDER); } private static int getSongCountForPlaylist(final Context context, final long playlistId) { Cursor c = context.getContentResolver().query( MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), new String[]{BaseColumns._ID}, MUSIC_ONLY_SELECTION, null, null); if (c != null) { int count = 0; if (c.moveToFirst()) { count = c.getCount(); } c.close(); c = null; return count; } return 0; } public static void deletePlaylists(Context context, long playlistId) { Uri localUri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI; StringBuilder localStringBuilder = new StringBuilder(); localStringBuilder.append("_id IN ("); localStringBuilder.append((playlistId)); localStringBuilder.append(")"); context.getContentResolver().delete(localUri, localStringBuilder.toString(), null); } }