package pasta.music.fragments; import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.content.Intent; import android.databinding.DataBindingUtil; import android.graphics.Bitmap; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.CollapsingToolbarLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.graphics.Palette; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.ProgressBar; import android.widget.TextView; import com.afollestad.async.Action; import com.afollestad.async.Async; import com.afollestad.async.Pool; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.GlideDrawableImageViewTarget; import com.google.android.flexbox.FlexboxLayout; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import pasta.music.Pasta; import pasta.music.R; import pasta.music.activities.HomeActivity; import pasta.music.adapters.SectionedOmniAdapter; import pasta.music.data.AlbumListData; import pasta.music.data.ArtistListData; import pasta.music.data.PlaylistListData; import pasta.music.data.TrackListData; import pasta.music.utils.ImageUtils; import pasta.music.utils.PreferenceUtils; import pasta.music.utils.StaticUtils; import pasta.music.views.CustomImageView; public class ArtistFragment extends FullScreenFragment { @Bind(R.id.progressBar2) ProgressBar spinner; @Bind(R.id.collapsing_toolbar) CollapsingToolbarLayout collapsingToolbarLayout; @Bind(R.id.topTenTrackListView) RecyclerView recycler; @Bind(R.id.header) CustomImageView header; @Bind(R.id.title) TextView title; @Bind(R.id.extra) TextView extra; @Bind(R.id.genres) FlexboxLayout genres; @Bind(R.id.toolbar) Toolbar toolbar; @Bind(R.id.somethingbar) View somethingbar; @Nullable @Bind(R.id.backgroundImage) CustomImageView backgroundImage; private ArtistListData data; private SectionedOmniAdapter adapter; private GridLayoutManager manager; private Pool pool; private boolean palette; private Pasta pasta; int limit; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = DataBindingUtil.inflate(inflater, R.layout.fragment_artist, container, false).getRoot(); ButterKnife.bind(this, rootView); data = getArguments().getParcelable("artist"); palette = PreferenceUtils.isPalette(getContext()); pasta = (Pasta) getContext().getApplicationContext(); limit = (PreferenceUtils.getLimit(getContext()) + 1) * 10; setHasOptionsMenu(true); toolbar.setNavigationIcon(R.drawable.ic_back); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getActivity().onBackPressed(); } }); toolbar.inflateMenu(R.menu.menu_basic); modifyMenu(toolbar.getMenu()); toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { onMenuClick(item); return false; } }); title.setText(data.artistName); extra.setText(String.valueOf(data.followers) + " followers"); if (data.genres.size() > 0) { for (String genre : data.genres) { View v = LayoutInflater.from(getContext()).inflate(R.layout.genre_item, null); ((TextView) v.findViewById(R.id.title)).setText(genre); v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(getActivity(), HomeActivity.class); i.putExtra("query", ((TextView) v.findViewById(R.id.title)).getText().toString()); startActivity(i); } }); genres.addView(v); } genres.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (recycler != null) recycler.setPadding(0, genres.getHeight(), 0, 0); if (genres != null) genres.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); } else { genres.setVisibility(View.GONE); } spinner.setVisibility(View.VISIBLE); manager = new GridLayoutManager(getContext(), PreferenceUtils.getColumnNumber(getContext(), false)); if (PreferenceUtils.isCards(getContext())) { manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return manager.getSpanCount(); } }); } else { manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { if (adapter.getItemViewType(position) == 0 || adapter.getItemViewType(position) == 4) return manager.getSpanCount(); else return 1; } }); } recycler.setLayoutManager(manager); adapter = new SectionedOmniAdapter((AppCompatActivity) getActivity(), null); recycler.setAdapter(adapter); pool = Async.parallel(new Action<List<TrackListData>>() { @NonNull @Override public String id() { return "searchTracks"; } @Nullable @Override protected List<TrackListData> run() throws InterruptedException { return pasta.getTracks(data); } @Override protected void done(@Nullable List<TrackListData> result) { if (spinner != null) spinner.setVisibility(View.GONE); if (result == null) pasta.onError(getActivity(), "artist tracks action"); else adapter.addData(result); } }, new Action<List<AlbumListData>>() { @NonNull @Override public String id() { return "searchAlbums"; } @Nullable @Override protected List<AlbumListData> run() throws InterruptedException { return pasta.getAlbums(data); } @Override protected void done(@Nullable List<AlbumListData> result) { if (result == null) { pasta.onError(getActivity(), "artist albums action"); return; } if (spinner != null) spinner.setVisibility(View.GONE); if (adapter != null) adapter.addData(result); } }, new Action<List<PlaylistListData>>() { @NonNull @Override public String id() { return "getPlaylists"; } @Nullable @Override protected List<PlaylistListData> run() throws InterruptedException { return pasta.searchPlaylists(data.artistName, limit); } @Override protected void done(@Nullable List<PlaylistListData> result) { if (spinner != null) spinner.setVisibility(View.GONE); if (result == null) pasta.onError(getContext(), "artist playlists action"); else adapter.addData(result); } }, new Action<List<ArtistListData>>() { @NonNull @Override public String id() { return "getArtists"; } @Nullable @Override protected List<ArtistListData> run() throws InterruptedException { return pasta.getArtists(data); } @Override protected void done(@Nullable List<ArtistListData> result) { if (spinner != null) spinner.setVisibility(View.GONE); if (result == null) pasta.onError(getContext(), "artist related artists action"); else adapter.addData(result); } }); Glide.with(getContext()).load(data.artistImage).placeholder(ImageUtils.getVectorDrawable(getContext(), R.drawable.preload)).into(new GlideDrawableImageViewTarget(header) { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) { if (header != null) header.transition(resource); Bitmap bitmap = ImageUtils.drawableToBitmap(resource); if (backgroundImage != null) backgroundImage.transition(ImageUtils.blurBitmap(bitmap)); if (palette) { Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() { @Override public void onGenerated(Palette palette) { int primary = palette.getMutedColor(Color.GRAY); if (collapsingToolbarLayout != null) collapsingToolbarLayout.setContentScrimColor(primary); ValueAnimator animator = ValueAnimator.ofObject(new ArgbEvaluator(), PreferenceUtils.getPrimaryColor(getContext()), primary); animator.setDuration(250); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { if (somethingbar != null) somethingbar.setBackgroundColor((int) animation.getAnimatedValue()); } }); animator.start(); setData(data.artistName, primary, palette.getDarkVibrantColor(primary)); } }); } } }); return rootView; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_basic, menu); modifyMenu(menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(final MenuItem item) { onMenuClick(item); return false; } @Override public void onDestroyView() { if (pool != null && pool.isExecuting()) pool.cancel(); super.onDestroyView(); ButterKnife.unbind(this); } private void modifyMenu(final Menu menu) { new Action<Boolean>() { @NonNull @Override public String id() { return "isArtistFav"; } @Nullable @Override protected Boolean run() throws InterruptedException { try { return pasta.isFavorite(data); } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void done(@Nullable Boolean result) { if (result == null) { pasta.onError(getActivity(), "artist favorite action"); return; } if (result) { menu.findItem(R.id.action_fav).setIcon(R.drawable.ic_fav); } else { menu.findItem(R.id.action_fav).setIcon(R.drawable.ic_unfav); } } }.execute(); } private void onMenuClick(final MenuItem item) { switch (item.getItemId()) { case android.R.id.home: getActivity().onBackPressed(); break; case R.id.action_fav: new Action<Boolean>() { @NonNull @Override public String id() { return "favArtist"; } @Nullable @Override protected Boolean run() throws InterruptedException { if (!pasta.toggleFavorite(data)) { return null; } else return pasta.isFavorite(data); } @Override protected void done(@Nullable Boolean result) { if (result == null) { pasta.onError(getActivity(), "artist favorite menu action"); return; } if (result) { item.setIcon(R.drawable.ic_fav); } else { item.setIcon(R.drawable.ic_unfav); } } }.execute(); break; case R.id.action_share: Intent s = new Intent(android.content.Intent.ACTION_SEND); s.setType("text/plain"); s.putExtra(Intent.EXTRA_SUBJECT, data.artistName); s.putExtra(Intent.EXTRA_TEXT, StaticUtils.getArtistUrl(data.artistId)); startActivity(Intent.createChooser(s, data.artistName)); break; case R.id.action_web: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(StaticUtils.getArtistUrl(data.artistId)))); break; } } }