Android Open Source - RealTextView Url Image Getter






From Project

Back to project page RealTextView.

License

The source code is released under:

Apache License

If you think the Android project RealTextView listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2013 Antarix Tandon//from w w  w . j  ava  2 s .co m
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.hardsoftstudio.real.textview.utils;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html.ImageGetter;
import android.util.Log;
import android.view.View;

import com.hardsoftstudio.real.textview.exceptions.RealHtmlTextViewException;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;

public class UrlImageGetter implements ImageGetter {

    private Context c;
    private View container;
    private String mUrl;
    private int mWidth;
    private int mHeight;
    private int mGravity;

    /**
     * Construct the URLImageParser which will execute AsyncTask and refresh the container
     *
     * @param t
     * @param c
     */
    public UrlImageGetter(View t, Context c) {
        this.c = c;
        this.container = t;
    }

    public Drawable getDrawable(String source) {
        parseUrl(source);

        Log.d("MPB", "URL: " + mUrl + " width: " + mWidth + " height " + mHeight);

        UrlDrawable urlDrawable = new UrlDrawable();
        urlDrawable.setBounds(0, 0, mWidth, mHeight);
        if (mGravity>0) {
            urlDrawable.setGravity(mGravity);
        }

        // get the actual source
        ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask(urlDrawable);

        asyncTask.execute(mUrl);

        // return reference to URLDrawable which will asynchronously load the image specified in the src tag
        return urlDrawable;
    }

    private void parseUrl(String source) {

        if (source == null || source.isEmpty())
            throw new RealHtmlTextViewException("The url is invalid");

        int index = source.lastIndexOf(RealUrl.TAG_SPLITER);
        if (index < 0)
            throw new RealHtmlTextViewException("No spliter tag found for remote image");

        mUrl = source.substring(0, index);
        String sizeTag = source.substring(index + RealUrl.TAG_SPLITER.length(), source.length());
        for (String param : sizeTag.split(RealUrl.TAG_PARAM_SPLITER)) {
            if (param.contains(RealUrl.TAG_WIDTH)) {
                mWidth = SizeUtils.convertPixtoDip(c, Integer.parseInt(param.replaceAll("[^\\d.]", "")));
            } else if (param.contains(RealUrl.TAG_HEIGHT)) {
                mHeight = SizeUtils.convertPixtoDip(c, Integer.parseInt(param.replaceAll("[^\\d.]", "")));
            } else if (param.contains(RealUrl.TAG_GRAVITY)) {
                mGravity = Integer.parseInt(param.replaceAll("[^\\d.]", ""));
            }
        }
    }

    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) {
            // set the correct bound according to the result from HTTP call
            if (result == null) {
                Log.e("MPB", "RealTextView could not retrieve image");
                return;
            }
            Log.d("MPB", "HTML img retrieved: " + result.getIntrinsicWidth() + " " + 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
            UrlImageGetter.this.container.invalidate();
        }

        /**
         * Get the Drawable from URL
         *
         * @param urlString
         * @return
         */
        public Drawable fetchDrawable(String urlString) {

            Log.d("MPB", "RealTextView html url: " + urlString);

            try {
                InputStream is = fetch(urlString);
                Drawable drawable = Drawable.createFromStream(is, "src");
                drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 + drawable.getIntrinsicHeight());
                return drawable;
            } catch (Exception e) {
                e.printStackTrace();
                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();
        }
    }

    @SuppressWarnings("deprecation")
    public class UrlDrawable extends BitmapDrawable {
        protected Drawable drawable;

        @Override
        public void draw(Canvas canvas) {
            // override the draw to facilitate refresh function later
            if (drawable != null) {
                drawable.draw(canvas);
            }
        }
    }
}




Java Source Code List

com.hardsoftstudio.real.textview.exceptions.RealHtmlTextViewException.java
com.hardsoftstudio.real.textview.utils.AutofitHelper.java
com.hardsoftstudio.real.textview.utils.FontManager.java
com.hardsoftstudio.real.textview.utils.HtmlTagHandler.java
com.hardsoftstudio.real.textview.utils.LocalImageGetter.java
com.hardsoftstudio.real.textview.utils.RealUrl.java
com.hardsoftstudio.real.textview.utils.SizeUtils.java
com.hardsoftstudio.real.textview.utils.UrlImageGetter.java
com.hardsoftstudio.real.textview.views.BaseTextView.java
com.hardsoftstudio.real.textview.views.RealButton.java
com.hardsoftstudio.real.textview.views.RealCheckBox.java
com.hardsoftstudio.real.textview.views.RealEditText.java
com.hardsoftstudio.real.textview.views.RealTextView.java
org.hardsoftstudio.real.example.ApplicationTest.java
org.hardsoftstudio.real.example.BaseActivity.java
org.hardsoftstudio.real.example.ExampleMainActivity.java
org.hardsoftstudio.real.example.HtmlExampleActivity.java
org.hardsoftstudio.real.example.MainActivity.java
org.hardsoftstudio.real.textview.ApplicationTest.java