package com.bocai.net; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; import android.widget.ImageView; import com.bocai.ImageDownloader; import com.bocai.R; import com.bocai.util.Macros; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.ConcurrentHashMap; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; public class FileCacheImageDownloader extends ImageDownloader { public static interface StreamFilter { public abstract InputStream filter(InputStream inputstream, long l); public abstract long getFilteredStreamLength(); } public FileCacheImageDownloader() { filterMap = null; } public void download(String paramString, ImageView paramImageView, StreamFilter paramStreamFilter) { Log.i(LOG_TAG, "download method1"); if (paramStreamFilter != null) { if (this.filterMap == null) { this.filterMap = new ConcurrentHashMap<String, StreamFilter>(); } this.filterMap.put(paramString, paramStreamFilter); } super.download(paramString, paramImageView); } public void download(String paramString, ImageView paramImageView, StreamFilter paramStreamFilter, ImageDownloader.OnFinishListener paramOnFinishListener) { Log.i(LOG_TAG, "download method2"); if (paramStreamFilter != null) { if (this.filterMap == null) { this.filterMap = new ConcurrentHashMap<String, StreamFilter>(); } this.filterMap.put(paramString, paramStreamFilter); } super.download(paramString, paramImageView,paramOnFinishListener); } public Bitmap downloadBitmap(String url) { Log.i(LOG_TAG, "downloadBitmap method===" + url); HttpGet httpGet = new HttpGet(url); DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); HttpResponse httpResponse = null; try { httpResponse = defaultHttpClient.execute(httpGet); } catch (Exception e) { Log.w("FileCacheImageDownloader", e.getMessage()); } int statusCode = httpResponse.getStatusLine().getStatusCode(); if(statusCode == '\310') { HttpEntity httpEntity = httpResponse.getEntity(); if(httpEntity == null) { return null; } InputStream inputStream = null; StreamFilter streamFilter; try { inputStream = httpEntity.getContent(); } catch (Exception e) { Log.w("FileCacheImageDownloader", e.getMessage()); } streamFilter = null; if(filterMap != null) { streamFilter = filterMap.get(url); } if(streamFilter == null) { ImageDownloader.FlushedInputStream flushedInputStream = new FlushedInputStream(inputStream); int length = (int)httpEntity.getContentLength(); File file = FileCache.putURL(url, flushedInputStream, length); Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); if(inputStream == null) return null; try { inputStream.close(); httpEntity.consumeContent(); } catch (IOException e) { Log.w("FileCacheImageDownloader", e.getMessage()); } return bitmap; } else { File file; ImageDownloader.FlushedInputStream flushedInputStream = new FlushedInputStream(inputStream); long length = httpEntity.getContentLength(); InputStream filteredStream = streamFilter.filter(flushedInputStream, length); int streamLength = (int)streamFilter.getFilteredStreamLength(); file = FileCache.putURL(url, filteredStream, streamLength); filterMap.remove(url); Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); if(inputStream == null) return null; try { inputStream.close(); httpEntity.consumeContent(); } catch (IOException e) { Log.w("FileCacheImageDownloader",e.getMessage()); } return bitmap; } } else { Bitmap bitmap; StringBuilder stringBuilder = (new StringBuilder()).append("Error "); stringBuilder.append(statusCode).append(" while retrieving bitmap from "); Log.w(LOG_TAG, stringBuilder.toString()); if(statusCode == '\u0194') bitmap = BitmapFactory.decodeResource(Macros.FS_APPLICATION().getResources(), R.drawable.default_404); else bitmap = null; return bitmap; } } public Bitmap getBitmapFromCache(String url) { Log.i(LOG_TAG, "getBitmapFromCache method"); Bitmap bitmap = super.getBitmapFromCache(url); Log.i(LOG_TAG, "=============================url==" + url ); Log.i(LOG_TAG, "=============================FileCache.urlExists=" + FileCache.urlExists(url)); if(bitmap == null && FileCache.urlExists(url)) { bitmap = BitmapFactory.decodeFile(FileCache.getURL(url).getAbsolutePath()); addBitmapToCache(url, bitmap); } return bitmap; } private static String LOG_TAG = "FCID"; private ConcurrentHashMap<String, StreamFilter> filterMap; }