package odoo.controls;
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.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.method.ScrollingMovementMethod;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.widget.TextView;
import com.odoo.util.StringUtils;
public class OWebTextView extends TextView {
private Context mContext;
/** The display metrics. */
private DisplayMetrics mMetrics = null;
/** The scale factor. */
private Float mScaleFactor = 0F;
private Spanned htmlSpan = null;
private String originalContent = null;
private Boolean trimedContent = false;
private OnLayoutLoad mOnLayoutLoad = null;
public OWebTextView(Context context) {
this(context, null, 0);
}
public OWebTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public OWebTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
mMetrics = getResources().getDisplayMetrics();
mScaleFactor = mMetrics.density;
int padding = (int) (10 * mScaleFactor);
setPadding(padding, padding, padding, 0);
setClickable(true);
setMovementMethod(new ScrollingMovementMethod());
setMovementMethod(LinkMovementMethod.getInstance());
}
@Override
public void setTextAppearance(Context context, int resid) {
super.setTextAppearance(context, resid);
setTypeface(OControlHelper.lightFont());
}
public void setHtmlContent(String content) {
URLImageParser p = new URLImageParser(mContext, this);
originalContent = content;
htmlSpan = trim(Html.fromHtml(content, p, null));
setText(htmlSpan);
}
public static Spanned trim(Spanned s) {
int start = 0;
int end = s.length();
while (start < end && Character.isWhitespace(s.charAt(start))) {
start++;
}
while (end > start && Character.isWhitespace(s.charAt(end - 1))) {
end--;
}
CharSequence str = s.subSequence(start, end);
SpannableStringBuilder builder = new SpannableStringBuilder(str);
return builder;
}
public void setHtmlSpanContent(Spanned content) {
setText(content);
}
public Spanned getHtmlSpan() {
return htmlSpan;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (mOnLayoutLoad != null)
mOnLayoutLoad.layoutLoad(this);
}
public void trimContent(int lines) {
if (lines > 0) {
StringBuffer newContent = new StringBuffer();
int start = 0;
int end = (originalContent.length() > 200) ? 200 : originalContent
.length();
newContent.append(StringUtils.htmlToString(originalContent)
.substring(start, end));
newContent.append("...");
trimedContent = true;
setHtmlContent(newContent.toString());
} else {
trimedContent = false;
}
}
public boolean trimedContent() {
return trimedContent;
}
@SuppressWarnings("deprecation")
public class URLDrawable extends BitmapDrawable {
protected Drawable drawable;
@Override
public void draw(Canvas canvas) {
if (drawable != null) {
drawable.draw(canvas);
}
}
}
public class URLImageParser implements ImageGetter {
TextView container;
URLDrawable urlDrawable;
Context mContext;
public URLImageParser(Context context, TextView textView) {
container = textView;
mContext = context;
}
public Drawable getDrawable(String source) {
urlDrawable = new URLDrawable();
ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask(
urlDrawable, mContext.getResources());
asyncTask.execute(source);
return urlDrawable;
}
public class ImageGetterAsyncTask extends
AsyncTask<String, Void, Drawable> {
URLDrawable urlDrawable;
Resources res = null;
public ImageGetterAsyncTask(URLDrawable d, Resources resource) {
this.urlDrawable = d;
res = resource;
}
@Override
protected Drawable doInBackground(String... params) {
String source = params[0];
return fetchDrawable(source);
}
@Override
protected void onPostExecute(Drawable result) {
if (result != null) {
float multiplier = (float) 200
/ (float) result.getIntrinsicWidth();
int width = (int) (result.getIntrinsicWidth() * multiplier);
int height = (int) (result.getIntrinsicHeight() * multiplier);
urlDrawable.setBounds(new Rect(0, 0, width, height));
urlDrawable.drawable = result;
URLImageParser.this.container.invalidate();
URLImageParser.this.container
.setHeight((URLImageParser.this.container
.getHeight() + result.getIntrinsicHeight()));
}
}
public Drawable fetchDrawable(String urlString) {
try {
InputStream is = fetch(urlString);
int multiplier = 10;
Drawable drawable = Drawable.createFromStream(is, "src");
drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth()
* multiplier, 0 + drawable.getIntrinsicHeight()
* multiplier);
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();
}
}
}
public void setOnLayoutLoad(OnLayoutLoad listener) {
mOnLayoutLoad = listener;
}
public interface OnLayoutLoad {
public void layoutLoad(OWebTextView view);
}
}