package com.architjn.acjmusicplayer.utils.adapters; import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.architjn.acjmusicplayer.R; import com.architjn.acjmusicplayer.ui.layouts.activity.ArtistActivity; import com.architjn.acjmusicplayer.ui.layouts.activity.MainActivity; import com.architjn.acjmusicplayer.ui.layouts.fragments.ArtistListFragment; import com.architjn.acjmusicplayer.utils.handlers.ArtistImgHandler; import com.architjn.acjmusicplayer.utils.decorations.ArtistSubListSpacesItemDecoration; import com.architjn.acjmusicplayer.utils.ImageConverter; import com.architjn.acjmusicplayer.utils.Utils; import com.architjn.acjmusicplayer.utils.items.Artist; 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 ArtistsListAdapter extends RecyclerView.Adapter<ArtistsListAdapter.SimpleItemViewHolder> { private ArrayList<Artist> items; private ArtistListFragment fragment; private Context context; private int expandedPosition = -1; private SimpleItemViewHolder expandedHolder; private int expandSize = 255; private ArtistSubListAdapter extendedAdapter; public ArtistsListAdapter(Context context, ArrayList<Artist> items, ArtistListFragment fragment) { this.context = context; this.items = items; this.fragment = fragment; } @Override public ArtistsListAdapter.SimpleItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()). inflate(R.layout.artist_list_item, parent, false); return new SimpleItemViewHolder(itemView); } @Override public void onBindViewHolder(final ArtistsListAdapter.SimpleItemViewHolder holder, final int position) { Utils utils = new Utils(context); holder.img.setImageBitmap(utils.getBitmapOfVector(R.drawable.default_artist_art, utils.dpToPx(50), utils.dpToPx(50))); holder.name.setText(items.get(position).getArtistName()); getArtistImg(holder, position); holder.songCount.setText(context.getResources().getString(R.string.songs) + " " + items.get(position).getNumberOfSongs() + " . " + context.getResources().getString(R.string.albums) + " " + items.get(position).getNumberOfAlbums()); if (position == expandedPosition) { expandWithoutAnimation(holder); } else { collapseWithoutAnimation(holder); } setOnClicks(holder, position); } private void setOnClicks(final SimpleItemViewHolder holder, final int position) { holder.mainView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Check for an expanded view, collapse if you find one if (expandedPosition != position) { if (expandedPosition >= 0) { collapse(); } expand(holder, position); } else { Intent i = new Intent(context, ArtistActivity.class); i.putExtra("name", items.get(position).getArtistName()); i.putExtra("id", items.get(position).getArtistId()); context.startActivity(i); } } }); holder.songsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(context, ArtistActivity.class); i.putExtra("name", items.get(position).getArtistName()); i.putExtra("id", items.get(position).getArtistId()); context.startActivity(i); } }); holder.shuffleButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } }); holder.menu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } }); } 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.img.setImageBitmap(circularBitmap); } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } }); } private void expand(SimpleItemViewHolder holder, int position) { expandedPosition = position; expandedHolder = holder; animateElevation(0, 12, holder.mainView); holder.mainView.setBackgroundColor(0xffffffff); if (expandedPosition == -1) animateHeight(0, dpToPx(expandSize), holder.expandedArea, false); else animateHeight(0, dpToPx(expandSize), holder.expandedArea, true); setSubList(position); } private void collapse() { animateElevation(12, 0, expandedHolder.mainView); expandedHolder.mainView.setBackgroundColor(0xfffafafa); animateHeight(dpToPx(expandSize), 0, expandedHolder.expandedArea, false); expandedPosition = -1; expandedHolder = null; } private void collapseWithoutAnimation(SimpleItemViewHolder holder) { holder.mainView.setElevation(0); holder.expandedArea.setLayoutParams(new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, dpToPx(0))); holder.mainView.setBackgroundColor(0xfffafafa); } private void expandWithoutAnimation(SimpleItemViewHolder holder) { holder.mainView.setElevation(12); holder.expandedArea.setLayoutParams(new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, dpToPx(expandSize))); holder.mainView.setBackgroundColor(0xffffffff); } @Override public int getItemCount() { return items.size(); } public int dpToPx(int dp) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT)); return px; } private void animateElevation(int from, int to, final View view) { Integer elevationFrom = from; Integer elevationTo = to; ValueAnimator colorAnimation = ValueAnimator.ofObject( new ArgbEvaluator(), elevationFrom, elevationTo); colorAnimation.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { view.setElevation( (Integer) animator.getAnimatedValue()); } }); colorAnimation.start(); } private void animateHeight(int from, int to, final View view, boolean delay) { // Declare a ValueAnimator object int duration = 500; ValueAnimator valueAnimator; valueAnimator = ValueAnimator.ofInt(from, to); // These values in this method can be changed to expand however much you like valueAnimator.setDuration(duration); valueAnimator.setInterpolator(new DecelerateInterpolator()); if (delay) valueAnimator.setStartDelay(duration); valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { Integer value = (Integer) animation.getAnimatedValue(); view.getLayoutParams().height = value.intValue(); view.requestLayout(); } }); valueAnimator.start(); } public void recyclerScrolled() { // if (expandedPosition != -1 && expandedHolder != null) // collapse(); } public void setSubList(int position) { if (expandedHolder.rv.getAdapter() == null) { expandedHolder.rv.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); expandedHolder.rv.addItemDecoration( new ArtistSubListSpacesItemDecoration(context, dpToPx(5))); } extendedAdapter = new ArtistSubListAdapter(context, items.get(position).getArtistId()); expandedHolder.rv.setAdapter(extendedAdapter); } 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.img); setImageToView(url, holder); } }); } }; String path = imgHandler.getArtistImgFromDB("name"); if (path != null && !path.matches("")) { setImageToView(path, holder); } else { String urlIfAny = imgHandler.getArtistArtWork(items.get(position).getArtistName(), position); if (urlIfAny != null) setImageToView(urlIfAny, holder); } } public void onBackPressed() { if (expandedPosition != -1) collapse(); else ((MainActivity) fragment.getActivity()).killActivity(); } public class SimpleItemViewHolder extends RecyclerView.ViewHolder { public TextView name, songCount, songsButton, shuffleButton; public View mainView, menu; public LinearLayout expandedArea; public ImageView img; public RecyclerView rv; public SimpleItemViewHolder(View itemView) { super(itemView); mainView = itemView; img = (ImageView) itemView.findViewById(R.id.artist_item_img); menu = itemView.findViewById(R.id.artist_item_menu); name = (TextView) itemView.findViewById(R.id.artist_item_name); songsButton = (TextView) itemView.findViewById(R.id.artist_song_button); shuffleButton = (TextView) itemView.findViewById(R.id.artist_shuffle_button); expandedArea = (LinearLayout) itemView.findViewById(R.id.expanded_area); songCount = (TextView) itemView.findViewById(R.id.artist_item_song_count); rv = (RecyclerView) itemView.findViewById(R.id.artist_sub_rv); } } }