package me.ccrama.redditslide.ImgurAlbum; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.util.ArrayList; import java.util.List; import me.ccrama.redditslide.Reddit; import me.ccrama.redditslide.SecretConstants; import me.ccrama.redditslide.util.HttpUtil; import me.ccrama.redditslide.util.LogUtil; import okhttp3.OkHttpClient; /** * Created by carlo_000 on 2/1/2016. */ public class AlbumUtils { public static SharedPreferences albumRequests; private static String getHash(String s) { if(s.contains("/comment/")){ s = s.substring(0, s.indexOf("/comment")); } String next = s.substring(s.lastIndexOf("/"), s.length()); if (next.contains(".")) { next = next.substring(0, next.indexOf(".")); } if (next.startsWith("/")) { next = next.substring(1, next.length()); } if (next.length() < 5) { return getHash(s.replace(next, "")); } else { return next; } } private static String cutEnds(String s) { if (s.endsWith("/")) { return s.substring(0, s.length() - 1); } else { return s; } } public static class GetAlbumWithCallback extends AsyncTask<String, Void, ArrayList<JsonElement>> { public String hash; public Activity baseActivity; private OkHttpClient client; private Gson gson; private String mashapeKey; public void onError() { } public GetAlbumWithCallback(@NotNull String url, @NotNull Activity baseActivity) { this.baseActivity = baseActivity; if(url.contains("/layout/")){ url = url.substring(0, url.indexOf("/layout")); } String rawDat = cutEnds(url); if (rawDat.endsWith("/")) { rawDat = rawDat.substring(0, rawDat.length() - 1); } if (rawDat.substring(rawDat.lastIndexOf("/")+1, rawDat.length()).length() < 4) { rawDat = rawDat.replace(rawDat.substring(rawDat.lastIndexOf("/"), rawDat.length()), ""); } if (rawDat.contains("?")) { rawDat = rawDat.substring(0, rawDat.indexOf("?")); } hash = getHash(rawDat); client = Reddit.client; gson = new Gson(); mashapeKey = SecretConstants.getImgurApiKey(baseActivity); } public void doWithData(List<Image> data) { if(data == null || data.isEmpty()){ onError(); } } public void doWithDataSingle(final SingleImage data) { doWithData(new ArrayList<Image>() { { this.add(convertToSingle(data)); } }); } public Image convertToSingle(SingleImage data) { try { final Image toDo = new Image(); toDo.setAnimated(data.getAnimated() || data.getLink().contains(".gif")); toDo.setDescription(data.getDescription()); if(data.getAdditionalProperties().keySet().contains("mp4")){ toDo.setHash(getHash(data.getAdditionalProperties().get("mp4").toString())); } else { toDo.setHash(getHash(data.getLink())); } toDo.setTitle(data.getTitle()); toDo.setExt(data.getLink().substring(data.getLink().lastIndexOf("."), data.getLink().length())); toDo.setHeight(data.getHeight()); toDo.setWidth(data.getWidth()); return toDo; } catch (Exception e) { LogUtil.e(e, "convertToSingle error, data [" + data + "]"); onError(); return null; } } JsonElement[] target; int count; int done; AlbumImage album; public void parseJson(JsonElement baseData) { try { if (!baseData.toString().contains("\"data\":[]")) { album = new ObjectMapper().readValue(baseData.toString(), AlbumImage.class); baseActivity.runOnUiThread(new Runnable() { @Override public void run() { doWithData(album.getData().getImages()); } }); } else { String apiUrl = "https://imgur-apiv3.p.mashape.com/3/image/" + hash + ".json"; LogUtil.v(apiUrl); JsonObject result = HttpUtil.getImgurMashapeJsonObject(client, gson, apiUrl, mashapeKey); try { if (result == null) { onError(); return; } final SingleImage single = new ObjectMapper().readValue(result.toString(), SingleAlbumImage.class).getData(); if (single.getLink() != null) { baseActivity.runOnUiThread(new Runnable() { @Override public void run() { doWithDataSingle(single); } }); } else { onError(); } } catch (Exception e) { LogUtil.e(e, "Error " + apiUrl); } } } catch (IOException e) { LogUtil.e(e, "parseJson error, baseData [" + baseData + "]"); } } @Override protected ArrayList<JsonElement> doInBackground(final String... sub) { if (hash.startsWith("/")) { hash = hash.substring(1, hash.length()); } if (hash.contains(",")) { target = new JsonElement[hash.split(",").length]; count = 0; done = 0; for (String s : hash.split(",")) { final int pos = count; count++; String apiUrl = "https://imgur-apiv3.p.mashape.com/3/image/" + s + ".json"; LogUtil.v(apiUrl); JsonObject result = HttpUtil.getImgurMashapeJsonObject(client, gson, apiUrl, mashapeKey); target[pos] = result; done += 1; if (done == target.length) { final ArrayList<Image> jsons = new ArrayList<>(); for (JsonElement el : target) { if (el != null) { try { SingleImage single = new ObjectMapper().readValue(el.toString(), SingleAlbumImage.class).getData(); LogUtil.v(el.toString()); jsons.add(convertToSingle(single)); } catch (IOException e) { LogUtil.e(e, "Error " + apiUrl); } } } if (jsons.isEmpty()) { onError(); } else { baseActivity.runOnUiThread(new Runnable() { @Override public void run() { doWithData(jsons); } }); } } } } else { if (baseActivity != null) { final String apiUrl = getUrl(hash); if (albumRequests.contains(apiUrl) && new JsonParser().parse(albumRequests.getString(apiUrl, "")).getAsJsonObject().has("data")) { parseJson(new JsonParser().parse(albumRequests.getString(apiUrl, "")).getAsJsonObject()); } else { LogUtil.v(apiUrl); // This call requires no mashape headers, don't pass in the headers Map final JsonObject result = HttpUtil.getJsonObject(client, gson, apiUrl); if (result != null && result.has("data")) { albumRequests.edit().putString(apiUrl, result.toString()).apply(); parseJson(result); } else { onError(); } } return null; } } return null; } } public static String getUrl(String hash) { return "http://imgur.com/ajaxalbums/getimages/" + hash + "/hit.json?all=true"; } public static void preloadImages(Context c, JsonObject result, boolean gallery) { if (gallery && result != null) { if (result.has("data") && result.get("data").getAsJsonObject().has("image") && result.get("data").getAsJsonObject().get("image").getAsJsonObject().has("album_images") && result.get("data").getAsJsonObject().get("image").getAsJsonObject().get("album_images").getAsJsonObject().has("images")) { JsonArray obj = result.getAsJsonObject("data").getAsJsonObject("image").getAsJsonObject("album_images").get("images").getAsJsonArray(); if (obj != null && !obj.isJsonNull() && obj.size() > 0) { for (JsonElement o : obj) { ((Reddit) c.getApplicationContext()).getImageLoader().loadImage("https://imgur.com/" + o.getAsJsonObject().get("hash").getAsString() + ".png", new SimpleImageLoadingListener()); } } } } else if (result != null) { if (result.has("album") && result.get("album").getAsJsonObject().has("images")) { JsonObject obj = result.getAsJsonObject("album"); if (obj != null && !obj.isJsonNull() && obj.has("images")) { final JsonArray jsonAuthorsArray = obj.get("images").getAsJsonArray(); for (JsonElement o : jsonAuthorsArray) { ((Reddit) c.getApplicationContext()).getImageLoader().loadImage(o.getAsJsonObject().getAsJsonObject("links").get("original").getAsString(), new SimpleImageLoadingListener()); } } } } } }