Playlists [beta]

This commit is contained in:
Karim Abou Zeid 2015-03-17 15:09:44 +01:00
commit de15a34365
33 changed files with 896 additions and 56 deletions

View file

@ -4,15 +4,24 @@ import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.BaseColumns;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.Song;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
/**
* Created by karim on 29.12.14.
@ -86,4 +95,57 @@ public class MusicUtil {
}
return albumArtDir;
}
public static void deleteTracks(final Context context, final List<Song> songs) {
final String[] projection = new String[] {
BaseColumns._ID, MediaStore.MediaColumns.DATA
};
final StringBuilder selection = new StringBuilder();
selection.append(BaseColumns._ID + " IN (");
for (int i = 0; i < songs.size(); i++) {
selection.append(songs.get(i).id);
if (i < songs.size() - 1) {
selection.append(",");
}
}
selection.append(")");
final Cursor cursor = context.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection.toString(),
null, null);
if (cursor != null) {
// Step 1: Remove selected tracks from the current playlist, as well
// as from the album art cache
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
final int id = cursor.getInt(0);
final Song song = SongLoader.getSong(context, id);
MusicPlayerRemote.removeFromQueue(song);
}
// Step 2: Remove selected tracks from the database
context.getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
selection.toString(), null);
// Step 3: Remove files from card
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
final String name = cursor.getString(1);
final File f = new File(name);
try { // File.delete can throw a security exception
if (!f.delete()) {
// I'm not sure if we'd ever get here (deletion would
// have to fail, but no exception thrown)
Log.e("MusicUtils", "Failed to delete file " + name);
}
cursor.moveToNext();
} catch (final SecurityException ex) {
cursor.moveToNext();
}
}
cursor.close();
}
context.getContentResolver().notifyChange(Uri.parse("content://media"), null);
Toast.makeText(context, "Deleted " + songs.size() + " songs", Toast.LENGTH_SHORT).show();
//TODO add resource string
}
}

View file

@ -16,6 +16,7 @@ import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity;
import com.kabouzeid.gramophone.ui.activities.ArtistDetailActivity;
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
import com.kabouzeid.gramophone.ui.activities.PlaylistDetailActivity;
/**
* Created by karim on 12.03.15.
@ -61,6 +62,23 @@ public class NavigationUtil {
}
}
public static void goToPlaylist(final Activity activity, final int playlistId, final Pair[] sharedViews) {
if ((activity instanceof KabViewsDisableAble && ((KabViewsDisableAble) activity).areViewsEnabled()) || !(activity instanceof KabViewsDisableAble)) {
if (activity instanceof KabViewsDisableAble)
((KabViewsDisableAble) activity).disableViews();
final Intent intent = new Intent(activity, PlaylistDetailActivity.class);
intent.putExtra(AppKeys.E_PLAYLIST, playlistId);
if (sharedViews != null) {
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
sharedViews
);
ActivityCompat.startActivity(activity, intent, optionsCompat.toBundle());
} else {
activity.startActivity(intent);
}
}
}
public static void openCurrentPlayingIfPossible(final Activity activity, final Pair[] sharedViews) {
if (activity instanceof MusicControllerActivity) {
activity.onBackPressed();

View file

@ -0,0 +1,99 @@
package com.kabouzeid.gramophone.util;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.widget.Toast;
import com.kabouzeid.gramophone.model.PlaylistSong;
import com.kabouzeid.gramophone.model.Song;
import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 16.03.15.
*/
public class PlaylistsUtil {
public static int createPlaylist(final Context context, final String name) {
if (name != null && name.length() > 0) {
final ContentResolver resolver = context.getContentResolver();
final String[] projection = new String[]{
MediaStore.Audio.PlaylistsColumns.NAME
};
final String selection = MediaStore.Audio.PlaylistsColumns.NAME + " = '" + name + "'";
Cursor cursor = resolver.query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
projection, selection, null, null);
if (cursor.getCount() <= 0) {
final ContentValues values = new ContentValues(1);
values.put(MediaStore.Audio.PlaylistsColumns.NAME, name);
final Uri uri = resolver.insert(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
values);
return Integer.parseInt(uri.getLastPathSegment());
}
cursor.close();
}
return -1;
}
public static void deletePlaylist(final Context context, final int playlistId) {
final Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
context.getContentResolver().delete(uri, null, null);
}
public static void addToPlaylist(final Context context, final Song song, final long playlistId) {
List<Song> helperList = new ArrayList<>();
helperList.add(song);
addToPlaylist(context, helperList, playlistId);
}
public static void addToPlaylist(final Context context, final List<Song> songs, final long playlistId) {
final ContentResolver resolver = context.getContentResolver();
final String[] projection = new String[]{
MediaStore.Audio.PlaylistsColumns.NAME
};
final Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
Cursor cursor = resolver.query(uri, projection, null, null, null);
cursor.moveToFirst();
final String playlistName = cursor.getString(0);
cursor.close();
ContentValues[] contentValues = new ContentValues[songs.size()];
for (int i = 0; i < songs.size(); i++) {
contentValues[i] = new ContentValues();
contentValues[i].put(MediaStore.Audio.Playlists.Members.AUDIO_ID, songs.get(i).id);
}
resolver.bulkInsert(uri, contentValues);
Toast.makeText(context, "Added " + contentValues.length + " songs to playlist " + playlistName, Toast.LENGTH_SHORT).show();
//TODO add string resource
}
public static void removeFromPlaylist(final Context context, final PlaylistSong song) {
Uri uri = MediaStore.Audio.Playlists.Members.getContentUri(
"external", song.playlistId);
String selection = MediaStore.Audio.Playlists.Members._ID+ " =?";
String[] selectionArgs = new String[]{String.valueOf(song.idInPlayList)};
context.getContentResolver().delete(uri, selection, selectionArgs);
}
public static void removeFromPlaylist(final Context context, final List<PlaylistSong> songs) {
Uri uri = MediaStore.Audio.Playlists.Members.getContentUri(
"external", songs.get(0).playlistId);
String selectionArgs[] = new String[songs.size()];
for (int i = 0; i < selectionArgs.length; i++) {
selectionArgs[i] = String.valueOf(songs.get(i).idInPlayList);
}
String selection = MediaStore.Audio.Playlists.Members._ID + " in (";
for (String selectionArg : selectionArgs) selection += "?, ";
selection = selection.substring(0, selection.length() - 2) + ")";
context.getContentResolver().delete(uri, selection, selectionArgs);
}
}