package pasta.music.fragments; import android.content.DialogInterface; import android.content.Intent; import android.content.res.ColorStateList; import android.databinding.DataBindingUtil; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.FloatingActionButton; 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.util.DisplayMetrics; 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.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.afollestad.async.Action; 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 java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import pasta.music.Pasta; import pasta.music.R; import pasta.music.activities.PlayerActivity; import pasta.music.adapters.TrackAdapter; import pasta.music.data.AlbumListData; 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 AlbumFragment extends FullScreenFragment { @Bind(R.id.topTenTrackListView) RecyclerView recycler; @Bind(R.id.progressBar2) ProgressBar spinner; @Bind(R.id.fab) FloatingActionButton fab; @Bind(R.id.collapsing_toolbar) CollapsingToolbarLayout collapsingToolbarLayout; @Bind(R.id.header) CustomImageView header; @Bind(R.id.bar) View bar; @Bind(R.id.toolbar) Toolbar toolbar; @Bind(R.id.appbar) AppBarLayout appbar; @Bind(R.id.tracksLength) TextView tracksLength; private AlbumListData data; private List<TrackListData> trackList; private Pasta pasta; private Action action; private int selectedOrder; private TrackAdapter adapter; private boolean palette; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = DataBindingUtil.inflate(inflater, R.layout.fragment_tracks, container, false).getRoot(); ButterKnife.bind(this, rootView); pasta = (Pasta) getContext().getApplicationContext(); data = getArguments().getParcelable("album"); palette = PreferenceUtils.isPalette(getContext()); fab.setBackgroundTintList(ColorStateList.valueOf(PreferenceUtils.getAccentColor(getContext()))); fab.setImageDrawable(ImageUtils.getVectorDrawable(getContext(), R.drawable.ic_play)); 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_view); modifyMenu(toolbar.getMenu()); toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { onMenuClick(item); return false; } }); collapsingToolbarLayout.setTitle(data.albumName); tracksLength.setText(String.valueOf(data.tracks) + (data.tracks == 1 ? " track" : " tracks")); appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (fab == null) return; if (appBarLayout.getHeight() / 2 < -verticalOffset) { fab.hide(); } else { fab.show(); } } }); spinner.setVisibility(View.VISIBLE); DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); adapter = new TrackAdapter((AppCompatActivity) getActivity(), null); adapter.setAlbumBehavior(); recycler.setAdapter(adapter); recycler.setLayoutManager(new GridLayoutManager(getContext(), PreferenceUtils.isListTracks(getContext()) ? 1 : PreferenceUtils.getColumnNumber(getContext(), metrics.widthPixels > metrics.heightPixels))); recycler.setHasFixedSize(true); action = new Action<List<TrackListData>>() { @NonNull @Override public String id() { return "getAlbumTracks"; } @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.onCriticalError(getContext(), "album tracks action"); return; } adapter.swapData(result); adapter.sort(PreferenceUtils.getTrackOrder(getContext())); trackList = result; } }; action.execute(); Glide.with(getContext()).load(data.albumImageLarge).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); if (palette) { Palette.from(ImageUtils.drawableToBitmap(resource)).generate(new Palette.PaletteAsyncListener() { @Override public void onGenerated(Palette palette) { int primary = palette.getMutedColor(Color.GRAY); if (collapsingToolbarLayout != null) collapsingToolbarLayout.setContentScrimColor(primary); if (fab != null) fab.setBackgroundTintList(ColorStateList.valueOf(palette.getVibrantColor(ImageUtils.darkColor(primary)))); if (bar != null) bar.setBackgroundColor(primary); setData(data.albumName, primary, palette.getDarkVibrantColor(primary)); } }); } } }); return rootView; } @OnClick(R.id.fab) public void startFirst(View v) { if (trackList == null || trackList.size() < 1) return; StaticUtils.play(0, trackList, getContext()); startActivity(new Intent(getActivity(), PlayerActivity.class)); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_basic_view, menu); modifyMenu(menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(final MenuItem item) { onMenuClick(item); return false; } @Override public void onDestroyView() { super.onDestroyView(); if (action != null && action.isExecuting()) action.cancel(); ButterKnife.unbind(this); } private void modifyMenu(final Menu menu) { new Action<Boolean>() { @NonNull @Override public String id() { return "isAlbumFav"; } @Nullable @Override protected Boolean run() throws InterruptedException { return pasta.isFavorite(data); } @Override protected void done(@Nullable Boolean result) { if (result == null) { pasta.onError(getActivity(), "favorite album 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 "favAlbum"; } @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(), "favorite album 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.albumName); s.putExtra(Intent.EXTRA_TEXT, StaticUtils.getAlbumUrl(data.albumId)); startActivity(Intent.createChooser(s, data.albumName)); break; case R.id.action_web: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(StaticUtils.getAlbumUrl(data.albumId)))); break; case R.id.action_order: PreferenceUtils.getOrderingDialog(getContext(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { selectedOrder = which; } }, new DialogInterface.OnClickListener() { public void onClick(DialogInterface d, int which) { PreferenceManager.getDefaultSharedPreferences(getContext()).edit().putInt(PreferenceUtils.ORDER, selectedOrder).apply(); adapter.sort(PreferenceUtils.getTrackOrder(getContext())); d.dismiss(); } }).show(); break; } } }