From 4e3f75d295c65ef22ba37eddeb7fd2d9b4694e60 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sun, 24 May 2015 23:00:46 +0200 Subject: [PATCH] Added album multi select and fixed some minor bugs. --- .../adapter/AbsMultiSelectAdapter.java | 8 +- .../gramophone/adapter/AlbumAdapter.java | 99 ++++++++++++++--- .../adapter/songadapter/SongAdapter.java | 3 +- .../ui/activities/MainActivity.java | 2 +- .../AlbumViewFragment.java | 2 +- .../ArtistViewFragment.java | 2 +- .../PlaylistViewFragment.java | 3 +- .../SongViewFragment.java | 3 +- .../drawable-xxxhdpi/ic_check_white_96dp.png | Bin 0 -> 2310 bytes app/src/main/res/layout/item_grid_album.xml | 101 +++++++++++------- app/src/main/res/layout/item_list_song.xml | 10 +- app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/styles_parents.xml | 2 + 13 files changed, 164 insertions(+), 72 deletions(-) create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_check_white_96dp.png 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 AbsMultiSelectAdapterL=Y%soeZamO&?@@4xlU>Y%@J3}O?WOpX57FUXMb!1ALx6GQa3Nk60+8+5IV{<$$E zct87LZwqE|pX=E#$RKgk_HjN7gImc$kfMnyl?4Yu48a&pkm|GRWa^a}Hn?#gz0bk0 z=HwxedD#ZX|KDu|Y0?rsexHLOB*ODgFT;UJ&wlI=kF8Z^*sx&gvHKhhF_%w))T~RK z05Z>8O6T8f$;S4p{0vpzpAxp;w!QndEI)MrQy25A{0tJ;{>=XW`|AEv^AlI?lRdEE zi2MS@kL(#4egE07s*2Y)uy)!zI6vaQFyRNYiOKQ*hhI(Vwm;AWRps%AQEJxX|AD0^ zkIE-FLRG2!W8ej8D*j`?PH*QAW*v|!q56ilXFuwLVv9bqM}W+Nsd~hJ;eyP6|JB}l z{}{MIs-Q+^^!-oAZ~#ct*^mGC?0WKue}lqD_6(5GvmXC<#c+UXrN%#ovmFSxL$z)~ z(dzYS)emM9WvGLp?l(F9e>H|Ly*|xCRe3??|9WhWHpk)U`Y;r)pZ)lM8;Vn)USDYW z?|$g?m_LkSD*rC{OfsK*CuDzf)Fb}0DwRh6RjbrbYF~Z7uB%h9Azx>PP-Rh*jQTTl}Yfh2G8| zhn>!K{6ARjmSBBEe%4O+KfMRqI_yn~8-K{}$!9sH`tQOS*2nc99D5EFZ0i5te^u4~ za7eASM3A2Re`aNa2_5!dCcQrT{{RP%!Xy5@Pkw#0|6$;kuvO{b1@CFy{|~wwGOZT= z*dDj3<_~|*fvyz!|MORQ*R`$uRc5f{%F+K19!oS93D&<*{rb`Vhl<+*pCj^BC#ygn z;sPmMUH>C}#;SaF=TpBP)qlwBIgkW0_nP$o=JQD`>+~M+?@jsp(cXY5T;yYWoRQxj ze!G6b9XnL|mHvGYm;GnI&HO6A#l`()yXV%c7dU##y)E0FzWeUG`B(ETFWxpcHxK@* zoRHzU>{a~Zb01m-ckKUhR{q2eOj6|Jh$Jo;L`+ z&sWhY(Rj7%2lMr5hVBm{&1{$i>k~93i&^%aWph_}#IK|4wjgGbxzay}R*)H~%*p~E z*;j!qw_^qw9nme(sG6_)@4&8QvztJYq z7@Vj2@4z;YLRIcQha>VgR`pmjt=BJ@ecZEd{l6Q=K3D74H8>vOxKk?pk-h4~4CN2m z>kOC#>le)Kv1ZDT`M~yw|I3tP$`fk;{9o~J21t2cLoY~K^gBZ)!TN^1J=RS9=YNEK zWZ$97>!$FCzhHY#1m^|d=dU`tSNd!X@%-`$9z*^o(J`1bP3C{SGyT=4kaiXgx=>)2xbEr;m0t0%O{W#%o{SbK}P5?=&s3OS@x=$VaujT zAPI&GK_5AMuHNUr5Oonm^B%|p*|}f5AzDnTapf;-#vO;Jx+kpqXU7otz)RU6v|gOS zea8ooQsx7kdL~T4U&|Q^+N%2wg#4{zc=zy(;EYxGc@MD8v0w`RTFtm)fwFtTsycOs z@DCvC?z0~dwM}PP_Ntt5L&N^w10kSF)1?1E$X~tzs?Zan|8XCxoOFp}mS-Hu37)Qg JF6*2UngDOgxXb_m literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/item_grid_album.xml b/app/src/main/res/layout/item_grid_album.xml index 5de6df4b..5c78cee7 100644 --- a/app/src/main/res/layout/item_grid_album.xml +++ b/app/src/main/res/layout/item_grid_album.xml @@ -1,56 +1,75 @@ + 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