package com.luck.picture.lib.ui;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.luck.picture.lib.R;
import com.luck.picture.lib.model.FunctionConfig;
import com.luck.picture.lib.widget.Constant;
import com.luck.picture.lib.widget.CustomDialog;
import com.yalantis.ucrop.dialog.SweetAlertDialog;
import com.yalantis.ucrop.entity.LocalMedia;
import com.yalantis.ucrop.util.FileUtils;
import com.yalantis.ucrop.util.ScreenUtils;
import com.yalantis.ucrop.util.Utils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import uk.co.senab.photoview.PhotoViewAttacher;
/**
* author:luck
* project:PictureSelector
* package:com.luck.picture.ui
* email:邮箱->893855882@qq.com
* data:17/01/18
*/
public class PictureImagePreviewFragment extends Fragment {
public static final String PATH = "path";
private List<LocalMedia> selectImages = new ArrayList<>();
private SweetAlertDialog dialog;
private loadDataThread loadDataThread;
private boolean isSave;
private String directory_path;
public static PictureImagePreviewFragment getInstance(String path, boolean isSave, String directory_path, List<LocalMedia> medias) {
PictureImagePreviewFragment fragment = new PictureImagePreviewFragment();
Bundle bundle = new Bundle();
bundle.putString(PATH, path);
bundle.putBoolean("isSave", isSave);
bundle.putString(FunctionConfig.DIRECTORY_PATH, directory_path);
bundle.putSerializable(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST, (Serializable) medias);
fragment.setArguments(bundle);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View contentView = inflater.inflate(R.layout.picture_fragment_image_preview, container, false);
final ImageView imageView = (ImageView) contentView.findViewById(R.id.preview_image);
final PhotoViewAttacher mAttacher = new PhotoViewAttacher(imageView);
selectImages = (List<LocalMedia>) getArguments().getSerializable(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST);
final String path = getArguments().getString(PATH);
isSave = getArguments().getBoolean("isSave");
directory_path = getArguments().getString(FunctionConfig.DIRECTORY_PATH);
if (!isSave && path.startsWith("http")) {
showPleaseDialog("请稍候...");
}
Glide.with(container.getContext())
.load(path)
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.into(new SimpleTarget<Bitmap>(480, 800) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
imageView.setImageBitmap(resource);
mAttacher.update();
dismiss();
}
});
mAttacher.setOnViewTapListener(new PhotoViewAttacher.OnViewTapListener() {
@Override
public void onViewTap(View view, float x, float y) {
if (getActivity() instanceof PicturePreviewActivity) {
activityFinish();
} else {
getActivity().finish();
getActivity().overridePendingTransition(0, R.anim.toast_out);
}
}
});
mAttacher.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// 内部预览不保存
if (!isSave) {
if (hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
showDownLoadDialog(path);
} else {
requestPermission(Constant.WRITE_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
}
return true;
}
});
return contentView;
}
protected void activityFinish() {
getActivity().setResult(getActivity().RESULT_OK, new Intent().putExtra("type", 1).putExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST, (Serializable) selectImages));
getActivity().finish();
}
/**
* 下载图片提示
*/
private void showDownLoadDialog(final String path) {
final CustomDialog dialog = new CustomDialog(getContext(), ScreenUtils.getScreenWidth(getContext()) * 3 / 4,
ScreenUtils.getScreenHeight(getContext()) / 4, R.layout.wind_base_dialog_xml, R.style.Theme_dialog);
Button btn_cancel = (Button) dialog.findViewById(R.id.btn_cancel);
Button btn_commit = (Button) dialog.findViewById(R.id.btn_commit);
TextView tv_title = (TextView) dialog.findViewById(R.id.tv_title);
TextView tv_content = (TextView) dialog.findViewById(R.id.tv_content);
tv_title.setText("提示");
tv_content.setText("是否保存图片至手机?");
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
btn_commit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showPleaseDialog("请稍候...");
if (!Utils.isNull(path)) {
if (path.startsWith("http") || path.startsWith("https")) {
loadDataThread = new loadDataThread(path);
loadDataThread.start();
} else {
// 有可能本地图片
String dirPath = createDir(System.currentTimeMillis() + ".png");
try {
FileUtils.copyFile(path, dirPath);
Toast.makeText(getActivity(), "图片保存成功至\n" + dirPath, Toast.LENGTH_SHORT).show();
dismiss();
} catch (IOException e) {
Toast.makeText(getActivity(), "图片保存失败\n" + e.getMessage(), Toast.LENGTH_SHORT).show();
dismiss();
e.printStackTrace();
}
}
}
dialog.dismiss();
}
});
dialog.show();
}
// 进度条线程
public class loadDataThread extends Thread {
private String path;
public loadDataThread(String path) {
super();
this.path = path;
}
public void run() {
try {
showLoadingImage(path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 下载图片保存至手机
public void showLoadingImage(String urlPath) {
try {
URL u = new URL(urlPath);
String path = createDir(System.currentTimeMillis() + ".png");
byte[] buffer = new byte[1024 * 8];
int read;
int ava = 0;
long start = System.currentTimeMillis();
BufferedInputStream bin;
HttpURLConnection urlConn = (HttpURLConnection) u.openConnection();
double fileLength = (double) urlConn.getContentLength();
bin = new BufferedInputStream(u.openStream());
BufferedOutputStream bout = new BufferedOutputStream(
new FileOutputStream(path));
while ((read = bin.read(buffer)) > -1) {
bout.write(buffer, 0, read);
ava += read;
int a = (int) Math.floor((ava / fileLength * 100));
long speed = ava / (System.currentTimeMillis() - start);
System.out.println("Download: " + ava + " byte(s)"
+ " avg speed: " + speed + " (kb/s)");
}
bout.flush();
bout.close();
Message message = handler.obtainMessage();
message.what = 200;
message.obj = path;
handler.sendMessage(message);
} catch (IOException e) {
Toast.makeText(getActivity(), "图片保存失败\n" + e.getMessage(), Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
/**
* 创建文件夹
*
* @param filename
* @return
*/
private String createDir(String filename) {
String state = Environment.getExternalStorageState();
File rootDir = state.equals(Environment.MEDIA_MOUNTED) ? Environment.getExternalStorageDirectory() : getActivity().getCacheDir();
File path = null;
if (!Utils.isNull(directory_path)) {
// 自定义保存目录
path = new File(rootDir.getAbsolutePath() + directory_path);
} else {
path = new File(rootDir.getAbsolutePath() + "/PictureSelector");
}
if (!path.exists())
// 若不存在,创建目录,可以在应用启动的时候创建
path.mkdirs();
return path + "/" + filename;
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 200:
String path = (String) msg.obj;
Toast.makeText(getActivity(), "图片保存成功至\n" + path, Toast.LENGTH_SHORT).show();
dismiss();
break;
}
}
};
/**
* 提示框
*
* @param msg
*/
private void showPleaseDialog(String msg) {
if (!getActivity().isFinishing()) {
dialog = new SweetAlertDialog(getActivity());
dialog.setTitleText(msg);
dialog.show();
}
}
/**
* 关闭提示框
*/
private void dismiss() {
if (dialog != null && dialog.isShowing()) {
dialog.cancel();
}
}
/**
* 针对6.0动态请求权限问题
* 判断是否允许此权限
*
* @param permissions
* @return
*/
protected boolean hasPermission(String... permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(getActivity(), permission)
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
/**
* 动态请求权限
*
* @param code
* @param permissions
*/
protected void requestPermission(int code, String... permissions) {
ActivityCompat.requestPermissions(getActivity(), permissions, code);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case Constant.WRITE_EXTERNAL_STORAGE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else {
Toast.makeText(getContext(), "读取内存卡权限已被拒绝", Toast.LENGTH_SHORT).show();
}
break;
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (loadDataThread != null) {
handler.removeCallbacks(loadDataThread);
loadDataThread = null;
}
}
}