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.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.spielpark.steve.bernieapp.R;
import com.spielpark.steve.bernieapp.actMainPage;
import com.spielpark.steve.bernieapp.misc.ImgTxtAdapter;
import com.spielpark.steve.bernieapp.wrappers.NewsArticle;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Locale;
/**
* Created by Steve on 7/8/2015.
*/
public class NewsTask extends AsyncTask<Object, NewsArticle, Object> {
private static ArrayList<NewsArticle> articles;
private static ListView list;
private static ProgressBar progressBar;
private static Context ctx;
private static TextView subHeader;
private static TextView header;
private static String NULL_IMAGE = "https://s.bsd.net/bernie16/main/page/-/website/fb-share.png";
public NewsTask(Context ctx, ListView listView, ProgressBar progressBar, TextView subHeader, TextView header) {
this.list = listView;
this.ctx = ctx;
this.progressBar = progressBar;
this.subHeader = subHeader;
this.header = header;
}
public static NewsArticle getArticle(int pos) {
return articles.get(pos);
}
public static ArrayList<NewsArticle> getData() { return articles; }
@Override
protected Object doInBackground(Object[] params) {
BufferedReader in;
try {
URL[] urls = new URL[]{
(new URL("https://berniesanders.com/?json=true&which=news&limit=12")),
(new URL("https://berniesanders.com/?json=true&which=daily&limit=12"))
};
for (URL u : urls) {
in = new BufferedReader(new InputStreamReader(u.openStream()));
if (in == null) {
Log.d("reader null", "no events, null reader,");
NewsArticle a = new NewsArticle();
a.setHtmlTitle("Unable to Load News");
a.setDesc("Check your internet connection?");
articles.add(a);
return null;
}
JsonReader reader = new JsonReader(in);
try {
readObjects(reader);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
private void readObjects(JsonReader reader) throws IOException {
NewsArticle a = new NewsArticle();
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();
}
String next = reader.nextName();
switch(next.toLowerCase().trim()) {
case "title" : {
a.setTitle(reader.nextString());
break;
}
case "permalink" : {
a.setUrl(reader.nextString());
break;
}
case "date" : {
a.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());
}
a.setDesc(content);
break;
}
case "og_image" : {
if (reader.peek() == JsonToken.NULL) {
a.setImgSrc(NULL_IMAGE);
reader.nextNull();
} else {
a.setImgSrc(reader.nextString());
}
break;
}
default: {
if (reader.peek() != JsonToken.END_OBJECT) {
reader.skipValue();
}
if (reader.peek() == JsonToken.END_OBJECT) {
if (a.getTitle() != null) {
a.setTxt(getHTMLForTitle(a));
publishProgress(a);
a = new NewsArticle();
}
reader.endObject();
}
}
}
}
reader.close();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
articles = new ArrayList<>();
ImgTxtAdapter adapter = new ImgTxtAdapter(ctx, R.layout.list_news_item, articles);
list.setAdapter(adapter);
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Collections.sort(articles);
NewsArticle a;
boolean setSubheader = false;
for (int i = 0; i < articles.size(); i++) {
a = articles.get(i);
if (!(setSubheader)) {
if (a.getUrl() != null) {
if (a.getUrl().contains("press-release")) {
subHeader.setText(Html.fromHtml(a.getDesc()));
String s = a.getTitle();
s = s.length() > 40 ? s.substring(0, 40) + "..." : s;
header.setText(s);
setSubheader = true;
}
}
}
}
((ImgTxtAdapter) list.getAdapter()).notifyDataSetChanged();
list.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
((actMainPage) ctx).loadEvent(NewsTask.getArticle(position));
}
});
}
@Override
protected void onProgressUpdate(NewsArticle[] a) {
super.onProgressUpdate(a);
articles.add(a[0]);
((ImgTxtAdapter) list.getAdapter()).notifyDataSetChanged();
}
private String getHTMLForTitle(NewsArticle e) {
StringBuilder bld = new StringBuilder();
String title = e.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(e.getPubDate());
return bld.toString();
}
}