/* * 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.app.Activity; 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.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; import com.naman14.timber.MusicPlayer; import com.naman14.timber.R; import com.naman14.timber.dialogs.AddPlaylistDialog; import com.naman14.timber.lastfmapi.LastFmClient; import com.naman14.timber.lastfmapi.callbacks.ArtistInfoListener; import com.naman14.timber.lastfmapi.models.ArtistQuery; import com.naman14.timber.lastfmapi.models.LastfmArtist; import com.naman14.timber.models.Album; import com.naman14.timber.models.Artist; import com.naman14.timber.models.Song; import com.naman14.timber.utils.NavigationUtils; import com.naman14.timber.utils.TimberUtils; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import java.util.Collections; import java.util.List; public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ItemHolder> { private Activity mContext; private List searchResults = Collections.emptyList(); public SearchAdapter(Activity context) { this.mContext = context; } @Override public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { switch (viewType) { case 0: View v0 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_song, null); ItemHolder ml0 = new ItemHolder(v0); return ml0; case 1: View v1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_album_search, null); ItemHolder ml1 = new ItemHolder(v1); return ml1; case 2: View v2 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_artist, null); ItemHolder ml2 = new ItemHolder(v2); return ml2; case 10: View v10 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.search_section_header, null); ItemHolder ml10 = new ItemHolder(v10); return ml10; default: View v3 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_song, null); ItemHolder ml3 = new ItemHolder(v3); return ml3; } } @Override public void onBindViewHolder(final ItemHolder itemHolder, int i) { switch (getItemViewType(i)) { case 0: Song song = (Song) searchResults.get(i); itemHolder.title.setText(song.title); itemHolder.songartist.setText(song.albumName); ImageLoader.getInstance().displayImage(TimberUtils.getAlbumArtUri(song.albumId).toString(), itemHolder.albumArt, new DisplayImageOptions.Builder().cacheInMemory(true) .cacheOnDisk(true) .showImageOnFail(R.drawable.ic_empty_music2) .resetViewBeforeLoading(true) .displayer(new FadeInBitmapDisplayer(400)) .build()); setOnPopupMenuListener(itemHolder, i); break; case 1: Album album = (Album) searchResults.get(i); itemHolder.albumtitle.setText(album.title); itemHolder.albumartist.setText(album.artistName); ImageLoader.getInstance().displayImage(TimberUtils.getAlbumArtUri(album.id).toString(), itemHolder.albumArt, new DisplayImageOptions.Builder().cacheInMemory(true) .cacheOnDisk(true) .showImageOnFail(R.drawable.ic_empty_music2) .resetViewBeforeLoading(true) .displayer(new FadeInBitmapDisplayer(400)) .build()); break; case 2: Artist artist = (Artist) searchResults.get(i); itemHolder.artisttitle.setText(artist.name); String albumNmber = TimberUtils.makeLabel(mContext, R.plurals.Nalbums, artist.albumCount); String songCount = TimberUtils.makeLabel(mContext, R.plurals.Nsongs, artist.songCount); itemHolder.albumsongcount.setText(TimberUtils.makeCombinedString(mContext, albumNmber, songCount)); LastFmClient.getInstance(mContext).getArtistInfo(new ArtistQuery(artist.name), new ArtistInfoListener() { @Override public void artistInfoSucess(LastfmArtist artist) { if (artist != null && itemHolder.artistImage != null) { ImageLoader.getInstance().displayImage(artist.mArtwork.get(1).mUrl, itemHolder.artistImage, new DisplayImageOptions.Builder().cacheInMemory(true) .cacheOnDisk(true) .showImageOnFail(R.drawable.ic_empty_music2) .resetViewBeforeLoading(true) .displayer(new FadeInBitmapDisplayer(400)) .build()); } } @Override public void artistInfoFailed() { } }); break; case 10: itemHolder.sectionHeader.setText((String) searchResults.get(i)); case 3: break; } } @Override public void onViewRecycled(ItemHolder itemHolder) { } @Override public int getItemCount() { return searchResults.size(); } private void setOnPopupMenuListener(ItemHolder itemHolder, final int position) { itemHolder.menu.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) { long[] song = new long[1]; song[0] = ((Song) searchResults.get(position)).id; switch (item.getItemId()) { case R.id.popup_song_play: MusicPlayer.playAll(mContext, song, 0, -1, TimberUtils.IdType.NA, false); break; case R.id.popup_song_play_next: MusicPlayer.playNext(mContext, song, -1, TimberUtils.IdType.NA); break; case R.id.popup_song_goto_album: NavigationUtils.navigateToAlbum(mContext, ((Song) searchResults.get(position)).albumId, null); break; case R.id.popup_song_goto_artist: NavigationUtils.navigateToArtist(mContext, ((Song) searchResults.get(position)).artistId, null); break; case R.id.popup_song_addto_queue: MusicPlayer.addToQueue(mContext, song, -1, TimberUtils.IdType.NA); break; case R.id.popup_song_addto_playlist: AddPlaylistDialog.newInstance(((Song) searchResults.get(position))).show(((AppCompatActivity) mContext).getSupportFragmentManager(), "ADD_PLAYLIST"); break; } return false; } }); menu.inflate(R.menu.popup_song); menu.show(); } }); } @Override public int getItemViewType(int position) { if (searchResults.get(position) instanceof Song) return 0; if (searchResults.get(position) instanceof Album) return 1; if (searchResults.get(position) instanceof Artist) return 2; if (searchResults.get(position) instanceof String) return 10; return 3; } public void updateSearchResults(List searchResults) { this.searchResults = searchResults; } public class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener { protected TextView title, songartist, albumtitle, artisttitle, albumartist, albumsongcount, sectionHeader; protected ImageView albumArt, artistImage, menu; public ItemHolder(View view) { super(view); this.title = (TextView) view.findViewById(R.id.song_title); this.songartist = (TextView) view.findViewById(R.id.song_artist); this.albumsongcount = (TextView) view.findViewById(R.id.album_song_count); this.artisttitle = (TextView) view.findViewById(R.id.artist_name); this.albumtitle = (TextView) view.findViewById(R.id.album_title); this.albumartist = (TextView) view.findViewById(R.id.album_artist); this.albumArt = (ImageView) view.findViewById(R.id.albumArt); this.artistImage = (ImageView) view.findViewById(R.id.artistImage); this.menu = (ImageView) view.findViewById(R.id.popup_menu); this.sectionHeader = (TextView) view.findViewById(R.id.section_header); view.setOnClickListener(this); } @Override public void onClick(View v) { switch (getItemViewType()) { case 0: final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { long[] ret = new long[1]; ret[0] = ((Song) searchResults.get(getAdapterPosition())).id; MusicPlayer.playAll(mContext, ret, 0, -1, TimberUtils.IdType.NA, false); } }, 100); break; case 1: NavigationUtils.goToAlbum(mContext, ((Album) searchResults.get(getAdapterPosition())).id); break; case 2: NavigationUtils.goToArtist(mContext, ((Artist) searchResults.get(getAdapterPosition())).id); break; case 3: break; case 10: break; } } } }