package com.kenny.openimgur.fragments; import android.app.DialogFragment; import android.graphics.Bitmap; import android.media.MediaPlayer; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.ImageView; import android.widget.Toast; import com.kenny.openimgur.R; import com.kenny.openimgur.activities.FullScreenPhotoActivity; import com.kenny.openimgur.api.ApiClient; import com.kenny.openimgur.api.responses.PhotoResponse; import com.kenny.openimgur.classes.ImgurPhoto; import com.kenny.openimgur.classes.OpengurApp; import com.kenny.openimgur.classes.VideoCache; import com.kenny.openimgur.ui.VideoView; import com.kenny.openimgur.util.FileUtil; import com.kenny.openimgur.util.ImageUtil; import com.kennyc.view.MultiStateView; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import java.io.File; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; /** * Created by kcampagna on 7/19/14. */ public class PopupImageDialogFragment extends DialogFragment implements VideoCache.VideoCacheListener { private static final long PHOTO_SIZE_LIMIT = 1024 * 1024 * 5; private static final String KEY_URL = "url"; private static final String KEY_ANIMATED = "animated"; private static final String KEY_DIRECT_LINK = "direct_link"; private static final String KEY_IS_VIDEO = "video"; @BindView(R.id.multiView) MultiStateView mMultiView; @BindView(R.id.image) ImageView mImage; @BindView(R.id.video) VideoView mVideo; String mImageUrl; Unbinder mUnbinder; public static PopupImageDialogFragment getInstance(String url, boolean isAnimated, boolean isDirectLink, boolean isVideo) { PopupImageDialogFragment fragment = new PopupImageDialogFragment(); Bundle args = new Bundle(4); args.putString(KEY_URL, url); args.putBoolean(KEY_ANIMATED, isAnimated); args.putBoolean(KEY_DIRECT_LINK, isDirectLink); args.putBoolean(KEY_IS_VIDEO, isVideo); fragment.setArguments(args); return fragment; } @Override public void onActivityCreated(Bundle savedInstanceState) { if (getDialog() == null) { setShowsDialog(false); } super.onActivityCreated(savedInstanceState); } @Override public void onCreate(Bundle savedInstanceState) { setStyle(DialogFragment.STYLE_NO_TITLE, OpengurApp.getInstance(getActivity()).getImgurTheme().getDialogTheme()); super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); return inflater.inflate(R.layout.image_popup_fragment, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Bundle bundle = getArguments(); if (bundle == null || !bundle.containsKey(KEY_URL)) { dismiss(); return; } mUnbinder = ButterKnife.bind(this, view); mImageUrl = bundle.getString(KEY_URL, null); boolean isAnimated = bundle.getBoolean(KEY_ANIMATED, false); boolean isDirectLink = bundle.getBoolean(KEY_DIRECT_LINK, true); boolean isVideo = bundle.getBoolean(KEY_IS_VIDEO, false); if (isDirectLink) { if (isVideo) { displayVideo(mImageUrl); } else { displayImage(mImageUrl, isAnimated); } } else { fetchImageDetails(); } mImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dismissAllowingStateLoss(); startActivity(FullScreenPhotoActivity.createIntent(getActivity(), mImageUrl)); } }); mVideo.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { dismissAllowingStateLoss(); mVideo.stopPlayback(); startActivity(FullScreenPhotoActivity.createIntent(getActivity(), mImageUrl)); return true; } }); } @Override public void onResume() { super.onResume(); if (mVideo != null && mVideo.getDuration() > 0) { mVideo.start(); } } @Override public void onPause() { if (mVideo != null && mVideo.isPlaying()) { mVideo.stopPlayback(); } super.onPause(); } @Override public void onDestroyView() { ImageUtil.getImageLoader(getActivity()).cancelDisplayTask(mImage); if (mUnbinder != null) mUnbinder.unbind(); super.onDestroyView(); } /** * Loads the image into the ImageView * * @param url * @param isAnimated */ public void displayImage(String url, final boolean isAnimated) { ImageUtil.getImageLoader(getActivity()).displayImage(url, mImage, new ImageLoadingListener() { @Override public void onLoadingStarted(String s, View view) { } @Override public void onLoadingFailed(String s, View view, FailReason failReason) { if (isAdded()) { dismissAllowingStateLoss(); Toast.makeText(getActivity(), R.string.loading_image_error, Toast.LENGTH_SHORT).show(); } } @Override public void onLoadingComplete(String s, View view, Bitmap bitmap) { if (isAdded()) { mMultiView.setViewState(MultiStateView.VIEW_STATE_CONTENT); if (isAnimated) { if (!ImageUtil.loadAndDisplayGif((ImageView) view, s, ImageUtil.getImageLoader(getActivity()))) { Toast.makeText(getActivity(), R.string.loading_image_error, Toast.LENGTH_SHORT).show(); dismissAllowingStateLoss(); } } } } @Override public void onLoadingCancelled(String s, View view) { if (isAdded()) { dismissAllowingStateLoss(); Toast.makeText(getActivity(), R.string.loading_image_error, Toast.LENGTH_SHORT).show(); } } }); } /** * Loads the video to be played * * @param url */ public void displayVideo(String url) { File file = VideoCache.getInstance().getVideoFile(url); if (FileUtil.isFileValid(file)) { displayVideo(file); } else { VideoCache.getInstance().putVideo(url, this); } } /** * Displays the video once the file is loaded * * @param file */ public void displayVideo(File file) { // The visibility needs to be set before the video is loaded or it won't play mMultiView.setViewState(MultiStateView.VIEW_STATE_CONTENT); mVideo.setVisibility(View.VISIBLE); // Needs to be set so the video is not dimmed mVideo.setZOrderOnTop(true); mImage.setVisibility(View.GONE); mVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.setLooping(true); } }); mVideo.setVideoPath(file.getAbsolutePath()); mVideo.start(); } @Override public void onVideoDownloadStart(String key, String url) { // NOOP } @Override public void onVideoDownloadFailed(Exception ex, String url) { if (isAdded() && isResumed() && getActivity() != null) { Toast.makeText(getActivity(), R.string.loading_image_error, Toast.LENGTH_SHORT).show(); dismissAllowingStateLoss(); } } @Override public void onVideoDownloadComplete(File file) { if (isAdded() && isResumed()) { displayVideo(file); } } @Override public void onProgress(int downloaded, int total) { } private void fetchImageDetails() { ApiClient.getService().getImageDetails(mImageUrl).enqueue(new Callback<PhotoResponse>() { @Override public void onResponse(Call<PhotoResponse> call, Response<PhotoResponse> response) { if (!isAdded()) return; if (response != null && response.body() != null && response.body().data != null) { ImgurPhoto photo = response.body().data; if (photo.isAnimated()) { if (photo.isLinkAThumbnail() || photo.getSize() > PHOTO_SIZE_LIMIT) { mImageUrl = photo.getVideoLink(); displayVideo(mImageUrl); } else { mImageUrl = photo.getLink(); displayImage(mImageUrl, photo.isAnimated()); } } else { mImageUrl = photo.getLink(); displayImage(mImageUrl, photo.isAnimated()); } } else { Toast.makeText(getActivity(), R.string.error_generic, Toast.LENGTH_SHORT).show(); dismissAllowingStateLoss(); } } @Override public void onFailure(Call<PhotoResponse> call, Throwable t) { if (!isAdded()) return; Toast.makeText(getActivity(), R.string.error_generic, Toast.LENGTH_SHORT).show(); dismissAllowingStateLoss(); } }); } }