Playlists multi select
This commit is contained in:
parent
ab678b43ca
commit
b4105b6cc0
13 changed files with 189 additions and 33 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
package com.kabouzeid.gramophone.adapter;
|
package com.kabouzeid.gramophone.adapter;
|
||||||
|
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
|
@ -18,7 +19,7 @@ public abstract class AbsMultiSelectAdapter<VH extends RecyclerView.ViewHolder,
|
||||||
private ArrayList<I> checked;
|
private ArrayList<I> checked;
|
||||||
private int menuRes;
|
private int menuRes;
|
||||||
|
|
||||||
public AbsMultiSelectAdapter(CabHolder cabHolder, int menuRes) {
|
public AbsMultiSelectAdapter(@Nullable CabHolder cabHolder, int menuRes) {
|
||||||
this.cabHolder = cabHolder;
|
this.cabHolder = cabHolder;
|
||||||
checked = new ArrayList<>();
|
checked = new ArrayList<>();
|
||||||
this.menuRes = menuRes;
|
this.menuRes = menuRes;
|
||||||
|
|
@ -40,8 +41,10 @@ public abstract class AbsMultiSelectAdapter<VH extends RecyclerView.ViewHolder,
|
||||||
}
|
}
|
||||||
|
|
||||||
private void openCabIfNecessary() {
|
private void openCabIfNecessary() {
|
||||||
if (cab == null || !cab.isActive()) {
|
if (cabHolder != null) {
|
||||||
cab = cabHolder.openCab(menuRes, this);
|
if (cab == null || !cab.isActive()) {
|
||||||
|
cab = cabHolder.openCab(menuRes, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.adapter;
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.util.Pair;
|
import android.support.v4.util.Pair;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.graphics.Palette;
|
import android.support.v7.graphics.Palette;
|
||||||
|
|
@ -184,7 +185,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public AlbumAdapter(AppCompatActivity activity, CabHolder cabHolder) {
|
public AlbumAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) {
|
||||||
super(cabHolder, R.menu.menu_media_selection);
|
super(cabHolder, R.menu.menu_media_selection);
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
usePalette = PreferenceUtils.getInstance(activity).coloredAlbumFootersEnabled();
|
usePalette = PreferenceUtils.getInstance(activity).coloredAlbumFootersEnabled();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.kabouzeid.gramophone.adapter;
|
package com.kabouzeid.gramophone.adapter;
|
||||||
|
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.util.Pair;
|
import android.support.v4.util.Pair;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
|
@ -39,7 +40,7 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
||||||
protected final AppCompatActivity activity;
|
protected final AppCompatActivity activity;
|
||||||
protected List<Artist> dataSet;
|
protected List<Artist> dataSet;
|
||||||
|
|
||||||
public ArtistAdapter(AppCompatActivity activity, CabHolder cabHolder) {
|
public ArtistAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) {
|
||||||
super(cabHolder, R.menu.menu_media_selection);
|
super(cabHolder, R.menu.menu_media_selection);
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
loadDataSet();
|
loadDataSet();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.kabouzeid.gramophone.adapter;
|
package com.kabouzeid.gramophone.adapter;
|
||||||
|
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.util.Pair;
|
import android.support.v4.util.Pair;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
|
@ -11,24 +12,32 @@ import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
|
import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
||||||
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
|
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||||
import com.kabouzeid.gramophone.loader.PlaylistLoader;
|
import com.kabouzeid.gramophone.loader.PlaylistLoader;
|
||||||
|
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
||||||
import com.kabouzeid.gramophone.model.Playlist;
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHolder> {
|
public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewHolder, Playlist> {
|
||||||
|
|
||||||
public static final String TAG = PlaylistAdapter.class.getSimpleName();
|
public static final String TAG = PlaylistAdapter.class.getSimpleName();
|
||||||
protected final AppCompatActivity activity;
|
protected final AppCompatActivity activity;
|
||||||
protected List<Playlist> dataSet;
|
protected List<Playlist> dataSet;
|
||||||
|
|
||||||
public PlaylistAdapter(AppCompatActivity activity) {
|
public PlaylistAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) {
|
||||||
|
super(cabHolder, R.menu.menu_playlists_selection);
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
loadDataSet();
|
loadDataSet();
|
||||||
}
|
}
|
||||||
|
|
@ -45,7 +54,9 @@ public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHo
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(ViewHolder holder, int position) {
|
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||||
holder.playlistName.setText(dataSet.get(position).name);
|
final Playlist playlist = dataSet.get(position);
|
||||||
|
holder.playlistName.setText(playlist.name);
|
||||||
|
holder.view.setActivated(isChecked(playlist));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -53,15 +64,46 @@ public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHo
|
||||||
return dataSet.size();
|
return dataSet.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
|
@Override
|
||||||
|
protected Playlist getIdentifier(int position) {
|
||||||
|
return dataSet.get(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMultipleItemAction(MenuItem menuItem, ArrayList<Playlist> selection) {
|
||||||
|
switch (menuItem.getItemId()) {
|
||||||
|
case R.id.action_delete_playlist:
|
||||||
|
DeletePlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
|
||||||
|
break;
|
||||||
|
case R.id.action_add_to_playlist:
|
||||||
|
AddToPlaylistDialog.create(getSongList(selection)).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
||||||
|
break;
|
||||||
|
case R.id.action_add_to_current_playing:
|
||||||
|
MusicPlayerRemote.enqueue(getSongList(selection));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<Song> getSongList(List<Playlist> playlists) {
|
||||||
|
final ArrayList<Song> songs = new ArrayList<>();
|
||||||
|
for (Playlist playlist : playlists) {
|
||||||
|
songs.addAll(PlaylistSongLoader.getPlaylistSongList(activity, playlist.id));
|
||||||
|
}
|
||||||
|
return songs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
|
||||||
public final TextView playlistName;
|
public final TextView playlistName;
|
||||||
private final View menu;
|
private final View menu;
|
||||||
|
private final View view;
|
||||||
|
|
||||||
public ViewHolder(View itemView) {
|
public ViewHolder(View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
|
view = itemView;
|
||||||
playlistName = (TextView) itemView.findViewById(R.id.playlist_name);
|
playlistName = (TextView) itemView.findViewById(R.id.playlist_name);
|
||||||
menu = itemView.findViewById(R.id.menu);
|
menu = itemView.findViewById(R.id.menu);
|
||||||
itemView.setOnClickListener(this);
|
view.setOnClickListener(this);
|
||||||
|
view.setOnLongClickListener(this);
|
||||||
menu.setOnClickListener(new View.OnClickListener() {
|
menu.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
|
@ -81,10 +123,20 @@ public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHo
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
Pair[] sharedViews = null;
|
if (isInQuickSelectMode()) {
|
||||||
if (activity instanceof AbsFabActivity)
|
toggleChecked(getAdapterPosition());
|
||||||
sharedViews = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
|
} else {
|
||||||
NavigationUtil.goToPlaylist(activity, dataSet.get(getAdapterPosition()).id, sharedViews);
|
Pair[] sharedViews = null;
|
||||||
|
if (activity instanceof AbsFabActivity)
|
||||||
|
sharedViews = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
|
||||||
|
NavigationUtil.goToPlaylist(activity, dataSet.get(getAdapterPosition()).id, sharedViews);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongClick(View view) {
|
||||||
|
toggleChecked(getAdapterPosition());
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,17 +8,26 @@ import android.text.Html;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class DeletePlaylistDialog extends DialogFragment {
|
public class DeletePlaylistDialog extends DialogFragment {
|
||||||
|
|
||||||
public static DeletePlaylistDialog create(long playlistId) {
|
public static DeletePlaylistDialog create(Playlist playlist) {
|
||||||
|
ArrayList<Playlist> list = new ArrayList<>();
|
||||||
|
list.add(playlist);
|
||||||
|
return create(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DeletePlaylistDialog create(ArrayList<Playlist> playlists) {
|
||||||
DeletePlaylistDialog dialog = new DeletePlaylistDialog();
|
DeletePlaylistDialog dialog = new DeletePlaylistDialog();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putLong("playlist_id", playlistId);
|
args.putSerializable("playlists", playlists);
|
||||||
dialog.setArguments(args);
|
dialog.setArguments(args);
|
||||||
return dialog;
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|
@ -26,11 +35,20 @@ public class DeletePlaylistDialog extends DialogFragment {
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
long playlistId = getArguments().getLong("playlist_id");
|
//noinspection unchecked
|
||||||
|
final ArrayList<Playlist> playlists = (ArrayList<Playlist>) getArguments().getSerializable("playlists");
|
||||||
|
int title;
|
||||||
|
CharSequence content;
|
||||||
|
if (playlists.size() > 1) {
|
||||||
|
title = R.string.delete_playlists_title;
|
||||||
|
content = Html.fromHtml(getString(R.string.delete_x_playlists, playlists.size()));
|
||||||
|
} else {
|
||||||
|
title = R.string.delete_playlist_title;
|
||||||
|
content = Html.fromHtml(getString(R.string.delete_playlist_x, playlists.get(0).name));
|
||||||
|
}
|
||||||
return new MaterialDialog.Builder(getActivity())
|
return new MaterialDialog.Builder(getActivity())
|
||||||
.title(R.string.delete_playlist_title)
|
.title(title)
|
||||||
.content(Html.fromHtml(getString(R.string.delete_playlist_x,
|
.content(content)
|
||||||
PlaylistsUtil.getNameForPlaylist(getActivity(), playlistId))))
|
|
||||||
.positiveText(R.string.delete_action)
|
.positiveText(R.string.delete_action)
|
||||||
.negativeText(android.R.string.cancel)
|
.negativeText(android.R.string.cancel)
|
||||||
.callback(new MaterialDialog.ButtonCallback() {
|
.callback(new MaterialDialog.ButtonCallback() {
|
||||||
|
|
@ -39,8 +57,7 @@ public class DeletePlaylistDialog extends DialogFragment {
|
||||||
super.onPositive(dialog);
|
super.onPositive(dialog);
|
||||||
if (getActivity() == null)
|
if (getActivity() == null)
|
||||||
return;
|
return;
|
||||||
long playlistId = getArguments().getLong("playlist_id");
|
PlaylistsUtil.deletePlaylists(getActivity(), playlists);
|
||||||
PlaylistsUtil.deletePlaylist(getActivity(), playlistId);
|
|
||||||
}
|
}
|
||||||
}).build();
|
}).build();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ public class DeleteSongsDialog extends DialogFragment {
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
ArrayList<Song> songs = (ArrayList<Song>) getArguments().getSerializable("songs");
|
final ArrayList<Song> songs = (ArrayList<Song>) getArguments().getSerializable("songs");
|
||||||
int title;
|
int title;
|
||||||
CharSequence content;
|
CharSequence content;
|
||||||
if (songs.size() > 1) {
|
if (songs.size() > 1) {
|
||||||
|
|
@ -57,8 +57,6 @@ public class DeleteSongsDialog extends DialogFragment {
|
||||||
super.onPositive(dialog);
|
super.onPositive(dialog);
|
||||||
if (getActivity() == null)
|
if (getActivity() == null)
|
||||||
return;
|
return;
|
||||||
//noinspection unchecked
|
|
||||||
ArrayList<Song> songs = (ArrayList<Song>) getArguments().getSerializable("songs");
|
|
||||||
MusicUtil.deleteTracks(getActivity(), songs);
|
MusicUtil.deleteTracks(getActivity(), songs);
|
||||||
}
|
}
|
||||||
}).build();
|
}).build();
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ public class MenuItemClickHelper {
|
||||||
RenamePlaylistDialog.create(playlist.id).show(activity.getSupportFragmentManager(), "RENAME_PLAYLIST");
|
RenamePlaylistDialog.create(playlist.id).show(activity.getSupportFragmentManager(), "RENAME_PLAYLIST");
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_delete_playlist:
|
case R.id.action_delete_playlist:
|
||||||
DeletePlaylistDialog.create(playlist.id).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
|
DeletePlaylistDialog.create(playlist).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -255,7 +255,7 @@ public class MusicPlayerRemote {
|
||||||
public static void enqueue(List<Song> songs) {
|
public static void enqueue(List<Song> songs) {
|
||||||
if (musicService != null) {
|
if (musicService != null) {
|
||||||
musicService.addSongs(songs);
|
musicService.addSongs(songs);
|
||||||
final String toast = songs.size() > 1 ? musicService.getResources().getString(R.string.added_x_titles_to_playing_queue, songs.size()) : musicService.getResources().getString(R.string.added_title_to_playing_queue);
|
final String toast = songs.size() == 1 ? musicService.getResources().getString(R.string.added_title_to_playing_queue) : musicService.getResources().getString(R.string.added_x_titles_to_playing_queue, songs.size());
|
||||||
Toast.makeText(musicService, toast, Toast.LENGTH_SHORT).show();
|
Toast.makeText(musicService, toast, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,16 @@
|
||||||
package com.kabouzeid.gramophone.model;
|
package com.kabouzeid.gramophone.model;
|
||||||
|
|
||||||
public class Playlist {
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
|
*/
|
||||||
|
public class Playlist implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 3013703495354856981L;
|
||||||
|
|
||||||
public final int id;
|
public final int id;
|
||||||
public final String name;
|
public final String name;
|
||||||
|
|
||||||
|
|
@ -13,4 +23,36 @@ public class Playlist {
|
||||||
this.id = -1;
|
this.id = -1;
|
||||||
this.name = "";
|
this.name = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + id;
|
||||||
|
result = prime * result + (name == null ? 0 : name.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(final Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (obj == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (getClass() != obj.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final Playlist other = (Playlist) obj;
|
||||||
|
if (id != other.id) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return TextUtils.equals(name, other.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected RecyclerView.Adapter createAdapter() {
|
protected RecyclerView.Adapter createAdapter() {
|
||||||
PlaylistAdapter adapter = new PlaylistAdapter(getMainActivity());
|
PlaylistAdapter adapter = new PlaylistAdapter(getMainActivity(), getMainActivity());
|
||||||
View v = getView();
|
View v = getView();
|
||||||
if (v != null) {
|
if (v != null) {
|
||||||
v.findViewById(android.R.id.empty).setVisibility(
|
v.findViewById(android.R.id.empty).setVisibility(
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,11 @@ import android.widget.Toast;
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
import com.kabouzeid.gramophone.model.PlaylistSong;
|
import com.kabouzeid.gramophone.model.PlaylistSong;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -59,13 +61,26 @@ public class PlaylistsUtil {
|
||||||
// context.getContentResolver().delete(uri, null, null);
|
// context.getContentResolver().delete(uri, null, null);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public static void deletePlaylist(final Context context, final long playlistId) {
|
public static void deletePlaylists(final Context context, final long playlistId) {
|
||||||
final Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
|
final Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
|
||||||
String where = MediaStore.Audio.Playlists._ID + "=?";
|
String where = MediaStore.Audio.Playlists._ID + "=?";
|
||||||
String[] whereVal = {String.valueOf(playlistId)};
|
String[] whereVal = {String.valueOf(playlistId)};
|
||||||
context.getContentResolver().delete(uri, where, whereVal);
|
context.getContentResolver().delete(uri, where, whereVal);
|
||||||
Toast.makeText(context, context.getResources().getString(R.string.deleted_playlist_x,
|
App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED));
|
||||||
getNameForPlaylist(context, playlistId)), Toast.LENGTH_SHORT).show();
|
}
|
||||||
|
|
||||||
|
public static void deletePlaylists(final Context context, final ArrayList<Playlist> playlists) {
|
||||||
|
final Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
|
||||||
|
final StringBuilder selection = new StringBuilder();
|
||||||
|
selection.append(MediaStore.Audio.Playlists._ID + " IN (");
|
||||||
|
for (int i = 0; i < playlists.size(); i++) {
|
||||||
|
selection.append(playlists.get(i).id);
|
||||||
|
if (i < playlists.size() - 1) {
|
||||||
|
selection.append(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
selection.append(")");
|
||||||
|
context.getContentResolver().delete(uri, selection.toString(), null);
|
||||||
App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED));
|
App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
23
app/src/main/res/menu/menu_playlists_selection.xml
Normal file
23
app/src/main/res/menu/menu_playlists_selection.xml
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_add_to_playlist"
|
||||||
|
android:icon="@drawable/ic_playlist_add_white_24dp"
|
||||||
|
android:title="@string/action_add_to_playlist"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_add_to_current_playing"
|
||||||
|
android:icon="@drawable/ic_queue_white_24dp"
|
||||||
|
android:title="@string/action_add_to_playing_queue"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_delete_playlist"
|
||||||
|
android:icon="@drawable/ic_delete_white_24dp"
|
||||||
|
android:title="@string/delete_playlists_title"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
|
</menu>
|
||||||
|
|
@ -68,6 +68,9 @@
|
||||||
<string name="delete_playlist_x"><![CDATA[
|
<string name="delete_playlist_x"><![CDATA[
|
||||||
Do you want to delete the playlist <b>%1$s</b>?
|
Do you want to delete the playlist <b>%1$s</b>?
|
||||||
]]></string>
|
]]></string>
|
||||||
|
<string name="delete_x_playlists"><![CDATA[
|
||||||
|
Do you want to delete <b>%1$d</b> playlists?
|
||||||
|
]]></string>
|
||||||
<string name="delete_song_x"><![CDATA[
|
<string name="delete_song_x"><![CDATA[
|
||||||
Do you want to delete the song <b>%1$s</b>?
|
Do you want to delete the song <b>%1$s</b>?
|
||||||
]]></string>
|
]]></string>
|
||||||
|
|
@ -78,6 +81,7 @@
|
||||||
<string name="delete_songs_title">Delete Songs</string>
|
<string name="delete_songs_title">Delete Songs</string>
|
||||||
<string name="rename_playlist_title">Rename Playlist</string>
|
<string name="rename_playlist_title">Rename Playlist</string>
|
||||||
<string name="delete_playlist_title">Delete Playlist</string>
|
<string name="delete_playlist_title">Delete Playlist</string>
|
||||||
|
<string name="delete_playlists_title">Delete Playlists</string>
|
||||||
<string name="add_playlist_title">Add to Playlist</string>
|
<string name="add_playlist_title">Add to Playlist</string>
|
||||||
<string name="new_playlist_title">New Playlist</string>
|
<string name="new_playlist_title">New Playlist</string>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue