Adapter clean ups

This commit is contained in:
Karim Abou Zeid 2015-07-12 03:22:24 +02:00
commit 98dcdf2d47
55 changed files with 811 additions and 1147 deletions

View file

@ -18,7 +18,6 @@ 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;
@ -47,6 +46,9 @@ import com.squareup.otto.Subscribe;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -55,15 +57,24 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
public static final String TAG = AlbumAdapter.class.getSimpleName();
private static final int FADE_IN_TIME = 500;
@NonNull
private final AppCompatActivity activity;
private boolean usePalette;
private List<Album> dataSet;
private int defaultFooterColor;
public AlbumAdapter(@NonNull AppCompatActivity activity, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
usePalette = PreferenceUtil.getInstance(activity).coloredAlbumFooters();
defaultFooterColor = ColorUtil.resolveColor(activity, R.attr.default_bar_color);
loadDataSet();
setHasStableIds(true);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_grid_album, parent, false);
View view = LayoutInflater.from(activity).inflate(R.layout.item_grid, parent, false);
return new ViewHolder(view);
}
@ -71,18 +82,18 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Album album = dataSet.get(position);
resetColors(holder.title, holder.artist, holder.footer);
setFooterColor(holder.title, holder.text, holder.footer, defaultFooterColor, false);
final boolean isChecked = isChecked(album);
holder.view.setActivated(isChecked);
holder.checkMark.setVisibility(isChecked ? View.VISIBLE : View.INVISIBLE);
holder.itemView.setActivated(isChecked);
holder.selectedIndicator.setVisibility(isChecked ? View.VISIBLE : View.GONE);
holder.title.setText(album.title);
holder.artist.setText(album.artistName);
holder.text.setText(album.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumImageLoaderString(album),
holder.albumArt,
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art)
@ -94,13 +105,13 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
FadeInBitmapDisplayer.animate(view, FADE_IN_TIME);
if (usePalette)
paletteBlackAndWhite(holder.title, holder.artist, holder.footer);
applyPalette(null, holder.title, holder.text, holder.footer);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (usePalette)
applyPalette(loadedImage, holder.title, holder.artist, holder.footer);
applyPalette(loadedImage, holder.title, holder.text, holder.footer);
}
}
);
@ -141,37 +152,33 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull
final ImageView albumArt;
@NonNull
final TextView title;
@NonNull
final TextView artist;
final View footer;
@NonNull
final ImageView checkMark;
@NonNull
final View view;
@InjectView(R.id.image)
ImageView image;
@InjectView(R.id.title)
TextView title;
@InjectView(R.id.text)
TextView text;
@InjectView(R.id.footer)
View footer;
@InjectView(R.id.selected_indicator)
ImageView selectedIndicator;
public ViewHolder(@NonNull 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);
checkMark = (ImageView) itemView.findViewById(R.id.check_mark);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
ButterKnife.inject(this, itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
// fixes the ripple starts at the right position
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
view.setOnTouchListener(new View.OnTouchListener() {
image.setTransitionName(activity.getString(R.string.transition_album_art));
// fixes the ripple, so that it starts at the right position instead of in the middle
itemView.setOnTouchListener(new View.OnTouchListener() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onTouch(@NonNull View view, @NonNull MotionEvent motionEvent) {
((FrameLayout) view.findViewById(R.id.content)).getForeground().setHotspot(motionEvent.getX(), motionEvent.getY());
((FrameLayout) view.findViewById(R.id.container)).getForeground().setHotspot(motionEvent.getX(), motionEvent.getY());
return false;
}
});
@ -184,8 +191,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
toggleChecked(getAdapterPosition());
} else {
Pair[] albumPairs = new Pair[]{
Pair.create(albumArt,
activity.getResources().getString(R.string.transition_album_cover)
Pair.create(image,
activity.getResources().getString(R.string.transition_album_art)
)};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
@ -200,14 +207,6 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
}
}
public AlbumAdapter(@NonNull AppCompatActivity activity, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
usePalette = PreferenceUtil.getInstance(activity).coloredAlbumFooters();
loadDataSet();
setHasStableIds(true);
}
@Override
public long getItemId(int position) {
return dataSet.get(position).id;
@ -224,33 +223,23 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@NonNull Palette palette) {
final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();
if (vibrantSwatch != null) {
title.setTextColor(ColorUtil.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
artist.setTextColor(ColorUtil.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
ViewUtil.animateViewColor(footer, footer.getDrawingCacheBackgroundColor(), vibrantSwatch.getRgb());
} else {
paletteBlackAndWhite(title, artist, footer);
}
setFooterColor(title, artist, footer, palette.getVibrantColor(defaultFooterColor), true);
}
});
} else {
paletteBlackAndWhite(title, artist, footer);
setFooterColor(title, artist, footer, defaultFooterColor, true);
}
}
private void paletteBlackAndWhite(@NonNull final TextView title, @NonNull final TextView artist, final View footer) {
title.setTextColor(ColorUtil.getOpaqueColor(DialogUtils.resolveColor(activity, R.attr.title_text_color)));
artist.setTextColor(ColorUtil.getOpaqueColor(DialogUtils.resolveColor(activity, R.attr.caption_text_color)));
int defaultBarColor = DialogUtils.resolveColor(activity, R.attr.default_bar_color);
ViewUtil.animateViewColor(footer, defaultBarColor, defaultBarColor);
}
private void resetColors(@NonNull final TextView title, @NonNull final TextView artist, @NonNull final View footer) {
title.setTextColor(DialogUtils.resolveColor(activity, R.attr.title_text_color));
artist.setTextColor(DialogUtils.resolveColor(activity, R.attr.caption_text_color));
int defaultBarColor = DialogUtils.resolveColor(activity, R.attr.default_bar_color);
footer.setBackgroundColor(defaultBarColor);
private void setFooterColor(@NonNull final TextView title, @NonNull final TextView artist, final View footer, int footerColor, boolean animate) {
int textColor = ColorUtil.getTextColorForBackground(footerColor);
title.setTextColor(textColor);
artist.setTextColor(textColor);
if (animate) {
ViewUtil.animateViewColor(footer, footer.getDrawingCacheBackgroundColor(), footerColor);
} else {
footer.setBackgroundColor(footerColor);
}
}
@Override

View file

@ -1,5 +1,6 @@
package com.kabouzeid.gramophone.adapter;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
@ -29,6 +30,9 @@ import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -65,7 +69,7 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter<ArtistAlbumAdapter
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_grid_artist_album, parent, false);
View view = LayoutInflater.from(activity).inflate(R.layout.item_grid_card, parent, false);
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
if (viewType == TYPE_FIRST) {
params.leftMargin = listMargin;
@ -81,7 +85,7 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter<ArtistAlbumAdapter
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumImageLoaderString(album),
holder.albumArt,
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art)
@ -90,8 +94,8 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter<ArtistAlbumAdapter
);
holder.title.setText(album.title);
holder.year.setText(String.valueOf(album.year));
holder.view.setActivated(isChecked(album));
holder.text.setText(String.valueOf(album.year));
holder.itemView.setActivated(isChecked(album));
}
@Override
@ -138,23 +142,23 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter<ArtistAlbumAdapter
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull
final ImageView albumArt;
@NonNull
final TextView title;
@NonNull
final TextView year;
@NonNull
final View view;
@InjectView(R.id.image)
ImageView image;
@InjectView(R.id.title)
TextView title;
@InjectView(R.id.text)
TextView text;
public ViewHolder(@NonNull View itemView) {
super(itemView);
view = itemView;
albumArt = (ImageView) itemView.findViewById(R.id.album_art);
title = (TextView) itemView.findViewById(R.id.album_title);
year = (TextView) itemView.findViewById(R.id.album_year);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
ButterKnife.inject(this, itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
image.setTransitionName(activity.getString(R.string.transition_album_art));
}
}
@Override
@ -163,8 +167,8 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter<ArtistAlbumAdapter
toggleChecked(getAdapterPosition());
} else {
Pair[] albumPairs = new Pair[]{
Pair.create(albumArt,
activity.getResources().getString(R.string.transition_album_cover)
Pair.create(image,
activity.getResources().getString(R.string.transition_album_art)
)};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);

View file

@ -9,13 +9,12 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.Util;
@ -30,7 +29,7 @@ public class PlayingQueueAdapter extends ArrayAdapter<Song> {
private final AppCompatActivity activity;
public PlayingQueueAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList<Song> playList) {
super(activity, R.layout.item_list_playlist_song, playList);
super(activity, R.layout.item_list_single_row, playList);
this.activity = activity;
}
@ -39,10 +38,10 @@ public class PlayingQueueAdapter extends ArrayAdapter<Song> {
public View getView(final int position, @Nullable View convertView, ViewGroup parent) {
final Song song = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(activity).inflate(R.layout.item_list_playlist_song, parent, false);
convertView = LayoutInflater.from(activity).inflate(R.layout.item_list_single_row, parent, false);
}
final TextView title = (TextView) convertView.findViewById(R.id.song_title);
final ImageView playingIndicator = (ImageView) convertView.findViewById(R.id.playing_indicator);
final TextView title = (TextView) convertView.findViewById(R.id.title);
final ImageView playingIndicator = (ImageView) convertView.findViewById(R.id.image);
final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
title.setText(song.title);
@ -53,23 +52,25 @@ public class PlayingQueueAdapter extends ArrayAdapter<Song> {
playingIndicator.setVisibility(View.GONE);
}
overflowButton.setOnClickListener(new View.OnClickListener() {
overflowButton.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override
public void onClick(final View v) {
PopupMenu popupMenu = new PopupMenu(activity, v);
popupMenu.inflate(R.menu.menu_item_playing_queue_song);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(@NonNull MenuItem item) {
if (item.getItemId() == R.id.action_remove_from_playing_queue) {
MusicPlayerRemote.removeFromQueue(position);
notifyDataSetChanged();
return true;
}
return MenuItemClickHelper.handleSongMenuClick(activity, song, item);
}
});
popupMenu.show();
public Song getSong() {
return song;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_remove_from_playing_queue) {
MusicPlayerRemote.removeFromQueue(position);
notifyDataSetChanged();
return true;
}
return super.onMenuItemClick(item);
}
@Override
public int getMenuRes() {
return R.menu.menu_item_playing_queue_song;
}
});
return convertView;

View file

@ -1,5 +1,6 @@
package com.kabouzeid.gramophone.adapter;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
@ -18,8 +19,8 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.ClearSmartPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.PlaylistMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.loader.PlaylistLoader;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
@ -31,8 +32,10 @@ import com.kabouzeid.gramophone.model.smartplaylist.LastAddedPlaylist;
import com.kabouzeid.gramophone.model.smartplaylist.MyTopTracksPlaylist;
import com.kabouzeid.gramophone.model.smartplaylist.RecentlyPlayedPlaylist;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.Util;
import com.squareup.otto.Subscribe;
import java.util.ArrayList;
@ -48,8 +51,8 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
public static final String TAG = PlaylistAdapter.class.getSimpleName();
private int VIEW_TYPE_SMART = 0;
private int VIEW_TYPE_DEFAULT = 1;
private int SMART_PLAYLIST = 0;
private int DEFAULT_PLAYLIST = 1;
protected final AppCompatActivity activity;
protected List<Playlist> dataSet;
@ -79,17 +82,21 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
int layoutRes = viewType == VIEW_TYPE_DEFAULT ? R.layout.item_list_playlist : R.layout.item_list_smart_playlist;
View view = LayoutInflater.from(activity).inflate(layoutRes, parent, false);
return new ViewHolder(view);
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_single_row, parent, false);
return new ViewHolder(view, viewType);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final Playlist playlist = dataSet.get(position);
holder.playlistName.setText(playlist.name);
holder.view.setActivated(isChecked(playlist));
holder.icon.setImageResource(getIconRes(playlist));
holder.itemView.setActivated(isChecked(playlist));
holder.icon.setImageDrawable(Util.getTintedDrawable(
activity,
getIconRes(playlist),
ColorUtil.resolveColor(activity, R.attr.themed_drawable_color)
));
}
private int getIconRes(Playlist playlist) {
@ -101,7 +108,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
@Override
public int getItemViewType(int position) {
return dataSet.get(position) instanceof AbsSmartPlaylist ? VIEW_TYPE_SMART : VIEW_TYPE_DEFAULT;
return dataSet.get(position) instanceof AbsSmartPlaylist ? SMART_PLAYLIST : DEFAULT_PLAYLIST;
}
@Override
@ -154,25 +161,37 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@InjectView(R.id.playlist_name)
@InjectView(R.id.title)
TextView playlistName;
@InjectView(R.id.menu)
View menu;
@InjectView(R.id.playlist_icon)
@InjectView(R.id.image)
ImageView icon;
View view;
@InjectView(R.id.short_separator)
View shortSeparator;
public ViewHolder(@NonNull View itemView) {
public ViewHolder(@NonNull View itemView, int itemViewType) {
super(itemView);
ButterKnife.inject(this, itemView);
view = itemView;
view.setOnClickListener(this);
view.setOnLongClickListener(this);
if (itemViewType == SMART_PLAYLIST) {
shortSeparator.setVisibility(View.GONE);
itemView.setBackgroundColor(ColorUtil.resolveColor(activity, R.attr.card_color));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation));
}
}
int padding = activity.getResources().getDimensionPixelSize(R.dimen.list_item_image_icon_padding);
icon.setPadding(padding, padding, padding, padding);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PopupMenu popupMenu = new PopupMenu(activity, view);
popupMenu.inflate(getItemViewType() == VIEW_TYPE_SMART ? R.menu.menu_item_smart_playlist : R.menu.menu_item_playlist);
popupMenu.inflate(getItemViewType() == SMART_PLAYLIST ? R.menu.menu_item_smart_playlist : R.menu.menu_item_playlist);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(@NonNull MenuItem item) {
@ -183,7 +202,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
return true;
}
}
return MenuItemClickHelper.handlePlaylistMenuClick(
return PlaylistMenuHelper.handleMenuClick(
activity, dataSet.get(getAdapterPosition()), item);
}
});

View file

@ -1,22 +1,21 @@
package com.kabouzeid.gramophone.adapter;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image;
@ -37,6 +36,9 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.Optional;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
@ -100,22 +102,19 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ALBUM)
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_search_album, parent, false), viewType);
if (viewType == ARTIST)
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_search_artist, parent, false), viewType);
if (viewType == SONG)
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_search_song, parent, false), viewType);
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_search_header, parent, false), viewType);
if (viewType == HEADER)
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.sub_header, parent, false), viewType);
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false), viewType);
}
@SuppressWarnings("ConstantConditions")
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case ALBUM:
final Album album = (Album) results.get(position);
holder.title.setText(album.title);
holder.subTitle.setText(album.artistName);
holder.text.setText(album.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumImageLoaderString(album),
holder.image,
@ -129,7 +128,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
case ARTIST:
final Artist artist = (Artist) results.get(position);
holder.title.setText(artist.name);
holder.subTitle.setText(MusicUtil.getArtistInfoString(activity, artist));
holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
if (MusicUtil.isArtistNameUnknown(artist.name)) {
holder.image.setImageResource(R.drawable.default_artist_image);
break;
@ -169,7 +168,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
case SONG:
final Song song = (Song) results.get(position);
holder.title.setText(song.title);
holder.subTitle.setText(song.albumName);
holder.text.setText(song.albumName);
break;
default:
holder.title.setText(results.get(position).toString());
@ -183,53 +182,46 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@InjectView(R.id.title)
TextView title;
@Nullable
private final ImageView image;
@NonNull
public final TextView title;
@Optional
@InjectView(R.id.image)
ImageView image;
@Nullable
public final TextView subTitle;
private final int viewType;
@Optional
@InjectView(R.id.text)
TextView text;
@Nullable
@Optional
@InjectView(R.id.menu)
View menu;
public ViewHolder(@NonNull View itemView, int viewType) {
@SuppressWarnings("ConstantConditions")
public ViewHolder(@NonNull View itemView, int itemViewType) {
super(itemView);
itemView.setOnClickListener(this);
this.viewType = viewType;
switch (viewType) {
case ALBUM:
image = (ImageView) itemView.findViewById(R.id.album_art);
title = (TextView) itemView.findViewById(R.id.album_title);
subTitle = (TextView) itemView.findViewById(R.id.album_artist);
break;
case ARTIST:
image = (ImageView) itemView.findViewById(R.id.artist_image);
title = (TextView) itemView.findViewById(R.id.artist_name);
subTitle = (TextView) itemView.findViewById(R.id.artist_info);
break;
ButterKnife.inject(this, itemView);
switch (itemViewType) {
case SONG:
image = null;
title = (TextView) itemView.findViewById(R.id.song_title);
subTitle = (TextView) itemView.findViewById(R.id.song_info);
itemView.findViewById(R.id.menu).setOnClickListener(new View.OnClickListener() {
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override
public void onClick(View view) {
PopupMenu popupMenu = new PopupMenu(activity, view);
popupMenu.inflate(R.menu.menu_item_song);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(@NonNull MenuItem menuItem) {
return MenuItemClickHelper.handleSongMenuClick(activity, (Song) results.get(getAdapterPosition()), menuItem);
}
});
popupMenu.show();
public Song getSong() {
return (Song) results.get(getAdapterPosition());
}
});
break;
default:
image = null;
title = (TextView) itemView.findViewById(R.id.title);
subTitle = null;
itemView.setOnClickListener(null);
case ALBUM:
menu.setVisibility(View.GONE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
image.setTransitionName(activity.getString(R.string.transition_album_art));
}
break;
case ARTIST:
menu.setVisibility(View.GONE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
image.setTransitionName(activity.getString(R.string.transition_artist_image));
}
break;
}
}
@ -237,13 +229,13 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
@Override
public void onClick(View view) {
Object item = results.get(getAdapterPosition());
switch (viewType) {
switch (getItemViewType()) {
case ALBUM:
NavigationUtil.goToAlbum(activity,
((Album) item).id,
new Pair[]{
Pair.create(image,
activity.getResources().getString(R.string.transition_album_cover)
activity.getResources().getString(R.string.transition_album_art)
)
});
break;
@ -252,7 +244,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
((Artist) item).id,
new Pair[]{
Pair.create(image,
activity.getResources().getString(R.string.transition_artist_image)
activity.getResources().getString(R.string.transition_album_art)
)
});
break;

View file

@ -1,19 +1,19 @@
package com.kabouzeid.gramophone.adapter;
package com.kabouzeid.gramophone.adapter.artist;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.kabouzeid.gramophone.App;
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.MusicPlayerRemote;
@ -36,6 +36,8 @@ import com.squareup.otto.Subscribe;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
@ -43,14 +45,12 @@ import retrofit.client.Response;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist> {
@NonNull
public abstract class AbsArtistAdapter extends AbsMultiSelectAdapter<AbsArtistAdapter.ViewHolder, Artist> {
protected final AppCompatActivity activity;
protected List<Artist> dataSet;
@NonNull
protected final LastFMRestClient lastFMRestClient;
public ArtistAdapter(@NonNull AppCompatActivity activity, @Nullable CabHolder cabHolder) {
public AbsArtistAdapter(@NonNull AppCompatActivity activity, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
lastFMRestClient = new LastFMRestClient(activity);
@ -67,23 +67,26 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
dataSet = ArtistLoader.getAllArtists(activity);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_artist, parent, false);
return new ViewHolder(view);
protected Image getArtistImageToUse(List<Image> images) {
int thumbnailIndex = 0;
if (images.size() > 2) {
thumbnailIndex = 2;
} else if (images.size() > 1) {
thumbnailIndex = 1;
}
return images.get(thumbnailIndex);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Artist artist = dataSet.get(position);
holder.artistName.setText(artist.name);
holder.artistInfo.setText(MusicUtil.getArtistInfoString(activity, artist));
holder.view.setActivated(isChecked(artist));
holder.title.setText(artist.name);
holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
holder.itemView.setActivated(isChecked(artist));
if (MusicUtil.isArtistNameUnknown(artist.name)) {
holder.artistImage.setImageResource(R.drawable.default_artist_image);
holder.image.setImageResource(R.drawable.default_artist_image);
return;
}
@ -91,15 +94,9 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
@Override
public void success(@NonNull ArtistInfo artistInfo, Response response) {
if (artistInfo.getArtist() != null) {
int thumbnailIndex = 0;
List<Image> images = artistInfo.getArtist().getImage();
if (images.size() > 2) {
thumbnailIndex = 2;
} else if (images.size() > 1) {
thumbnailIndex = 1;
}
ImageLoader.getInstance().displayImage(images.get(thumbnailIndex).getText(),
holder.artistImage,
ImageLoader.getInstance().displayImage(getArtistImageToUse(images).getText(),
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
@ -109,13 +106,13 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
.build()
);
} else {
holder.artistImage.setImageResource(R.drawable.default_artist_image);
holder.image.setImageResource(R.drawable.default_artist_image);
}
}
@Override
public void failure(RetrofitError error) {
holder.artistImage.setImageResource(R.drawable.default_artist_image);
holder.image.setImageResource(R.drawable.default_artist_image);
}
});
}
@ -154,48 +151,6 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
return songs;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull
final TextView artistName;
@NonNull
final TextView artistInfo;
@NonNull
final ImageView artistImage;
@NonNull
final View view;
public ViewHolder(@NonNull View itemView) {
super(itemView);
view = itemView;
artistName = (TextView) itemView.findViewById(R.id.artist_name);
artistInfo = (TextView) itemView.findViewById(R.id.artist_info);
artistImage = (ImageView) itemView.findViewById(R.id.artist_image);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
}
@Override
public void onClick(View v) {
if (isInQuickSelectMode()) {
toggleChecked(getAdapterPosition());
} else {
Pair[] artistPairs = new Pair[]{
Pair.create(artistImage,
activity.getResources().getString(R.string.transition_artist_image)
)};
if (activity instanceof AbsFabActivity)
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs);
NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).id, artistPairs);
}
}
@Override
public boolean onLongClick(View view) {
toggleChecked(getAdapterPosition());
return true;
}
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
@ -218,4 +173,45 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
break;
}
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@InjectView(R.id.title)
TextView title;
@InjectView(R.id.text)
TextView text;
@InjectView(R.id.image)
ImageView image;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.inject(this, itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
image.setTransitionName(activity.getString(R.string.transition_artist_image));
}
}
@Override
public void onClick(View v) {
if (isInQuickSelectMode()) {
toggleChecked(getAdapterPosition());
} else {
Pair[] artistPairs = new Pair[]{
Pair.create(image,
activity.getResources().getString(R.string.transition_artist_image)
)};
if (activity instanceof AbsFabActivity)
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs);
NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).id, artistPairs);
}
}
@Override
public boolean onLongClick(View view) {
toggleChecked(getAdapterPosition());
return true;
}
}
}

View file

@ -0,0 +1,34 @@
package com.kabouzeid.gramophone.adapter.artist;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image;
import java.util.List;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistGridAdapter extends AbsArtistAdapter {
public ArtistGridAdapter(@NonNull AppCompatActivity activity, @Nullable CabHolder cabHolder) {
super(activity, cabHolder);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_grid, parent, false);
return new ViewHolder(view);
}
@Override
protected Image getArtistImageToUse(List<Image> images) {
return images.get(images.size() - 1);
}
}

View file

@ -0,0 +1,26 @@
package com.kabouzeid.gramophone.adapter.artist;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.CabHolder;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistListAdapter extends AbsArtistAdapter {
public ArtistListAdapter(@NonNull AppCompatActivity activity, @Nullable CabHolder cabHolder) {
super(activity, cabHolder);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false);
return new ViewHolder(view);
}
}

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.adapter.songadapter;
package com.kabouzeid.gramophone.adapter.song;
import android.content.Context;
import android.support.annotation.Nullable;

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.adapter.songadapter;
package com.kabouzeid.gramophone.adapter.song;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@ -9,21 +9,23 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
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.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.MusicUtil;
import java.util.ArrayList;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -45,7 +47,7 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.Vie
return dataSet.get(position).id;
}
public void updateDataSet(ArrayList<Song> objects){
public void updateDataSet(ArrayList<Song> objects) {
dataSet = objects;
notifyDataSetChanged();
}
@ -53,7 +55,7 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.Vie
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_album_song, parent, false);
View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false);
return new ViewHolder(view);
}
@ -63,10 +65,10 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.Vie
final int trackNumber = MusicUtil.getFixedTrackNumber(song.trackNumber);
final String trackNumberString = trackNumber > 0 ? String.valueOf(trackNumber) : "-";
holder.trackNumber.setText(trackNumberString);
holder.songTitle.setText(song.title);
holder.artistName.setText(MusicUtil.getReadableDurationString(song.duration));
holder.view.setActivated(isChecked(song));
holder.track_number.setText(trackNumberString);
holder.title.setText(song.title);
holder.text.setText(MusicUtil.getReadableDurationString(song.duration));
holder.itemView.setActivated(isChecked(song));
}
@Override
@ -95,38 +97,31 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.Vie
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull
final TextView songTitle;
@NonNull
final TextView trackNumber;
@NonNull
final TextView artistName;
@NonNull
final ImageView overflowButton;
@NonNull
final View view;
@InjectView(R.id.title)
TextView title;
@InjectView(R.id.text)
TextView text;
@InjectView(R.id.image)
ImageView image;
@InjectView(R.id.image_text)
TextView track_number;
@InjectView(R.id.menu)
ImageView menu;
public ViewHolder(@NonNull 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);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
overflowButton.setOnClickListener(new View.OnClickListener() {
ButterKnife.inject(this, itemView);
menu.setVisibility(View.VISIBLE);
track_number.setVisibility(View.VISIBLE);
image.setVisibility(View.GONE);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@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(@NonNull MenuItem item) {
return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(getAdapterPosition()), item);
}
});
popupMenu.show();
public Song getSong() {
return dataSet.get(getAdapterPosition());
}
});
}

View file

@ -1,5 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter;
package com.kabouzeid.gramophone.adapter.song;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
@ -11,15 +12,14 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
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.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
@ -45,7 +45,7 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
private final AppCompatActivity activity;
public ArtistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList<Song> songs, @Nullable CabHolder cabHolder) {
super(activity, R.layout.item_list_song, songs);
super(activity, R.layout.item_list, songs);
this.activity = activity;
this.cabHolder = cabHolder;
checked = new ArrayList<>();
@ -63,12 +63,12 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
public View getView(final int position, @Nullable View convertView, ViewGroup parent) {
final Song song = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_list_artist_song, parent, false);
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_list, parent, false);
}
final TextView songTitle = (TextView) convertView.findViewById(R.id.song_title);
final TextView songInfo = (TextView) convertView.findViewById(R.id.song_info);
final ImageView albumArt = (ImageView) convertView.findViewById(R.id.album_art);
final TextView songTitle = (TextView) convertView.findViewById(R.id.title);
final TextView songInfo = (TextView) convertView.findViewById(R.id.text);
final ImageView albumArt = (ImageView) convertView.findViewById(R.id.image);
songTitle.setText(song.title);
songInfo.setText(song.albumName);
@ -83,29 +83,29 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
.build()
);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
albumArt.setTransitionName(activity.getString(R.string.transition_album_art));
}
final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
overflowButton.setOnClickListener(new View.OnClickListener() {
overflowButton.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@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(@NonNull MenuItem item) {
switch (item.getItemId()) {
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, song.albumId, albumPairs);
return true;
}
return MenuItemClickHelper.handleSongMenuClick(activity, song, item);
}
});
popupMenu.show();
public Song getSong() {
return song;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_go_to_album) {
Pair[] albumPairs = new Pair[]{
Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))
};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
return true;
}
return super.onMenuItemClick(item);
}
});

View file

@ -1,5 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter;
package com.kabouzeid.gramophone.adapter.song;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
@ -10,14 +11,13 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.RemoveFromPlaylistDialog;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.model.Playlist;
@ -33,6 +33,9 @@ import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* @author Karim Abou Zeid (kabouzeid)
@ -72,8 +75,8 @@ public class PlaylistSongAdapter extends AbsPlaylistSongAdapter<PlaylistSongAdap
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_song, parent, false);
return new ViewHolder(view, R.menu.menu_item_playlist_song);
View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false);
return new ViewHolder(view);
}
@Override
@ -81,11 +84,11 @@ public class PlaylistSongAdapter extends AbsPlaylistSongAdapter<PlaylistSongAdap
final PlaylistSong song = dataSet.get(position);
holder.itemView.setActivated(isChecked(song));
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
holder.title.setText(song.title);
holder.text.setText(song.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getSongImageLoaderString(song),
holder.albumArt,
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art)
@ -107,7 +110,7 @@ public class PlaylistSongAdapter extends AbsPlaylistSongAdapter<PlaylistSongAdap
@Override
protected void onMultipleItemAction(@NonNull MenuItem menuItem, ArrayList<PlaylistSong> selection) {
switch (menuItem.getItemId()) {
case R.id.action_delete_from_playlist:
case R.id.action_remove_from_playlist:
RemoveFromPlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
break;
case R.id.action_add_to_playlist:
@ -132,48 +135,53 @@ public class PlaylistSongAdapter extends AbsPlaylistSongAdapter<PlaylistSongAdap
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull
final TextView songTitle;
@NonNull
final TextView songInfo;
@NonNull
final ImageView overflowButton;
@NonNull
final ImageView albumArt;
@InjectView(R.id.title)
TextView title;
@InjectView(R.id.text)
TextView text;
@InjectView(R.id.menu)
ImageView menu;
@InjectView(R.id.image)
ImageView image;
public ViewHolder(@NonNull View itemView, final int songMenu) {
public ViewHolder(@NonNull View itemView) {
super(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);
ButterKnife.inject(this, itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
overflowButton = (ImageView) itemView.findViewById(R.id.menu);
overflowButton.setOnClickListener(new View.OnClickListener() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
image.setTransitionName(activity.getString(R.string.transition_album_art));
}
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override
public void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(activity, v);
popupMenu.inflate(songMenu);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_delete_from_playlist:
RemoveFromPlaylistDialog.create(dataSet.get(getAdapterPosition())).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
return true;
case R.id.action_go_to_album:
Pair[] albumPairs = new Pair[]{
Pair.create(albumArt, activity.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();
public Song getSong() {
return dataSet.get(getAdapterPosition());
}
@Override
public int getMenuRes() {
return R.menu.menu_item_playlist_song;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_remove_from_playlist:
RemoveFromPlaylistDialog.create((PlaylistSong) getSong()).show(activity.getSupportFragmentManager(), "REMOVE_FROM_PLAYLIST");
return true;
case R.id.action_go_to_album:
Pair[] albumPairs = new Pair[]{
Pair.create(image, activity.getString(R.string.transition_album_art))
};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, ((PlaylistSong) getSong()).albumId, albumPairs);
return true;
}
return super.onMenuItemClick(item);
}
});
}

View file

@ -1,6 +1,7 @@
package com.kabouzeid.gramophone.adapter.songadapter;
package com.kabouzeid.gramophone.adapter.song;
import android.graphics.Typeface;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity;
@ -10,7 +11,6 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab;
@ -20,8 +20,8 @@ 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.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
@ -35,6 +35,9 @@ import com.squareup.otto.Subscribe;
import java.util.ArrayList;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -67,7 +70,7 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_song, parent, false);
View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false);
return new ViewHolder(view);
}
@ -81,28 +84,28 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
if (getItemViewType(position) == SONG) {
final Song song = dataSet.get(position - 1);
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
holder.title.setText(song.title);
holder.text.setText(song.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getSongImageLoaderString(song),
holder.albumArt,
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art)
.resetViewBeforeLoading(true)
.build()
);
holder.view.setActivated(isChecked(song));
holder.itemView.setActivated(isChecked(song));
} else {
holder.songTitle.setText(activity.getResources().getString(R.string.action_shuffle_all).toUpperCase());
holder.songTitle.setTextColor(ThemeSingleton.get().positiveColor);
holder.songTitle.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
holder.songInfo.setVisibility(View.GONE);
holder.overflowButton.setVisibility(View.GONE);
holder.title.setText(activity.getResources().getString(R.string.action_shuffle_all).toUpperCase());
holder.title.setTextColor(ThemeSingleton.get().positiveColor);
holder.title.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
holder.text.setVisibility(View.GONE);
holder.menu.setVisibility(View.GONE);
final int padding = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin) / 2;
holder.albumArt.setPadding(padding, padding, padding, padding);
holder.albumArt.setColorFilter(ThemeSingleton.get().positiveColor);
holder.albumArt.setImageResource(R.drawable.ic_shuffle_white_48dp);
holder.image.setPadding(padding, padding, padding, padding);
holder.image.setColorFilter(ThemeSingleton.get().positiveColor);
holder.image.setImageResource(R.drawable.ic_shuffle_white_48dp);
holder.separator.setVisibility(View.VISIBLE);
holder.short_separator.setVisibility(View.GONE);
}
@ -135,53 +138,49 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull
final TextView songTitle;
@NonNull
final TextView songInfo;
@NonNull
final ImageView overflowButton;
@NonNull
final ImageView albumArt;
final View separator;
final View short_separator;
@NonNull
final View view;
@InjectView(R.id.title)
TextView title;
@InjectView(R.id.text)
TextView text;
@InjectView(R.id.menu)
ImageView menu;
@InjectView(R.id.image)
ImageView image;
@InjectView(R.id.separator)
View separator;
@InjectView(R.id.short_separator)
View short_separator;
public ViewHolder(@NonNull 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);
overflowButton = (ImageView) itemView.findViewById(R.id.menu);
separator = itemView.findViewById(R.id.separator);
short_separator = itemView.findViewById(R.id.short_separator);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
overflowButton.setOnClickListener(new View.OnClickListener() {
ButterKnife.inject(this, itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
image.setTransitionName(activity.getString(R.string.transition_album_art));
}
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override
public void onClick(View view) {
PopupMenu popupMenu = new PopupMenu(activity, view);
popupMenu.inflate(R.menu.menu_item_song);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(@NonNull MenuItem item) {
final int position = getAdapterPosition() - 1;
switch (item.getItemId()) {
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(position).albumId, albumPairs);
return true;
}
return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(position), item);
}
});
popupMenu.show();
public Song getSong() {
return dataSet.get(getAdapterPosition() - 1);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_go_to_album:
Pair[] albumPairs = new Pair[]{
Pair.create(image, activity.getResources().getString(R.string.transition_album_art))
};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, getSong().albumId, albumPairs);
return true;
}
return super.onMenuItemClick(item);
}
});
}

View file

@ -1,5 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter.smartplaylist;
package com.kabouzeid.gramophone.adapter.song.smartplaylist;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
@ -10,14 +11,13 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.songadapter.AbsPlaylistSongAdapter;
import com.kabouzeid.gramophone.adapter.song.AbsPlaylistSongAdapter;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
@ -30,6 +30,9 @@ import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -67,8 +70,8 @@ public class SmartPlaylistSongAdapter extends AbsPlaylistSongAdapter<SmartPlayli
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_song, parent, false);
return new ViewHolder(view, R.menu.menu_item_cannot_delete_single_songs_playlist_song);
View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false);
return new ViewHolder(view);
}
@Override
@ -76,11 +79,11 @@ public class SmartPlaylistSongAdapter extends AbsPlaylistSongAdapter<SmartPlayli
final Song song = dataSet.get(position);
holder.itemView.setActivated(isChecked(song));
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
holder.title.setText(song.title);
holder.text.setText(song.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getSongImageLoaderString(song),
holder.albumArt,
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art)
@ -120,45 +123,49 @@ public class SmartPlaylistSongAdapter extends AbsPlaylistSongAdapter<SmartPlayli
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull
final TextView songTitle;
@NonNull
final TextView songInfo;
@NonNull
final ImageView overflowButton;
@NonNull
final ImageView albumArt;
@InjectView(R.id.title)
TextView title;
@InjectView(R.id.text)
TextView text;
@InjectView(R.id.menu)
ImageView menu;
@InjectView(R.id.image)
ImageView image;
public ViewHolder(@NonNull View itemView, final int songMenu) {
public ViewHolder(@NonNull View itemView) {
super(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);
ButterKnife.inject(this, itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
overflowButton = (ImageView) itemView.findViewById(R.id.menu);
overflowButton.setOnClickListener(new View.OnClickListener() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
image.setTransitionName(activity.getString(R.string.transition_album_art));
}
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override
public void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(activity, v);
popupMenu.inflate(songMenu);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_go_to_album:
Pair[] albumPairs = new Pair[]{
Pair.create(albumArt, activity.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();
public Song getSong() {
return dataSet.get(getAdapterPosition());
}
@Override
public int getMenuRes() {
return R.menu.menu_item_cannot_delete_single_songs_playlist_song;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_go_to_album) {
Pair[] albumPairs = new Pair[]{
Pair.create(image, activity.getString(R.string.transition_album_art))
};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs);
return true;
}
return super.onMenuItemClick(item);
}
});
}