package com.shaweibo.biu.ui.picture;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.opengl.GLES10;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.shaweibo.biu.R;
import com.shaweibo.biu.Utils.Utility;
import com.shaweibo.biu.model.MessageModel;
import com.shaweibo.biu.model.PicSize;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
import butterknife.ButterKnife;
import butterknife.InjectView;
import pl.droidsonroids.gif.GifDrawable;
import uk.co.senab.photoview.PhotoView;
/**
* 部分代码参考自四次元 Asien
*
* @author shaw
*
*/
public class PictureFragment extends Fragment {
public static PictureFragment newInstance(MessageModel.PictureUrl url) {
PictureFragment fragment = new PictureFragment();
Bundle args = new Bundle();
args.putParcelable("url", url);
fragment.setArguments(args);
return fragment;
}
@InjectView(R.id.photoview)
PhotoView photoView;
@InjectView(R.id.webview)
WebView mWebView;
@InjectView(R.id.txtFailure)
View viewFailure;
@InjectView(R.id.tv_progress)
TextView tv_progress;
@InjectView(R.id.progressbar)
ProgressBar progressBar;
@InjectView(R.id.view_progress)
View view_progress;
private MessageModel.PictureUrl image;
private PicSize pictureSize;
String mImagUrl;
public enum PictureStatus {
wait, downloading, success, faild
}
private PictureStatus mStatus;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mView= inflater.inflate(R.layout.fragment_picture,null);
ButterKnife.inject(this,mView);
mStatus = PictureStatus.wait;
image = savedInstanceState == null ? (MessageModel.PictureUrl) getArguments().getParcelable("url")
: (MessageModel.PictureUrl) savedInstanceState.getSerializable("url");
mImagUrl=image.getMedium();
File origPic= ImageLoader.getInstance().getDiskCache().get(image.getLarge());
if(origPic.exists()){
mImagUrl=image.getLarge();
}
loadImage(mImagUrl);
return mView;
}
public void loadOrigImage(){
mImagUrl=image.getLarge();
loadImage(mImagUrl);
}
public void savePic(){
File imagFileCache= ImageLoader.getInstance().getDiskCache().get(mImagUrl);
File imagFileToSave = Utility.getOutputImageFile();
try {
OutputStream myOutput = new FileOutputStream(imagFileToSave);
InputStream myInput = new FileInputStream(imagFileCache);
byte[] buffer = new byte[1024];
int length = myInput.read(buffer);
while (length > 0) {
myOutput.write(buffer, 0, length);
length = myInput.read(buffer);
}
myOutput.flush();
myInput.close();
myOutput.close();
}
catch (IOException e) {
e.printStackTrace();
Toast.makeText(getActivity(),R.string.fail,Toast.LENGTH_LONG).show();
return;
}
Toast.makeText(getActivity(), getString(R.string.success)+imagFileToSave.getPath(), Toast.LENGTH_LONG).show();
}
private void loadImage(String imageUrl){
ImageLoader.getInstance().loadImage(imageUrl,null, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
view_progress.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
view_progress.setVisibility(View.GONE);
if(image.isGif()){
loadGifPicture(imageUri);
}
else{
if(loadedImage.getHeight()>1024||loadedImage.getWidth()>1024){
loadLargePicture(imageUri);
}
else
{
loadNomalPicture(imageUri,loadedImage);
}
}
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
String percent= Math.round(100.0f * current / total)+"%";
tv_progress.setText(percent);
}
});
}
private void loadNomalPicture(String url,Bitmap loadedImage){
try {
photoView.setImageBitmap(loadedImage);
photoView.setVisibility(View.VISIBLE);
}catch (OutOfMemoryError c){
loadLargePicture(url);
}
}
private void loadGifPicture(String url){
File file = ImageLoader.getInstance().getDiskCache().get(url);
if(file == null|| !file.exists()){
return;
}
GifDrawable gifDrawable;
try {
gifDrawable = new GifDrawable(file);
gifDrawable.reset();
gifDrawable.start();
photoView.setImageDrawable(gifDrawable);
photoView.setVisibility(View.VISIBLE);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("url", image);
}
DisplayImageOptions options = new DisplayImageOptions.Builder()
// .showImageOnLoading(R.drawable.ic_stub) // resource or bitmap
// .showImageForEmptyUri(R.drawable.ic_empty) // resource or bitmap
// .showImageOnFail(R.drawable.ic_error) // resource or bitmap
.resetViewBeforeLoading(false) // default
.delayBeforeLoading(1000)
.cacheInMemory(false) // default
.cacheOnDisk(true) // default
// .preProcessor(...)
// .postProcessor(...)
// .extraForDownloader(...)
.imageScaleType(ImageScaleType.NONE) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
// .decodingOptions(...)
.displayer(new SimpleBitmapDisplayer()) // default
// .handler(new Handler()) // default
.build();
@SuppressLint("SetJavaScriptEnabled")
private void loadLargePicture(String url) {
// photoView.setImageDrawable(getResources().getDrawable(R.drawable.bg_timeline_loading));
File file = ImageLoader.getInstance().getDiskCache().get(url);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.getSettings().setDisplayZoomControls(false);
mWebView.setVerticalScrollBarEnabled(false);
mWebView.setHorizontalScrollBarEnabled(false);
String str1 = "file://" + file.getAbsolutePath().replace("/mnt/sdcard/", "/sdcard/");
String str2 = "<html>\n<head>\n <style>\n html,body{background:#3b3b3b;margin:0;padding:0;} *{-webkit-tap-highlight-color:rgba(0, 0, 0, 0);}\n </style>\n <script type=\"text/javascript\">\n var imgUrl = \""
+ str1
+ "\";"
+ " var objImage = new Image();\n"
+ " var realWidth = 0;\n"
+ " var realHeight = 0;\n"
+ "\n"
+ " function onLoad() {\n"
+ " objImage.onload = function() {\n"
+ " realWidth = objImage.width;\n"
+ " realHeight = objImage.height;\n"
+ "\n"
+ " document.gagImg.src = imgUrl;\n"
+ " onResize();\n"
+ " }\n"
+ " objImage.src = imgUrl;\n"
+ " }\n"
+ "\n"
+ " function onResize() {\n"
+ " var scale = 1;\n"
+ " var newWidth = document.gagImg.width;\n"
+ " if (realWidth > newWidth) {\n"
+ " scale = realWidth / newWidth;\n"
+ " } else {\n"
+ " scale = newWidth / realWidth;\n"
+ " }\n"
+ "\n"
+ " hiddenHeight = Math.ceil(30 * scale);\n"
+ " document.getElementById('hiddenBar').style.height = hiddenHeight + \"px\";\n"
+ " document.getElementById('hiddenBar').style.marginTop = -hiddenHeight + \"px\";\n"
+ " }\n"
+ " </script>\n"
+ "</head>\n"
+ "<body onload=\"onLoad()\" onresize=\"onResize()\" onclick=\"Android.toggleOverlayDisplay();\">\n"
+ " <table style=\"width: 100%;height:100%;\">\n"
+ " <tr style=\"width: 100%;\">\n"
+ " <td valign=\"middle\" align=\"center\" style=\"width: 100%;\">\n"
+ " <div style=\"display:block\">\n"
+ " <img name=\"gagImg\" src=\"\" width=\"100%\" style=\"\" />\n"
+ " </div>\n"
+ " <div id=\"hiddenBar\" style=\"position:absolute; width: 0%; background: #3b3b3b;\"></div>\n"
+ " </td>\n" + " </tr>\n" + " </table>\n" + "</body>\n" + "</html>";
mWebView.loadDataWithBaseURL("file:///android_asset/", str2, "text/html", "utf-8", null);
mWebView.setTag(new Object());
mWebView.postDelayed(new Runnable() {
@Override
public void run() {
mWebView.setVisibility(View.VISIBLE);
}
}, 500);
}
public static int getBitmapMaxWidthAndMaxHeight() {
// 2014-08-26 最大高度改小一点
int[] maxSizeArray = new int[1];
GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSizeArray, 0);
if (maxSizeArray[0] == 0) {
GLES10.glGetIntegerv(GL11.GL_MAX_TEXTURE_SIZE, maxSizeArray, 0);
}
if (maxSizeArray[0] > 0)
return maxSizeArray[0];
return 1280;
}
public static int getAppHeight(Activity paramActivity) {
Rect localRect = new Rect();
paramActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect);
return localRect.height();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}