diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java index dd3383d6..e24165ef 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java @@ -27,11 +27,9 @@ public abstract class AbsMultiSelectAdapter 0) { - I identifier = getIdentifier(position); - if (!checked.remove(identifier)) checked.add(identifier); - notifyItemChanged(position); - } + I identifier = getIdentifier(position); + if (!checked.remove(identifier)) checked.add(identifier); + notifyItemChanged(position); if (checked.isEmpty()) cab.finish(); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java index 13e80325..4f44b2c9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java @@ -1,27 +1,39 @@ package com.kabouzeid.gramophone.adapter; -import android.app.Activity; +import android.annotation.TargetApi; import android.graphics.Bitmap; +import android.os.Build; import android.support.v4.util.Pair; +import android.support.v7.app.AppCompatActivity; import android.support.v7.graphics.Palette; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.afollestad.materialdialogs.util.DialogUtils; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; +import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; +import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.loader.AlbumLoader; +import com.kabouzeid.gramophone.loader.AlbumSongLoader; 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; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PreferenceUtils; +import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.ViewUtil; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; @@ -29,15 +41,16 @@ import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.squareup.otto.Subscribe; +import java.util.ArrayList; import java.util.List; /** * @author Karim Abou Zeid (kabouzeid) */ -public class AlbumAdapter extends RecyclerView.Adapter { +public class AlbumAdapter extends AbsMultiSelectAdapter { public static final String TAG = AlbumAdapter.class.getSimpleName(); - private final Activity activity; + private final AppCompatActivity activity; private boolean usePalette; private List dataSet; @@ -53,6 +66,10 @@ public class AlbumAdapter extends RecyclerView.Adapter resetColors(holder.title, holder.artist, holder.footer); + final boolean isChecked = isChecked(album); + holder.view.setActivated(isChecked); + holder.checkMark.setVisibility(isChecked ? View.VISIBLE : View.INVISIBLE); + holder.title.setText(album.title); holder.artist.setText(album.artistName); @@ -85,34 +102,90 @@ public class AlbumAdapter extends RecyclerView.Adapter return dataSet.size(); } - public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + @Override + protected Album getIdentifier(int position) { + return dataSet.get(position); + } + + @Override + protected void onMultipleItemAction(MenuItem menuItem, ArrayList selection) { + switch (menuItem.getItemId()) { + case R.id.action_delete_from_disk: + DeleteSongsDialog.create(getSongList(selection)).show(activity.getSupportFragmentManager(), "DELETE_SONGS"); + 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 getSongList(List albums) { + final ArrayList songs = new ArrayList<>(); + for (Album album : albums) { + songs.addAll(AlbumSongLoader.getAlbumSongList(activity, album.id)); + } + return songs; + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { final ImageView albumArt; final TextView title; final TextView artist; final View footer; + final ImageView checkMark; + final View view; public ViewHolder(View itemView) { super(itemView); + view = itemView; albumArt = (ImageView) itemView.findViewById(R.id.album_art); title = (TextView) itemView.findViewById(R.id.album_title); artist = (TextView) itemView.findViewById(R.id.album_interpret); footer = itemView.findViewById(R.id.footer); - itemView.setOnClickListener(this); + checkMark = (ImageView) itemView.findViewById(R.id.check_mark); + view.setOnClickListener(this); + view.setOnLongClickListener(this); + + // fixes the ripple starts at the right position + if (Util.isAtLeastLollipop()) { + view.setOnTouchListener(new View.OnTouchListener() { + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + ((FrameLayout) view.findViewById(R.id.content)).getForeground().setHotspot(motionEvent.getX(), motionEvent.getY()); + return false; + } + }); + } } @Override public void onClick(View v) { - 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()).id, albumPairs); + if (isInQuickSelectMode()) { + toggleChecked(getAdapterPosition()); + } else { + 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()).id, albumPairs); + } + } + + @Override + public boolean onLongClick(View view) { + toggleChecked(getAdapterPosition()); + return true; } } - public AlbumAdapter(Activity activity) { + public AlbumAdapter(AppCompatActivity activity, CabHolder cabHolder) { + super(cabHolder, R.menu.menu_media_selection); this.activity = activity; usePalette = PreferenceUtils.getInstance(activity).coloredAlbumFootersEnabled(); loadDataSet(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java index ceb05a2c..5da11120 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java @@ -184,7 +184,8 @@ public class SongAdapter extends AbsMultiSelectAdapter + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="1dp"> - - - + android:layout_height="wrap_content" + android:foreground="?rect_selector"> + tools:ignore="UnusedAttribute,UselessParent"> - + - + + + + + + + + - + + + diff --git a/app/src/main/res/layout/item_list_song.xml b/app/src/main/res/layout/item_list_song.xml index cafd0910..07a64767 100644 --- a/app/src/main/res/layout/item_list_song.xml +++ b/app/src/main/res/layout/item_list_song.xml @@ -1,8 +1,8 @@ + android:paddingRight="16dp"> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index f6f749c2..5d9ae327 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -18,6 +18,7 @@ + diff --git a/app/src/main/res/values/styles_parents.xml b/app/src/main/res/values/styles_parents.xml index d12ae983..b7e9c25c 100644 --- a/app/src/main/res/values/styles_parents.xml +++ b/app/src/main/res/values/styles_parents.xml @@ -25,6 +25,7 @@ #fff @color/materialmusic_dark_themed_drawable_color + @color/grey_900 @color/materialmusic_dark_default_bar_color @color/materialmusic_dark_default_bar_color @@ -56,6 +57,7 @@ #000 @color/materialmusic_themed_drawable_color + @color/white @color/materialmusic_default_bar_color @color/white