package com.gzsll.hupu.ui.imagepreview; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.annotation.NonNull; import com.facebook.cache.common.CacheKey; import com.facebook.imagepipeline.cache.DefaultCacheKeyFactory; import com.facebook.imagepipeline.core.ImagePipelineFactory; import com.facebook.imagepipeline.request.ImageRequest; import com.gzsll.hupu.components.okhttp.OkHttpHelper; import com.gzsll.hupu.injector.PerActivity; import com.gzsll.hupu.util.ConfigUtil; import com.gzsll.hupu.util.FormatUtil; import com.gzsll.hupu.util.StringUtil; import com.gzsll.hupu.util.ToastUtil; import java.io.File; import java.io.InputStream; import javax.inject.Inject; import okio.BufferedSink; import okio.Okio; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by sll on 2016/4/29. */ @PerActivity public class ImagePreviewPresenter implements ImagePreviewContract.Presenter { private OkHttpHelper mOkHttpHelper; private Context mContext; @Inject public ImagePreviewPresenter(OkHttpHelper okHttpHelper, Context context) { mOkHttpHelper = okHttpHelper; mContext = context; } @Override public void saveImage(final String url) { Observable.just(url) .map(new Func1<String, InputStream>() { @Override public InputStream call(String s) { return getImageBytesFromLocal(Uri.parse(s)); } }) .map(new Func1<InputStream, File>() { @Override public File call(InputStream in) { if (in != null) { String fileName = FormatUtil.getFileNameFromUrl(url); File target = new File(ConfigUtil.getPicSavePath(mContext), fileName); if (target.exists()) { return target; } try { BufferedSink sink = Okio.buffer(Okio.sink(target)); sink.writeAll(Okio.source(in)); sink.close(); return target; } catch (Exception e) { e.printStackTrace(); } } return null; } }) .map(new Func1<File, File>() { @Override public File call(File file) { if (file != null && file.exists()) { return file; } try { mOkHttpHelper.httpDownload(url, file); return file; } catch (Exception e) { e.printStackTrace(); } return null; } }) .doOnNext(new Action1<File>() { @Override public void call(File file) { if (file != null && file.exists()) { scanPhoto(file); } } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<File>() { @Override public void call(File file) { if (file != null && file.exists()) { ToastUtil.showToast("保存成功"); } else { ToastUtil.showToast("保存失败,请重试"); } } }); } private InputStream getImageBytesFromLocal(Uri loadUri) { if (loadUri == null) { return null; } CacheKey cacheKey = DefaultCacheKeyFactory.getInstance() .getEncodedCacheKey(ImageRequest.fromUri(loadUri), null); try { if (ImagePipelineFactory.getInstance().getMainFileCache().hasKey(cacheKey)) { return ImagePipelineFactory.getInstance() .getMainFileCache() .getResource(cacheKey) .openStream(); } if (ImagePipelineFactory.getInstance().getSmallImageFileCache().hasKey(cacheKey)) { return ImagePipelineFactory.getInstance() .getSmallImageFileCache() .getResource(cacheKey) .openStream(); } } catch (Exception e) { e.printStackTrace(); } return null; } private void scanPhoto(File file) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(file); mediaScanIntent.setData(contentUri); mContext.sendBroadcast(mediaScanIntent); } @Override public void copyImagePath(String url) { StringUtil.copy(mContext, url); } @Override public void attachView(@NonNull ImagePreviewContract.View view) { } @Override public void detachView() { } }