package be.geelen.yarr.postPages.Readability;
import android.os.AsyncTask;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
class ReadabilityAdapter extends FragmentStatePagerAdapter {
private JSONObject readabilityObject;
private Document doc;
private ArrayList<Fragment> fragments;
public ReadabilityAdapter(FragmentManager fm, String url) {
super(fm);
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... strings) {
String response = "";
HttpClient client = new DefaultHttpClient();
try {
HttpGet httpGet = new HttpGet(strings[0]);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
response = client.execute(httpGet, responseHandler);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
protected void onPostExecute(String result) {
setReadabilityJson(result);
}
}.execute(url);
}
private void setReadabilityJson(String json) {
try {
setRootObject(new JSONObject(json));
} catch (JSONException e) {
e.printStackTrace();
}
}
private void setRootObject(JSONObject readabilityObject) throws JSONException {
this.readabilityObject = readabilityObject;
doc = Jsoup.parse(readabilityObject.getString("content"));
fragments = new ArrayList<Fragment>();
if (readabilityObject.getString("lead_image_url") != null) {
fragments.add(ReadabilityPictureFragment.newInstance(
readabilityObject.getString("title"),
readabilityObject.getString("lead_image_url"),
readabilityObject.getString("excerpt")));
}
ArrayList<String> htmlParts = new ArrayList<String>();
ArrayList<String> imgSrcs = new ArrayList<String>();
ArrayList<String> imgAlts = new ArrayList<String>();
Elements imgElements = doc.getElementsByTag("img");
StringBuilder buildDoc = new StringBuilder(readabilityObject.getString("content"));
for (Element imgElement : imgElements) {
StringBuilder htmlPart = new StringBuilder();
int index = buildDoc.indexOf("<img");
htmlPart.append(buildDoc.substring(0, index));
for (Element parent : imgElement.parents()){
htmlPart = htmlPart.append("</" + parent.tag()+ ">");
}
buildDoc = new StringBuilder(buildDoc.substring(index));
buildDoc = new StringBuilder(buildDoc.substring(buildDoc.indexOf(">") + 1));
for (Element parent : imgElement.parents()){
buildDoc = buildDoc.insert(0, "<" + parent.tag() + ">");
}
htmlParts.add(htmlPart.toString());
imgSrcs.add(imgElement.attr("src"));
imgAlts.add(imgElement.attr("alt") == null ? "" : imgElement.attr("alt"));
}
htmlParts.add(buildDoc.toString());
for (int i = 0; i < htmlParts.size(); i++) {
String htmlPart = htmlParts.get(i);
if (Jsoup.parse(htmlPart).text().length() > 0) {
fragments.add(ReadabilityHtmlFragment.newInstance(htmlPart));
}
if (i >= imgAlts.size())
break;
String imgSrc = imgSrcs.get(i);
String imgAlt = imgAlts.get(i);
fragments.add(ReadabilityPictureFragment.newInstance(
"",
imgSrc,
imgAlt));
}
notifyDataSetChanged();
// check: http://readability.com/api/content/v1/parser?token=d48451fa7e61e79f0f7e215fe2258dc41b69ca75&url=http://www.techdirt.com/articles/20140815/11500128226/redditors-propose-setting-up-consumers-union-to-fight-back-against-broadband-giants.shtml
}
@Override
public Fragment getItem(int position) {
// String html = doc.outerHtml();
// Fragment fragment = ReadabilityHtmlFragment.newInstance(html);
return fragments.get(position);
}
@Override
public int getCount() {
if (fragments == null)
return 0;
return fragments.size();
}
}