Album song multi select

This commit is contained in:
Karim Abou Zeid 2015-05-25 16:51:43 +02:00
commit 9d6ece0f31
3 changed files with 106 additions and 24 deletions

View file

@ -1,5 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter; package com.kabouzeid.gramophone.adapter.songadapter;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -11,8 +12,12 @@ 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.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.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
@ -21,13 +26,14 @@ import java.util.ArrayList;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class AlbumSongAdapter extends RecyclerView.Adapter<AlbumSongAdapter.ViewHolder> { public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.ViewHolder, Song> {
public static final String TAG = AlbumSongAdapter.class.getSimpleName(); public static final String TAG = AlbumSongAdapter.class.getSimpleName();
protected final AppCompatActivity activity; protected final AppCompatActivity activity;
protected final ArrayList<Song> dataSet; protected final ArrayList<Song> dataSet;
public AlbumSongAdapter(AppCompatActivity activity, ArrayList<Song> objects) { public AlbumSongAdapter(AppCompatActivity activity, ArrayList<Song> objects, @Nullable CabHolder cabHolder) {
super(cabHolder, R.menu.menu_media_selection);
this.activity = activity; this.activity = activity;
dataSet = objects; dataSet = objects;
} }
@ -47,6 +53,7 @@ public class AlbumSongAdapter extends RecyclerView.Adapter<AlbumSongAdapter.View
holder.trackNumber.setText(trackNumberString); holder.trackNumber.setText(trackNumberString);
holder.songTitle.setText(song.title); holder.songTitle.setText(song.title);
holder.artistName.setText(MusicUtil.getReadableDurationString(song.duration)); holder.artistName.setText(MusicUtil.getReadableDurationString(song.duration));
holder.view.setActivated(isChecked(song));
} }
@Override @Override
@ -54,27 +61,43 @@ public class AlbumSongAdapter extends RecyclerView.Adapter<AlbumSongAdapter.View
return dataSet.size(); return dataSet.size();
} }
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { @Override
protected Song getIdentifier(int position) {
return dataSet.get(position);
}
@Override
protected void onMultipleItemAction(MenuItem menuItem, ArrayList<Song> 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 songTitle;
final TextView trackNumber; final TextView trackNumber;
final TextView artistName; final TextView artistName;
final ImageView overflowButton; final ImageView overflowButton;
final View view;
public ViewHolder(View itemView) { public ViewHolder(View itemView) {
super(itemView); super(itemView);
view = itemView;
songTitle = (TextView) itemView.findViewById(R.id.song_title); songTitle = (TextView) itemView.findViewById(R.id.song_title);
trackNumber = (TextView) itemView.findViewById(R.id.track_number); trackNumber = (TextView) itemView.findViewById(R.id.track_number);
artistName = (TextView) itemView.findViewById(R.id.song_info); artistName = (TextView) itemView.findViewById(R.id.song_info);
overflowButton = (ImageView) itemView.findViewById(R.id.menu); overflowButton = (ImageView) itemView.findViewById(R.id.menu);
overflowButton.setOnClickListener(this); view.setOnClickListener(this);
itemView.setOnClickListener(new View.OnClickListener() { view.setOnLongClickListener(this);
@Override overflowButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MusicPlayerRemote.openQueue(dataSet, getAdapterPosition(), true);
}
});
}
@Override @Override
public void onClick(View v) { public void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(activity, v); PopupMenu popupMenu = new PopupMenu(activity, v);
@ -87,5 +110,22 @@ public class AlbumSongAdapter extends RecyclerView.Adapter<AlbumSongAdapter.View
}); });
popupMenu.show(); popupMenu.show();
} }
});
}
@Override
public void onClick(View v) {
if (isInQuickSelectMode()) {
toggleChecked(getAdapterPosition());
} else {
MusicPlayerRemote.openQueue(dataSet, getAdapterPosition(), true);
}
}
@Override
public boolean onLongClick(View view) {
toggleChecked(getAdapterPosition());
return true;
}
} }
} }

View file

@ -16,12 +16,14 @@ import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab;
import com.afollestad.materialdialogs.util.DialogUtils; import com.afollestad.materialdialogs.util.DialogUtils;
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView; import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.songadapter.AlbumSongAdapter; import com.kabouzeid.gramophone.adapter.songadapter.AlbumSongAdapter;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.loader.AlbumSongLoader;
@ -51,7 +53,7 @@ import java.util.ArrayList;
* <p/> * <p/>
* Should be kinda stable ONLY AS IT IS!!! * 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(); public static final String TAG = AlbumDetailActivity.class.getSimpleName();
private static final int TAG_EDITOR_REQUEST = 2001; private static final int TAG_EDITOR_REQUEST = 2001;
@ -63,10 +65,12 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
private View songsBackgroundView; private View songsBackgroundView;
private TextView albumTitleView; private TextView albumTitleView;
private Toolbar toolbar; private Toolbar toolbar;
private MaterialCab cab;
private int headerOffset; private int headerOffset;
private int titleViewHeight; private int titleViewHeight;
private int albumArtViewHeight; private int albumArtViewHeight;
private int toolbarColor; private int toolbarColor;
private float toolbarAlpha;
private int bottomOffset; private int bottomOffset;
private final SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() { 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)); ViewHelper.setTranslationY(songsBackgroundView, Math.max(0, -scrollY + albumArtViewHeight));
// Change alpha of overlay // Change alpha of overlay
float alpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange)); toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange));
ViewUtil.setBackgroundAlpha(toolbar, alpha, toolbarColor); ViewUtil.setBackgroundAlpha(toolbar, toolbarAlpha, toolbarColor);
ViewUtil.setBackgroundAlpha(statusBar, alpha, toolbarColor); ViewUtil.setBackgroundAlpha(statusBar, cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor);
// Translate name text // Translate name text
int maxTitleTranslationY = albumArtViewHeight; int maxTitleTranslationY = albumArtViewHeight;
@ -278,7 +282,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
private void setUpSongsAdapter() { private void setUpSongsAdapter() {
final ArrayList<Song> songs = AlbumSongLoader.getAlbumSongList(this, album.id); final ArrayList<Song> 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.setLayoutManager(new GridLayoutManager(this, 1));
recyclerView.setAdapter(albumSongAdapter); recyclerView.setAdapter(albumSongAdapter);
} }
@ -358,4 +362,31 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
super.onDestroy(); super.onDestroy();
App.bus.unregister(this); 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;
}
} }

View file

@ -67,11 +67,22 @@
android:layout_height="@dimen/statusMargin" android:layout_height="@dimen/statusMargin"
android:background="@android:color/transparent" /> android:background="@android:color/transparent" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
style="@style/Toolbar" style="@style/Toolbar"
android:background="@android:color/transparent" /> android:background="@android:color/transparent" />
<ViewStub
android:id="@+id/cab_stub"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
</FrameLayout>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout