package com.paphus.sdk.activity.actions; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.URL; import java.util.Hashtable; import java.util.Map; import com.paphus.sdk.activity.MainActivity; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class HttpGetImageAction extends HttpAction { public static int MAX_HEIGHT = 300; public static int MAX_WIDTH = 300; public static int MAX_FILES = 100; public static volatile boolean downloading; static File cacheDir; static Map<String, SoftReference<Bitmap>> imageCache = new Hashtable<String, SoftReference<Bitmap>>(); String image; Bitmap bmp; View view; public static void clearFileCache(Context context) { try { File[] files = getFileCacheDir(context).listFiles(); if (files == null) { return; } for (File file : files) { boolean success = false; if (file.isDirectory()) { File[] nested = file.listFiles(); for (File nestedFile : nested) { if (!nestedFile.isDirectory()) { success = nestedFile.delete(); } } } else { success = file.delete(); } } } catch (Exception failed) { Log.wtf(failed.toString(), failed); } } public static File getFileCacheDir(Context context) { if (cacheDir == null) { try { //if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { // cacheDir = new File(android.os.Environment.getExternalStorageDirectory().toString() + "/botlibre"); //} else { cacheDir = context.getCacheDir(); //} if (!cacheDir.exists()) { cacheDir.mkdirs(); } } catch (Exception failed) { failed.printStackTrace(); return null; } } return cacheDir; } public static File getFile(String filename, Context context) { File dir = getFileCacheDir(context); if (dir == null) { return null; } File file = new File(dir.getAbsolutePath() + "/" + filename); dir = new File(file.getParent()); if (!dir.exists()) { dir.mkdir(); } else { File[] files = dir.listFiles(); if (files.length > MAX_FILES) { for (File nestedFile : files) { if (!nestedFile.isDirectory()) { nestedFile.delete(); } } } } return file; } public static void fetchImage(Activity activity, String image, View view) { if (image == null) { return; } SoftReference<Bitmap> ref = imageCache.get(image); if (ref != null) { Bitmap bmp = ref.get(); if (bmp != null) { if (view instanceof ImageView) { ((ImageView)view).setImageBitmap(bmp); } else if (view instanceof Button) { ((Button)view).setBackgroundDrawable(new BitmapDrawable(view.getResources(), bmp)); } return; } } HttpGetImageAction action = new HttpGetImageAction(activity, image, view); try { action.execute().get(); action.postExecute(); if (action.getException() != null) { throw action.getException(); } } catch (Exception exception) { if (MainActivity.DEBUG) { exception.printStackTrace(); } return; } } public HttpGetImageAction(Activity activity) { super(activity); } public HttpGetImageAction(Activity activity, String image, View view) { super(activity); this.image = image; this.view = view; } @Override protected String doInBackground(Void... params) { try { URL url = MainActivity.connection.fetchImage(this.image); /*BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; long start = System.currentTimeMillis(); InputStream stream = url.openConnection().getInputStream(); BitmapFactory.decodeStream(stream, null, options); stream.close(); System.out.println("decodeStream1:" + (System.currentTimeMillis() - start)); int height = options.outHeight; int width = options.outWidth; options.inPreferredConfig = Bitmap.Config.RGB_565; int inSampleSize = 1; if (height > MAX_HEIGHT) { inSampleSize = Math.round((float)height / (float)MAX_HEIGHT); } int expectedWidth = width / inSampleSize; if (expectedWidth > MAX_WIDTH) { inSampleSize = Math.round((float)width / (float)MAX_WIDTH); } options.inSampleSize = inSampleSize; options.inJustDecodeBounds = false; start = System.currentTimeMillis(); stream = url.openConnection().getInputStream(); BitmapFactory.decodeStream(stream, null, options).recycle(); stream.close(); System.out.println("decodeStream2:" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); stream = url.openConnection().getInputStream(); BitmapFactory.decodeStream(stream).recycle(); stream.close(); System.out.println("decodeStream-full:" + (System.currentTimeMillis() - start));*/ File file = getFile(this.image, this.activity); if (!file.exists()) { downloading = true; file.createNewFile(); FileOutputStream outputStream = new FileOutputStream(file); InputStream stream = url.openConnection().getInputStream(); byte[] bytes= new byte[1024]; int count = 0; while (count != -1) { count = stream.read(bytes, 0, 1024); if (count == -1) { break; } outputStream.write(bytes, 0, count); } stream.close(); outputStream.close(); downloading = false; } BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; InputStream stream = new FileInputStream(file); BitmapFactory.decodeStream(stream, null, options); stream.close(); int height = options.outHeight; int width = options.outWidth; options.inPreferredConfig = Bitmap.Config.RGB_565; int inSampleSize = 1; if (height > MAX_HEIGHT) { inSampleSize = Math.round((float)height / (float)MAX_HEIGHT); } int expectedWidth = width / inSampleSize; if (expectedWidth > MAX_WIDTH) { inSampleSize = Math.round((float)width / (float)MAX_WIDTH); } options.inSampleSize = inSampleSize; options.inJustDecodeBounds = false; stream = new FileInputStream(file); this.bmp = BitmapFactory.decodeStream(stream, null, options); stream.close(); imageCache.put(this.image, new SoftReference<Bitmap>(this.bmp)); return ""; } catch (Exception exception) { if (MainActivity.DEBUG) { exception.printStackTrace(); } } return null; } protected void postExecute() { if (view instanceof ImageView) { ((ImageView)view).setImageBitmap(bmp); } else if (view instanceof Button) { ((Button)view).setBackgroundDrawable(new BitmapDrawable(view.getResources(), bmp)); } } }