package pro.dbro.glance.formats; import android.content.Context; import android.net.Uri; import android.text.Html; import android.util.Log; import com.google.gson.JsonObject; import com.koushikdutta.async.future.FutureCallback; import com.koushikdutta.ion.Ion; import com.parse.FindCallback; import com.parse.ParseException; import com.parse.ParseObject; import com.parse.ParseQuery; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import pro.dbro.glance.SECRETS; import pro.dbro.glance.http.TrustManager; /** * This provides an implementation of {@link pro.dbro.glance.formats.SpritzerMedia} * that serves a web page * * @author defer (diogo@underdev.org) */ public class HtmlPage implements SpritzerMedia { public static final boolean VERBOSE = true; private static boolean sSetupTrustManager = false; /** * The logging tag. */ private static final String TAG = "HtmlPage"; private String mTitle; private String mUrl; private String mContent; /** * Builds an HtmlPage from a {@link com.google.gson.JsonObject} in diffbot format. * See http://www.diffbot.com/products/automatic/ * * @param result The {@link com.google.gson.JsonObject} to display */ private HtmlPage(JsonObject result) { if (result != null) initFromJson(result); } public void setResult(JsonObject result) { initFromJson(result); } private void initFromJson(JsonObject json) { // Diffbot json format // see http://www.diffbot.com/products/automatic/ if (json == null) { Log.e(TAG, "Error parsing page"); return; } if (json.has("title")) mTitle = json.get("title").getAsString(); if (json.has("url")) mUrl = json.get("url").getAsString(); if (json.has("text")) mContent = json.get("text").getAsString(); // Sanitize content mContent = Html.fromHtml(mContent).toString().replaceAll("\\n+", " ").replaceAll("(?s)<!--.*?-->", ""); } /** * Creates an {@link pro.dbro.glance.formats.HtmlPage} from a url. * Returns immediately with an {@link pro.dbro.glance.formats.HtmlPage} * that is not yet initialized. Pass a {@link pro.dbro.glance.formats.HtmlPage.HtmlPageParsedCallback} * to be notified when page parsing is complete, and the returned HtmlPage is populated. * * @param url The http url. * @param cb A callback to be invoked when the HtmlPage is parsed * @return An HtmlPage with null JResult; * @throws pro.dbro.glance.formats.UnsupportedFormatException if HTML parsing fails */ public static HtmlPage fromUri(final Context context, String url, final HtmlPageParsedCallback cb) throws UnsupportedFormatException { // Seems to be a bug in Ion setting trust manager // When that's resolved, go back to Ion request // if (!sSetupTrustManager) { // sSetupTrustManager = TrustManager.setupIonTrustManager(context); // } final HtmlPage page = new HtmlPage(null); String encodedUrlToParse = Uri.encode(url); String requestUrl = String.format("http://api.diffbot.com/v2/article?url=%s&token=%s", encodedUrlToParse, SECRETS.getDiffbotKey()); Log.i(TAG, "Loading url: " + requestUrl); // TrustManager.makeTrustRequest(context, requestUrl, new TrustManager.TrustRequestCallback() { // @Override // public void onSuccess(JsonObject result) { // page.setResult(result); // recordRead(page); // // if (cb != null) { // cb.onPageParsed(page); // // } // } // }); Ion.getInstance(context, TrustManager.sIonInstanceName) .build(context) .load(requestUrl) .asJsonObject() .setCallback(new FutureCallback<JsonObject>() { @Override public void onCompleted(Exception e, JsonObject result) { if (e != null) { e.printStackTrace(); Log.e(TAG, "Unable to parse page"); return; } //Log.i(TAG, "Got diffbot result " + result.toString()); page.setResult(result); if (cb != null) { cb.onPageParsed(page); } } }); return page; } public String getUrl() { return mUrl; } @Override public String getTitle() { return (mTitle == null) ? "" : mTitle; } @Override public String getAuthor() { try { if (mUrl != null) return new URL(mUrl).getHost(); return ""; } catch (MalformedURLException e) { return ""; } } @Override public String loadChapter(int ignored) { return (mContent == null) ? "" : mContent; } @Override public String getChapterTitle(int ignored) { return ""; } @Override public int countChapters() { return 1; } public static interface HtmlPageParsedCallback { public void onPageParsed(HtmlPage result); } }