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.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
@ -47,6 +46,9 @@ import com.squareup.otto.Subscribe;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
@ -55,15 +57,24 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
public static final String TAG = AlbumAdapter.class.getSimpleName(); public static final String TAG = AlbumAdapter.class.getSimpleName();
private static final int FADE_IN_TIME = 500; private static final int FADE_IN_TIME = 500;
@NonNull
private final AppCompatActivity activity; private final AppCompatActivity activity;
private boolean usePalette; private boolean usePalette;
private List<Album> dataSet; 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 @NonNull
@Override @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 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); return new ViewHolder(view);
} }
@ -71,18 +82,18 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Album album = dataSet.get(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); final boolean isChecked = isChecked(album);
holder.view.setActivated(isChecked); holder.itemView.setActivated(isChecked);
holder.checkMark.setVisibility(isChecked ? View.VISIBLE : View.INVISIBLE); holder.selectedIndicator.setVisibility(isChecked ? View.VISIBLE : View.GONE);
holder.title.setText(album.title); holder.title.setText(album.title);
holder.artist.setText(album.artistName); holder.text.setText(album.artistName);
ImageLoader.getInstance().displayImage( ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumImageLoaderString(album), MusicUtil.getAlbumImageLoaderString(album),
holder.albumArt, holder.image,
new DisplayImageOptions.Builder() new DisplayImageOptions.Builder()
.cacheInMemory(true) .cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art) .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) { public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
FadeInBitmapDisplayer.animate(view, FADE_IN_TIME); FadeInBitmapDisplayer.animate(view, FADE_IN_TIME);
if (usePalette) if (usePalette)
paletteBlackAndWhite(holder.title, holder.artist, holder.footer); applyPalette(null, holder.title, holder.text, holder.footer);
} }
@Override @Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (usePalette) 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 { public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull @InjectView(R.id.image)
final ImageView albumArt; ImageView image;
@NonNull @InjectView(R.id.title)
final TextView title; TextView title;
@NonNull @InjectView(R.id.text)
final TextView artist; TextView text;
final View footer; @InjectView(R.id.footer)
@NonNull View footer;
final ImageView checkMark; @InjectView(R.id.selected_indicator)
@NonNull ImageView selectedIndicator;
final View view;
public ViewHolder(@NonNull View itemView) { public ViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
view = itemView; ButterKnife.inject(this, itemView);
albumArt = (ImageView) itemView.findViewById(R.id.album_art);
title = (TextView) itemView.findViewById(R.id.album_title); itemView.setOnClickListener(this);
artist = (TextView) itemView.findViewById(R.id.album_interpret); itemView.setOnLongClickListener(this);
footer = itemView.findViewById(R.id.footer);
checkMark = (ImageView) itemView.findViewById(R.id.check_mark);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
// fixes the ripple starts at the right position
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 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) @TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override @Override
public boolean onTouch(@NonNull View view, @NonNull MotionEvent motionEvent) { 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; return false;
} }
}); });
@ -184,8 +191,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
toggleChecked(getAdapterPosition()); toggleChecked(getAdapterPosition());
} else { } else {
Pair[] albumPairs = new Pair[]{ Pair[] albumPairs = new Pair[]{
Pair.create(albumArt, Pair.create(image,
activity.getResources().getString(R.string.transition_album_cover) activity.getResources().getString(R.string.transition_album_art)
)}; )};
if (activity instanceof AbsFabActivity) if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); 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 @Override
public long getItemId(int position) { public long getItemId(int position) {
return dataSet.get(position).id; return dataSet.get(position).id;
@ -224,33 +223,23 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
.generate(new Palette.PaletteAsyncListener() { .generate(new Palette.PaletteAsyncListener() {
@Override @Override
public void onGenerated(@NonNull Palette palette) { public void onGenerated(@NonNull Palette palette) {
final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch(); setFooterColor(title, artist, footer, palette.getVibrantColor(defaultFooterColor), true);
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);
}
} }
}); });
} else { } 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) { private void setFooterColor(@NonNull final TextView title, @NonNull final TextView artist, final View footer, int footerColor, boolean animate) {
title.setTextColor(ColorUtil.getOpaqueColor(DialogUtils.resolveColor(activity, R.attr.title_text_color))); int textColor = ColorUtil.getTextColorForBackground(footerColor);
artist.setTextColor(ColorUtil.getOpaqueColor(DialogUtils.resolveColor(activity, R.attr.caption_text_color))); title.setTextColor(textColor);
int defaultBarColor = DialogUtils.resolveColor(activity, R.attr.default_bar_color); artist.setTextColor(textColor);
ViewUtil.animateViewColor(footer, defaultBarColor, defaultBarColor); if (animate) {
ViewUtil.animateViewColor(footer, footer.getDrawingCacheBackgroundColor(), footerColor);
} else {
footer.setBackgroundColor(footerColor);
} }
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);
} }
@Override @Override

View file

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

View file

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

View file

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

View file

@ -1,22 +1,21 @@
package com.kabouzeid.gramophone.adapter; package com.kabouzeid.gramophone.adapter;
import android.os.Build;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.util.Pair; import android.support.v4.util.Pair;
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;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView; import android.widget.TextView;
import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; 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.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo; import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image; import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image;
@ -37,6 +36,9 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.Optional;
import retrofit.Callback; import retrofit.Callback;
import retrofit.RetrofitError; import retrofit.RetrofitError;
import retrofit.client.Response; import retrofit.client.Response;
@ -100,22 +102,19 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
@NonNull @NonNull
@Override @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ALBUM) if (viewType == HEADER)
return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_search_album, parent, false), viewType); return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.sub_header, parent, false), viewType);
if (viewType == ARTIST) return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false), viewType);
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);
} }
@SuppressWarnings("ConstantConditions")
@Override @Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
switch (getItemViewType(position)) { switch (getItemViewType(position)) {
case ALBUM: case ALBUM:
final Album album = (Album) results.get(position); final Album album = (Album) results.get(position);
holder.title.setText(album.title); holder.title.setText(album.title);
holder.subTitle.setText(album.artistName); holder.text.setText(album.artistName);
ImageLoader.getInstance().displayImage( ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumImageLoaderString(album), MusicUtil.getAlbumImageLoaderString(album),
holder.image, holder.image,
@ -129,7 +128,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
case ARTIST: case ARTIST:
final Artist artist = (Artist) results.get(position); final Artist artist = (Artist) results.get(position);
holder.title.setText(artist.name); holder.title.setText(artist.name);
holder.subTitle.setText(MusicUtil.getArtistInfoString(activity, artist)); holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
if (MusicUtil.isArtistNameUnknown(artist.name)) { if (MusicUtil.isArtistNameUnknown(artist.name)) {
holder.image.setImageResource(R.drawable.default_artist_image); holder.image.setImageResource(R.drawable.default_artist_image);
break; break;
@ -169,7 +168,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
case SONG: case SONG:
final Song song = (Song) results.get(position); final Song song = (Song) results.get(position);
holder.title.setText(song.title); holder.title.setText(song.title);
holder.subTitle.setText(song.albumName); holder.text.setText(song.albumName);
break; break;
default: default:
holder.title.setText(results.get(position).toString()); 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 { public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@InjectView(R.id.title)
TextView title;
@Nullable @Nullable
private final ImageView image; @Optional
@NonNull @InjectView(R.id.image)
public final TextView title; ImageView image;
@Nullable @Nullable
public final TextView subTitle; @Optional
private final int viewType; @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); super(itemView);
itemView.setOnClickListener(this); ButterKnife.inject(this, itemView);
this.viewType = viewType;
switch (viewType) { switch (itemViewType) {
case SONG:
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override
public Song getSong() {
return (Song) results.get(getAdapterPosition());
}
});
break;
case ALBUM: case ALBUM:
image = (ImageView) itemView.findViewById(R.id.album_art); menu.setVisibility(View.GONE);
title = (TextView) itemView.findViewById(R.id.album_title); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
subTitle = (TextView) itemView.findViewById(R.id.album_artist); image.setTransitionName(activity.getString(R.string.transition_album_art));
}
break; break;
case ARTIST: case ARTIST:
image = (ImageView) itemView.findViewById(R.id.artist_image); menu.setVisibility(View.GONE);
title = (TextView) itemView.findViewById(R.id.artist_name); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
subTitle = (TextView) itemView.findViewById(R.id.artist_info); image.setTransitionName(activity.getString(R.string.transition_artist_image));
break;
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() {
@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();
}
});
break;
default:
image = null;
title = (TextView) itemView.findViewById(R.id.title);
subTitle = null;
itemView.setOnClickListener(null);
break; break;
} }
} }
@ -237,13 +229,13 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Object item = results.get(getAdapterPosition()); Object item = results.get(getAdapterPosition());
switch (viewType) { switch (getItemViewType()) {
case ALBUM: case ALBUM:
NavigationUtil.goToAlbum(activity, NavigationUtil.goToAlbum(activity,
((Album) item).id, ((Album) item).id,
new Pair[]{ new Pair[]{
Pair.create(image, Pair.create(image,
activity.getResources().getString(R.string.transition_album_cover) activity.getResources().getString(R.string.transition_album_art)
) )
}); });
break; break;
@ -252,7 +244,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
((Artist) item).id, ((Artist) item).id,
new Pair[]{ new Pair[]{
Pair.create(image, Pair.create(image,
activity.getResources().getString(R.string.transition_artist_image) activity.getResources().getString(R.string.transition_album_art)
) )
}); });
break; 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.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.util.Pair; import android.support.v4.util.Pair;
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.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
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.AbsMultiSelectAdapter;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
@ -36,6 +36,8 @@ import com.squareup.otto.Subscribe;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import retrofit.Callback; import retrofit.Callback;
import retrofit.RetrofitError; import retrofit.RetrofitError;
import retrofit.client.Response; import retrofit.client.Response;
@ -43,14 +45,12 @@ import retrofit.client.Response;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist> { public abstract class AbsArtistAdapter extends AbsMultiSelectAdapter<AbsArtistAdapter.ViewHolder, Artist> {
@NonNull
protected final AppCompatActivity activity; protected final AppCompatActivity activity;
protected List<Artist> dataSet; protected List<Artist> dataSet;
@NonNull
protected final LastFMRestClient lastFMRestClient; 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); super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity; this.activity = activity;
lastFMRestClient = new LastFMRestClient(activity); lastFMRestClient = new LastFMRestClient(activity);
@ -67,23 +67,26 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
dataSet = ArtistLoader.getAllArtists(activity); dataSet = ArtistLoader.getAllArtists(activity);
} }
@NonNull protected Image getArtistImageToUse(List<Image> images) {
@Override int thumbnailIndex = 0;
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (images.size() > 2) {
View view = LayoutInflater.from(activity).inflate(R.layout.item_list_artist, parent, false); thumbnailIndex = 2;
return new ViewHolder(view); } else if (images.size() > 1) {
thumbnailIndex = 1;
}
return images.get(thumbnailIndex);
} }
@Override @Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Artist artist = dataSet.get(position); final Artist artist = dataSet.get(position);
holder.artistName.setText(artist.name); holder.title.setText(artist.name);
holder.artistInfo.setText(MusicUtil.getArtistInfoString(activity, artist)); holder.text.setText(MusicUtil.getArtistInfoString(activity, artist));
holder.view.setActivated(isChecked(artist)); holder.itemView.setActivated(isChecked(artist));
if (MusicUtil.isArtistNameUnknown(artist.name)) { if (MusicUtil.isArtistNameUnknown(artist.name)) {
holder.artistImage.setImageResource(R.drawable.default_artist_image); holder.image.setImageResource(R.drawable.default_artist_image);
return; return;
} }
@ -91,15 +94,9 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
@Override @Override
public void success(@NonNull ArtistInfo artistInfo, Response response) { public void success(@NonNull ArtistInfo artistInfo, Response response) {
if (artistInfo.getArtist() != null) { if (artistInfo.getArtist() != null) {
int thumbnailIndex = 0;
List<Image> images = artistInfo.getArtist().getImage(); List<Image> images = artistInfo.getArtist().getImage();
if (images.size() > 2) { ImageLoader.getInstance().displayImage(getArtistImageToUse(images).getText(),
thumbnailIndex = 2; holder.image,
} else if (images.size() > 1) {
thumbnailIndex = 1;
}
ImageLoader.getInstance().displayImage(images.get(thumbnailIndex).getText(),
holder.artistImage,
new DisplayImageOptions.Builder() new DisplayImageOptions.Builder()
.cacheInMemory(true) .cacheInMemory(true)
.cacheOnDisk(true) .cacheOnDisk(true)
@ -109,13 +106,13 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
.build() .build()
); );
} else { } else {
holder.artistImage.setImageResource(R.drawable.default_artist_image); holder.image.setImageResource(R.drawable.default_artist_image);
} }
} }
@Override @Override
public void failure(RetrofitError error) { 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; 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 @Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) { public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView); super.onDetachedFromRecyclerView(recyclerView);
@ -218,4 +173,45 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
break; 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.content.Context;
import android.support.annotation.Nullable; 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.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -9,21 +9,23 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
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.adapter.AbsMultiSelectAdapter;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder; 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;
import java.util.ArrayList; import java.util.ArrayList;
import butterknife.ButterKnife;
import butterknife.InjectView;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
@ -53,7 +55,7 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.Vie
@NonNull @NonNull
@Override @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 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); return new ViewHolder(view);
} }
@ -63,10 +65,10 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.Vie
final int trackNumber = MusicUtil.getFixedTrackNumber(song.trackNumber); final int trackNumber = MusicUtil.getFixedTrackNumber(song.trackNumber);
final String trackNumberString = trackNumber > 0 ? String.valueOf(trackNumber) : "-"; final String trackNumberString = trackNumber > 0 ? String.valueOf(trackNumber) : "-";
holder.trackNumber.setText(trackNumberString); holder.track_number.setText(trackNumberString);
holder.songTitle.setText(song.title); holder.title.setText(song.title);
holder.artistName.setText(MusicUtil.getReadableDurationString(song.duration)); holder.text.setText(MusicUtil.getReadableDurationString(song.duration));
holder.view.setActivated(isChecked(song)); holder.itemView.setActivated(isChecked(song));
} }
@Override @Override
@ -95,38 +97,31 @@ public class AlbumSongAdapter extends AbsMultiSelectAdapter<AlbumSongAdapter.Vie
} }
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@NonNull @InjectView(R.id.title)
final TextView songTitle; TextView title;
@NonNull @InjectView(R.id.text)
final TextView trackNumber; TextView text;
@NonNull @InjectView(R.id.image)
final TextView artistName; ImageView image;
@NonNull @InjectView(R.id.image_text)
final ImageView overflowButton; TextView track_number;
@NonNull @InjectView(R.id.menu)
final View view; ImageView menu;
public ViewHolder(@NonNull View itemView) { public ViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
view = itemView; ButterKnife.inject(this, itemView);
songTitle = (TextView) itemView.findViewById(R.id.song_title);
trackNumber = (TextView) itemView.findViewById(R.id.track_number); menu.setVisibility(View.VISIBLE);
artistName = (TextView) itemView.findViewById(R.id.song_info); track_number.setVisibility(View.VISIBLE);
overflowButton = (ImageView) itemView.findViewById(R.id.menu); image.setVisibility(View.GONE);
view.setOnClickListener(this);
view.setOnLongClickListener(this); itemView.setOnClickListener(this);
overflowButton.setOnClickListener(new View.OnClickListener() { itemView.setOnLongClickListener(this);
menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override @Override
public void onClick(View v) { public Song getSong() {
PopupMenu popupMenu = new PopupMenu(activity, v); return dataSet.get(getAdapterPosition());
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();
} }
}); });
} }

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.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.util.Pair; import android.support.v4.util.Pair;
@ -11,15 +12,14 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView; import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialcab.MaterialCab;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
@ -45,7 +45,7 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
private final AppCompatActivity activity; private final AppCompatActivity activity;
public ArtistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList<Song> songs, @Nullable CabHolder cabHolder) { 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.activity = activity;
this.cabHolder = cabHolder; this.cabHolder = cabHolder;
checked = new ArrayList<>(); 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) { public View getView(final int position, @Nullable View convertView, ViewGroup parent) {
final Song song = getItem(position); final Song song = getItem(position);
if (convertView == null) { 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 songTitle = (TextView) convertView.findViewById(R.id.title);
final TextView songInfo = (TextView) convertView.findViewById(R.id.song_info); final TextView songInfo = (TextView) convertView.findViewById(R.id.text);
final ImageView albumArt = (ImageView) convertView.findViewById(R.id.album_art); final ImageView albumArt = (ImageView) convertView.findViewById(R.id.image);
songTitle.setText(song.title); songTitle.setText(song.title);
songInfo.setText(song.albumName); songInfo.setText(song.albumName);
@ -83,29 +83,29 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
.build() .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); final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
overflowButton.setOnClickListener(new View.OnClickListener() { overflowButton.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) {
@Override @Override
public void onClick(View v) { public Song getSong() {
PopupMenu popupMenu = new PopupMenu(activity, v); return song;
popupMenu.inflate(R.menu.menu_item_song); }
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override @Override
public boolean onMenuItemClick(@NonNull MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) { if (item.getItemId() == R.id.action_go_to_album) {
case R.id.action_go_to_album:
Pair[] albumPairs = new Pair[]{ Pair[] albumPairs = new Pair[]{
Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_cover)) Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))
}; };
if (activity instanceof AbsFabActivity) if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, song.albumId, albumPairs); NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
return true; return true;
} }
return MenuItemClickHelper.handleSongMenuClick(activity, song, item); return super.onMenuItemClick(item);
}
});
popupMenu.show();
} }
}); });

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

View file

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

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

View file

@ -43,7 +43,7 @@ public class WidgetMedium extends AppWidgetProvider {
if (song.id == -1) return; if (song.id == -1) return;
widgetLayout = new RemoteViews(context.getPackageName(), R.layout.widget_medium); widgetLayout = new RemoteViews(context.getPackageName(), R.layout.widget_medium);
linkButtons(context, widgetLayout); linkButtons(context, widgetLayout);
widgetLayout.setTextViewText(R.id.song_title, song.title); widgetLayout.setTextViewText(R.id.title, song.title);
widgetLayout.setTextViewText(R.id.song_secondary_information, song.artistName + " | " + song.albumName); widgetLayout.setTextViewText(R.id.song_secondary_information, song.artistName + " | " + song.albumName);
updateWidgetsPlayState(context, isPlaying); updateWidgetsPlayState(context, isPlaying);
loadAlbumArt(context, song); loadAlbumArt(context, song);
@ -107,15 +107,15 @@ public class WidgetMedium extends AppWidgetProvider {
private static void setAlbumArt(@NonNull final Context context, @Nullable final Bitmap albumArt) { private static void setAlbumArt(@NonNull final Context context, @Nullable final Bitmap albumArt) {
if (albumArt != null) { if (albumArt != null) {
widgetLayout.setImageViewBitmap(R.id.album_art, albumArt); widgetLayout.setImageViewBitmap(R.id.image, albumArt);
} else { } else {
widgetLayout.setImageViewResource(R.id.album_art, R.drawable.default_album_art); widgetLayout.setImageViewResource(R.id.image, R.drawable.default_album_art);
} }
updateWidgets(context); updateWidgets(context);
} }
private static void linkButtons(@NonNull final Context context, @NonNull final RemoteViews views) { private static void linkButtons(@NonNull final Context context, @NonNull final RemoteViews views) {
views.setOnClickPendingIntent(R.id.album_art, retrievePlaybackActions(context, 0)); views.setOnClickPendingIntent(R.id.image, retrievePlaybackActions(context, 0));
views.setOnClickPendingIntent(R.id.media_titles, retrievePlaybackActions(context, 0)); views.setOnClickPendingIntent(R.id.media_titles, retrievePlaybackActions(context, 0));
views.setOnClickPendingIntent(R.id.button_toggle_play_pause, retrievePlaybackActions(context, 1)); views.setOnClickPendingIntent(R.id.button_toggle_play_pause, retrievePlaybackActions(context, 1));
views.setOnClickPendingIntent(R.id.button_next, retrievePlaybackActions(context, 2)); views.setOnClickPendingIntent(R.id.button_next, retrievePlaybackActions(context, 2));

View file

@ -0,0 +1,14 @@
package com.kabouzeid.gramophone.helper.menu;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class GenericMenuHelper {
public static boolean handleMenuClick(@NonNull AppCompatActivity activity, @NonNull MenuItem item) {
return false;
}
}

View file

@ -0,0 +1,49 @@
package com.kabouzeid.gramophone.helper.menu;
import android.app.Activity;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.RenamePlaylistDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class PlaylistMenuHelper {
public static final int MENU_RES = R.menu.menu_item_playlist;
public static boolean handleMenuClick(@NonNull AppCompatActivity activity, @NonNull Playlist playlist, @NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_play:
MusicPlayerRemote.openQueue(new ArrayList<>(getPlaylistSongs(activity, playlist)), 0, true);
return true;
case R.id.action_add_to_current_playing:
MusicPlayerRemote.enqueue(new ArrayList<>(getPlaylistSongs(activity, playlist)));
return true;
case R.id.action_rename_playlist:
RenamePlaylistDialog.create(playlist.id).show(activity.getSupportFragmentManager(), "RENAME_PLAYLIST");
return true;
case R.id.action_delete_playlist:
DeletePlaylistDialog.create(playlist).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
return true;
}
return false;
}
@NonNull
private static ArrayList<? extends Song> getPlaylistSongs(@NonNull Activity activity, Playlist playlist) {
return playlist instanceof AbsSmartPlaylist ?
((AbsSmartPlaylist) playlist).getSongs(activity) :
PlaylistSongLoader.getPlaylistSongList(activity, playlist.id);
}
}

View file

@ -1,23 +1,20 @@
package com.kabouzeid.gramophone.helper; package com.kabouzeid.gramophone.helper.menu;
import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.util.Pair; import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
import com.kabouzeid.gramophone.dialogs.RenamePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.SongDetailDialog; import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
@ -25,14 +22,14 @@ import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import java.io.File; import java.io.File;
import java.util.ArrayList;
/** /**
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class MenuItemClickHelper { public class SongMenuHelper {
public static int MENU_RES = R.menu.menu_item_song;
public static boolean handleSongMenuClick(@NonNull AppCompatActivity activity, @NonNull Song song, @NonNull MenuItem item) { public static boolean handleMenuClick(@NonNull AppCompatActivity activity, @NonNull Song song, @NonNull MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_set_as_ringtone: case R.id.action_set_as_ringtone:
MusicUtil.setRingtone(activity, song.id); MusicUtil.setRingtone(activity, song.id);
@ -79,28 +76,30 @@ public class MenuItemClickHelper {
return false; return false;
} }
public static boolean handlePlaylistMenuClick(@NonNull AppCompatActivity activity, @NonNull Playlist playlist, @NonNull MenuItem item) { public static abstract class OnClickSongMenu implements View.OnClickListener, PopupMenu.OnMenuItemClickListener {
switch (item.getItemId()) { private AppCompatActivity activity;
case R.id.action_play:
MusicPlayerRemote.openQueue(new ArrayList<>(getPlaylistSongs(activity, playlist)), 0, true); public OnClickSongMenu(@NonNull AppCompatActivity activity) {
return true; this.activity = activity;
case R.id.action_add_to_current_playing:
MusicPlayerRemote.enqueue(new ArrayList<>(getPlaylistSongs(activity, playlist)));
return true;
case R.id.action_rename_playlist:
RenamePlaylistDialog.create(playlist.id).show(activity.getSupportFragmentManager(), "RENAME_PLAYLIST");
return true;
case R.id.action_delete_playlist:
DeletePlaylistDialog.create(playlist).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
return true;
}
return false;
} }
@NonNull public int getMenuRes() {
private static ArrayList<? extends Song> getPlaylistSongs(@NonNull Activity activity, Playlist playlist) { return MENU_RES;
return playlist instanceof AbsSmartPlaylist ? }
((AbsSmartPlaylist) playlist).getSongs(activity) :
PlaylistSongLoader.getPlaylistSongList(activity, playlist.id); @Override
public void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(activity, v);
popupMenu.inflate(getMenuRes());
popupMenu.setOnMenuItemClickListener(this);
popupMenu.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
return handleMenuClick(activity, getSong(), item);
}
public abstract Song getSong();
} }
} }

View file

@ -7,7 +7,7 @@ import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.songadapter.smartplaylist.SmartPlaylistSongAdapter; import com.kabouzeid.gramophone.adapter.song.smartplaylist.SmartPlaylistSongAdapter;
import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
@ -24,7 +24,7 @@ public abstract class AbsSmartPlaylist extends Playlist {
public final int iconRes; public final int iconRes;
public AbsSmartPlaylist(final String name, final int iconRes) { public AbsSmartPlaylist(final String name, final int iconRes) {
super(-1, name); super(-Math.abs(31 * name.hashCode() + (iconRes * name.hashCode() * 31 * 31)), name);
this.iconRes = iconRes; this.iconRes = iconRes;
} }

View file

@ -27,7 +27,7 @@ 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.song.AlbumSongAdapter;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.imageloader.BlurProcessor; import com.kabouzeid.gramophone.imageloader.BlurProcessor;
@ -77,13 +77,13 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
@InjectView(R.id.list) @InjectView(R.id.list)
ObservableRecyclerView recyclerView; ObservableRecyclerView recyclerView;
@InjectView(R.id.album_art) @InjectView(R.id.image)
ImageView albumArtImageView; ImageView albumArtImageView;
@InjectView(R.id.album_art_background) @InjectView(R.id.album_art_background)
ImageView albumArtBackground; ImageView albumArtBackground;
@InjectView(R.id.toolbar) @InjectView(R.id.toolbar)
Toolbar toolbar; Toolbar toolbar;
@InjectView(R.id.album_title) @InjectView(R.id.title)
TextView albumTitleView; TextView albumTitleView;
@InjectView(R.id.list_background) @InjectView(R.id.list_background)
View songsBackgroundView; View songsBackgroundView;
@ -156,6 +156,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
// Translate album cover // Translate album cover
albumArtImageView.setTranslationY(Math.max(-albumArtViewHeight, -scrollY / 2)); albumArtImageView.setTranslationY(Math.max(-albumArtViewHeight, -scrollY / 2));
albumArtBackground.setTranslationY(Math.max(-albumArtViewHeight, -scrollY / 2));
// Translate list background // Translate list background
songsBackgroundView.setTranslationY(Math.max(0, -scrollY + albumArtViewHeight)); songsBackgroundView.setTranslationY(Math.max(0, -scrollY + albumArtViewHeight));
@ -254,43 +255,31 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
} }
private void applyPalette(@Nullable Bitmap bitmap) { private void applyPalette(@Nullable Bitmap bitmap) {
final int defaultBarColor = ColorUtil.resolveColor(this, R.attr.default_bar_color);
if (bitmap != null) { if (bitmap != null) {
Palette.from(bitmap) Palette.from(bitmap)
.resizeBitmapSize(100) .resizeBitmapSize(100)
.generate(new Palette.PaletteAsyncListener() { .generate(new Palette.PaletteAsyncListener() {
@Override @Override
public void onGenerated(@NonNull Palette palette) { public void onGenerated(@NonNull Palette palette) {
final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch(); setColors(palette.getVibrantColor(defaultBarColor));
if (vibrantSwatch != null) {
toolbarColor = vibrantSwatch.getRgb();
albumTitleView.setBackgroundColor(toolbarColor);
albumTitleView.setTextColor(ColorUtil.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
if (PreferenceUtil.getInstance(AlbumDetailActivity.this).coloredNavigationBarAlbum())
setNavigationBarColor(toolbarColor);
notifyTaskColorChange(toolbarColor);
} else {
resetColors();
}
} }
}); });
} else { } else {
resetColors(); setColors(defaultBarColor);
} }
} }
private void resetColors() { private void setColors(int vibrantColor) {
int titleTextColor = DialogUtils.resolveColor(this, R.attr.title_text_color); toolbarColor = vibrantColor;
int defaultBarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color); albumTitleView.setBackgroundColor(vibrantColor);
albumTitleView.setTextColor(ColorUtil.getTextColorForBackground(vibrantColor));
toolbarColor = defaultBarColor;
albumTitleView.setBackgroundColor(defaultBarColor);
albumTitleView.setTextColor(titleTextColor);
if (PreferenceUtil.getInstance(this).coloredNavigationBarArtist()) if (PreferenceUtil.getInstance(this).coloredNavigationBarArtist())
setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); setNavigationBarColor(vibrantColor);
notifyTaskColorChange(toolbarColor); notifyTaskColorChange(vibrantColor);
} }
@Override @Override

View file

@ -34,7 +34,7 @@ import com.github.ksoichiro.android.observablescrollview.ObservableListView;
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.ArtistAlbumAdapter; import com.kabouzeid.gramophone.adapter.ArtistAlbumAdapter;
import com.kabouzeid.gramophone.adapter.songadapter.ArtistSongAdapter; import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager; import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager;
@ -91,13 +91,13 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
@InjectView(R.id.artist_image_background) @InjectView(R.id.artist_image_background)
ImageView artistImageBackground; ImageView artistImageBackground;
@InjectView(R.id.artist_image) @InjectView(R.id.image)
SquareIfPlaceImageView artistImage; SquareIfPlaceImageView artistImage;
@InjectView(R.id.list_background) @InjectView(R.id.list_background)
View songListBackground; View songListBackground;
@InjectView(R.id.list) @InjectView(R.id.list)
ObservableListView songListView; ObservableListView songListView;
@InjectView(R.id.artist_name) @InjectView(R.id.title)
TextView artistName; TextView artistName;
@InjectView(R.id.toolbar) @InjectView(R.id.toolbar)
Toolbar toolbar; Toolbar toolbar;
@ -191,6 +191,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
// Translate album cover // Translate album cover
artistImage.setTranslationY(Math.max(-artistImageViewHeight, -scrollY / 2)); artistImage.setTranslationY(Math.max(-artistImageViewHeight, -scrollY / 2));
artistImageBackground.setTranslationY(Math.max(-artistImageViewHeight, -scrollY / 2));
// Translate list background // Translate list background
songListBackground.setTranslationY(Math.max(0, -scrollY + artistImageViewHeight)); songListBackground.setTranslationY(Math.max(0, -scrollY + artistImageViewHeight));
@ -305,7 +306,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
private MaterialDialog getBiographyDialog() { private MaterialDialog getBiographyDialog() {
return new MaterialDialog.Builder(ArtistDetailActivity.this) return new MaterialDialog.Builder(ArtistDetailActivity.this)
.title(artist.name) .title(artist.name)
.content(biography) .content(biography != null ? biography : "")
.positiveText(android.R.string.ok) .positiveText(android.R.string.ok)
.build(); .build();
} }

View file

@ -281,18 +281,18 @@ public class MainActivity extends AbsFabActivity
public void onClick(View v) { public void onClick(View v) {
//noinspection ConstantConditions //noinspection ConstantConditions
NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithFab(new Pair[]{ NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithFab(new Pair[]{
Pair.create(navigationDrawerHeader.findViewById(R.id.album_art), Pair.create(navigationDrawerHeader.findViewById(R.id.image),
getResources().getString(R.string.transition_album_cover) getResources().getString(R.string.transition_album_art)
) )
})); }));
} }
}); });
} }
((TextView) navigationDrawerHeader.findViewById(R.id.song_title)).setText(song.title); ((TextView) navigationDrawerHeader.findViewById(R.id.title)).setText(song.title);
((TextView) navigationDrawerHeader.findViewById(R.id.song_artist)).setText(song.artistName); ((TextView) navigationDrawerHeader.findViewById(R.id.text)).setText(song.artistName);
ImageLoader.getInstance().displayImage( ImageLoader.getInstance().displayImage(
MusicUtil.getSongImageLoaderString(song), MusicUtil.getSongImageLoaderString(song),
((ImageView) navigationDrawerHeader.findViewById(R.id.album_art)), ((ImageView) navigationDrawerHeader.findViewById(R.id.image)),
new DisplayImageOptions.Builder() new DisplayImageOptions.Builder()
.cacheInMemory(true) .cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art) .showImageOnFail(R.drawable.default_album_art)

View file

@ -42,7 +42,6 @@ import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.dialogs.SongDetailDialog; import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
import com.kabouzeid.gramophone.dialogs.SongShareDialog; import com.kabouzeid.gramophone.dialogs.SongShareDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager;
import com.kabouzeid.gramophone.imageloader.BlurProcessor; import com.kabouzeid.gramophone.imageloader.BlurProcessor;
import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.misc.SmallTransitionListener;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
@ -77,9 +76,9 @@ public class MusicControllerActivity extends AbsFabActivity {
private static final int CMD_UPDATE_PROGRESS_VIEWS = 1; private static final int CMD_UPDATE_PROGRESS_VIEWS = 1;
@InjectView(R.id.song_title) @InjectView(R.id.title)
TextView songTitle; TextView songTitle;
@InjectView(R.id.song_artist) @InjectView(R.id.text)
TextView songArtist; TextView songArtist;
@InjectView(R.id.footer) @InjectView(R.id.footer)
LinearLayout footer; LinearLayout footer;
@ -97,7 +96,7 @@ public class MusicControllerActivity extends AbsFabActivity {
RelativeLayout mediaControllerContainer; RelativeLayout mediaControllerContainer;
@InjectView(R.id.album_art_background) @InjectView(R.id.album_art_background)
ImageView albumArtBackground; ImageView albumArtBackground;
@InjectView(R.id.album_art) @InjectView(R.id.image)
SquareIfPlaceImageView albumArt; SquareIfPlaceImageView albumArt;
@InjectView(R.id.toolbar) @InjectView(R.id.toolbar)
Toolbar toolbar; Toolbar toolbar;
@ -121,8 +120,6 @@ public class MusicControllerActivity extends AbsFabActivity {
private boolean alternativeProgressSlider; private boolean alternativeProgressSlider;
private boolean showPlaybackControllerCard; private boolean showPlaybackControllerCard;
private StackBlurManager defaultAlbumArtStackBlurManager;
private Song song; private Song song;
@Override @Override
@ -439,6 +436,7 @@ public class MusicControllerActivity extends AbsFabActivity {
@Override @Override
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) { public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
applyPalette(null); applyPalette(null);
ImageLoader.getInstance().displayImage( ImageLoader.getInstance().displayImage(
"drawable://" + R.drawable.default_album_art, "drawable://" + R.drawable.default_album_art,
albumArtBackground, albumArtBackground,
@ -453,7 +451,9 @@ public class MusicControllerActivity extends AbsFabActivity {
onLoadingFailed(imageUri, view, null); onLoadingFailed(imageUri, view, null);
return; return;
} }
applyPalette(loadedImage); applyPalette(loadedImage);
ImageLoader.getInstance().displayImage( ImageLoader.getInstance().displayImage(
imageUri, imageUri,
albumArtBackground, albumArtBackground,
@ -465,36 +465,25 @@ public class MusicControllerActivity extends AbsFabActivity {
} }
private void applyPalette(@Nullable Bitmap bitmap) { private void applyPalette(@Nullable Bitmap bitmap) {
final int defaultBarColor = ColorUtil.resolveColor(this, R.attr.default_bar_color);
if (bitmap != null) { if (bitmap != null) {
Palette.from(bitmap) Palette.from(bitmap)
.resizeBitmapSize(100) .resizeBitmapSize(100)
.generate(new Palette.PaletteAsyncListener() { .generate(new Palette.PaletteAsyncListener() {
@Override @Override
public void onGenerated(@NonNull Palette palette) { public void onGenerated(@NonNull Palette palette) {
final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch(); setColors(palette.getVibrantColor(defaultBarColor));
if (vibrantSwatch != null) {
final int swatchRgb = vibrantSwatch.getRgb();
animateColorChange(swatchRgb);
animateTextColorChange(ColorUtil.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
notifyTaskColorChange(swatchRgb);
} else {
resetColors();
}
} }
}); });
} else { } else {
resetColors(); setColors(defaultBarColor);
} }
} }
private void resetColors() { private void setColors(int vibrantColor) {
final int textColor = ColorUtil.getOpaqueColor(DialogUtils.resolveColor(this, R.attr.title_text_color)); animateColorChange(vibrantColor);
final int defaultBarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color); animateTextColorChange(ColorUtil.getTextColorForBackground(vibrantColor));
notifyTaskColorChange(vibrantColor);
animateColorChange(defaultBarColor);
animateTextColorChange(textColor);
notifyTaskColorChange(defaultBarColor);
} }

View file

@ -13,8 +13,8 @@ import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialcab.MaterialCab;
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.AbsPlaylistSongAdapter; import com.kabouzeid.gramophone.adapter.song.AbsPlaylistSongAdapter;
import com.kabouzeid.gramophone.adapter.songadapter.PlaylistSongAdapter; import com.kabouzeid.gramophone.adapter.song.PlaylistSongAdapter;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.CabHolder;
@ -77,7 +77,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
adapter = new PlaylistSongAdapter(this, playlist, this); adapter = new PlaylistSongAdapter(this, playlist, this);
DragSortRecycler dragSortRecycler = new DragSortRecycler(); DragSortRecycler dragSortRecycler = new DragSortRecycler();
dragSortRecycler.setViewHandleId(R.id.album_art); dragSortRecycler.setViewHandleId(R.id.image);
dragSortRecycler.setOnItemMovedListener(new DragSortRecycler.OnItemMovedListener() { dragSortRecycler.setOnItemMovedListener(new DragSortRecycler.OnItemMovedListener() {
@Override @Override
public void onItemMoved(int from, int to) { public void onItemMoved(int from, int to) {

View file

@ -122,7 +122,7 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
} }
} }
@Nullable @NonNull
protected FloatingActionButton getFab() { protected FloatingActionButton getFab() {
if (fab == null) { if (fab == null) {
fab = (FloatingActionButton) findViewById(R.id.fab); fab = (FloatingActionButton) findViewById(R.id.fab);

View file

@ -45,7 +45,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
public static final String TAG = AlbumTagEditorActivity.class.getSimpleName(); public static final String TAG = AlbumTagEditorActivity.class.getSimpleName();
@InjectView(R.id.album_title) @InjectView(R.id.title)
EditText albumTitle; EditText albumTitle;
@InjectView(R.id.album_artist) @InjectView(R.id.album_artist)
EditText albumArtist; EditText albumArtist;

View file

@ -34,7 +34,7 @@ public class SongTagEditorActivity extends AbsTagEditorActivity implements TextW
EditText genre; EditText genre;
@InjectView(R.id.year) @InjectView(R.id.year)
EditText year; EditText year;
@InjectView(R.id.track_number) @InjectView(R.id.image_text)
EditText trackNumber; EditText trackNumber;
@Override @Override

View file

@ -5,7 +5,7 @@ import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.ArtistAdapter; import com.kabouzeid.gramophone.adapter.artist.ArtistListAdapter;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
@ -23,7 +23,7 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment {
@NonNull @NonNull
@Override @Override
protected RecyclerView.Adapter createAdapter() { protected RecyclerView.Adapter createAdapter() {
return new ArtistAdapter(getMainActivity(), getMainActivity()); return new ArtistListAdapter(getMainActivity(), getMainActivity());
} }
@Override @Override

View file

@ -5,7 +5,7 @@ import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.songadapter.SongAdapter; import com.kabouzeid.gramophone.adapter.song.SongAdapter;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)

View file

@ -52,4 +52,8 @@ public class ColorUtil {
public static boolean useDarkTextColorOnBackground(int backgroundColor) { public static boolean useDarkTextColorOnBackground(int backgroundColor) {
return (Color.red(backgroundColor) * 0.299 + Color.green(backgroundColor) * 0.587 + Color.blue(backgroundColor) * 0.114) > 186; return (Color.red(backgroundColor) * 0.299 + Color.green(backgroundColor) * 0.587 + Color.blue(backgroundColor) * 0.114) > 186;
} }
public static int getTextColorForBackground(int backgroundColor) {
return (Color.red(backgroundColor) * 0.299 + Color.green(backgroundColor) * 0.587 + Color.blue(backgroundColor) * 0.114) > 186 ? Color.BLACK : Color.WHITE;
}
} }

View file

@ -15,13 +15,13 @@
android:scaleType="centerCrop" /> android:scaleType="centerCrop" />
<com.kabouzeid.gramophone.views.SquareIfPlaceImageView <com.kabouzeid.gramophone.views.SquareIfPlaceImageView
android:id="@+id/album_art" android:id="@+id/image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center" android:layout_gravity="center"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/default_album_art" android:src="@drawable/default_album_art"
android:transitionName="@string/transition_album_cover" android:transitionName="@string/transition_album_art"
tools:ignore="ContentDescription,UnusedAttribute" /> tools:ignore="ContentDescription,UnusedAttribute" />
</FrameLayout> </FrameLayout>
@ -46,7 +46,7 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/album_title" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/title_view_height" android:layout_height="@dimen/title_view_height"
android:height="@dimen/title_view_height" android:height="@dimen/title_view_height"

View file

@ -16,11 +16,13 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.kabouzeid.gramophone.views.WidthFitSquareImageView <com.kabouzeid.gramophone.views.WidthFitSquareImageView
android:transitionName="@string/transition_album_art"
android:id="@+id/image" android:id="@+id/image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/default_album_art" /> android:src="@drawable/default_album_art"
tools:ignore="UnusedAttribute" />
<LinearLayout <LinearLayout
android:id="@+id/header" android:id="@+id/header"
@ -41,7 +43,7 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<EditText <EditText
android:id="@+id/album_title" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"

View file

@ -16,7 +16,7 @@
android:scaleType="centerCrop" /> android:scaleType="centerCrop" />
<com.kabouzeid.gramophone.views.SquareIfPlaceImageView <com.kabouzeid.gramophone.views.SquareIfPlaceImageView
android:id="@+id/artist_image" android:id="@+id/image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/header_image_height" android:layout_height="@dimen/header_image_height"
android:layout_gravity="center" android:layout_gravity="center"
@ -47,7 +47,7 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/artist_name" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/title_view_height" android:layout_height="@dimen/title_view_height"
android:height="@dimen/title_view_height" android:height="@dimen/title_view_height"
@ -100,7 +100,7 @@
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/fab" android:id="@+id/fab"
style="@style/PlayPauseFab" style="@style/PlayPauseFab"
android:layout_gravity="end|right|bottom" android:layout_gravity="end|bottom"
android:layout_margin="@dimen/fab_margin" /> android:layout_margin="@dimen/fab_margin" />
</FrameLayout> </FrameLayout>

View file

@ -1,8 +1,7 @@
<android.support.v4.widget.DrawerLayout <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"

View file

@ -74,11 +74,11 @@
android:paddingLeft="72dp" android:paddingLeft="72dp"
android:paddingRight="72dp" android:paddingRight="72dp"
android:paddingTop="@dimen/title_box_padding_large" android:paddingTop="@dimen/title_box_padding_large"
android:transitionName="@string/transition_album_text" android:transitionName="@string/transition_album_art"
tools:ignore="UnusedAttribute"> tools:ignore="UnusedAttribute">
<TextView <TextView
android:id="@+id/song_title" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
@ -87,7 +87,7 @@
android:textColor="?attr/title_text_color" /> android:textColor="?attr/title_text_color" />
<TextView <TextView
android:id="@+id/song_artist" android:id="@+id/text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
@ -199,22 +199,23 @@
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<com.kabouzeid.gramophone.views.SquareIfPlaceImageView <com.kabouzeid.gramophone.views.SquareIfPlaceImageView
android:id="@+id/album_art" android:id="@+id/image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center" android:layout_gravity="center"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/default_album_art" android:src="@drawable/default_album_art"
android:transitionName="@string/transition_album_cover" android:transitionName="@string/transition_album_art"
tools:ignore="ContentDescription,UnusedAttribute" /> tools:ignore="ContentDescription,UnusedAttribute" />
<ImageView <ImageView
android:id="@+id/favorite_icon" android:id="@+id/favorite_icon"
android:visibility="invisible" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:src="@drawable/ic_favorite_red_a400_96dp" android:src="@drawable/ic_favorite_red_a400_96dp"
android:layout_width="wrap_content" android:visibility="invisible"
android:layout_height="wrap_content" /> tools:ignore="ContentDescription" />
<RelativeLayout <RelativeLayout
android:id="@+id/default_progress_container" android:id="@+id/default_progress_container"
@ -249,7 +250,7 @@
android:textAppearance="@style/TextAppearance.AppCompat.Title" android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:textSize="16sp" android:textSize="16sp"
tools:ignore="RtlHardcoded,RtlSymmetry,SmallSp" /> tools:ignore="RelativeOverlap,RtlHardcoded,RtlSymmetry,SmallSp" />
</RelativeLayout> </RelativeLayout>
</FrameLayout> </FrameLayout>

View file

@ -146,7 +146,7 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<EditText <EditText
android:id="@+id/track_number" android:id="@+id/image_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"

View file

@ -6,7 +6,7 @@
android:layout_margin="2dp"> android:layout_margin="2dp">
<FrameLayout <FrameLayout
android:id="@+id/content" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:foreground="?rect_selector"> android:foreground="?rect_selector">
@ -19,12 +19,10 @@
tools:ignore="UnusedAttribute,UselessParent"> tools:ignore="UnusedAttribute,UselessParent">
<com.kabouzeid.gramophone.views.WidthFitSquareImageView <com.kabouzeid.gramophone.views.WidthFitSquareImageView
android:id="@+id/album_art" android:id="@+id/image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="centerCrop" android:scaleType="centerCrop" />
android:src="@drawable/default_album_art"
android:transitionName="@string/transition_album_cover" />
<LinearLayout <LinearLayout
@ -35,11 +33,10 @@
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="vertical" android:orientation="vertical"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="16dp" android:paddingRight="16dp">
android:transitionName="@string/transition_album_text">
<TextView <TextView
android:id="@+id/album_title" android:id="@+id/title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
@ -48,7 +45,7 @@
android:textColor="?title_text_color" /> android:textColor="?title_text_color" />
<TextView <TextView
android:id="@+id/album_interpret" android:id="@+id/text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
@ -63,13 +60,13 @@
</FrameLayout> </FrameLayout>
<ImageView <ImageView
android:id="@+id/check_mark" android:id="@+id/selected_indicator"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:paddingBottom="68dp" android:paddingBottom="68dp"
android:src="@drawable/ic_check_white_96dp" android:src="@drawable/ic_check_white_96dp"
android:tint="?check_mark_color" android:tint="?check_mark_color"
android:visibility="invisible" /> android:visibility="gone" />
</FrameLayout> </FrameLayout>

View file

@ -15,11 +15,10 @@
android:orientation="vertical"> android:orientation="vertical">
<ImageView <ImageView
android:id="@+id/album_art" android:id="@+id/image"
android:layout_width="104dp" android:layout_width="104dp"
android:layout_height="104dp" android:layout_height="104dp"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:transitionName="@string/transition_album_cover"
tools:ignore="ContentDescription,UnusedAttribute" /> tools:ignore="ContentDescription,UnusedAttribute" />
<LinearLayout <LinearLayout
@ -34,11 +33,10 @@
android:orientation="vertical" android:orientation="vertical"
android:paddingLeft="8dp" android:paddingLeft="8dp"
android:paddingRight="8dp" android:paddingRight="8dp"
android:transitionName="@string/transition_album_text"
tools:ignore="UnusedAttribute"> tools:ignore="UnusedAttribute">
<TextView <TextView
android:id="@+id/album_title" android:id="@+id/title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:singleLine="true" android:singleLine="true"
@ -47,7 +45,7 @@
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
android:id="@+id/album_year" android:id="@+id/text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:singleLine="true" android:singleLine="true"

View file

@ -16,25 +16,44 @@
android:paddingRight="0dp" android:paddingRight="0dp"
android:paddingStart="16dp"> android:paddingStart="16dp">
<com.kabouzeid.gramophone.views.WidthFitSquareImageView <FrameLayout
android:id="@+id/album_art" android:id="@+id/image_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:id="@+id/image"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_gravity="center" android:scaleType="centerCrop"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/image_text"
android:layout_width="40dp"
android:layout_height="match_parent"
android:fontFamily="sans-serif"
android:gravity="center" android:gravity="center"
android:scaleType="centerCrop" /> android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color"
android:visibility="gone" />
</FrameLayout>
<LinearLayout <LinearLayout
android:id="@+id/text_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginLeft="16dp" android:layout_marginEnd="16dp"
android:layout_marginRight="16dp" android:layout_marginStart="16dp"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/song_title" android:id="@+id/title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
@ -43,7 +62,7 @@
android:textColor="?title_text_color" /> android:textColor="?title_text_color" />
<TextView <TextView
android:id="@+id/song_info" android:id="@+id/text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
@ -56,8 +75,8 @@
android:id="@+id/menu" android:id="@+id/menu"
style="@style/OverFlowButton" style="@style/OverFlowButton"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="2dp" android:layout_marginEnd="2dp"
android:layout_marginRight="2dp" android:layout_marginStart="2dp"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</LinearLayout> </LinearLayout>

View file

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="72dp"
android:foreground="?rect_selector"
tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/artist_image"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:gravity="center"
android:scaleType="centerCrop" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/artist_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" />
<TextView
android:id="@+id/artist_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="?caption_text_color" />
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/short_separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:layout_marginLeft="72dp"
android:layout_marginStart="72dp"
android:background="?separator_color" />
</FrameLayout>

View file

@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="72dp"
android:foreground="?rect_selector"
tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal"
android:paddingEnd="0dp"
android:paddingLeft="16dp"
android:paddingRight="0dp"
android:paddingStart="16dp">
<com.kabouzeid.gramophone.views.WidthFitSquareImageView
android:id="@+id/album_art"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:gravity="center"
android:scaleType="centerCrop" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/song_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" />
<TextView
android:id="@+id/song_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="?caption_text_color" />
</LinearLayout>
<ImageView
android:id="@+id/menu"
style="@style/OverFlowButton"
android:layout_gravity="center_vertical"
android:layout_marginEnd="2dp"
android:layout_marginRight="2dp"
tools:ignore="ContentDescription" />
</LinearLayout>
<View
android:id="@+id/short_separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:layout_marginLeft="72dp"
android:layout_marginStart="72dp"
android:background="?separator_color" />
</FrameLayout>

View file

@ -1,61 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="64dp"
android:foreground="?rect_selector"
tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingEnd="0dp"
android:paddingLeft="16dp"
android:paddingRight="0dp"
android:paddingStart="16dp">
<ImageView
android:id="@+id/playlist_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:gravity="center"
android:padding="8dp"
android:src="@drawable/ic_queue_music_white_24dp"
android:tint="?themed_drawable_color"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/playlist_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" />
<ImageView
android:id="@+id/menu"
style="@style/OverFlowButton"
android:layout_gravity="center_vertical"
android:layout_marginEnd="2dp"
android:layout_marginRight="2dp"
tools:ignore="ContentDescription" />
</LinearLayout>
<View
android:id="@+id/short_separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:layout_marginLeft="72dp"
android:layout_marginStart="72dp"
android:background="?separator_color" />
</FrameLayout>

View file

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="64dp"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal"
tools:ignore="UnusedAttribute">
<TextView
android:id="@+id/song_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Body2" />
<ImageView
android:id="@+id/playing_indicator"
style="@style/PlayingIndicator"
android:layout_marginEnd="-8dp"
android:layout_marginRight="-8dp"
tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/menu"
style="@style/OverFlowButton"
android:layout_gravity="center_vertical"
tools:ignore="ContentDescription" />
</LinearLayout>

View file

@ -2,11 +2,11 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="72dp" android:layout_height="64dp"
android:foreground="?rect_selector" android:foreground="?rect_selector"
tools:ignore="UnusedAttribute"> tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants" android:descendantFocusability="blocksDescendants"
@ -16,54 +16,63 @@
android:paddingRight="0dp" android:paddingRight="0dp"
android:paddingStart="16dp"> android:paddingStart="16dp">
<FrameLayout
android:id="@+id/image_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:id="@+id/image"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerCrop"
tools:ignore="ContentDescription" />
<TextView <TextView
android:id="@+id/track_number" android:id="@+id/image_text"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
android:gravity="center" android:gravity="center"
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead" android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" /> android:textColor="?title_text_color"
android:visibility="gone" />
<LinearLayout </FrameLayout>
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView <TextView
android:id="@+id/song_title" android:id="@+id/title"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead" android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" /> android:textColor="?title_text_color" />
<TextView
android:id="@+id/song_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="?caption_text_color" />
</LinearLayout>
<ImageView <ImageView
android:id="@+id/menu" android:id="@+id/menu"
style="@style/OverFlowButton" style="@style/OverFlowButton"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginLeft="2dp" android:layout_marginEnd="2dp"
android:layout_marginRight="2dp" android:layout_marginStart="2dp"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</LinearLayout> </LinearLayout>
<View
android:id="@+id/separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="?separator_color"
android:visibility="gone" />
<View <View
android:id="@+id/short_separator" android:id="@+id/short_separator"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -72,4 +81,5 @@
android:layout_marginLeft="72dp" android:layout_marginLeft="72dp"
android:layout_marginStart="72dp" android:layout_marginStart="72dp"
android:background="?separator_color" /> android:background="?separator_color" />
</FrameLayout> </FrameLayout>

View file

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="64dp"
android:background="?card_color"
android:elevation="2dp"
android:foreground="?rect_selector"
tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingEnd="0dp"
android:paddingLeft="16dp"
android:paddingRight="0dp"
android:paddingStart="16dp">
<ImageView
android:id="@+id/playlist_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:gravity="center"
android:padding="8dp"
android:src="@drawable/ic_queue_music_white_24dp"
android:tint="?themed_drawable_color"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/playlist_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" />
<ImageView
android:id="@+id/menu"
style="@style/OverFlowButton"
android:layout_gravity="center_vertical"
android:layout_marginEnd="2dp"
android:layout_marginRight="2dp"
tools:ignore="ContentDescription" />
</LinearLayout>
</FrameLayout>

View file

@ -1,66 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="72dp"
android:background="?card_color"
android:elevation="2dp"
android:foreground="?rect_selector"
tools:ignore="UnusedAttribute">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<com.kabouzeid.gramophone.views.WidthFitSquareImageView
android:id="@+id/album_art"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:gravity="center"
android:scaleType="centerCrop" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/album_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" />
<TextView
android:id="@+id/album_artist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="?caption_text_color" />
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/short_separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:layout_marginLeft="72dp"
android:layout_marginStart="72dp"
android:background="?separator_color" />
</FrameLayout>

View file

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="72dp"
android:background="?card_color"
android:elevation="2dp"
android:foreground="?rect_selector"
tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/artist_image"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:gravity="center"
android:scaleType="centerCrop" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/artist_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" />
<TextView
android:id="@+id/artist_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="?caption_text_color" />
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/short_separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:layout_marginLeft="72dp"
android:layout_marginStart="72dp"
android:background="?separator_color" />
</FrameLayout>

View file

@ -1,62 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="72dp"
android:background="?card_color"
android:elevation="2dp"
android:foreground="?rect_selector"
tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingStart="16dp"
tools:ignore="RtlSymmetry">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/song_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" />
<TextView
android:id="@+id/song_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="?caption_text_color" />
</LinearLayout>
<ImageView
android:id="@+id/menu"
style="@style/OverFlowButton"
android:layout_gravity="center_vertical"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp" />
</LinearLayout>
<View
android:id="@+id/separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="?separator_color" />
</FrameLayout>

View file

@ -1,19 +1,18 @@
<FrameLayout <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/header"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/header"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/navigation_drawer_header_height" android:layout_height="@dimen/navigation_drawer_header_height"
android:clickable="true" android:clickable="true"
android:foreground="?rect_selector"> android:foreground="?rect_selector">
<ImageView <ImageView
android:id="@+id/album_art" android:id="@+id/image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/default_album_art" android:src="@drawable/default_album_art"
android:transitionName="@string/transition_album_cover" android:transitionName="@string/transition_album_art"
tools:ignore="UnusedAttribute" /> tools:ignore="UnusedAttribute" />
<View <View
@ -31,7 +30,7 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/song_title" android:id="@+id/title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="16dp" android:layout_marginLeft="16dp"
@ -39,11 +38,11 @@
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead" android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="@color/white" android:textColor="@android:color/white"
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
android:id="@+id/song_artist" android:id="@+id/text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="16dp" android:layout_marginLeft="16dp"

View file

@ -6,7 +6,7 @@
tools:ignore="ContentDescription"> tools:ignore="ContentDescription">
<ImageView <ImageView
android:id="@+id/album_art" android:id="@+id/image"
android:layout_width="@dimen/widget_medium_image_size" android:layout_width="@dimen/widget_medium_image_size"
android:layout_height="@dimen/widget_medium_image_size" android:layout_height="@dimen/widget_medium_image_size"
android:scaleType="centerCrop" android:scaleType="centerCrop"
@ -60,7 +60,7 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/song_title" android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"

View file

@ -2,7 +2,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/action_delete_from_playlist" android:id="@+id/action_remove_from_playlist"
android:title="@string/action_remove_from_playlist" android:title="@string/action_remove_from_playlist"
app:showAsAction="never" /> app:showAsAction="never" />
<item <item

View file

@ -15,7 +15,7 @@
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_delete_from_playlist" android:id="@+id/action_remove_from_playlist"
android:icon="@drawable/ic_delete_white_24dp" android:icon="@drawable/ic_delete_white_24dp"
android:title="@string/action_remove_from_playlist" android:title="@string/action_remove_from_playlist"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />

View file

@ -9,7 +9,8 @@
<dimen name="nav_drawer_margin">56dp</dimen> <dimen name="nav_drawer_margin">56dp</dimen>
<dimen name="title_view_height">72dp</dimen> <dimen name="title_view_height">72dp</dimen>
<dimen name="toolbar_elevation">2dp</dimen> <dimen name="toolbar_elevation">4dp</dimen>
<dimen name="card_elevation">2dp</dimen>
<dimen name="header_image_height">360dp</dimen> <dimen name="header_image_height">360dp</dimen>
<dimen name="progress_container_height">20dp</dimen> <dimen name="progress_container_height">20dp</dimen>
@ -63,4 +64,7 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
<dimen name="title_box_text_spacing_small">0dp</dimen> <dimen name="title_box_text_spacing_small">0dp</dimen>
<dimen name="title_box_text_spacing_large">2dp</dimen> <dimen name="title_box_text_spacing_large">2dp</dimen>
<!-- For use with 24dp drawables in the item_list layouts-->
<dimen name="list_item_image_icon_padding">8dp</dimen>
</resources> </resources>

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="transition_album_cover">album_cover_transition</string> <string name="transition_album_art">album_art_transition</string>
<string name="transition_fab">fab_transition</string>
<string name="transition_album_text">album_text_transition</string>
<string name="transition_artist_image">artist_image_transition</string> <string name="transition_artist_image">artist_image_transition</string>
<string name="transition_fab">fab_transition</string>
</resources> </resources>