From 9d6ece0f31f73f078b80fc7333780405a6b0f4a7 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Mon, 25 May 2015 16:51:43 +0200 Subject: [PATCH] Album song multi select --- .../adapter/songadapter/AlbumSongAdapter.java | 70 +++++++++++++++---- .../ui/activities/AlbumDetailActivity.java | 41 +++++++++-- .../main/res/layout/activity_album_detail.xml | 19 +++-- 3 files changed, 106 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java index da50c319..84dc68f9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java @@ -1,5 +1,6 @@ package com.kabouzeid.gramophone.adapter.songadapter; +import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -11,8 +12,12 @@ 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.DeleteSongsDialog; import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.MusicUtil; @@ -21,13 +26,14 @@ import java.util.ArrayList; /** * @author Karim Abou Zeid (kabouzeid) */ -public class AlbumSongAdapter extends RecyclerView.Adapter { +public class AlbumSongAdapter extends AbsMultiSelectAdapter { public static final String TAG = AlbumSongAdapter.class.getSimpleName(); protected final AppCompatActivity activity; protected final ArrayList dataSet; - public AlbumSongAdapter(AppCompatActivity activity, ArrayList objects) { + public AlbumSongAdapter(AppCompatActivity activity, ArrayList objects, @Nullable CabHolder cabHolder) { + super(cabHolder, R.menu.menu_media_selection); this.activity = activity; dataSet = objects; } @@ -47,6 +53,7 @@ public class AlbumSongAdapter extends RecyclerView.Adapter 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; + } + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { final TextView songTitle; final TextView trackNumber; final TextView artistName; final ImageView overflowButton; + final View view; public ViewHolder(View itemView) { super(itemView); + view = itemView; songTitle = (TextView) itemView.findViewById(R.id.song_title); trackNumber = (TextView) itemView.findViewById(R.id.track_number); artistName = (TextView) itemView.findViewById(R.id.song_info); overflowButton = (ImageView) itemView.findViewById(R.id.menu); - overflowButton.setOnClickListener(this); - itemView.setOnClickListener(new View.OnClickListener() { + view.setOnClickListener(this); + view.setOnLongClickListener(this); + overflowButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - MusicPlayerRemote.openQueue(dataSet, getAdapterPosition(), true); + PopupMenu popupMenu = new PopupMenu(activity, v); + popupMenu.inflate(R.menu.menu_item_song); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + 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_song); - popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(getAdapterPosition()), item); - } - }); - popupMenu.show(); + if (isInQuickSelectMode()) { + toggleChecked(getAdapterPosition()); + } else { + MusicPlayerRemote.openQueue(dataSet, getAdapterPosition(), true); + } + } + + @Override + public boolean onLongClick(View view) { + toggleChecked(getAdapterPosition()); + return true; } } } 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 1f5ea6eb..26922d25 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 @@ -16,12 +16,14 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialdialogs.util.DialogUtils; import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.songadapter.AlbumSongAdapter; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.loader.AlbumSongLoader; @@ -51,7 +53,7 @@ import java.util.ArrayList; *

* Should be kinda stable ONLY AS IT IS!!! */ -public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorHolder { +public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorHolder, CabHolder { public static final String TAG = AlbumDetailActivity.class.getSimpleName(); private static final int TAG_EDITOR_REQUEST = 2001; @@ -63,10 +65,12 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH private View songsBackgroundView; private TextView albumTitleView; private Toolbar toolbar; + private MaterialCab cab; private int headerOffset; private int titleViewHeight; private int albumArtViewHeight; private int toolbarColor; + private float toolbarAlpha; private int bottomOffset; private final SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() { @@ -83,9 +87,9 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH ViewHelper.setTranslationY(songsBackgroundView, Math.max(0, -scrollY + albumArtViewHeight)); // Change alpha of overlay - float alpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange)); - ViewUtil.setBackgroundAlpha(toolbar, alpha, toolbarColor); - ViewUtil.setBackgroundAlpha(statusBar, alpha, toolbarColor); + toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange)); + ViewUtil.setBackgroundAlpha(toolbar, toolbarAlpha, toolbarColor); + ViewUtil.setBackgroundAlpha(statusBar, cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor); // Translate name text int maxTitleTranslationY = albumArtViewHeight; @@ -278,7 +282,7 @@ 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); + final AlbumSongAdapter albumSongAdapter = new AlbumSongAdapter(this, songs, this); recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); recyclerView.setAdapter(albumSongAdapter); } @@ -358,4 +362,31 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH super.onDestroy(); App.bus.unregister(this); } + + @Override + public MaterialCab openCab(int menuRes, final MaterialCab.Callback callback) { + if (cab != null && cab.isActive()) cab.finish(); + cab = new MaterialCab(this, R.id.cab_stub) + .setMenu(menuRes) + .setBackgroundColor(getPaletteColor()) + .start(new MaterialCab.Callback() { + @Override + public boolean onCabCreated(MaterialCab materialCab, Menu menu) { + ViewUtil.setBackgroundAlpha(statusBar, 1, toolbarColor); + return callback.onCabCreated(materialCab, menu); + } + + @Override + public boolean onCabItemClicked(MenuItem menuItem) { + return callback.onCabItemClicked(menuItem); + } + + @Override + public boolean onCabFinished(MaterialCab materialCab) { + ViewUtil.setBackgroundAlpha(statusBar, toolbarAlpha, toolbarColor); + return callback.onCabFinished(materialCab); + } + }); + return cab; + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_album_detail.xml b/app/src/main/res/layout/activity_album_detail.xml index 27cbc717..a8fd61c7 100644 --- a/app/src/main/res/layout/activity_album_detail.xml +++ b/app/src/main/res/layout/activity_album_detail.xml @@ -67,10 +67,21 @@ android:layout_height="@dimen/statusMargin" android:background="@android:color/transparent" /> - + + + + + + +