package com.aincc.lib.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html.ImageGetter;
import android.view.View;
/**
*
* <h3><b>URLImageParser</b></h3></br>
*
* HTML.fromHtml 에서 사용하기 위한 이미지 Getter
*
* @author aincc@barusoft.com
* @version 1.0.0
* @since 1.0.0
*/
public class URLImageParser implements ImageGetter
{
Context context;
View container;
/***
* Construct the URLImageParser which will execute AsyncTask and refresh the container
*
* @param t
* @param c
*/
public URLImageParser(View t, Context context)
{
this.context = context;
this.container = t;
}
public Drawable getDrawable(String source)
{
URLDrawable urlDrawable = new URLDrawable(context.getResources());
// get the actual source
ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask(urlDrawable);
asyncTask.execute(source);
// return reference to URLDrawable where I will change with actual image from
// the src tag
return urlDrawable;
}
public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable>
{
URLDrawable urlDrawable;
public ImageGetterAsyncTask(URLDrawable d)
{
this.urlDrawable = d;
}
@Override
protected Drawable doInBackground(String... params)
{
String source = params[0];
return fetchDrawable(source);
}
@Override
protected void onPostExecute(Drawable result)
{
// 2012.09.08 aincc : NullPointerException
if (null != result)
{
// set the correct bound according to the result from HTTP call
urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 + result.getIntrinsicHeight());
// change the reference of the current drawable to the result
// from the HTTP call
urlDrawable.drawable = result;
// redraw the image by invalidating the container
URLImageParser.this.container.invalidate();
}
else
{
Logger.i("Failed fetch drawable.");
}
}
/***
* Get the Drawable from URL
*
* @param urlString
* @return
*/
public Drawable fetchDrawable(String urlString)
{
try
{
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
if (null != drawable)
{
drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 + drawable.getIntrinsicHeight());
}
return drawable;
}
catch (Exception e)
{
return null;
}
}
private InputStream fetch(String urlString) throws MalformedURLException, IOException
{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
}
}