package com.duckduckgo.mobile.android.tasks; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.os.AsyncTask; import android.util.Log; import com.duckduckgo.mobile.android.bus.BusProvider; import com.duckduckgo.mobile.android.events.ReadabilityFeedRetrieveErrorEvent; import com.duckduckgo.mobile.android.events.ReadabilityFeedRetrieveSuccessEvent; import com.duckduckgo.mobile.android.network.DDGNetworkConstants; import com.duckduckgo.mobile.android.objects.FeedObject; public class ReadableFeedTask extends AsyncTask<Void, Void, List<FeedObject>> { private static String TAG = "ReadableFeedTask"; private boolean requestFailed = false; private String articleUrl = null; public ReadableFeedTask(FeedObject currentFeedObject) { this.articleUrl = currentFeedObject.getArticleUrl(); } @Override protected List<FeedObject> doInBackground(Void... arg0) { JSONArray json = null; List<FeedObject> returnFeed = new ArrayList<FeedObject>(); String body = null; if (isCancelled()) { return null; } if(articleUrl == null || articleUrl.length() == 0) { return null; } try { // if an update is triggered, directly fetch from URL body = DDGNetworkConstants.mainClient.doGetString(articleUrl); } catch (Exception e) { requestFailed = true; Log.e(TAG, e.getMessage(), e); } if(body != null) { try { json = new JSONArray(body); } catch (JSONException jex) { Log.e(TAG, jex.getMessage(), jex); } } else { Log.e(TAG, "body: null"); } if (json != null) { if (isCancelled()) return returnFeed; for (int i = 0; i < json.length(); i++) { try { JSONObject nextObj = json.getJSONObject(i); if (nextObj != null) { FeedObject feed = new FeedObject(nextObj); if (feed != null) { returnFeed.add(feed); } } } catch (JSONException e) { Log.e(TAG, "Failed to create object with info at index " + i); } } } return returnFeed; } @Override protected void onPostExecute(List<FeedObject> feed) { if(requestFailed) { BusProvider.getInstance().post(new ReadabilityFeedRetrieveErrorEvent()); return; } if (feed != null) { BusProvider.getInstance().post(new ReadabilityFeedRetrieveSuccessEvent(feed)); } } }