/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.service; import java.util.HashSet; import org.apache.http.HttpConnectionMetrics; import android.content.Context; import android.graphics.Point; import android.util.Log; import com.android.volley.NetworkResponse; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.ResponseDelivery; import com.android.volley.VolleyError; import com.android.volley.toolbox.BasicNetwork; import com.android.volley.toolbox.HurlStack; import com.android.volley.toolbox.NoCache; import com.galaxy.meetup.client.android.content.EsAccount; import com.galaxy.meetup.client.android.content.EsNetworkData; import com.galaxy.meetup.client.android.content.MediaImageRequest; import com.galaxy.meetup.client.android.content.cache.CachedImageRequest; import com.galaxy.meetup.client.android.content.cache.EsMediaCache; import com.galaxy.meetup.client.android.network.http.HttpTransactionMetrics; import com.galaxy.meetup.client.util.EsLog; import com.galaxy.meetup.client.util.FIFEUtil; import com.galaxy.meetup.client.util.GifImage; import com.galaxy.meetup.client.util.ImageProxyUtil; import com.galaxy.meetup.client.util.ImageUtils; /** * * @author sihai * */ public class VolleyImageDownloader { private static EsAccount sAccount; private static Context sContext; private static final Object sImageDownloadTag = new Object(); private static BasicNetwork sNetwork; private static HashSet sQueuedRequest = new HashSet(); private static RequestQueue sRequestQueue; public static void downloadImage(Context context, EsAccount esaccount, CachedImageRequest cachedimagerequest) { init(context); synchronized(sQueuedRequest) { if(!esaccount.equals(sAccount)) { sRequestQueue.cancelAll(sImageDownloadTag); sQueuedRequest.clear(); } sAccount = esaccount; if(!sQueuedRequest.contains(cachedimagerequest)) { sQueuedRequest.add(cachedimagerequest); DownloadImageRequest downloadimagerequest = new DownloadImageRequest(cachedimagerequest, true); downloadimagerequest.setShouldCache(false); downloadimagerequest.setTag(sImageDownloadTag); sRequestQueue.add(downloadimagerequest); } } } private static synchronized void init(Context context) { if(sNetwork == null) { sContext = context.getApplicationContext(); sNetwork = new BasicNetwork(new HurlStack()) { public final NetworkResponse performRequest(Request request) throws VolleyError { ((DownloadImageRequest)request).getMetrics().onBeginTransaction("VolleyImageDownload"); android.os.Process.setThreadPriority(19); return super.performRequest(request); } }; RequestQueue requestqueue = new RequestQueue(new NoCache(), sNetwork, 2, new NoResponseDelivery()); sRequestQueue = requestqueue; requestqueue.start(); } } static byte[] access$500(MediaImageRequest mediaimagerequest, byte abyte0[]) { int i = mediaimagerequest.getMediaType(); String s = mediaimagerequest.getUrl(); if(i == 3 || i == 2) { if(GifImage.isGif(abyte0)) return abyte0; } else { if(i == 1) { if(GifImage.isGif(abyte0)) return abyte0; } else { return null; } } byte abyte1[]; int j = mediaimagerequest.getWidth(); int k = mediaimagerequest.getHeight(); if(j <= 0 && k <= 0) { Point point; if(FIFEUtil.isFifeHostedUrl(s)) point = FIFEUtil.getImageUrlSize(s); else point = ImageProxyUtil.getImageUrlSize(s); j = point.x; k = point.y; } if(j <= 0 || k <= 0) return abyte0; else { android.graphics.Bitmap bitmap = ImageUtils.resizeBitmap(abyte0, j, k); if(bitmap == null) return null; else return ImageUtils.compressBitmap(bitmap); } } private static final class ConnectionMetrics implements HttpConnectionMetrics { long receivedBytes; public final Object getMetric(String s) { return null; } public final long getReceivedBytesCount() { return receivedBytes; } public final long getRequestCount() { return 1L; } public final long getResponseCount() { return 1L; } public final long getSentBytesCount() { return 0L; } public final void reset() { } ConnectionMetrics() { } } private static final class DownloadImageRequest extends Request { private final ConnectionMetrics mConnectionMetrics = new ConnectionMetrics(); private CachedImageRequest mImageRequest; public final HttpTransactionMetrics mMetrics = new HttpTransactionMetrics(); private boolean mSaveToCache; public DownloadImageRequest(CachedImageRequest cachedimagerequest, boolean flag) { super(cachedimagerequest.getDownloadUrl(), null); mImageRequest = cachedimagerequest; mSaveToCache = flag; mMetrics.setConnectionMetrics(mConnectionMetrics); } public final int compareTo(Request request) { com.android.volley.Request.Priority priority = com.android.volley.Request.Priority.NORMAL; com.android.volley.Request.Priority priority1 = com.android.volley.Request.Priority.NORMAL; int i; if (priority == priority1) i = request.getSequence() - getSequence(); else i = priority1.ordinal() - priority.ordinal(); return i; } public final int compareTo(Object obj) { return compareTo((Request) obj); } protected final void deliverResponse(Object obj) { } public final CachedImageRequest getImageRequest() { return mImageRequest; } public final HttpTransactionMetrics getMetrics() { return mMetrics; } protected final Response parseNetworkResponse(NetworkResponse networkresponse) { mMetrics.onStartResultProcessing(); mConnectionMetrics.receivedBytes = networkresponse.data.length; Response response; try { byte abyte0[]; if(mImageRequest instanceof MediaImageRequest) abyte0 = access$500((MediaImageRequest)mImageRequest, networkresponse.data); else abyte0 = networkresponse.data; if(mSaveToCache && abyte0 != null) EsMediaCache.insertMedia(VolleyImageDownloader.sContext, mImageRequest, abyte0); response = Response.success(abyte0, null); } catch(OutOfMemoryError outofmemoryerror) { Log.w("VolleyImageDownloader", (new StringBuilder("DownloadImageOperation OutOfMemoryError on image bytes: ")).append(networkresponse.data.length).toString(), outofmemoryerror); response = Response.error(new VolleyError(outofmemoryerror)); } return response; } } private static final class NoResponseDelivery implements ResponseDelivery { NoResponseDelivery() { } private static void finishRequest(DownloadImageRequest downloadimagerequest, VolleyError volleyerror) { HttpTransactionMetrics httptransactionmetrics = downloadimagerequest.getMetrics(); httptransactionmetrics.onEndTransaction(); EsNetworkData.insertData(VolleyImageDownloader.sContext, VolleyImageDownloader.sAccount, httptransactionmetrics, volleyerror); synchronized (VolleyImageDownloader.sQueuedRequest) { VolleyImageDownloader.sQueuedRequest .remove(downloadimagerequest.getImageRequest()); } } public final void postError(Request request, VolleyError volleyerror) { if (EsLog.isLoggable("VolleyImageDownloader", 5)) Log.w("VolleyImageDownloader", (new StringBuilder("ERROR: ")) .append(request.getSequence()).toString(), volleyerror); finishRequest((DownloadImageRequest) request, volleyerror); } @Override public final void postResponse(Request request, Response response) { postResponse(request, response, null); } @Override public final void postResponse(Request request, Response response, Runnable runnable) { if (EsLog.isLoggable("VolleyImageDownloader", 3)) Log.d("VolleyImageDownloader", (new StringBuilder("RESPONSE: ")).append( request.getSequence()).toString()); finishRequest((DownloadImageRequest) request, null); } @Override @Deprecated public void discardBefore(int sequence) { } } }