package com.gh4a.loader; import android.content.Context; import com.gh4a.holder.Trend; import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.CharArrayWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class TrendLoader extends BaseLoader<List<Trend>> { private static final String URL_TEMPLATE = "http://octodroid.s3.amazonaws.com/trends/trending_%s-all.json"; private final String mType; public TrendLoader(Context context, String type) { super(context); mType = type; } @Override public List<Trend> doLoadInBackground() throws Exception { URL url = new URL(String.format(Locale.US, URL_TEMPLATE, mType)); List<Trend> trends = new ArrayList<>(); HttpURLConnection connection = null; CharArrayWriter writer = null; try { connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Content-Type", "application/json"); if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { return trends; } InputStream in = new BufferedInputStream(connection.getInputStream()); InputStreamReader reader = new InputStreamReader(in, "UTF-8"); int length = connection.getContentLength(); writer = new CharArrayWriter(Math.max(0, length)); char[] tmp = new char[4096]; int l; while ((l = reader.read(tmp)) != -1) { writer.write(tmp, 0, l); } } finally { if (connection != null) { connection.disconnect(); } if (writer != null) { writer.close(); } } JSONArray resultArray = new JSONArray(writer.toString()); for (int i = 0; i < resultArray.length(); i++) { JSONObject repoObject = resultArray.getJSONObject(i); trends.add(new Trend( repoObject.getString("owner"), repoObject.getString("repo"), repoObject.isNull("description") ? null : repoObject.optString("description"), (int) repoObject.getDouble("stars"), (int) repoObject.getDouble("new_stars"), (int) repoObject.getDouble("forks"))); } return trends; } }