package com.architjn.acjmusicplayer.utils.adapters; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.architjn.acjmusicplayer.R; import com.architjn.acjmusicplayer.service.PlayerService; import com.architjn.acjmusicplayer.task.AlbumItemLoad; import com.architjn.acjmusicplayer.ui.layouts.activity.AlbumActivity; import com.architjn.acjmusicplayer.ui.layouts.activity.ArtistActivity; import com.architjn.acjmusicplayer.utils.ImageConverter; import com.architjn.acjmusicplayer.utils.ListSongs; import com.architjn.acjmusicplayer.utils.Utils; import com.architjn.acjmusicplayer.utils.handlers.ArtistImgHandler; import com.architjn.acjmusicplayer.utils.items.Album; import com.architjn.acjmusicplayer.utils.items.Artist; import com.architjn.acjmusicplayer.utils.items.Search; import com.architjn.acjmusicplayer.utils.items.Song; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; import java.io.File; import java.util.ArrayList; /** * Created by architjn on 28/11/15. */ public class SearchListAdapter extends RecyclerView.Adapter<SearchListAdapter.SimpleItemViewHolder> { public static final int ITEM_VIEW_TYPE_HEADER_ARTISTS = 0; public static final int ITEM_VIEW_TYPE_HEADER_ALBUMS = 1; public static final int ITEM_VIEW_TYPE_HEADER_SONGS = 2; public static final int ITEM_VIEW_TYPE_LIST_ARTIST = 3; public static final int ITEM_VIEW_TYPE_LIST_ALBUM = 4; public static final int ITEM_VIEW_TYPE_LIST_SONG = 5; private ArrayList<Song> songs; private ArrayList<Album> albums; private ArrayList<Artist> artists; private int headerArtistPos, headerAlbumPos, headerSongPos, totalSize; private Context context; public SearchListAdapter(Context context, ArrayList<Song> songs, ArrayList<Album> albums, ArrayList<Artist> artists) { this.context = context; init(songs, albums, artists); } private void init(ArrayList<Song> songs, ArrayList<Album> albums, ArrayList<Artist> artists) { this.songs = songs; this.albums = albums; this.artists = artists; headerArtistPos = 0; headerAlbumPos = this.artists.size() + 1; headerSongPos = this.artists.size() + this.albums.size() + 2; this.totalSize = songs.size() + albums.size() + artists.size() + 3; } public int whatView(int position) { if (position == headerArtistPos) { return ITEM_VIEW_TYPE_HEADER_ARTISTS; } else if (position == headerAlbumPos) { return ITEM_VIEW_TYPE_HEADER_ALBUMS; } else if (position == headerSongPos) { return ITEM_VIEW_TYPE_HEADER_SONGS; } else if (position > 0 && position < headerAlbumPos) { return ITEM_VIEW_TYPE_LIST_ARTIST; } else if (position > headerAlbumPos && position < headerSongPos) { return ITEM_VIEW_TYPE_LIST_ALBUM; } else return ITEM_VIEW_TYPE_LIST_SONG; } public void updateList(Search searchRes) { init(searchRes.getSongs(), searchRes.getAlbums(), searchRes.getArtists()); notifyDataSetChanged(); } private int getPosition(int position) { if (position > headerArtistPos && position < headerAlbumPos) { return position - 1; } else if (position > headerAlbumPos && position < headerSongPos) { return position - artists.size() - 2; } else return position - artists.size() - albums.size() - 3; } @Override public SearchListAdapter.SimpleItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView; switch (viewType) { case ITEM_VIEW_TYPE_HEADER_ALBUMS: itemView = LayoutInflater.from(parent.getContext()). inflate(R.layout.search_header, parent, false); return new SimpleItemViewHolder(itemView); case ITEM_VIEW_TYPE_HEADER_SONGS: itemView = LayoutInflater.from(parent.getContext()). inflate(R.layout.search_header, parent, false); return new SimpleItemViewHolder(itemView); case ITEM_VIEW_TYPE_HEADER_ARTISTS: itemView = LayoutInflater.from(parent.getContext()). inflate(R.layout.search_header, parent, false); return new SimpleItemViewHolder(itemView); case ITEM_VIEW_TYPE_LIST_SONG: itemView = LayoutInflater.from(parent.getContext()). inflate(R.layout.songs_list_item, parent, false); return new SimpleItemViewHolder(itemView); case ITEM_VIEW_TYPE_LIST_ARTIST: itemView = LayoutInflater.from(parent.getContext()). inflate(R.layout.artist_list_item, parent, false); return new SimpleItemViewHolder(itemView); case ITEM_VIEW_TYPE_LIST_ALBUM: itemView = LayoutInflater.from(parent.getContext()). inflate(R.layout.album_grid_item, parent, false); return new SimpleItemViewHolder(itemView); } return null; } @Override public void onBindViewHolder(final SearchListAdapter.SimpleItemViewHolder holder, final int position) { if (whatView(position) == ITEM_VIEW_TYPE_HEADER_ARTISTS) { setHeaderBg(holder); holder.headerText.setText(R.string.artists); return; } else if (whatView(position) == ITEM_VIEW_TYPE_HEADER_ALBUMS) { setHeaderBg(holder); holder.headerText.setText(R.string.albums); return; } else if (whatView(position) == ITEM_VIEW_TYPE_HEADER_SONGS) { setHeaderBg(holder); holder.headerText.setText(R.string.songs); return; } else if (whatView(position) == ITEM_VIEW_TYPE_LIST_ARTIST) { if (artists.size() == 0) return; Utils utils = new Utils(context); holder.artistArt.setImageBitmap(utils.getBitmapOfVector(R.drawable.default_artist_art, utils.dpToPx(50), utils.dpToPx(50))); getArtistImg(holder, getPosition(position)); holder.expandView.setVisibility(View.GONE); holder.artistName.setText(artists.get(getPosition(position)).getArtistName()); holder.artistSongCount.setText(artists.get(getPosition(position)).getNumberOfSongs() + " " + context.getResources().getString(R.string.songs) + " . " + artists.get(getPosition(position)).getNumberOfAlbums() + " " + context.getResources().getString(R.string.albums)); holder.mainView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(context, ArtistActivity.class); i.putExtra("name", artists.get(getPosition(position)).getArtistName()); i.putExtra("id", artists.get(getPosition(position)).getArtistId()); context.startActivity(i); } }); } else if (whatView(position) == ITEM_VIEW_TYPE_LIST_ALBUM) { if (albums.size() == 0) return; setDefaultView(holder); holder.albumName.setText(albums.get(getPosition(position)).getAlbumTitle()); holder.albumArtist.setText(albums.get(getPosition(position)).getAlbumArtist()); setArt(holder, getPosition(position)); holder.mainView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(context, AlbumActivity.class); i.putExtra("albumName", albums.get(getPosition(position)).getAlbumTitle()); i.putExtra("albumId", albums.get(getPosition(position)).getAlbumId()); context.startActivity(i); } }); } else { if (songs.size() == 0) return; holder.songArt.setImageDrawable(new ColorDrawable(0xffffffff)); setSongArt(getPosition(position), holder); holder.songName.setText(songs.get(getPosition(position)).getName()); holder.songArtist.setText(songs.get(getPosition(position)).getArtist()); holder.mainView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(); i.setAction(PlayerService.ACTION_PLAY_ALL_SONGS); i.putExtra("songId", songs.get(getPosition(position)).getSongId()); i.putExtra("pos", getPosition(position)); context.sendBroadcast(i); } }); } holder.mainView.setBackgroundColor(0xffffffff); holder.mainView.setElevation(dpToPx(2)); } private void setHeaderBg(SimpleItemViewHolder holder) { holder.mainView.setBackgroundColor(ContextCompat.getColor(context, R.color.appBackground)); holder.mainView.setElevation(dpToPx(0)); } private void setSongArt(int position, SimpleItemViewHolder holder) { String path = ListSongs.getAlbumArt(context, songs.get(position).getAlbumId()); Utils utils = new Utils(context); int size = utils.dpToPx(50); if (path != null) Picasso.with(context).load(new File(path)).resize(size, size).centerCrop().into(holder.songArt); else { holder.songArt.setImageBitmap(utils.getBitmapOfVector(R.drawable.default_art, size, size)); } } public void getArtistImg(final SimpleItemViewHolder holder, int position) { ArtistImgHandler imgHandler = new ArtistImgHandler(context) { @Override public void onDownloadComplete(final String url) { if (url != null) ((Activity) context).runOnUiThread(new Runnable() { @Override public void run() { Picasso.with(context).load(new File(url)).into(holder.artistArt); setImageToView(url, holder); } }); } }; String path = imgHandler.getArtistImgFromDB("name"); if (path != null && !path.matches("")) { setImageToView(path, holder); } else { String urlIfAny = imgHandler.getArtistArtWork(artists.get(position).getArtistName(), position); if (urlIfAny != null) setImageToView(urlIfAny, holder); } } public void setImageToView(String url, final SimpleItemViewHolder holder) { Picasso.with(context).load(new File(url)).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { Bitmap circularBitmap = ImageConverter.getRoundedCornerBitmap(bitmap, 100); holder.artistArt.setImageBitmap(circularBitmap); } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }); } private void setArt(SimpleItemViewHolder holder, int position) { //For album art if (albums.get(position).getAlbumArtPath() != null) { if (isFilePathExist(albums.get(position).getAlbumArtPath())) { new AlbumItemLoad(context, albums.get(position).getAlbumArtPath(), holder).execute(); setAlbumArt(position, holder); } else setDefaultView(holder); } else { setDefaultView(holder); } } private boolean isFilePathExist(String albumArtPath) { File imgFile = new File(albumArtPath); return imgFile.exists(); } private void setDefaultView(SimpleItemViewHolder holder) { int colorPrimary = ContextCompat .getColor(context, R.color.colorPrimary); Utils utils = new Utils(context); int size = (utils.getWindowWidth() - dpToPx(1)) / 2; holder.albumArt.setImageBitmap(utils.getBitmapOfVector(R.drawable.default_art, size, size)); holder.bgView.setBackgroundColor(colorPrimary); } private void setAlbumArt(int position, SimpleItemViewHolder holder) { String art = albums.get(position).getAlbumArtPath(); if (art != null) Picasso.with(context).load(new File(art)).resize(dpToPx(180), dpToPx(180)).centerCrop().into(holder.albumArt); else setDefaultView(holder); } public int dpToPx(int dp) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); } @Override public int getItemCount() { return totalSize; } @Override public int getItemViewType(int position) { return whatView(position); } public class SimpleItemViewHolder extends RecyclerView.ViewHolder { public View mainView; //For Header View public View headerHolder; public TextView headerText; //For Song View public TextView songName, songArtist; public ImageView songArt, songMenu; //For Artist View public TextView artistSongCount, artistName; public ImageView artistArt, artistMenu; public View expandView; //For Album View public TextView albumName, albumArtist; public ImageView albumArt; public View bgView; public SimpleItemViewHolder(View itemView) { super(itemView); mainView = itemView; headerHolder = itemView.findViewById(R.id.search_header_holder); headerText = (TextView) itemView.findViewById(R.id.search_header_text); songName = (TextView) itemView.findViewById(R.id.song_item_name); songArtist = (TextView) itemView.findViewById(R.id.song_item_artist); songArt = (ImageView) itemView.findViewById(R.id.song_item_img); songMenu = (ImageView) itemView.findViewById(R.id.song_item_menu); artistName = (TextView) itemView.findViewById(R.id.artist_item_name); artistSongCount = (TextView) itemView.findViewById(R.id.artist_item_song_count); artistArt = (ImageView) itemView.findViewById(R.id.artist_item_img); artistMenu = (ImageView) itemView.findViewById(R.id.artist_item_menu); expandView = itemView.findViewById(R.id.expanded_area); albumName = (TextView) itemView.findViewById(R.id.album_list_name); albumArtist = (TextView) itemView.findViewById(R.id.album_list_artist); albumArt = (ImageView) itemView.findViewById(R.id.album_list_img); bgView = itemView.findViewById(R.id.album_list_bottom); } } }