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);
}
}
}