package com.spielpark.steve.bernieapp.tasks; import android.content.Context; import android.os.AsyncTask; import android.text.Html; import android.util.JsonReader; import android.util.JsonToken; import android.util.Log; import android.view.View; import android.widget.ListView; import android.widget.ProgressBar; import com.spielpark.steve.bernieapp.R; import com.spielpark.steve.bernieapp.misc.ImgTxtAdapter; import com.spielpark.steve.bernieapp.wrappers.Issue; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; /** * Created by Steve on 7/9/2015. */ public class IssuesTask extends AsyncTask<Object, Issue, Object> { private static ArrayList<Issue> issues; private static ListView list; private static ProgressBar progressBar; private static Context ctx; private static HashMap<String, String> vidLinks; public IssuesTask(Context ctx, ListView listView, ProgressBar progressBar) { this.list = listView; this.ctx = ctx; this.progressBar = progressBar; } public static Issue getIssue(int position) { return issues.get(position); } private String getHTMLForTitle(Issue i) { StringBuilder bld = new StringBuilder(); String title = i.getTitle(); if (title.length() > 40) { title = title.substring(0, 40); title = title.substring(0, Math.min(title.length(), title.lastIndexOf(' '))).concat("..."); } bld.append("<big>").append(title).append("</big><br>"); bld.append("<font color=\"#FF2222\">").append(i.getPubDate()); return bld.toString(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); for (Issue i : issues) { i.setVideo(vidLinks.get(i.getTitle().toLowerCase())); i.setImgSrc("https://img.youtube.com/vi/" + i.getVideo() + "/default.jpg"); } ((ImgTxtAdapter) list.getAdapter()).notifyDataSetChanged(); list.setVisibility(View.VISIBLE); progressBar.setVisibility(View.GONE); } @Override protected void onPreExecute() { super.onPreExecute(); issues = new ArrayList<>(); ImgTxtAdapter adapter = new ImgTxtAdapter(ctx, R.layout.list_news_item, issues); list.setAdapter(adapter); } @Override protected void onProgressUpdate(Issue[] i) { super.onProgressUpdate(i); issues.add(i[0]); ((ImgTxtAdapter) list.getAdapter()).notifyDataSetChanged(); } @Override protected Object doInBackground(Object[] params) { retrieveLinks(); BufferedReader in = null; try { URL url = new URL("https://berniesanders.com/?json=true&which=issues"); in = new BufferedReader(new InputStreamReader(url.openStream())); } catch (IOException e) { e.printStackTrace(); } if (in == null) { Log.d("reader null", "no events, null reader,"); Issue i = new Issue(); i.setHtmlTitle("Unable to Load News"); i.setDesc("Check your internet connection?"); issues.add(i); return null; } JsonReader reader = new JsonReader(in); try { readObjects(reader); } catch (IOException e) { e.printStackTrace(); } return null; } private void readObjects(JsonReader reader) throws IOException { Issue i = new Issue(); while (reader.hasNext()) { if (isCancelled()) { return; } if (reader.peek() == JsonToken.BEGIN_ARRAY) { reader.beginArray(); } if (reader.peek() == JsonToken.BEGIN_OBJECT) { reader.beginObject(); } if (reader.peek() == JsonToken.END_ARRAY) { reader.endArray(); } if (reader.peek() == JsonToken.END_DOCUMENT) { return; } String next = reader.nextName(); switch(next.toLowerCase().trim()) { case "title" : { i.setTitle(Html.fromHtml(reader.nextString()).toString()); break; } case "permalink" : { i.setUrl(reader.nextString()); break; } case "date" : { i.setPubDate(reader.nextString()); break; } case "content" : { String content = reader.nextString(); if (content.contains("<style>") && content.contains("</style")) { content = content.substring(content.indexOf("</style") + "</style>".length()); } i.setDesc(content); break; } default: { if (reader.peek() != JsonToken.END_OBJECT) { reader.skipValue(); } if (reader.peek() == JsonToken.END_OBJECT) { if (i.getTitle() != null) { i.setTxt(getHTMLForTitle(i)); publishProgress(i); i = new Issue(); } reader.endObject(); } } } } reader.close(); } private void retrieveLinks() { BufferedReader in = null; vidLinks = new HashMap<>(); try { URL url = new URL("https://www.reddit.com/r/bernienews.json"); in = new BufferedReader(new InputStreamReader(url.openStream())); } catch (IOException e) { e.printStackTrace(); } if (in == null) { Log.d("rss reader null", "null reader. Is Reddit down?!?!"); } JsonReader reader = new JsonReader(in); try { readReddit(reader); } catch (IOException e) { e.printStackTrace(); } } private void readReddit(JsonReader reader) throws IOException { String title = ""; String link = ""; while (reader.hasNext()) { if (reader.peek() == JsonToken.BEGIN_OBJECT) { reader.beginObject(); } String next = reader.nextName(); switch(next.toLowerCase().trim()) { case "children" : { reader.beginArray(); reader.beginObject(); break; } case "data" : { reader.beginObject(); break; } case "title" : { title = reader.nextString().replaceAll("&", "&"); break; } case "url" : { link = reader.nextString(); break; } case "ups": { reader.skipValue(); reader.endObject(); reader.endObject(); vidLinks.put(title.toLowerCase(), link.substring(link.lastIndexOf('=') + 1)); break; } default: { reader.skipValue(); } } } reader.close(); } }