Adapter clean ups

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -43,7 +43,7 @@ public class WidgetMedium extends AppWidgetProvider {
if (song.id == -1) return;
widgetLayout = new RemoteViews(context.getPackageName(), R.layout.widget_medium);
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);
updateWidgetsPlayState(context, isPlaying);
loadAlbumArt(context, song);
@ -107,15 +107,15 @@ public class WidgetMedium extends AppWidgetProvider {
private static void setAlbumArt(@NonNull final Context context, @Nullable final Bitmap albumArt) {
if (albumArt != null) {
widgetLayout.setImageViewBitmap(R.id.album_art, albumArt);
widgetLayout.setImageViewBitmap(R.id.image, albumArt);
} else {
widgetLayout.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
widgetLayout.setImageViewResource(R.id.image, R.drawable.default_album_art);
}
updateWidgets(context);
}
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.button_toggle_play_pause, retrievePlaybackActions(context, 1));
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.support.annotation.NonNull;
import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
import com.kabouzeid.gramophone.dialogs.RenamePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
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.smartplaylist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
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 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()) {
case R.id.action_set_as_ringtone:
MusicUtil.setRingtone(activity, song.id);
@ -79,28 +76,30 @@ public class MenuItemClickHelper {
return false;
}
public static boolean handlePlaylistMenuClick(@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;
}
public static abstract class OnClickSongMenu implements View.OnClickListener, PopupMenu.OnMenuItemClickListener {
private AppCompatActivity activity;
@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);
public OnClickSongMenu(@NonNull AppCompatActivity activity) {
this.activity = activity;
}
public int getMenuRes() {
return MENU_RES;
}
@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 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.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
@ -24,7 +24,7 @@ public abstract class AbsSmartPlaylist extends Playlist {
public 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;
}

View file

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

View file

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

View file

@ -281,18 +281,18 @@ public class MainActivity extends AbsFabActivity
public void onClick(View v) {
//noinspection ConstantConditions
NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithFab(new Pair[]{
Pair.create(navigationDrawerHeader.findViewById(R.id.album_art),
getResources().getString(R.string.transition_album_cover)
Pair.create(navigationDrawerHeader.findViewById(R.id.image),
getResources().getString(R.string.transition_album_art)
)
}));
}
});
}
((TextView) navigationDrawerHeader.findViewById(R.id.song_title)).setText(song.title);
((TextView) navigationDrawerHeader.findViewById(R.id.song_artist)).setText(song.artistName);
((TextView) navigationDrawerHeader.findViewById(R.id.title)).setText(song.title);
((TextView) navigationDrawerHeader.findViewById(R.id.text)).setText(song.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getSongImageLoaderString(song),
((ImageView) navigationDrawerHeader.findViewById(R.id.album_art)),
((ImageView) navigationDrawerHeader.findViewById(R.id.image)),
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.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.SongShareDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager;
import com.kabouzeid.gramophone.imageloader.BlurProcessor;
import com.kabouzeid.gramophone.misc.SmallTransitionListener;
import com.kabouzeid.gramophone.model.Song;
@ -77,9 +76,9 @@ public class MusicControllerActivity extends AbsFabActivity {
private static final int CMD_UPDATE_PROGRESS_VIEWS = 1;
@InjectView(R.id.song_title)
@InjectView(R.id.title)
TextView songTitle;
@InjectView(R.id.song_artist)
@InjectView(R.id.text)
TextView songArtist;
@InjectView(R.id.footer)
LinearLayout footer;
@ -97,7 +96,7 @@ public class MusicControllerActivity extends AbsFabActivity {
RelativeLayout mediaControllerContainer;
@InjectView(R.id.album_art_background)
ImageView albumArtBackground;
@InjectView(R.id.album_art)
@InjectView(R.id.image)
SquareIfPlaceImageView albumArt;
@InjectView(R.id.toolbar)
Toolbar toolbar;
@ -121,8 +120,6 @@ public class MusicControllerActivity extends AbsFabActivity {
private boolean alternativeProgressSlider;
private boolean showPlaybackControllerCard;
private StackBlurManager defaultAlbumArtStackBlurManager;
private Song song;
@Override
@ -439,6 +436,7 @@ public class MusicControllerActivity extends AbsFabActivity {
@Override
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
applyPalette(null);
ImageLoader.getInstance().displayImage(
"drawable://" + R.drawable.default_album_art,
albumArtBackground,
@ -453,7 +451,9 @@ public class MusicControllerActivity extends AbsFabActivity {
onLoadingFailed(imageUri, view, null);
return;
}
applyPalette(loadedImage);
ImageLoader.getInstance().displayImage(
imageUri,
albumArtBackground,
@ -465,36 +465,25 @@ public class MusicControllerActivity extends AbsFabActivity {
}
private void applyPalette(@Nullable Bitmap bitmap) {
final int defaultBarColor = ColorUtil.resolveColor(this, R.attr.default_bar_color);
if (bitmap != null) {
Palette.from(bitmap)
.resizeBitmapSize(100)
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@NonNull Palette palette) {
final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();
if (vibrantSwatch != null) {
final int swatchRgb = vibrantSwatch.getRgb();
animateColorChange(swatchRgb);
animateTextColorChange(ColorUtil.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
notifyTaskColorChange(swatchRgb);
} else {
resetColors();
}
setColors(palette.getVibrantColor(defaultBarColor));
}
});
} else {
resetColors();
setColors(defaultBarColor);
}
}
private void resetColors() {
final int textColor = ColorUtil.getOpaqueColor(DialogUtils.resolveColor(this, R.attr.title_text_color));
final int defaultBarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
animateColorChange(defaultBarColor);
animateTextColorChange(textColor);
notifyTaskColorChange(defaultBarColor);
private void setColors(int vibrantColor) {
animateColorChange(vibrantColor);
animateTextColorChange(ColorUtil.getTextColorForBackground(vibrantColor));
notifyTaskColorChange(vibrantColor);
}

View file

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

View file

@ -122,7 +122,7 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
}
}
@Nullable
@NonNull
protected FloatingActionButton getFab() {
if (fab == null) {
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();
@InjectView(R.id.album_title)
@InjectView(R.id.title)
EditText albumTitle;
@InjectView(R.id.album_artist)
EditText albumArtist;

View file

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

View file

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

View file

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

View file

@ -52,4 +52,8 @@ public class ColorUtil {
public static boolean useDarkTextColorOnBackground(int backgroundColor) {
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" />
<com.kabouzeid.gramophone.views.SquareIfPlaceImageView
android:id="@+id/album_art"
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:scaleType="centerCrop"
android:src="@drawable/default_album_art"
android:transitionName="@string/transition_album_cover"
android:transitionName="@string/transition_album_art"
tools:ignore="ContentDescription,UnusedAttribute" />
</FrameLayout>
@ -46,7 +46,7 @@
android:orientation="vertical">
<TextView
android:id="@+id/album_title"
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="@dimen/title_view_height"
android:height="@dimen/title_view_height"

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -16,25 +16,44 @@
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" />
<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
android:id="@+id/image_text"
android:layout_width="40dp"
android:layout_height="match_parent"
android:fontFamily="sans-serif"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color"
android:visibility="gone" />
</FrameLayout>
<LinearLayout
android:id="@+id/text_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/song_title"
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
@ -43,7 +62,7 @@
android:textColor="?title_text_color" />
<TextView
android:id="@+id/song_info"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
@ -56,8 +75,8 @@
android:id="@+id/menu"
style="@style/OverFlowButton"
android:layout_gravity="center_vertical"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_marginEnd="2dp"
android:layout_marginStart="2dp"
tools:ignore="ContentDescription" />
</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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_height="64dp"
android:foreground="?rect_selector"
tools:ignore="UnusedAttribute">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
@ -16,54 +16,63 @@
android:paddingRight="0dp"
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
android:id="@+id/image_text"
android:layout_width="40dp"
android:layout_height="match_parent"
android:fontFamily="sans-serif"
android:gravity="center"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color"
android:visibility="gone" />
</FrameLayout>
<TextView
android:id="@+id/track_number"
android:layout_width="40dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:id="@+id/title"
android:layout_width="0dp"
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:gravity="center"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="?title_text_color" />
<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"
android:layout_marginEnd="2dp"
android:layout_marginStart="2dp"
tools:ignore="ContentDescription" />
</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
android:id="@+id/short_separator"
android:layout_width="match_parent"
@ -72,4 +81,5 @@
android:layout_marginLeft="72dp"
android:layout_marginStart="72dp"
android:background="?separator_color" />
</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
android:id="@+id/header"
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"
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="@dimen/navigation_drawer_header_height"
android:clickable="true"
android:foreground="?rect_selector">
<ImageView
android:id="@+id/album_art"
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/default_album_art"
android:transitionName="@string/transition_album_cover"
android:transitionName="@string/transition_album_art"
tools:ignore="UnusedAttribute" />
<View
@ -31,7 +30,7 @@
android:orientation="vertical">
<TextView
android:id="@+id/song_title"
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
@ -39,11 +38,11 @@
android:fontFamily="sans-serif-medium"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
android:textColor="@color/white"
android:textColor="@android:color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/song_artist"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"

View file

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

View file

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

View file

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

View file

@ -9,7 +9,8 @@
<dimen name="nav_drawer_margin">56dp</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="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_large">2dp</dimen>
<!-- For use with 24dp drawables in the item_list layouts-->
<dimen name="list_item_image_icon_padding">8dp</dimen>
</resources>

View file

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