diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java index 449fbdd6..1251649c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java @@ -39,9 +39,21 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter dataSet; + private ArrayList dataSet; private final int listMargin; + public ArtistAlbumAdapter(AppCompatActivity activity, ArrayList objects, @Nullable CabHolder cabHolder) { + super(cabHolder, R.menu.menu_media_selection); + this.activity = activity; + dataSet = objects; + listMargin = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin); + } + + public void updateDataSet(ArrayList objects) { + dataSet = objects; + notifyDataSetChanged(); + } + @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(activity).inflate(R.layout.item_grid_artist_album, parent, false); @@ -152,11 +164,4 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter objects, @Nullable CabHolder cabHolder) { - super(cabHolder, R.menu.menu_media_selection); - this.activity = activity; - dataSet = objects; - listMargin = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin); - } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java index 0403a623..d76c6893 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java @@ -11,6 +11,7 @@ import android.view.ViewGroup; import android.widget.PopupMenu; import android.widget.TextView; +import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog; @@ -19,10 +20,12 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.loader.PlaylistLoader; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; +import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.util.NavigationUtil; +import com.squareup.otto.Subscribe; import java.util.ArrayList; import java.util.List; @@ -139,4 +142,27 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter dataSet; + protected ArrayList dataSet; public AlbumSongAdapter(AppCompatActivity activity, ArrayList objects, @Nullable CabHolder cabHolder) { super(cabHolder, R.menu.menu_media_selection); @@ -38,6 +38,11 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter objects){ + dataSet = objects; + notifyDataSetChanged(); + } + @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(activity).inflate(R.layout.item_list_album_song, parent, false); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/ArtistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/ArtistSongAdapter.java index 5bf43ed3..573e5bf8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/ArtistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/ArtistSongAdapter.java @@ -15,6 +15,8 @@ import android.widget.TextView; import com.afollestad.materialcab.MaterialCab; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; +import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; @@ -47,6 +49,11 @@ public class ArtistSongAdapter extends ArrayAdapter implements MaterialCab dataSet = songs; } + public void updateDataSet(ArrayList objects) { + dataSet = objects; + notifyDataSetChanged(); + } + @Override public View getView(final int position, View convertView, ViewGroup parent) { final Song song = getItem(position); @@ -119,8 +126,18 @@ public class ArtistSongAdapter extends ArrayAdapter implements MaterialCab return convertView; } - private void onMultipleItemAction(MenuItem menuItem, ArrayList songs) { - + private void onMultipleItemAction(MenuItem menuItem, ArrayList selection) { + switch (menuItem.getItemId()) { + case R.id.action_delete_from_disk: + DeleteSongsDialog.create(selection).show(activity.getSupportFragmentManager(), "DELETE_SONGS"); + break; + case R.id.action_add_to_playlist: + AddToPlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); + break; + case R.id.action_add_to_current_playing: + MusicPlayerRemote.enqueue(selection); + break; + } } protected void toggleChecked(Song song) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java index f97cab2a..4126a08f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java @@ -1,5 +1,6 @@ package com.kabouzeid.gramophone.adapter.songadapter; +import android.support.annotation.Nullable; import android.support.v4.util.Pair; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; @@ -12,14 +13,17 @@ import android.widget.PopupMenu; import android.widget.TextView; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.adapter.AbsMultiSelectAdapter; +import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; +import com.kabouzeid.gramophone.dialogs.DeleteFromPlaylistDialog; import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; -import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; @@ -29,17 +33,23 @@ import java.util.List; /** * @author Karim Abou Zeid (kabouzeid) */ -public class PlaylistSongAdapter extends RecyclerView.Adapter { +public class PlaylistSongAdapter extends AbsMultiSelectAdapter { public static final String TAG = AlbumSongAdapter.class.getSimpleName(); protected final AppCompatActivity activity; - protected final ArrayList dataSet; + protected ArrayList dataSet; - public PlaylistSongAdapter(AppCompatActivity activity, ArrayList objects) { + public PlaylistSongAdapter(AppCompatActivity activity, ArrayList objects, @Nullable CabHolder cabHolder) { + super(cabHolder, R.menu.menu_playlists_songs_selection); this.activity = activity; dataSet = objects; } + public void updateDataSet(ArrayList objects) { + dataSet = objects; + notifyDataSetChanged(); + } + @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(activity).inflate(R.layout.item_list_song, parent, false); @@ -48,8 +58,9 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter selection) { + switch (menuItem.getItemId()) { + case R.id.action_delete_from_playlist: + DeleteFromPlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "DELETE_FROM_PLAYLIST"); + break; + case R.id.action_add_to_playlist: + //noinspection unchecked + AddToPlaylistDialog.create((ArrayList) (List) selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); + break; + case R.id.action_add_to_current_playing: + //noinspection unchecked + MusicPlayerRemote.enqueue((ArrayList) (List) selection); + break; + } + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { final TextView songTitle; final TextView songInfo; final ImageView overflowButton; final ImageView albumArt; + final View view; public ViewHolder(View itemView) { super(itemView); + view = itemView; songTitle = (TextView) itemView.findViewById(R.id.song_title); songInfo = (TextView) itemView.findViewById(R.id.song_info); albumArt = (ImageView) itemView.findViewById(R.id.album_art); + view.setOnClickListener(this); + view.setOnLongClickListener(this); overflowButton = (ImageView) itemView.findViewById(R.id.menu); - overflowButton.setOnClickListener(this); - itemView.setOnClickListener(new View.OnClickListener() { + overflowButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - //noinspection unchecked - MusicPlayerRemote.openQueue((ArrayList) (List) dataSet, getAdapterPosition(), true); + PopupMenu popupMenu = new PopupMenu(activity, v); + popupMenu.inflate(R.menu.menu_item_playlist_song); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_delete_from_playlist: + DeleteFromPlaylistDialog.create(dataSet.get(getAdapterPosition())).show(activity.getSupportFragmentManager(), "DELETE_FROM_PLAYLIST"); + return true; + case R.id.action_go_to_album: + Pair[] albumPairs = new Pair[]{ + Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_cover)) + }; + if (activity instanceof AbsFabActivity) + albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); + NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs); + return true; + } + return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(getAdapterPosition()), item); + } + }); + popupMenu.show(); } }); } @Override public void onClick(View v) { - PopupMenu popupMenu = new PopupMenu(activity, v); - popupMenu.inflate(R.menu.menu_item_playlist_song); - popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_delete_from_playlist: - int position = getAdapterPosition(); - PlaylistsUtil.removeFromPlaylist(activity, dataSet.remove(position)); - notifyItemRemoved(position); - return true; - case R.id.action_go_to_album: - Pair[] albumPairs = new Pair[]{ - Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_cover)) - }; - if (activity instanceof AbsFabActivity) - albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); - NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs); - return true; - } - return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(getAdapterPosition()), item); - } - }); - popupMenu.show(); + if (isInQuickSelectMode()) { + toggleChecked(getAdapterPosition()); + } else { + //noinspection unchecked + MusicPlayerRemote.openQueue((ArrayList) (List) dataSet, getAdapterPosition(), true); + } + } + + @Override + public boolean onLongClick(View view) { + toggleChecked(getAdapterPosition()); + return true; } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/DeleteFromPlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/DeleteFromPlaylistDialog.java new file mode 100644 index 00000000..3e0b3c62 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/DeleteFromPlaylistDialog.java @@ -0,0 +1,64 @@ +package com.kabouzeid.gramophone.dialogs; + +import android.app.Dialog; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.text.Html; + +import com.afollestad.materialdialogs.MaterialDialog; +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.model.PlaylistSong; +import com.kabouzeid.gramophone.util.PlaylistsUtil; + +import java.util.ArrayList; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class DeleteFromPlaylistDialog extends DialogFragment { + + public static DeleteFromPlaylistDialog create(PlaylistSong song) { + ArrayList list = new ArrayList<>(); + list.add(song); + return create(list); + } + + public static DeleteFromPlaylistDialog create(ArrayList songs) { + DeleteFromPlaylistDialog dialog = new DeleteFromPlaylistDialog(); + Bundle args = new Bundle(); + args.putSerializable("songs", songs); + dialog.setArguments(args); + return dialog; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + //noinspection unchecked + final ArrayList songs = (ArrayList) getArguments().getSerializable("songs"); + int title; + CharSequence content; + if (songs.size() > 1) { + title = R.string.delete_songs_from_playlist_title; + content = Html.fromHtml(getString(R.string.delete_x_songs_from_playlist, songs.size())); + } else { + title = R.string.delete_song_from_playlist_title; + content = Html.fromHtml(getString(R.string.delete_song_x_from_playlist, songs.get(0).title)); + } + return new MaterialDialog.Builder(getActivity()) + .title(title) + .content(content) + .positiveText(R.string.delete_action) + .negativeText(android.R.string.cancel) + .callback(new MaterialDialog.ButtonCallback() { + @Override + public void onPositive(MaterialDialog dialog) { + super.onPositive(dialog); + if (getActivity() == null) + return; + PlaylistsUtil.removeFromPlaylist(getActivity(), songs); + } + }).build(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java index 893a53f6..4e3a8930 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java @@ -9,16 +9,15 @@ import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.util.PreferenceUtils; import java.util.ArrayList; -import java.util.List; /** * @author Karim Abou Zeid (kabouzeid) */ public class ArtistAlbumLoader { - public static List getArtistAlbumList(final Context context, final int artistId) { + public static ArrayList getArtistAlbumList(final Context context, final int artistId) { Cursor cursor = makeArtistAlbumCursor(context, artistId); - List albums = new ArrayList<>(); + ArrayList albums = new ArrayList<>(); if (cursor != null && cursor.moveToFirst()) { do { final int id = cursor.getInt(0); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 26922d25..e8cba8e0 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -30,6 +30,7 @@ import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; import com.kabouzeid.gramophone.model.Album; +import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; @@ -60,6 +61,8 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH private Album album; private ObservableRecyclerView recyclerView; + private AlbumSongAdapter adapter; + private ArrayList songs; private View statusBar; private ImageView albumArtImageView; private View songsBackgroundView; @@ -281,10 +284,10 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH } private void setUpSongsAdapter() { - final ArrayList songs = AlbumSongLoader.getAlbumSongList(this, album.id); - final AlbumSongAdapter albumSongAdapter = new AlbumSongAdapter(this, songs, this); + songs = AlbumSongLoader.getAlbumSongList(this, album.id); + adapter = new AlbumSongAdapter(this, songs, this); recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); - recyclerView.setAdapter(albumSongAdapter); + recyclerView.setAdapter(adapter); } @Override @@ -348,6 +351,19 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH } } + @Subscribe + public void onDataBaseEvent(DataBaseChangedEvent event) { + switch (event.getAction()) { + case DataBaseChangedEvent.SONGS_CHANGED: + case DataBaseChangedEvent.ALBUMS_CHANGED: + case DataBaseChangedEvent.DATABASE_CHANGED: + songs = AlbumSongLoader.getAlbumSongList(this, album.id); + adapter.updateDataSet(songs); + if (songs.size() < 1) finish(); + break; + } + } + @Subscribe public void onUIPreferenceChanged(UIPreferenceChangedEvent event) { switch (event.getAction()) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index b67a1523..24e0bd45 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -41,6 +41,7 @@ import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Artist; +import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; @@ -56,7 +57,6 @@ import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListene import com.squareup.otto.Subscribe; import java.util.ArrayList; -import java.util.List; /** * A lot of hackery is done in this activity. Changing things may will brake the whole activity. @@ -86,6 +86,9 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor private RecyclerView albumRecyclerView; private Spanned biography; private ArtistAlbumAdapter albumAdapter; + private ArtistSongAdapter songAdapter; + private ArrayList songs; + private ArrayList albums; private final SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() { @Override @@ -211,8 +214,8 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor songListView.setPadding(0, artistImageViewHeight + titleViewHeight, 0, bottomOffset); songListView.addHeaderView(songListHeader); - final ArrayList songs = ArtistSongLoader.getArtistSongList(this, artist.id); - ArtistSongAdapter songAdapter = new ArtistSongAdapter(this, songs, this); + songs = ArtistSongLoader.getArtistSongList(this, artist.id); + songAdapter = new ArtistSongAdapter(this, songs, this); songListView.setAdapter(songAdapter); final View contentView = getWindow().getDecorView().findViewById(android.R.id.content); @@ -227,7 +230,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor private void setUpAlbumRecyclerView() { albumRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); - List albums = ArtistAlbumLoader.getArtistAlbumList(this, artist.id); + albums = ArtistAlbumLoader.getArtistAlbumList(this, artist.id); albumAdapter = new ArtistAlbumAdapter(this, albums, this); albumRecyclerView.setAdapter(albumAdapter); } @@ -431,6 +434,22 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor }); } + @Subscribe + public void onDataBaseEvent(DataBaseChangedEvent event) { + switch (event.getAction()) { + case DataBaseChangedEvent.SONGS_CHANGED: + case DataBaseChangedEvent.ALBUMS_CHANGED: + case DataBaseChangedEvent.ARTISTS_CHANGED: + case DataBaseChangedEvent.DATABASE_CHANGED: + songs = ArtistSongLoader.getArtistSongList(this, artist.id); + songAdapter.updateDataSet(songs); + albums = ArtistAlbumLoader.getArtistAlbumList(this, artist.id); + albumAdapter.updateDataSet(albums); + if (songs.size() < 1) finish(); + break; + } + } + @Subscribe public void onUIPreferenceChanged(UIPreferenceChangedEvent event) { switch (event.getAction()) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index 7eacb053..bc54df02 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -10,12 +10,16 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import com.afollestad.materialcab.MaterialCab; +import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.songadapter.PlaylistSongAdapter; +import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.loader.PlaylistLoader; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.misc.DragSortRecycler; +import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; @@ -23,13 +27,17 @@ import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PreferenceUtils; import com.kabouzeid.gramophone.util.Util; +import com.squareup.otto.Subscribe; import java.util.ArrayList; -public class PlaylistDetailActivity extends AbsFabActivity { +public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder { public static final String TAG = PlaylistDetailActivity.class.getSimpleName(); private Playlist playlist; + private MaterialCab cab; + private PlaylistSongAdapter adapter; + private ArrayList songs; @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override @@ -41,8 +49,8 @@ public class PlaylistDetailActivity extends AbsFabActivity { getIntentExtras(); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); - final ArrayList songs = PlaylistSongLoader.getPlaylistSongList(this, playlist.id); - final PlaylistSongAdapter adapter = new PlaylistSongAdapter(this, songs); + songs = PlaylistSongLoader.getPlaylistSongList(this, playlist.id); + adapter = new PlaylistSongAdapter(this, songs, this); recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); recyclerView.setAdapter(adapter); @@ -72,6 +80,8 @@ public class PlaylistDetailActivity extends AbsFabActivity { setSupportActionBar(toolbar); getSupportActionBar().setTitle(playlist.name); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + App.bus.register(this); } @Override @@ -123,4 +133,34 @@ public class PlaylistDetailActivity extends AbsFabActivity { } return super.onOptionsItemSelected(item); } + + @Override + public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) { + if (cab != null && cab.isActive()) cab.finish(); + cab = new MaterialCab(this, R.id.cab_stub) + .setMenu(menu) + .setBackgroundColor(PreferenceUtils.getInstance(this).getThemeColorPrimary()) + .start(callback); + return cab; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + App.bus.unregister(this); + } + + @Subscribe + public void onDataBaseEvent(DataBaseChangedEvent event) { + switch (event.getAction()) { + case DataBaseChangedEvent.PLAYLISTS_CHANGED: + case DataBaseChangedEvent.DATABASE_CHANGED: + songs = PlaylistSongLoader.getPlaylistSongList(this, playlist.id); + adapter.updateDataSet(songs); + findViewById(android.R.id.empty).setVisibility( + songs.size() == 0 ? View.VISIBLE : View.GONE + ); + break; + } + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java index 2a9544c0..0a2be896 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java @@ -146,20 +146,20 @@ public class PlaylistsUtil { App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); } -// public static void removeFromPlaylist(final Context context, final List 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); -// App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); -// } + public static void removeFromPlaylist(final Context context, final List 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); + App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); + } // // public static int getSongCountForPlaylist(final Context context, final long playlistId) { // Cursor c = context.getContentResolver().query( diff --git a/app/src/main/res/layout/activity_playlist_detail.xml b/app/src/main/res/layout/activity_playlist_detail.xml index 6483502f..0efe000d 100644 --- a/app/src/main/res/layout/activity_playlist_detail.xml +++ b/app/src/main/res/layout/activity_playlist_detail.xml @@ -9,10 +9,21 @@ android:orientation="vertical" android:paddingTop="@dimen/main_toolbar_padding_top"> - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 493162df..fc7e3373 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,8 +77,16 @@ %1$d songs? ]]> + %1$s from the playlist? + ]]> + %1$d songs from the playlist? + ]]> Delete Song Delete Songs + Delete Song from Playlist + Delete Songs from Playlist Rename Playlist Delete Playlist Delete Playlists