package net.coding.program;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import com.davemorrissey.labs.subscaleview.ImageSource;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.github.lzyzsd.circleprogress.DonutProgress;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.FileAsyncHttpResponseHandler;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import net.coding.program.common.BlankViewDisplay;
import net.coding.program.common.Global;
import net.coding.program.common.network.MyAsyncHttpClient;
import net.coding.program.common.photopick.ImageInfo;
import net.coding.program.common.ui.BaseFragment;
import net.coding.program.common.util.FileUtil;
import net.coding.program.model.AttachmentFileObject;
import net.coding.program.project.detail.AttachmentsPicDetailActivity;
import net.coding.program.project.detail.file.FileSaveHelp;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.FragmentArg;
import org.androidannotations.annotations.ViewById;
import org.apache.http.Header;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.HashMap;
import pl.droidsonroids.gif.GifImageView;
/**
* Created by chaochen on 2014-9-7.
*/
@EFragment(R.layout.activity_image_pager_item)
public class ImagePagerFragment extends BaseFragment {
public static final int HTTP_CODE_FILE_NOT_EXIST = 1304;
public static DisplayImageOptions optionsImage = new DisplayImageOptions
.Builder()
.showImageForEmptyUri(R.drawable.image_not_exist)
.showImageOnFail(R.drawable.image_not_exist)
.bitmapConfig(Bitmap.Config.RGB_565)
.cacheOnDisk(true)
.resetViewBeforeLoading(true)
.cacheInMemory(false)
.considerExifParams(true)
.imageScaleType(ImageScaleType.NONE_SAFE)
.build();
private final View.OnClickListener onClickImageClose = v -> getActivity().onBackPressed();
// private final PhotoViewAttacher.OnPhotoTapListener onPhotoTapClose = (view, v, v2) -> getActivity().onBackPressed();
// private final PhotoViewAttacher.OnViewTapListener onViewTapListener = (view, v, v1) -> getActivity().onBackPressed();
@ViewById
DonutProgress circleLoading;
@ViewById
View imageLoadFail;
@ViewById
ViewGroup rootLayout;
@ViewById
View blankLayout;
View image;
HashMap<String, AttachmentFileObject> picCache;
File mFile;
AttachmentsPicDetailActivity parentActivity;
@FragmentArg
String uri;
@FragmentArg
String fileId;
@FragmentArg
int mProjectObjectId;
@FragmentArg // 是否允许使用自己的菜单
boolean customMenu = true;
private String URL_FILES_BASE = Global.HOST_API + "/project/%d/files/%s/view";
private String URL_FILES = "";
private AsyncHttpClient client;
public void setData(String uriString) {
uri = uriString;
}
public void setData(String fileId, int mProjectObjectId) {
this.fileId = fileId;
this.mProjectObjectId = mProjectObjectId;
}
@AfterViews
void init() {
setHasOptionsMenu(customMenu);
// getActivity().invalidateOptionsMenu();
circleLoading.setVisibility(View.INVISIBLE);
if (uri == null) {
parentActivity = (AttachmentsPicDetailActivity) getActivity();
if (parentActivity != null) {
//在AttachmentsPicDetailActivity中存放了缓存下来的结果
picCache = parentActivity.getPicCache();
if (picCache.containsKey(fileId)) {
AttachmentFileObject mFileObject = picCache.get(fileId);
uri = mFileObject.preview;
showPhoto();
} else {
//如果之前没有缓存过,那么获取并在得到结果后存入
URL_FILES = String.format(URL_FILES_BASE, mProjectObjectId, fileId);
getPhotoFromNetwork();
}
}
} else {
showPhoto();
}
}
private void getPhotoFromNetwork() {
getNetwork(URL_FILES, URL_FILES);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu_empty, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Click
protected final void rootLayout() {
getActivity().onBackPressed();
}
@Override
public void onDestroyView() {
if (image != null) {
if (image instanceof GifImageView) {
((GifImageView) image).setImageURI(null);
// } else if (image instanceof PhotoView) {
// try {
// ((SubsamplingScaleImageView) image).setImageDrawable(null);
// } catch (Exception e) {
// Global.errorLog(e);
// }
}
}
super.onDestroyView();
}
private void showPhoto() {
if (!isAdded()) {
return;
}
ImageSize size = new ImageSize(10000, 10000);
getImageLoad().imageLoader.loadImage(uri, size, optionsImage, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
circleLoading.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
if (!isAdded()) {
return;
}
circleLoading.setVisibility(View.GONE);
imageLoadFail.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingComplete(final String imageUri, View view, Bitmap loadedImage) {
if (!isAdded()) {
return;
}
circleLoading.setVisibility(View.GONE);
File file;
if (ImageInfo.isLocalFile(uri)) {
file = ImageInfo.getLocalFile(uri);
} else {
file = getImageLoad().imageLoader.getDiskCache().get(imageUri);
}
if (Global.isGifByFile(file)) {
image = getActivity().getLayoutInflater().inflate(R.layout.imageview_gif, null);
rootLayout.addView(image);
image.setOnClickListener(onClickImageClose);
} else {
SubsamplingScaleImageView photoView = (SubsamplingScaleImageView) getActivity().getLayoutInflater().inflate(R.layout.imageview_touch, rootLayout, false);
photoView.setOrientation(SubsamplingScaleImageView.ORIENTATION_USE_EXIF);
image = photoView;
rootLayout.addView(image);
// photoView.setOnPhotoTapListener(onPhotoTapClose);
// photoView.setOnViewTapListener(onViewTapListener);
photoView.setOnClickListener(v -> getActivity().onBackPressed());
// photoView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
// photoView.setMa
// photoView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM);
// photoView.setMinScale(10.f);
}
image.setOnLongClickListener(v -> {
new AlertDialog.Builder(getActivity())
.setItems(new String[]{"保存到手机"}, (dialog, which) -> {
if (which == 0) {
if (client == null) {
client = MyAsyncHttpClient.createClient(getActivity());
client.get(getActivity(), imageUri, new FileAsyncHttpResponseHandler(mFile) {
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file1) {
if (!isResumed()) {
return;
}
client = null;
showButtomToast("保存失败");
}
@Override
public void onSuccess(int statusCode, Header[] headers, File file1) {
if (!isResumed()) {
return;
}
client = null;
showButtomToast("图片已保存到:" + file1.getPath());
getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file1)));/**/
}
});
}
}
})
.show();
return true;
});
try {
if (image instanceof GifImageView) {
Uri uri1 = Uri.fromFile(file);
((GifImageView) image).setImageURI(uri1);
} else if (image instanceof SubsamplingScaleImageView) {
SubsamplingScaleImageView scaleImageView = (SubsamplingScaleImageView) ImagePagerFragment.this.image;
scaleImageView.setImage(ImageSource.uri(file.getAbsolutePath()));
// scaleImageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_OUTSIDE);
}
} catch (Exception e) {
Global.errorLog(e);
}
}
},
(imageUri, view, current, total) -> {
if (!isAdded()) {
return;
}
int progress = current * 100 / total;
circleLoading.setProgress(progress);
});
FileSaveHelp fileSaveHelp = new FileSaveHelp(getActivity());
mFile = FileUtil.getDestinationInExternalPublicDir(fileSaveHelp.getFileDownloadPath(), uri.replaceAll(".*/(.*?)", "$1"));
}
@Override
public void parseJson(int code, JSONObject response, String tag, int pos, Object data) throws JSONException {
if (tag.equals(URL_FILES)) {
if (code == 0) {
setHasOptionsMenu(false);
getActivity().invalidateOptionsMenu();
JSONObject file = response.getJSONObject("data").getJSONObject("file");
AttachmentFileObject mFileObject = new AttachmentFileObject(file);
if (picCache != null) {
picCache.put(mFileObject.file_id, mFileObject);
parentActivity.setAttachmentFileObject(mFileObject);
}
uri = mFileObject.preview;
showPhoto();
} else {
setHasOptionsMenu(true);
getActivity().invalidateOptionsMenu();
showErrorMsg(code, response);
if (code == HTTP_CODE_FILE_NOT_EXIST) {
BlankViewDisplay.setBlank(0, this, true, blankLayout, null);
} else {
BlankViewDisplay.setBlank(0, this, false, blankLayout, new View.OnClickListener() {
@Override
public void onClick(View v) {
getPhotoFromNetwork();
}
});
}
}
}
}
@Override
public void onDestroy() {
if (client != null) {
client.cancelRequests(getActivity(), true);
client = null;
}
super.onDestroy();
}
}