/* * Copyright (C) 2015 Naman Dwivedi * * Licensed under the GNU General Public License v3 * * This is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ package com.naman14.timber.adapters; import android.graphics.Color; import android.os.Handler; 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.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; import com.afollestad.appthemeengine.Config; import com.naman14.timber.MusicPlayer; import com.naman14.timber.R; import com.naman14.timber.dialogs.AddPlaylistDialog; import com.naman14.timber.models.Song; import com.naman14.timber.utils.Helpers; import com.naman14.timber.utils.NavigationUtils; import com.naman14.timber.utils.PreferencesUtility; import com.naman14.timber.utils.TimberUtils; import com.naman14.timber.widgets.BubbleTextGetter; import com.naman14.timber.widgets.MusicVisualizer; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.List; public class SongsListAdapter extends RecyclerView.Adapter<SongsListAdapter.ItemHolder> implements BubbleTextGetter { public int currentlyPlayingPosition; private List<Song> arraylist; private AppCompatActivity mContext; private long[] songIDs; private boolean isPlaylist; private boolean animate; private int lastPosition = -1; private String ateKey; private long playlistId; public SongsListAdapter(AppCompatActivity context, List<Song> arraylist, boolean isPlaylistSong, boolean animate) { this.arraylist = arraylist; this.mContext = context; this.isPlaylist = isPlaylistSong; this.songIDs = getSongIds(); this.ateKey = Helpers.getATEKey(context); this.animate = animate; } @Override public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i) { if (isPlaylist) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_song_playlist, null); ItemHolder ml = new ItemHolder(v); return ml; } else { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_song, null); ItemHolder ml = new ItemHolder(v); return ml; } } @Override public void onBindViewHolder(ItemHolder itemHolder, int i) { Song localItem = arraylist.get(i); itemHolder.title.setText(localItem.title); itemHolder.artist.setText(localItem.artistName); ImageLoader.getInstance().displayImage(TimberUtils.getAlbumArtUri(localItem.albumId).toString(), itemHolder.albumArt, new DisplayImageOptions.Builder().cacheInMemory(true).showImageOnFail(R.drawable.ic_empty_music2).resetViewBeforeLoading(true).build()); if (MusicPlayer.getCurrentAudioId() == localItem.id) { itemHolder.title.setTextColor(Config.accentColor(mContext, ateKey)); if (MusicPlayer.isPlaying()) { itemHolder.visualizer.setColor(Config.accentColor(mContext, ateKey)); itemHolder.visualizer.setVisibility(View.VISIBLE); } } else { if (isPlaylist) itemHolder.title.setTextColor(Color.WHITE); else itemHolder.title.setTextColor(Config.textColorPrimary(mContext, ateKey)); itemHolder.visualizer.setVisibility(View.GONE); } if (animate && isPlaylist && PreferencesUtility.getInstance(mContext).getAnimations()) { if (TimberUtils.isLollipop()) setAnimation(itemHolder.itemView, i); else { if (i > 10) setAnimation(itemHolder.itemView, i); } } setOnPopupMenuListener(itemHolder, i); } public void setPlaylistId(long playlistId) { this.playlistId = playlistId; } @Override public int getItemCount() { return (null != arraylist ? arraylist.size() : 0); } private void setOnPopupMenuListener(ItemHolder itemHolder, final int position) { itemHolder.popupMenu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final PopupMenu menu = new PopupMenu(mContext, v); menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.popup_song_remove_playlist: TimberUtils.removeFromPlaylist(mContext, arraylist.get(position).id, playlistId); removeSongAt(position); notifyItemRemoved(position); break; case R.id.popup_song_play: MusicPlayer.playAll(mContext, songIDs, position, -1, TimberUtils.IdType.NA, false); break; case R.id.popup_song_play_next: long[] ids = new long[1]; ids[0] = arraylist.get(position).id; MusicPlayer.playNext(mContext, ids, -1, TimberUtils.IdType.NA); break; case R.id.popup_song_goto_album: NavigationUtils.goToAlbum(mContext, arraylist.get(position).albumId); break; case R.id.popup_song_goto_artist: NavigationUtils.goToArtist(mContext, arraylist.get(position).artistId); break; case R.id.popup_song_addto_queue: long[] id = new long[1]; id[0] = arraylist.get(position).id; MusicPlayer.addToQueue(mContext, id, -1, TimberUtils.IdType.NA); break; case R.id.popup_song_addto_playlist: AddPlaylistDialog.newInstance(arraylist.get(position)).show(mContext.getSupportFragmentManager(), "ADD_PLAYLIST"); break; case R.id.popup_song_share: TimberUtils.shareTrack(mContext, arraylist.get(position).id); break; case R.id.popup_song_delete: long[] deleteIds = {arraylist.get(position).id}; TimberUtils.showDeleteDialog(mContext,arraylist.get(position).title, deleteIds, SongsListAdapter.this, position); break; } return false; } }); menu.inflate(R.menu.popup_song); menu.show(); if (isPlaylist) menu.getMenu().findItem(R.id.popup_song_remove_playlist).setVisible(true); } }); } public long[] getSongIds() { long[] ret = new long[getItemCount()]; for (int i = 0; i < getItemCount(); i++) { ret[i] = arraylist.get(i).id; } return ret; } @Override public String getTextToShowInBubble(final int pos) { if (arraylist == null || arraylist.size() == 0) return ""; Character ch = arraylist.get(pos).title.charAt(0); if (Character.isDigit(ch)) { return "#"; } else return Character.toString(ch); } private void setAnimation(View viewToAnimate, int position) { // If the bound view wasn't previously displayed on screen, it's animated if (position > lastPosition) { Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.abc_slide_in_bottom); viewToAnimate.startAnimation(animation); lastPosition = position; } } public void updateDataSet(List<Song> arraylist) { this.arraylist = arraylist; this.songIDs = getSongIds(); } public class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener { protected TextView title, artist; protected ImageView albumArt, popupMenu; private MusicVisualizer visualizer; public ItemHolder(View view) { super(view); this.title = (TextView) view.findViewById(R.id.song_title); this.artist = (TextView) view.findViewById(R.id.song_artist); this.albumArt = (ImageView) view.findViewById(R.id.albumArt); this.popupMenu = (ImageView) view.findViewById(R.id.popup_menu); visualizer = (MusicVisualizer) view.findViewById(R.id.visualizer); view.setOnClickListener(this); } @Override public void onClick(View v) { final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { MusicPlayer.playAll(mContext, songIDs, getAdapterPosition(), -1, TimberUtils.IdType.NA, false); Handler handler1 = new Handler(); handler1.postDelayed(new Runnable() { @Override public void run() { notifyItemChanged(currentlyPlayingPosition); notifyItemChanged(getAdapterPosition()); } }, 50); } }, 100); } } public Song getSongAt(int i) { return arraylist.get(i); } public void addSongTo(int i, Song song) { arraylist.add(i, song); } public void removeSongAt(int i) { arraylist.remove(i); } }