package com.simplecity.amp_library.ui.fragments;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.bumptech.glide.DrawableRequestBuilder;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.crashlytics.android.Crashlytics;
import com.jp.wasabeef.glide.transformations.BlurTransformation;
import com.simplecity.amp_library.R;
import com.simplecity.amp_library.glide.utils.GlideUtils;
import com.simplecity.amp_library.model.Song;
import com.simplecity.amp_library.ui.activities.PlayerActivity;
import com.simplecity.amp_library.utils.SettingsManager;
import java.lang.ref.WeakReference;
public class ArtworkFragment extends BaseFragment {
private static final String TAG = "ArtworkFragment";
private static final String ARG_SONG = "song";
private ImageView imageView;
private Target blurTarget;
private Song song;
public static ArtworkFragment newInstance(Song song) {
ArtworkFragment fragment = new ArtworkFragment();
Bundle args = new Bundle();
args.putSerializable(ARG_SONG, song);
fragment.setArguments(args);
return fragment;
}
public ArtworkFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
song = (Song) getArguments().getSerializable(ARG_SONG);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_artwork, container, false);
GestureDetector gestureDetector = new GestureDetector(this.getActivity(), new GestureListener(this));
imageView = (ImageView) rootView.findViewById(R.id.image);
imageView.setOnTouchListener((view, motionEvent) -> gestureDetector.onTouchEvent(motionEvent));
updateArtwork();
return rootView;
}
@Override
public void onPause() {
super.onPause();
if (imageView != null) {
Glide.clear(imageView);
}
if (blurTarget != null) {
Glide.clear(blurTarget);
}
}
@Override
public void onResume() {
super.onResume();
updateArtwork();
}
private void updateArtwork() {
RequestManager requestManager = null;
if (getParentFragment() != null && getParentFragment() instanceof RequestManagerProvider) {
requestManager = ((RequestManagerProvider) (getParentFragment())).getRequestManager();
}
// There's currently no situation where this will happen, but this keeps the ArtworkFragment
// decoupled from its parent.
if (requestManager == null) {
requestManager = Glide.with(this);
}
if (imageView != null && song != null) {
DrawableRequestBuilder builder = requestManager
.load(song)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.placeholder(GlideUtils.getLargePlaceHolderResId());
if (SettingsManager.getInstance().cropArtwork()) {
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
try {
builder.into(imageView);
} catch (IllegalArgumentException e) {
Crashlytics.log("ArtworkFragment load normal image failed: " + e.getMessage());
}
if (!SettingsManager.getInstance().cropArtwork()) {
try {
blurTarget = requestManager
.load(song)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.bitmapTransform(new BlurTransformation(getContext()))
.override(100, 100)
.into(new Target(imageView));
} catch (IllegalArgumentException e) {
Crashlytics.log("ArtworkFragment load blur image failed: " + e.getMessage());
}
}
}
}
@Override
public void onDestroy() {
if (imageView != null) {
imageView.setOnTouchListener(null);
}
super.onDestroy();
}
private static class Target extends SimpleTarget<GlideDrawable> {
private WeakReference<ImageView> imageViewWeakReference;
public Target(ImageView imageView) {
imageViewWeakReference = new WeakReference<>(imageView);
}
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
ImageView imageView = imageViewWeakReference.get();
if (imageView != null) {
imageView.setBackground(resource);
}
}
}
private static class GestureListener extends GestureDetector.SimpleOnGestureListener {
private WeakReference<Fragment> fragmentWeakReference;
public GestureListener(Fragment fragment) {
fragmentWeakReference = new WeakReference<>(fragment);
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Fragment fragment = fragmentWeakReference.get();
if (fragment == null) {
return false;
}
Activity activity = fragment.getActivity();
if (activity instanceof PlayerActivity) {
((PlayerActivity) activity).toggleLyrics();
return true;
} else {
Fragment parentFragment = fragment.getParentFragment();
Fragment playingFragment = null;
if (parentFragment != null) {
playingFragment = parentFragment.getParentFragment();
}
if (playingFragment != null && playingFragment instanceof PlayerFragment) {
((PlayerFragment) playingFragment).toggleLyrics();
}
}
return false;
}
}
@Override
protected String screenName() {
return TAG;
}
}