diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java deleted file mode 100644 index 92081e95..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java +++ /dev/null @@ -1,277 +0,0 @@ -package com.kabouzeid.gramophone.adapter; - -import android.annotation.TargetApi; -import android.graphics.Bitmap; -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.graphics.Palette; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.TextView; - -import com.kabouzeid.gramophone.App; -import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; -import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; -import com.kabouzeid.gramophone.helper.MusicPlayerRemote; -import com.kabouzeid.gramophone.interfaces.CabHolder; -import com.kabouzeid.gramophone.loader.AlbumLoader; -import com.kabouzeid.gramophone.loader.AlbumSongLoader; -import com.kabouzeid.gramophone.model.Album; -import com.kabouzeid.gramophone.model.DataBaseChangedEvent; -import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; -import com.kabouzeid.gramophone.util.ColorUtil; -import com.kabouzeid.gramophone.util.MusicUtil; -import com.kabouzeid.gramophone.util.NavigationUtil; -import com.kabouzeid.gramophone.util.PreferenceUtil; -import com.kabouzeid.gramophone.util.ViewUtil; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; -import com.squareup.otto.Subscribe; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; -import butterknife.InjectView; - -/** - * @author Karim Abou Zeid (kabouzeid) - */ -public class AlbumAdapter extends AbsMultiSelectAdapter { - - public static final String TAG = AlbumAdapter.class.getSimpleName(); - private static final int FADE_IN_TIME = 500; - - private final AppCompatActivity activity; - private boolean usePalette; - private List 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, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { - final Album album = dataSet.get(position); - - setFooterColor(holder.title, holder.text, holder.footer, defaultFooterColor, false); - - final boolean isChecked = isChecked(album); - holder.itemView.setActivated(isChecked); - holder.selectedIndicator.setVisibility(isChecked ? View.VISIBLE : View.GONE); - - holder.title.setText(album.title); - holder.text.setText(album.artistName); - - ImageLoader.getInstance().displayImage( - MusicUtil.getAlbumImageLoaderString(album), - holder.image, - new DisplayImageOptions.Builder() - .cacheInMemory(true) - .showImageOnFail(R.drawable.default_album_art) - .resetViewBeforeLoading(true) - .displayer(new FadeInBitmapDisplayer(FADE_IN_TIME, true, true, false)) - .build(), - new SimpleImageLoadingListener() { - @Override - public void onLoadingFailed(String imageUri, View view, FailReason failReason) { - FadeInBitmapDisplayer.animate(view, FADE_IN_TIME); - if (usePalette) - 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.text, holder.footer); - } - } - ); - } - - @Override - public int getItemCount() { - return dataSet.size(); - } - - @Override - protected Album getIdentifier(int position) { - return dataSet.get(position); - } - - @Override - protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList selection) { - switch (menuItem.getItemId()) { - case R.id.action_delete_from_disk: - DeleteSongsDialog.create(getSongList(selection)).show(activity.getSupportFragmentManager(), "DELETE_SONGS"); - break; - case R.id.action_add_to_playlist: - AddToPlaylistDialog.create(getSongList(selection)).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); - break; - case R.id.action_add_to_current_playing: - MusicPlayerRemote.enqueue(getSongList(selection)); - break; - } - } - - @NonNull - private ArrayList getSongList(@NonNull List albums) { - final ArrayList songs = new ArrayList<>(); - for (Album album : albums) { - songs.addAll(AlbumSongLoader.getAlbumSongList(activity, album.id)); - } - return songs; - } - - public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { - @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); - 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)); - // 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.container)).getForeground().setHotspot(motionEvent.getX(), motionEvent.getY()); - return false; - } - }); - } - } - - @Override - public void onClick(View v) { - if (isInQuickSelectMode()) { - toggleChecked(getAdapterPosition()); - } else { - 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, dataSet.get(getAdapterPosition()).id, albumPairs); - } - } - - @Override - public boolean onLongClick(View view) { - toggleChecked(getAdapterPosition()); - return true; - } - } - - @Override - public long getItemId(int position) { - return dataSet.get(position).id; - } - - private void loadDataSet() { - dataSet = AlbumLoader.getAllAlbums(activity); - } - - private void applyPalette(@Nullable Bitmap bitmap, @NonNull final TextView title, @NonNull final TextView artist, @NonNull final View footer) { - if (bitmap != null) { - Palette.from(bitmap) - .resizeBitmapSize(100) - .generate(new Palette.PaletteAsyncListener() { - @Override - public void onGenerated(@NonNull Palette palette) { - setFooterColor(title, artist, footer, palette.getVibrantColor(defaultFooterColor), true); - } - }); - } else { - setFooterColor(title, artist, footer, defaultFooterColor, true); - } - } - - 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 - public void onDetachedFromRecyclerView(RecyclerView recyclerView) { - super.onDetachedFromRecyclerView(recyclerView); - App.bus.unregister(this); - } - - @Override - public void onAttachedToRecyclerView(RecyclerView recyclerView) { - super.onAttachedToRecyclerView(recyclerView); - App.bus.register(this); - } - - @Subscribe - public void onDataBaseEvent(@NonNull DataBaseChangedEvent event) { - switch (event.getAction()) { - case DataBaseChangedEvent.ALBUMS_CHANGED: - case DataBaseChangedEvent.DATABASE_CHANGED: - loadDataSet(); - notifyDataSetChanged(); - break; - } - } - - @Subscribe - public void onUIChangeEvent(@NonNull UIPreferenceChangedEvent event) { - switch (event.getAction()) { - case UIPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED: - usePalette = (boolean) event.getValue(); - notifyDataSetChanged(); - break; - } - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java deleted file mode 100644 index 213f6d82..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAlbumAdapter.java +++ /dev/null @@ -1,185 +0,0 @@ -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.TextView; - -import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; -import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; -import com.kabouzeid.gramophone.helper.MusicPlayerRemote; -import com.kabouzeid.gramophone.interfaces.CabHolder; -import com.kabouzeid.gramophone.loader.AlbumSongLoader; -import com.kabouzeid.gramophone.model.Album; -import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; -import com.kabouzeid.gramophone.util.MusicUtil; -import com.kabouzeid.gramophone.util.NavigationUtil; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -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) - */ -public class ArtistAlbumAdapter extends AbsMultiSelectAdapter { - public static final String TAG = AlbumAdapter.class.getSimpleName(); - - private static final int TYPE_FIRST = 1; - private static final int TYPE_MIDDLE = 2; - private static final int TYPE_LAST = 3; - - @NonNull - private final AppCompatActivity activity; - private ArrayList dataSet; - private final int listMargin; - - public ArtistAlbumAdapter(@NonNull AppCompatActivity activity, ArrayList objects, @Nullable CabHolder cabHolder) { - super(activity, cabHolder, R.menu.menu_media_selection); - this.activity = activity; - dataSet = objects; - listMargin = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin); - setHasStableIds(true); - } - - @Override - public long getItemId(int position) { - return dataSet.get(position).id; - } - - public void updateDataSet(ArrayList objects) { - dataSet = objects; - notifyDataSetChanged(); - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - 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; - } else if (viewType == TYPE_LAST) { - params.rightMargin = listMargin; - } - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { - final Album album = dataSet.get(position); - - ImageLoader.getInstance().displayImage( - MusicUtil.getAlbumImageLoaderString(album), - holder.image, - new DisplayImageOptions.Builder() - .cacheInMemory(true) - .showImageOnFail(R.drawable.default_album_art) - .resetViewBeforeLoading(true) - .build() - ); - - holder.title.setText(album.title); - holder.text.setText(String.valueOf(album.year)); - holder.itemView.setActivated(isChecked(album)); - } - - @Override - public int getItemCount() { - return dataSet.size(); - } - - @Override - public int getItemViewType(int position) { - if (position == 0) { - return TYPE_FIRST; - } else if (position == getItemCount() - 1) { - return TYPE_LAST; - } else return TYPE_MIDDLE; - } - - @Override - protected Album getIdentifier(int position) { - return dataSet.get(position); - } - - @Override - protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList selection) { - switch (menuItem.getItemId()) { - case R.id.action_delete_from_disk: - DeleteSongsDialog.create(getSongList(selection)).show(activity.getSupportFragmentManager(), "DELETE_SONGS"); - break; - case R.id.action_add_to_playlist: - AddToPlaylistDialog.create(getSongList(selection)).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); - break; - case R.id.action_add_to_current_playing: - MusicPlayerRemote.enqueue(getSongList(selection)); - break; - } - } - - @NonNull - private ArrayList getSongList(@NonNull List albums) { - final ArrayList songs = new ArrayList<>(); - for (Album album : albums) { - songs.addAll(AlbumSongLoader.getAlbumSongList(activity, album.id)); - } - return songs; - } - - public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { - @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); - 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 - public void onClick(View v) { - if (isInQuickSelectMode()) { - toggleChecked(getAdapterPosition()); - } else { - 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, dataSet.get(getAdapterPosition()).id, albumPairs); - } - } - - @Override - public boolean onLongClick(View view) { - toggleChecked(getAdapterPosition()); - return true; - } - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java index 096f887e..732291e3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java @@ -104,14 +104,6 @@ public class PagerAdapter extends FragmentPagerAdapter { .toUpperCase(Locale.getDefault()); } - public int getCurrentPage() { - return mCurrentPage; - } - - protected void setCurrentPage(final int currentPage) { - mCurrentPage = currentPage; - } - public enum MusicFragments { SONG(SongViewFragment.class), ALBUM(AlbumViewFragment.class), diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java index 522da458..8c2832c4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java @@ -1,49 +1,39 @@ package com.kabouzeid.gramophone.adapter; import android.os.Build; +import android.support.annotation.LayoutRes; 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.adapter.base.AbsMultiSelectAdapter; +import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.ClearSmartPlaylistDialog; import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog; 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; -import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; -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; import java.util.List; -import butterknife.ButterKnife; -import butterknife.InjectView; - /** * @author Karim Abou Zeid (kabouzeid) */ @@ -51,17 +41,22 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter dataSet; - int favoritePlaylistId; + protected ArrayList dataSet; + protected int itemLayoutRes; + protected int favoritePlaylistId; - public PlaylistAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) { + public PlaylistAdapter(AppCompatActivity activity, ArrayList dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { super(activity, cabHolder, R.menu.menu_playlists_selection); this.activity = activity; - loadDataSet(); + this.dataSet = dataSet; + this.itemLayoutRes = itemLayoutRes; + + favoritePlaylistId = MusicUtil.getFavoritesPlaylist(activity).id; + setHasStableIds(true); } @@ -70,33 +65,34 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter(); - dataSet.add(new LastAddedPlaylist(activity)); - dataSet.add(new RecentlyPlayedPlaylist(activity)); - dataSet.add(new MyTopTracksPlaylist(activity)); - dataSet.addAll(PlaylistLoader.getAllPlaylists(activity)); - favoritePlaylistId = MusicUtil.getFavoritesPlaylist(activity).id; - } - @NonNull @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(activity).inflate(R.layout.item_list_single_row, parent, false); + View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false); + return createViewHolder(view, viewType); + } + + protected ViewHolder createViewHolder(View view, int viewType) { 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.itemView.setActivated(isChecked(playlist)); - holder.icon.setImageDrawable(Util.getTintedDrawable( - activity, - getIconRes(playlist), - ColorUtil.resolveColor(activity, R.attr.themed_drawable_color) - )); + if (holder.title != null) { + holder.title.setText(playlist.name); + } + + if (holder.image != null) { + holder.image.setImageDrawable(Util.getTintedDrawable( + activity, + getIconRes(playlist), + ColorUtil.resolveColor(activity, R.attr.themed_drawable_color) + )); + } } private int getIconRes(Playlist playlist) { @@ -160,55 +156,50 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter= 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); + if (image != null) { + int iconPadding = activity.getResources().getDimensionPixelSize(R.dimen.list_item_image_icon_padding); + image.setPadding(iconPadding, iconPadding, iconPadding, iconPadding); + } - 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() == 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) { - if (item.getItemId() == R.id.action_clear_playlist) { - Playlist playlist = dataSet.get(getAdapterPosition()); - if (playlist instanceof AbsSmartPlaylist) { - ClearSmartPlaylistDialog.create((AbsSmartPlaylist) playlist).show(activity.getSupportFragmentManager(), "CLEAR_SMART_PLAYLIST_" + playlist.name); - return true; + if (menu != null) { + menu.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + PopupMenu popupMenu = new PopupMenu(activity, view); + 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) { + if (item.getItemId() == R.id.action_clear_playlist) { + Playlist playlist = dataSet.get(getAdapterPosition()); + if (playlist instanceof AbsSmartPlaylist) { + ClearSmartPlaylistDialog.create((AbsSmartPlaylist) playlist).show(activity.getSupportFragmentManager(), "CLEAR_SMART_PLAYLIST_" + playlist.name); + return true; + } } + return PlaylistMenuHelper.handleMenuClick( + activity, dataSet.get(getAdapterPosition()), item); } - return PlaylistMenuHelper.handleMenuClick( - activity, dataSet.get(getAdapterPosition()), item); - } - }); - popupMenu.show(); - } - }); + }); + popupMenu.show(); + } + }); + } } @Override @@ -230,27 +221,4 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter= Build.VERSION_CODES.LOLLIPOP) { + itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation)); + } + } + + if (menu != null) { + if (itemViewType == SONG) { + menu.setVisibility(View.VISIBLE); menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) { @Override public Song getSong() { return (Song) results.get(getAdapterPosition()); } }); - break; - case ALBUM: + } else { menu.setVisibility(View.GONE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - image.setTransitionName(activity.getString(R.string.transition_album_art)); - } + } + } + + switch (itemViewType) { + case ALBUM: + setImageTransitionName(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)); + setImageTransitionName(activity.getString(R.string.transition_artist_image)); + break; + default: + if (image != null) { + image.setVisibility(View.GONE); } break; } @@ -244,7 +238,7 @@ public class SearchAdapter extends RecyclerView.Adapter { + + public static final String TAG = AlbumAdapter.class.getSimpleName(); + private static final int FADE_IN_TIME = 500; + + protected final AppCompatActivity activity; + protected List dataSet; + + protected int itemLayoutRes; + + protected boolean usePalette; + + public AlbumAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { + super(activity, cabHolder, R.menu.menu_media_selection); + this.activity = activity; + this.dataSet = dataSet; + this.itemLayoutRes = itemLayoutRes; + + setHasStableIds(true); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false); + return createViewHolder(view, viewType); + } + + protected ViewHolder createViewHolder(View view, int viewType) { + return new ViewHolder(view); + } + + protected String getAlbumTitle(Album album) { + return album.title; + } + + protected String getAlbumText(Album album) { + return album.artistName; + } + + protected String getAlbumImageLoaderUri(Album album) { + return MusicUtil.getAlbumImageLoaderString(album); + } + + @Override + public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { + final Album album = dataSet.get(position); + + final int defaultBarColor = ColorUtil.resolveColor(activity, R.attr.default_bar_color); + ViewUtil.applyBackgroundColor( + defaultBarColor, + new View[]{holder.paletteColorContainer}, + new TextView[]{holder.title, holder.text}, + false); + + final boolean isChecked = isChecked(album); + holder.itemView.setActivated(isChecked); + if (holder.selectedIndicator != null) { + holder.selectedIndicator.setVisibility(isChecked ? View.VISIBLE : View.GONE); + } + + if (holder.title != null) { + holder.title.setText(getAlbumTitle(album)); + } + if (holder.text != null) { + holder.text.setText(getAlbumText(album)); + } + + ImageLoader.getInstance().displayImage( + getAlbumImageLoaderUri(album), + holder.image, + new DisplayImageOptions.Builder() + .cacheInMemory(true) + .showImageOnFail(R.drawable.default_album_art) + .resetViewBeforeLoading(true) + .displayer(new FadeInBitmapDisplayer(FADE_IN_TIME) { + @Override + public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) { + boolean loadedFromMemoryCache = loadedFrom == LoadedFrom.MEMORY_CACHE; + if (loadedFromMemoryCache) { + imageAware.setImageBitmap(bitmap); + } else { + super.display(bitmap, imageAware, loadedFrom); + } + if (usePalette) + ViewUtil.applyBackgroundColorFromBitmap( + bitmap, + defaultBarColor, + new View[]{holder.paletteColorContainer}, + new TextView[]{holder.title, holder.text}, + !loadedFromMemoryCache); + } + }) + .build(), + new SimpleImageLoadingListener() { + @Override + public void onLoadingFailed(String imageUri, View view, FailReason failReason) { + FadeInBitmapDisplayer.animate(view, FADE_IN_TIME); + if (usePalette) + ViewUtil.applyBackgroundColor( + defaultBarColor, + new View[]{holder.paletteColorContainer}, + new TextView[]{holder.title, holder.text}, + true); + } + } + ); + } + + @Override + public int getItemCount() { + return dataSet.size(); + } + + @Override + public long getItemId(int position) { + return dataSet.get(position).id; + } + + @Override + protected Album getIdentifier(int position) { + return dataSet.get(position); + } + + @Override + protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList selection) { + switch (menuItem.getItemId()) { + case R.id.action_delete_from_disk: + DeleteSongsDialog.create(getSongList(selection)).show(activity.getSupportFragmentManager(), "DELETE_SONGS"); + break; + case R.id.action_add_to_playlist: + AddToPlaylistDialog.create(getSongList(selection)).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); + break; + case R.id.action_add_to_current_playing: + MusicPlayerRemote.enqueue(getSongList(selection)); + break; + } + } + + @NonNull + private ArrayList getSongList(@NonNull List albums) { + final ArrayList songs = new ArrayList<>(); + for (Album album : albums) { + songs.addAll(AlbumSongLoader.getAlbumSongList(activity, album.id)); + } + return songs; + } + + public class ViewHolder extends MediaEntryViewHolder { + + public ViewHolder(@NonNull final View itemView) { + super(itemView); + setImageTransitionName(activity.getString(R.string.transition_album_art)); + } + + @Override + public void onClick(View v) { + if (isInQuickSelectMode()) { + toggleChecked(getAdapterPosition()); + } else { + 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, dataSet.get(getAdapterPosition()).id, albumPairs); + } + } + + @Override + public boolean onLongClick(View view) { + toggleChecked(getAdapterPosition()); + return true; + } + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/HorizontalAlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/HorizontalAlbumAdapter.java new file mode 100644 index 00000000..4428edaf --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/HorizontalAlbumAdapter.java @@ -0,0 +1,41 @@ +package com.kabouzeid.gramophone.adapter.album; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.view.ViewGroup; + +import com.kabouzeid.gramophone.helper.HorizontalAdapterHelper; +import com.kabouzeid.gramophone.interfaces.CabHolder; +import com.kabouzeid.gramophone.model.Album; + +import java.util.ArrayList; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class HorizontalAlbumAdapter extends AlbumAdapter { + public static final String TAG = AlbumAdapter.class.getSimpleName(); + + public HorizontalAlbumAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, @Nullable CabHolder cabHolder) { + super(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, cabHolder); + } + + @Override + protected ViewHolder createViewHolder(View view, int viewType) { + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); + HorizontalAdapterHelper.applyMarginToLayoutParams(activity, params, viewType); + return new ViewHolder(view); + } + + @Override + protected String getAlbumText(Album album) { + return String.valueOf(album.year); + } + + @Override + public int getItemViewType(int position) { + return HorizontalAdapterHelper.getItemViewtype(position, getItemCount()); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/AbsArtistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistAdapter.java similarity index 68% rename from app/src/main/java/com/kabouzeid/gramophone/adapter/artist/AbsArtistAdapter.java rename to app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistAdapter.java index f3422ac5..c265612f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/AbsArtistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistAdapter.java @@ -1,19 +1,18 @@ package com.kabouzeid.gramophone.adapter.artist; -import android.os.Build; +import android.support.annotation.LayoutRes; 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.widget.ImageView; -import android.widget.TextView; +import android.view.ViewGroup; -import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.adapter.AbsMultiSelectAdapter; +import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; +import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; @@ -21,23 +20,18 @@ import com.kabouzeid.gramophone.interfaces.CabHolder; 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; -import com.kabouzeid.gramophone.loader.ArtistLoader; import com.kabouzeid.gramophone.loader.ArtistSongLoader; import com.kabouzeid.gramophone.model.Artist; -import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; -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; @@ -45,16 +39,18 @@ import retrofit.client.Response; /** * @author Karim Abou Zeid (kabouzeid) */ -public abstract class AbsArtistAdapter extends AbsMultiSelectAdapter { +public class ArtistAdapter extends AbsMultiSelectAdapter { protected final AppCompatActivity activity; - protected List dataSet; + protected ArrayList dataSet; + protected int itemLayoutRes; protected final LastFMRestClient lastFMRestClient; - public AbsArtistAdapter(@NonNull AppCompatActivity activity, @Nullable CabHolder cabHolder) { + public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { super(activity, cabHolder, R.menu.menu_media_selection); this.activity = activity; + this.dataSet = dataSet; + this.itemLayoutRes = itemLayoutRes; lastFMRestClient = new LastFMRestClient(activity); - loadDataSet(); setHasStableIds(true); } @@ -63,28 +59,32 @@ public abstract class AbsArtistAdapter extends AbsMultiSelectAdapter images) { - int thumbnailIndex = 0; - if (images.size() > 2) { - thumbnailIndex = 2; - } else if (images.size() > 1) { - thumbnailIndex = 1; - } - return images.get(thumbnailIndex); + protected ViewHolder createViewHolder(View view) { + return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { final Artist artist = dataSet.get(position); - holder.title.setText(artist.name); - holder.text.setText(MusicUtil.getArtistInfoString(activity, artist)); + if (holder.title != null) { + holder.title.setText(artist.name); + } + if (holder.text != null) { + holder.text.setText(MusicUtil.getArtistInfoString(activity, artist)); + } holder.itemView.setActivated(isChecked(artist)); + if (holder.image == null) { + return; + } + if (MusicUtil.isArtistNameUnknown(artist.name)) { holder.image.setImageResource(R.drawable.default_artist_image); return; @@ -95,7 +95,10 @@ public abstract class AbsArtistAdapter extends AbsMultiSelectAdapter images = artistInfo.getArtist().getImage(); - ImageLoader.getInstance().displayImage(getArtistImageToUse(images).getText(), + if (images == null || images.isEmpty()) { + return; + } + ImageLoader.getInstance().displayImage(images.get(images.size() - 1).getText(), holder.image, new DisplayImageOptions.Builder() .cacheInMemory(true) @@ -151,46 +154,11 @@ public abstract class AbsArtistAdapter extends AbsMultiSelectAdapter= Build.VERSION_CODES.LOLLIPOP) { - image.setTransitionName(activity.getString(R.string.transition_artist_image)); - } + setImageTransitionName(activity.getString(R.string.transition_artist_image)); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistGridAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistGridAdapter.java deleted file mode 100644 index 36da08b3..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistGridAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -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 images) { - return images.get(images.size() - 1); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistListAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistListAdapter.java deleted file mode 100644 index 780456e7..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistListAdapter.java +++ /dev/null @@ -1,26 +0,0 @@ -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); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/base/AbsMultiSelectAdapter.java similarity index 91% rename from app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java rename to app/src/main/java/com/kabouzeid/gramophone/adapter/base/AbsMultiSelectAdapter.java index f7e40df0..db95ed9d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AbsMultiSelectAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/base/AbsMultiSelectAdapter.java @@ -1,6 +1,7 @@ -package com.kabouzeid.gramophone.adapter; +package com.kabouzeid.gramophone.adapter.base; import android.content.Context; +import android.support.annotation.MenuRes; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.view.Menu; @@ -23,13 +24,17 @@ public abstract class AbsMultiSelectAdapter(); this.menuRes = menuRes; this.context = context; } + protected void overrideMultiSelectMenuRes(@MenuRes int menuRes) { + this.menuRes = menuRes; + } + protected void toggleChecked(final int position) { if (cabHolder != null) { openCabIfNecessary(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/base/MediaEntryViewHolder.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/base/MediaEntryViewHolder.java new file mode 100644 index 00000000..60f32b09 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/base/MediaEntryViewHolder.java @@ -0,0 +1,86 @@ +package com.kabouzeid.gramophone.adapter.base; + +import android.os.Build; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.kabouzeid.gramophone.R; + +import butterknife.ButterKnife; +import butterknife.InjectView; +import butterknife.Optional; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public abstract class MediaEntryViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { + @Nullable + @Optional + @InjectView(R.id.image) + public ImageView image; + @Nullable + @Optional + @InjectView(R.id.image_text) + public TextView imageText; + + @Nullable + @Optional + @InjectView(R.id.title) + public TextView title; + @Nullable + @Optional + @InjectView(R.id.text) + public TextView text; + + @Nullable + @Optional + @InjectView(R.id.menu) + public View menu; + + @Nullable + @Optional + @InjectView(R.id.palette_color_container) + public View paletteColorContainer; + + @Nullable + @Optional + @InjectView(R.id.separator) + public View separator; + @Nullable + @Optional + @InjectView(R.id.short_separator) + public View shortSeparator; + + @Nullable + @Optional + @InjectView(R.id.selected_indicator) + public View selectedIndicator; + + public MediaEntryViewHolder(View itemView) { + super(itemView); + ButterKnife.inject(this, itemView); + + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); + } + + protected void setImageTransitionName(@NonNull String transitionName) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && image != null) { + image.setTransitionName(transitionName); + } + } + + @Override + public boolean onLongClick(View v) { + return false; + } + + @Override + public void onClick(View v) { + + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AbsPlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AbsPlaylistSongAdapter.java deleted file mode 100644 index 2bdd9bd4..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AbsPlaylistSongAdapter.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.kabouzeid.gramophone.adapter.song; - -import android.content.Context; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; - -import com.kabouzeid.gramophone.adapter.AbsMultiSelectAdapter; -import com.kabouzeid.gramophone.interfaces.CabHolder; -import com.kabouzeid.gramophone.model.Song; - -import java.util.ArrayList; - -/** - * @author Karim Abou Zeid (kabouzeid) - */ -public abstract class AbsPlaylistSongAdapter extends AbsMultiSelectAdapter { - public static final String TAG = AbsPlaylistSongAdapter.class.getSimpleName(); - - public AbsPlaylistSongAdapter(Context context, @Nullable CabHolder cabHolder, int menuRes) { - super(context, cabHolder, menuRes); - } - - public abstract ArrayList getDataSet(); - - public abstract void updateDataSet(); -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AlbumSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AlbumSongAdapter.java index 0bbf5438..32ecdcd2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AlbumSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/AlbumSongAdapter.java @@ -1,144 +1,67 @@ package com.kabouzeid.gramophone.adapter.song; +import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; 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.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; -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) */ -public class AlbumSongAdapter extends AbsMultiSelectAdapter { +public class AlbumSongAdapter extends SongAdapter { public static final String TAG = AlbumSongAdapter.class.getSimpleName(); - protected final AppCompatActivity activity; - protected ArrayList dataSet; - public AlbumSongAdapter(AppCompatActivity activity, ArrayList objects, @Nullable CabHolder cabHolder) { - super(activity, cabHolder, R.menu.menu_media_selection); - this.activity = activity; - dataSet = objects; - setHasStableIds(true); + public AlbumSongAdapter(AppCompatActivity activity, ArrayList dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { + super(activity, dataSet, itemLayoutRes, cabHolder); } @Override - public long getItemId(int position) { - return dataSet.get(position).id; - } - - public void updateDataSet(ArrayList objects) { - dataSet = objects; - notifyDataSetChanged(); - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false); + protected SongAdapter.ViewHolder createViewHolder(View view) { return new ViewHolder(view); } @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + public void onBindViewHolder(@NonNull SongAdapter.ViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + final Song song = dataSet.get(position); - final int trackNumber = MusicUtil.getFixedTrackNumber(song.trackNumber); - final String trackNumberString = trackNumber > 0 ? String.valueOf(trackNumber) : "-"; - holder.track_number.setText(trackNumberString); - holder.title.setText(song.title); - holder.text.setText(MusicUtil.getReadableDurationString(song.duration)); - holder.itemView.setActivated(isChecked(song)); - } - - @Override - public int getItemCount() { - return dataSet.size(); - } - - @Override - protected Song getIdentifier(int position) { - return dataSet.get(position); - } - - @Override - protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList selection) { - switch (menuItem.getItemId()) { - case R.id.action_delete_from_disk: - DeleteSongsDialog.create(selection).show(activity.getSupportFragmentManager(), "DELETE_SONGS"); - break; - case R.id.action_add_to_playlist: - AddToPlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); - break; - case R.id.action_add_to_current_playing: - MusicPlayerRemote.enqueue(selection); - break; + if (holder.imageText != null) { + final int trackNumber = MusicUtil.getFixedTrackNumber(song.trackNumber); + final String trackNumberString = trackNumber > 0 ? String.valueOf(trackNumber) : "-"; + holder.imageText.setText(trackNumberString); } } - 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; - @InjectView(R.id.image_text) - TextView track_number; - @InjectView(R.id.menu) - ImageView menu; + @Override + protected String getSongImageLoaderUri(Song song) { + return null; + } + + @Override + protected String getSongText(Song song) { + return MusicUtil.getReadableDurationString(song.duration); + } + + public class ViewHolder extends SongAdapter.ViewHolder { public ViewHolder(@NonNull View itemView) { super(itemView); - 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 Song getSong() { - return dataSet.get(getAdapterPosition()); - } - }); - } - - @Override - public void onClick(View v) { - if (isInQuickSelectMode()) { - toggleChecked(getAdapterPosition()); - } else { - MusicPlayerRemote.openQueue(dataSet, getAdapterPosition(), true); + if (imageText != null) { + imageText.setVisibility(View.VISIBLE); + } + if (image != null) { + image.setVisibility(View.GONE); } - } - - @Override - public boolean onLongClick(View view) { - toggleChecked(getAdapterPosition()); - return true; } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java index d29f6203..8c5b0cbe 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlaylistSongAdapter.java @@ -1,205 +1,74 @@ package com.kabouzeid.gramophone.adapter.song; -import android.os.Build; +import android.support.annotation.LayoutRes; 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.R; -import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.RemoveFromPlaylistDialog; -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; import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; -import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; -import com.kabouzeid.gramophone.util.PlaylistsUtil; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -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) */ -public class PlaylistSongAdapter extends AbsPlaylistSongAdapter { +@SuppressWarnings("unchecked") +public class PlaylistSongAdapter extends SongAdapter { public static final String TAG = PlaylistSongAdapter.class.getSimpleName(); - @NonNull - protected final AppCompatActivity activity; - protected ArrayList dataSet; - private Playlist playlist; - public PlaylistSongAdapter(@NonNull AppCompatActivity activity, @NonNull Playlist playlist, @Nullable CabHolder cabHolder) { - super(activity, cabHolder, R.menu.menu_playlists_songs_selection); - this.activity = activity; - this.playlist = playlist; - dataSet = PlaylistSongLoader.getPlaylistSongList(activity, playlist.id); - setHasStableIds(true); + public PlaylistSongAdapter(@NonNull AppCompatActivity activity, @NonNull ArrayList dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { + super(activity, (ArrayList) (List) dataSet, itemLayoutRes, cabHolder); + overrideMultiSelectMenuRes(R.menu.menu_playlists_songs_selection); } @Override - public long getItemId(int position) { - return dataSet.get(position).id; - } - - @Override - public void updateDataSet() { - dataSet = PlaylistSongLoader.getPlaylistSongList(activity, playlist.id); - notifyDataSetChanged(); - } - - @Override - public ArrayList getDataSet() { - return dataSet; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { - final PlaylistSong song = dataSet.get(position); - - holder.itemView.setActivated(isChecked(song)); - holder.title.setText(song.title); - holder.text.setText(song.artistName); - ImageLoader.getInstance().displayImage( - MusicUtil.getSongImageLoaderString(song), - holder.image, - new DisplayImageOptions.Builder() - .cacheInMemory(true) - .showImageOnFail(R.drawable.default_album_art) - .resetViewBeforeLoading(true) - .build() - ); - } - - @Override - public int getItemCount() { - return dataSet.size(); - } - - @Override - protected PlaylistSong getIdentifier(int position) { - return dataSet.get(position); - } - - @Override - protected void onMultipleItemAction(@NonNull MenuItem menuItem, ArrayList selection) { + protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList selection) { switch (menuItem.getItemId()) { case R.id.action_remove_from_playlist: - RemoveFromPlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); - break; - case R.id.action_add_to_playlist: - //noinspection unchecked - AddToPlaylistDialog.create((ArrayList) (List) selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); - break; - case R.id.action_add_to_current_playing: - //noinspection unchecked - MusicPlayerRemote.enqueue((ArrayList) (List) selection); + RemoveFromPlaylistDialog.create((ArrayList) (List) selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); break; } } - public void moveItem(int from, int to) { - if (from == to) return; - - if (PlaylistsUtil.moveItem(activity, playlist.id, from, to)) { - PlaylistSong song = dataSet.remove(from); - dataSet.add(to, song); - notifyItemMoved(from, to); - } - } - - 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.menu) - ImageView menu; - @InjectView(R.id.image) - ImageView image; + public class ViewHolder extends SongAdapter.ViewHolder { 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_album_art)); - } - - menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) { - @Override - 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); - } - }); } @Override - public void onClick(View v) { - if (isInQuickSelectMode()) { - toggleChecked(getAdapterPosition()); - } else { - //noinspection unchecked - MusicPlayerRemote.openQueue((ArrayList) (List) dataSet, getAdapterPosition(), true); - } + protected int getSongMenuRes() { + return R.menu.menu_item_playlist_song; } @Override - public boolean onLongClick(View v) { - toggleChecked(getAdapterPosition()); - return true; + protected boolean onSongMenuItemClick(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.onSongMenuItemClick(item); } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SmartPlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SmartPlaylistSongAdapter.java new file mode 100644 index 00000000..c87118fd --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SmartPlaylistSongAdapter.java @@ -0,0 +1,65 @@ +package com.kabouzeid.gramophone.adapter.song; + +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.util.Pair; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; +import android.view.View; + +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.interfaces.CabHolder; +import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.util.NavigationUtil; + +import java.util.ArrayList; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class SmartPlaylistSongAdapter extends SongAdapter { + + public static final String TAG = SmartPlaylistSongAdapter.class.getSimpleName(); + + @Override + public long getItemId(int position) { + return dataSet.get(position).id; + } + + public SmartPlaylistSongAdapter(AppCompatActivity activity, @NonNull ArrayList dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { + super(activity, dataSet, itemLayoutRes, cabHolder); + overrideMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection); + } + + @Override + protected SongAdapter.ViewHolder createViewHolder(View view) { + return new ViewHolder(view); + } + + public class ViewHolder extends SongAdapter.ViewHolder { + public ViewHolder(@NonNull View itemView) { + super(itemView); + } + + @Override + protected int getSongMenuRes() { + return R.menu.menu_item_cannot_delete_single_songs_playlist_song; + } + + @Override + protected boolean onSongMenuItemClick(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.onSongMenuItemClick(item); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java index b8dc20d9..c249980b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java @@ -1,125 +1,121 @@ package com.kabouzeid.gramophone.adapter.song; -import android.graphics.Typeface; -import android.os.Build; +import android.support.annotation.LayoutRes; 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.afollestad.materialcab.MaterialCab; -import com.afollestad.materialdialogs.ThemeSingleton; -import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.adapter.AbsMultiSelectAdapter; +import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; +import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; 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; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; -import com.squareup.otto.Subscribe; +import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import java.util.ArrayList; -import butterknife.ButterKnife; -import butterknife.InjectView; - /** * @author Karim Abou Zeid (kabouzeid) */ public class SongAdapter extends AbsMultiSelectAdapter implements MaterialCab.Callback { public static final String TAG = AlbumSongAdapter.class.getSimpleName(); - private static final int SHUFFLE_BUTTON = 0; - private static final int SONG = 1; + private static final int FADE_IN_TIME = 500; protected final AppCompatActivity activity; protected ArrayList dataSet; - public SongAdapter(AppCompatActivity activity, CabHolder cabHolder) { + protected int itemLayoutRes; + + public SongAdapter(AppCompatActivity activity, ArrayList dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { super(activity, cabHolder, R.menu.menu_media_selection); this.activity = activity; - loadDataSet(); + this.dataSet = dataSet; + this.itemLayoutRes = itemLayoutRes; setHasStableIds(true); } + public ArrayList getDataSet() { + return dataSet; + } + @Override public long getItemId(int position) { - if (position == 0) return -1; - return dataSet.get(position - 1).id; - } - - private void loadDataSet() { - dataSet = SongLoader.getAllSongs(activity); + return dataSet.get(position).id; } @NonNull @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false); + View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false); + return createViewHolder(view); + } + + protected ViewHolder createViewHolder(View view) { return new ViewHolder(view); } - @Override - public int getItemViewType(int position) { - return position == 0 ? SHUFFLE_BUTTON : SONG; - } - @Override public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { - if (getItemViewType(position) == SONG) { - final Song song = dataSet.get(position - 1); + final Song song = dataSet.get(position); - holder.title.setText(song.title); - holder.text.setText(song.artistName); + if (holder.title != null) { + holder.title.setText(getSongTitle(song)); + } + if (holder.text != null) { + holder.text.setText(getSongText(song)); + } + if (holder.image != null) { ImageLoader.getInstance().displayImage( - MusicUtil.getSongImageLoaderString(song), + getSongImageLoaderUri(song), holder.image, new DisplayImageOptions.Builder() .cacheInMemory(true) .showImageOnFail(R.drawable.default_album_art) .resetViewBeforeLoading(true) + .displayer(new FadeInBitmapDisplayer(FADE_IN_TIME, true, true, false)) .build() ); - holder.itemView.setActivated(isChecked(song)); - } else { - 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.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); } + + holder.itemView.setActivated(isChecked(song)); + } + + protected String getSongTitle(Song song) { + return song.title; + } + + protected String getSongText(Song song) { + return song.artistName; + } + + protected String getSongImageLoaderUri(Song song) { + return MusicUtil.getSongImageLoaderString(song); } @Override public int getItemCount() { - final int dataSetSize = dataSet.size(); - return dataSetSize > 0 ? dataSetSize + 1 : 0; + return dataSet.size(); } @Override protected Song getIdentifier(int position) { - return dataSet.get(position - 1); + return dataSet.get(position); } @Override @@ -137,94 +133,71 @@ public class SongAdapter extends AbsMultiSelectAdapter= Build.VERSION_CODES.LOLLIPOP) { - image.setTransitionName(activity.getString(R.string.transition_album_art)); + if (menu == null) { + return; } - menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) { @Override public Song getSong() { - return dataSet.get(getAdapterPosition() - 1); + return ViewHolder.this.getSong(); + } + + @Override + public int getMenuRes() { + return getSongMenuRes(); } @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); + return onSongMenuItemClick(item) || super.onMenuItemClick(item); } }); } + protected Song getSong() { + return dataSet.get(getAdapterPosition()); + } + + protected int getSongMenuRes() { + return DEFAULT_MENU_RES; + } + + protected boolean onSongMenuItemClick(MenuItem item) { + if (image != null && image.getVisibility() == View.VISIBLE) { + 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 false; + } + @Override public void onClick(View v) { - if (getItemViewType() == SHUFFLE_BUTTON) { - MusicPlayerRemote.shuffleAllSongs(activity, true); - } else if (isInQuickSelectMode()) { + if (isInQuickSelectMode()) { toggleChecked(getAdapterPosition()); } else { - MusicPlayerRemote.openQueue(dataSet, getAdapterPosition() - 1, true); + MusicPlayerRemote.openQueue(dataSet, getAdapterPosition(), true); } } @Override public boolean onLongClick(View view) { - if (getItemViewType() == SONG) - toggleChecked(getAdapterPosition()); + toggleChecked(getAdapterPosition()); return true; } } - - - @Override - public void onDetachedFromRecyclerView(RecyclerView recyclerView) { - super.onDetachedFromRecyclerView(recyclerView); - App.bus.unregister(this); - } - - @Override - public void onAttachedToRecyclerView(RecyclerView recyclerView) { - super.onAttachedToRecyclerView(recyclerView); - App.bus.register(this); - } - - @Subscribe - public void onDataBaseEvent(@NonNull DataBaseChangedEvent event) { - switch (event.getAction()) { - case DataBaseChangedEvent.SONGS_CHANGED: - case DataBaseChangedEvent.DATABASE_CHANGED: - loadDataSet(); - notifyDataSetChanged(); - break; - } - } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/smartplaylist/SmartPlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/smartplaylist/SmartPlaylistSongAdapter.java deleted file mode 100644 index a43a1584..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/smartplaylist/SmartPlaylistSongAdapter.java +++ /dev/null @@ -1,189 +0,0 @@ -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; -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.R; -import com.kabouzeid.gramophone.adapter.song.AbsPlaylistSongAdapter; -import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; -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; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; -import com.kabouzeid.gramophone.util.MusicUtil; -import com.kabouzeid.gramophone.util.NavigationUtil; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -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) - */ -public class SmartPlaylistSongAdapter extends AbsPlaylistSongAdapter { - - public static final String TAG = SmartPlaylistSongAdapter.class.getSimpleName(); - protected final AppCompatActivity activity; - private AbsSmartPlaylist playlist; - protected ArrayList dataSet; - - @Override - public void updateDataSet() { - dataSet = playlist.getSongs(activity); - notifyDataSetChanged(); - } - - @Override - public long getItemId(int position) { - return dataSet.get(position).id; - } - - public SmartPlaylistSongAdapter(AppCompatActivity activity, @NonNull AbsSmartPlaylist playlist, @Nullable CabHolder cabHolder) { - super(activity, cabHolder, R.menu.menu_cannot_delete_single_songs_playlist_songs_selection); - this.activity = activity; - this.playlist = playlist; - dataSet = playlist.getSongs(activity); - setHasStableIds(true); - } - - @Override - public ArrayList getDataSet() { - return dataSet; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { - final Song song = dataSet.get(position); - - holder.itemView.setActivated(isChecked(song)); - holder.title.setText(song.title); - holder.text.setText(song.artistName); - ImageLoader.getInstance().displayImage( - MusicUtil.getSongImageLoaderString(song), - holder.image, - new DisplayImageOptions.Builder() - .cacheInMemory(true) - .showImageOnFail(R.drawable.default_album_art) - .resetViewBeforeLoading(true) - .build() - ); - } - - @Override - public int getItemCount() { - return dataSet.size(); - } - - @Override - protected Song getIdentifier(int position) { - return dataSet.get(position); - } - - @Override - protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList selection) { - switch (menuItem.getItemId()) { - case R.id.action_add_to_playlist: - onAddToPlaylist(selection); - break; - case R.id.action_add_to_current_playing: - onAddToCurrentPlaying(selection); - break; - } - } - - protected void onAddToPlaylist(ArrayList songs) { - AddToPlaylistDialog.create(songs).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST"); - } - - protected void onAddToCurrentPlaying(@NonNull ArrayList songs) { - MusicPlayerRemote.enqueue(songs); - } - - 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.menu) - ImageView menu; - @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_album_art)); - } - - menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) { - @Override - 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); - } - }); - } - - @Override - public void onClick(View v) { - if (isInQuickSelectMode()) { - toggleChecked(getAdapterPosition()); - } else { - //noinspection unchecked - MusicPlayerRemote.openQueue((ArrayList) (List) dataSet, getAdapterPosition(), true); - } - } - - @Override - public boolean onLongClick(View v) { - toggleChecked(getAdapterPosition()); - return true; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/HorizontalAdapterHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/HorizontalAdapterHelper.java new file mode 100644 index 00000000..c9067dbb --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/HorizontalAdapterHelper.java @@ -0,0 +1,34 @@ +package com.kabouzeid.gramophone.helper; + +import android.content.Context; +import android.view.ViewGroup; + +import com.kabouzeid.gramophone.R; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class HorizontalAdapterHelper { + public static final int LAYOUT_RES = R.layout.item_grid_card_horizontal; + + public static final int TYPE_FIRST = 1; + public static final int TYPE_MIDDLE = 2; + public static final int TYPE_LAST = 3; + + public static void applyMarginToLayoutParams(Context context, ViewGroup.MarginLayoutParams layoutParams, int viewType) { + int listMargin = context.getResources().getDimensionPixelSize(R.dimen.default_item_margin); + if (viewType == TYPE_FIRST) { + layoutParams.leftMargin = listMargin; + } else if (viewType == TYPE_LAST) { + layoutParams.rightMargin = listMargin; + } + } + + public static int getItemViewtype(int position, int itemCount) { + if (position == 0) { + return TYPE_FIRST; + } else if (position == itemCount - 1) { + return TYPE_LAST; + } else return TYPE_MIDDLE; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/AbsSmartPlaylist.java b/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/AbsSmartPlaylist.java index d3dded37..7e9a78ea 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/AbsSmartPlaylist.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/smartplaylist/AbsSmartPlaylist.java @@ -2,13 +2,9 @@ package com.kabouzeid.gramophone.model.smartplaylist; import android.content.Context; import android.support.annotation.DrawableRes; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import com.kabouzeid.gramophone.R; -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; @@ -33,11 +29,6 @@ public abstract class AbsSmartPlaylist extends Playlist { this.iconRes = R.drawable.ic_queue_music_white_24dp; } - @NonNull - public SmartPlaylistSongAdapter createAdapter(AppCompatActivity activity, @Nullable CabHolder cabHolder) { - return new SmartPlaylistSongAdapter(activity, this, cabHolder); - } - public abstract ArrayList getSongs(Context context); public abstract void clear(Context context); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 4cea6d2c..20354fcf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -38,7 +38,6 @@ import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.model.Album; -import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; @@ -325,7 +324,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH private void setUpSongsAdapter() { songs = AlbumSongLoader.getAlbumSongList(this, album.id); - adapter = new AlbumSongAdapter(this, songs, this); + adapter = new AlbumSongAdapter(this, songs, R.layout.item_list, this); recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); recyclerView.setAdapter(adapter); } @@ -394,19 +393,6 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH } } - @Subscribe - public void onDataBaseEvent(@NonNull DataBaseChangedEvent event) { - switch (event.getAction()) { - case DataBaseChangedEvent.SONGS_CHANGED: - case DataBaseChangedEvent.ALBUMS_CHANGED: - case DataBaseChangedEvent.DATABASE_CHANGED: - songs = AlbumSongLoader.getAlbumSongList(this, album.id); - adapter.updateDataSet(songs); - if (songs.size() < 1) finish(); - break; - } - } - @Subscribe public void onUIPreferenceChanged(@NonNull UIPreferenceChangedEvent event) { switch (event.getAction()) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 9d1cd42e..c5cde5fb 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -33,7 +33,7 @@ import com.afollestad.materialdialogs.util.DialogUtils; 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.album.HorizontalAlbumAdapter; import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; @@ -51,7 +51,6 @@ import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Artist; -import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; @@ -116,7 +115,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor private Artist artist; @Nullable private Spanned biography; - private ArtistAlbumAdapter albumAdapter; + private HorizontalAlbumAdapter albumAdapter; private ArtistSongAdapter songAdapter; private ArrayList songs; private ArrayList albums; @@ -278,7 +277,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor private void setUpAlbumRecyclerView() { albumRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); albums = ArtistAlbumLoader.getArtistAlbumList(this, artist.id); - albumAdapter = new ArtistAlbumAdapter(this, albums, this); + albumAdapter = new HorizontalAlbumAdapter(this, albums, this); albumRecyclerView.setAdapter(albumAdapter); } @@ -551,22 +550,6 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor }); } - @Subscribe - public void onDataBaseEvent(@NonNull DataBaseChangedEvent event) { - switch (event.getAction()) { - case DataBaseChangedEvent.SONGS_CHANGED: - case DataBaseChangedEvent.ALBUMS_CHANGED: - case DataBaseChangedEvent.ARTISTS_CHANGED: - case DataBaseChangedEvent.DATABASE_CHANGED: - songs = ArtistSongLoader.getArtistSongList(this, artist.id); - songAdapter.updateDataSet(songs); - albums = ArtistAlbumLoader.getArtistAlbumList(this, artist.id); - albumAdapter.updateDataSet(albums); - if (songs.size() < 1) finish(); - break; - } - } - @Subscribe public void onUIPreferenceChanged(@NonNull UIPreferenceChangedEvent event) { switch (event.getAction()) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index bbd3bceb..a921b7bf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -13,19 +13,21 @@ import android.widget.TextView; import com.afollestad.materialcab.MaterialCab; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.adapter.song.AbsPlaylistSongAdapter; import com.kabouzeid.gramophone.adapter.song.PlaylistSongAdapter; +import com.kabouzeid.gramophone.adapter.song.SmartPlaylistSongAdapter; +import com.kabouzeid.gramophone.adapter.song.SongAdapter; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; +import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.misc.DragSortRecycler; -import com.kabouzeid.gramophone.model.DataBaseChangedEvent; 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.util.NavigationUtil; +import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; -import com.squareup.otto.Subscribe; import butterknife.ButterKnife; import butterknife.InjectView; @@ -46,7 +48,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder private Playlist playlist; private MaterialCab cab; - private AbsPlaylistSongAdapter adapter; + private SongAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { @@ -72,16 +74,22 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder private void setUpRecyclerView() { recyclerView.setLayoutManager(new GridLayoutManager(this, 1)); if (playlist instanceof AbsSmartPlaylist) { - adapter = ((AbsSmartPlaylist) playlist).createAdapter(this, this); + adapter = new SmartPlaylistSongAdapter(this, ((AbsSmartPlaylist) playlist).getSongs(this), R.layout.item_list, this); } else { - adapter = new PlaylistSongAdapter(this, playlist, this); + adapter = new PlaylistSongAdapter(this, PlaylistSongLoader.getPlaylistSongList(this, playlist.id), R.layout.item_list, this); DragSortRecycler dragSortRecycler = new DragSortRecycler(); dragSortRecycler.setViewHandleId(R.id.image); dragSortRecycler.setOnItemMovedListener(new DragSortRecycler.OnItemMovedListener() { @Override public void onItemMoved(int from, int to) { - ((PlaylistSongAdapter) adapter).moveItem(from, to); + if (from == to) return; + + if (PlaylistsUtil.moveItem(PlaylistDetailActivity.this, playlist.id, from, to)) { + Song song = adapter.getDataSet().remove(from); + adapter.getDataSet().add(to, song); + adapter.notifyItemMoved(from, to); + } } }); @@ -133,7 +141,6 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder new SleepTimerDialog().show(getSupportFragmentManager(), "SET_SLEEP_TIMER"); return true; case R.id.action_shuffle_playlist: - //noinspection unchecked MusicPlayerRemote.openAndShuffleQueue(this, adapter.getDataSet(), true); return true; case R.id.action_equalizer: @@ -169,17 +176,6 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder App.bus.unregister(this); } - @Subscribe - public void onDataBaseEvent(@NonNull DataBaseChangedEvent event) { - switch (event.getAction()) { - case DataBaseChangedEvent.PLAYLISTS_CHANGED: - case DataBaseChangedEvent.DATABASE_CHANGED: - adapter.updateDataSet(); - checkIsEmpty(); - break; - } - } - @Override public void onBackPressed() { if (cab != null && cab.isActive()) cab.finish(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java index 5a5524cf..1e0694ce 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java @@ -5,7 +5,8 @@ import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.adapter.AlbumAdapter; +import com.kabouzeid.gramophone.adapter.album.AlbumAdapter; +import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.Util; @@ -27,7 +28,7 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment { @NonNull @Override protected RecyclerView.Adapter createAdapter() { - return new AlbumAdapter(getMainActivity(), getMainActivity()); + return new AlbumAdapter(getMainActivity(), AlbumLoader.getAllAlbums(getActivity()), R.layout.item_grid, getMainActivity()); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/ArtistViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/ArtistViewFragment.java index a079454c..89d58d9f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/ArtistViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/ArtistViewFragment.java @@ -5,7 +5,8 @@ import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.adapter.artist.ArtistListAdapter; +import com.kabouzeid.gramophone.adapter.artist.ArtistAdapter; +import com.kabouzeid.gramophone.loader.ArtistLoader; /** * @author Karim Abou Zeid (kabouzeid) @@ -17,13 +18,17 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment { @NonNull @Override protected RecyclerView.LayoutManager createLayoutManager() { - return new GridLayoutManager(getActivity(), 1); + return new GridLayoutManager(getActivity(), 2); } @NonNull @Override protected RecyclerView.Adapter createAdapter() { - return new ArtistListAdapter(getMainActivity(), getMainActivity()); + return new ArtistAdapter( + getMainActivity(), + ArtistLoader.getAllArtists(getActivity()), + R.layout.item_grid, + getMainActivity()); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java index f0037d65..7cc1aafd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java @@ -6,6 +6,13 @@ import android.support.v7.widget.RecyclerView; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.PlaylistAdapter; +import com.kabouzeid.gramophone.loader.PlaylistLoader; +import com.kabouzeid.gramophone.model.Playlist; +import com.kabouzeid.gramophone.model.smartplaylist.LastAddedPlaylist; +import com.kabouzeid.gramophone.model.smartplaylist.MyTopTracksPlaylist; +import com.kabouzeid.gramophone.model.smartplaylist.RecentlyPlayedPlaylist; + +import java.util.ArrayList; /** * @author Karim Abou Zeid (kabouzeid) @@ -23,7 +30,15 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment { @NonNull @Override protected RecyclerView.Adapter createAdapter() { - return new PlaylistAdapter(getMainActivity(), getMainActivity()); + ArrayList playlists = new ArrayList<>(); + + playlists.add(new LastAddedPlaylist(getActivity())); + playlists.add(new RecentlyPlayedPlaylist(getActivity())); + playlists.add(new MyTopTracksPlaylist(getActivity())); + + playlists.addAll(PlaylistLoader.getAllPlaylists(getActivity())); + + return new PlaylistAdapter(getMainActivity(), playlists, R.layout.item_list_single_row, getMainActivity()); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java index 36166bca..8df83ad2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java @@ -6,6 +6,7 @@ import android.support.v7.widget.RecyclerView; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.song.SongAdapter; +import com.kabouzeid.gramophone.loader.SongLoader; /** * @author Karim Abou Zeid (kabouzeid) @@ -23,7 +24,7 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment { @NonNull @Override protected RecyclerView.Adapter createAdapter() { - return new SongAdapter(getMainActivity(), getMainActivity()); + return new SongAdapter(getMainActivity(), SongLoader.getAllSongs(getActivity()), R.layout.item_list, getMainActivity()); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java index 4585e34d..06c992e1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java @@ -68,6 +68,14 @@ public final class PreferenceUtil { return sInstance; } + public void registerOnSharedPreferenceChangedListener(SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener) { + mPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + } + + public void unregisterOnSharedPreferenceChangedListener(SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener) { + mPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + } + public int getGeneralTheme() { int value = Integer.parseInt(mPreferences.getString(GENERAL_THEME, "0")); switch (value) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java index 07506661..a062fbd1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java @@ -2,9 +2,11 @@ package com.kabouzeid.gramophone.util; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; +import android.graphics.Bitmap; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v7.graphics.Palette; import android.support.v7.internal.view.menu.ListMenuItemView; import android.support.v7.internal.view.menu.MenuPopupHelper; import android.view.View; @@ -26,6 +28,47 @@ import java.lang.reflect.Field; public class ViewUtil { public final static int DEFAULT_COLOR_ANIMATION_DURATION = 500; + public static void applyBackgroundColorFromBitmap(@Nullable Bitmap bitmap, final int defaultBgColor, @Nullable final View[] views, @Nullable final TextView[] textViews, final boolean animate) { + if (bitmap != null) { + Palette.from(bitmap) + .resizeBitmapSize(100) + .generate(new Palette.PaletteAsyncListener() { + @Override + public void onGenerated(@NonNull Palette palette) { + applyBackgroundColor(palette.getVibrantColor(defaultBgColor), views, textViews, animate); + } + }); + } else { + applyBackgroundColor(defaultBgColor, views, textViews, animate); + } + } + + public static void applyBackgroundColor(int bgColor, @Nullable final View[] views, @Nullable TextView[] textViews, final boolean animate) { + if (views != null) { + for (View view : views) { + if (view != null) { + if (animate) { + ViewUtil.animateViewColor(view, view.getDrawingCacheBackgroundColor(), bgColor); + } else { + view.setBackgroundColor(bgColor); + } + } + } + } + if (textViews != null) { + int textColor = ColorUtil.getTextColorForBackground(bgColor); + for (TextView textView : textViews) { + if (textView != null) { + if (animate) { + animateTextColor(textView, textView.getCurrentTextColor(), textColor); + } else { + textView.setTextColor(textColor); + } + } + } + } + } + public static void animateViewColor(final View v, final int startColor, final int endColor) { animateViewColor(v, startColor, endColor, DEFAULT_COLOR_ANIMATION_DURATION); } diff --git a/app/src/main/res/drawable-v21/colored_notification_selector.xml b/app/src/main/res/drawable-v21/colored_notification_selector.xml deleted file mode 100644 index f0360419..00000000 --- a/app/src/main/res/drawable-v21/colored_notification_selector.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/drawable/colored_notification_selector.xml b/app/src/main/res/drawable/colored_notification_selector.xml deleted file mode 100644 index 4cbc5ae3..00000000 --- a/app/src/main/res/drawable/colored_notification_selector.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_music_controller.xml b/app/src/main/res/layout/activity_music_controller.xml index 293f1f4c..ba8fb4a9 100644 --- a/app/src/main/res/layout/activity_music_controller.xml +++ b/app/src/main/res/layout/activity_music_controller.xml @@ -110,7 +110,8 @@ android:layout_height="match_parent" android:layout_margin="16dp" android:visibility="gone" - app:cardBackgroundColor="?music_controller_container_color" /> + app:cardBackgroundColor="?music_controller_container_color" + app:elevation="@dimen/card_elevation" /> + android:layout_margin="2dp" + android:foreground="?rect_selector"> - + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + tools:ignore="UnusedAttribute,UselessParent"> - + + + + android:paddingLeft="16dp" + android:paddingRight="16dp"> - + - - - - - - - - + - + + app:elevation="@dimen/card_elevation"> diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml index ad572754..24cd814f 100644 --- a/app/src/main/res/layout/item_list.xml +++ b/app/src/main/res/layout/item_list.xml @@ -17,7 +17,6 @@ android:paddingStart="16dp"> @@ -43,7 +42,6 @@