package com.kabouzeid.gramophone.adapter; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.glide.PhonographColoredTarget; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.misc.CustomFragmentStatePagerAdapter; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.PreferenceUtil; import java.util.ArrayList; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; /** * @author Karim Abou Zeid (kabouzeid) */ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter { public static final String TAG = AlbumCoverPagerAdapter.class.getSimpleName(); private ArrayList<Song> dataSet; private AlbumCoverFragment.ColorReceiver currentColorReceiver; private int currentColorReceiverPosition = -1; public AlbumCoverPagerAdapter(FragmentManager fm, ArrayList<Song> dataSet) { super(fm); this.dataSet = dataSet; } @Override public Fragment getItem(final int position) { return AlbumCoverFragment.newInstance(dataSet.get(position)); } @Override public int getCount() { return dataSet.size(); } @Override public Object instantiateItem(ViewGroup container, int position) { Object o = super.instantiateItem(container, position); if (currentColorReceiver != null && currentColorReceiverPosition == position) { receiveColor(currentColorReceiver, currentColorReceiverPosition); } return o; } /** * Only the latest passed {@link AlbumCoverFragment.ColorReceiver} is guaranteed to receive a response */ public void receiveColor(AlbumCoverFragment.ColorReceiver colorReceiver, int position) { AlbumCoverFragment fragment = (AlbumCoverFragment) getFragment(position); if (fragment != null) { currentColorReceiver = null; currentColorReceiverPosition = -1; fragment.receiveColor(colorReceiver, position); } else { currentColorReceiver = colorReceiver; currentColorReceiverPosition = position; } } public static class AlbumCoverFragment extends Fragment implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String SONG_ARG = "song"; private Unbinder unbinder; @BindView(R.id.player_image) ImageView albumCover; private boolean isColorReady; private int color; private Song song; private ColorReceiver colorReceiver; private int request; public static AlbumCoverFragment newInstance(final Song song) { AlbumCoverFragment frag = new AlbumCoverFragment(); final Bundle args = new Bundle(); args.putParcelable(SONG_ARG, song); frag.setArguments(args); return frag; } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); song = getArguments().getParcelable(SONG_ARG); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_album_cover, container, false); unbinder = ButterKnife.bind(this, view); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); forceSquareAlbumCover(false); // TODO // forceSquareAlbumCover(PreferenceUtil.getInstance(getContext()).forceSquareAlbumCover()); PreferenceUtil.getInstance(getActivity()).registerOnSharedPreferenceChangedListener(this); loadAlbumCover(); } @Override public void onDestroyView() { super.onDestroyView(); PreferenceUtil.getInstance(getActivity()).unregisterOnSharedPreferenceChangedListener(this); unbinder.unbind(); colorReceiver = null; } private void loadAlbumCover() { SongGlideRequest.Builder.from(Glide.with(this), song) .checkIgnoreMediaStore(getActivity()) .generatePalette(getActivity()).build() .into(new PhonographColoredTarget(albumCover) { @Override public void onColorReady(int color) { setColor(color); } }); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { switch (key) { case PreferenceUtil.FORCE_SQUARE_ALBUM_COVER: // TODO // forceSquareAlbumCover(PreferenceUtil.getInstance(getActivity()).forceSquareAlbumCover()); break; } } public void forceSquareAlbumCover(boolean forceSquareAlbumCover) { albumCover.setScaleType(forceSquareAlbumCover ? ImageView.ScaleType.FIT_CENTER : ImageView.ScaleType.CENTER_CROP); } private void setColor(int color) { this.color = color; isColorReady = true; if (colorReceiver != null) { colorReceiver.onColorReady(color, request); colorReceiver = null; } } public void receiveColor(ColorReceiver colorReceiver, int request) { if (isColorReady) { colorReceiver.onColorReady(color, request); } else { this.colorReceiver = colorReceiver; this.request = request; } } public interface ColorReceiver { void onColorReady(int color, int request); } } }