package com.lmit.jenkins.android.networking; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TableRow; import com.lmit.jenkins.android.addon.ImageCache; import com.lmit.jenkins.android.logger.Logger; import com.lmit.jenkinscloud.commons.JenkinsCloudDataNode; import com.lmit.jenkinscloud.commons.JenkinsCloudNode; public class ImageDownloader { private LinkedBlockingQueue<Executor> execution = new LinkedBlockingQueue<Executor>(); private static ImageDownloader instance; private boolean stop = false; public static ImageDownloader getInstance() { if (instance == null) { instance = new ImageDownloader(); } return instance; } public void stop(){ stop = true; } private ImageDownloader() { new Thread(new Runnable() { @Override public void run() { while (!stop) { try { Executor e = execution.take(); e.start(); } catch (InterruptedException e1) { ; } } } }).start(); } class Executor extends Thread { private String url; private Handler handler; public Executor(String url, Handler handler) { this.url = url; this.handler = handler; } @Override public void run() { Looper.prepare(); try { Bitmap bm = downloadImage(url); Message msg = new Message(); msg.what = 0; msg.obj = bm; handler.sendMessage(msg); } catch (Exception e) { ; } } } class SetMenutItemIconHandler extends Handler { private MenuItem menuItem; public SetMenutItemIconHandler(MenuItem item) { this.menuItem = item; } @Override public void handleMessage(Message msg) { Bitmap bm = (Bitmap) msg.obj; menuItem.setIcon(new BitmapDrawable(bm)); } } class SetImageViewIconHandler extends Handler { private ImageView imageView; public SetImageViewIconHandler(ImageView view) { this.imageView = view; } @Override public void handleMessage(Message msg) { Bitmap bm = (Bitmap) msg.obj; this.imageView.setImageBitmap(bm); this.imageView.setVisibility(View.VISIBLE); } } class SetNodeIconHandler extends Handler { private JenkinsCloudDataNode node; public SetNodeIconHandler(JenkinsCloudDataNode node) { this.node = node; } @Override public void handleMessage(Message msg) { Bitmap bm = (Bitmap) msg.obj; this.node.setIconBmp(bm); } } public void setImageBitmap(final MenuItem menuItem, final String url) { execution.offer(new Executor(url, new SetMenutItemIconHandler(menuItem))); } public void setImageBitmap(final JenkinsCloudDataNode node, final String url) { try { Bitmap bm = downloadImage(url); node.setIconBmp(bm); } catch (Exception e) { ; } } public void setImageBitmap(final ImageView imageView, final String url) { execution.offer(new Executor(url, new SetImageViewIconHandler(imageView))); } private Bitmap downloadImage(String url) throws ClientProtocolException, IOException { Bitmap bm; bm = ImageCache.get(url); if (bm == null) { AbstractSecureHttpClient client = new ServerAuthenticationDefaultHttpClient(url); HttpResponse response = client.executeGetQuery(false); InputStream is = response.getEntity().getContent(); BufferedInputStream bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); ImageCache.put(url, bm); bis.close(); is.close(); } return bm; } public void preloadImage(String basePath, JenkinsCloudNode genericNode) { if(!(genericNode instanceof JenkinsCloudDataNode)) { return; } JenkinsCloudDataNode node = (JenkinsCloudDataNode) genericNode; String nodePath = node.getPath(); if (node.getIcon() != null) { setImageBitmap(node, getImageUrl(basePath, node, nodePath)); } List<JenkinsCloudDataNode> payload = node.getPayload(); if (payload != null) { for (JenkinsCloudDataNode subNode : payload) { preloadImage(basePath + nodePath, subNode); } } } private String getImageUrl(String basePath, JenkinsCloudDataNode node, String nodePath) { String iconPath = node.getIcon(); if (iconPath.startsWith("http")) { return iconPath; } else if (iconPath.startsWith("/")) { return iconPath; } else { return basePath + nodePath + iconPath; } } }