package org.wordpress.android.ui.reader.utils; import android.net.Uri; import android.support.annotation.NonNull; import android.text.TextUtils; import org.json.JSONException; import org.json.JSONObject; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.JSONUtils; import org.wordpress.android.util.UrlUtils; import java.util.HashMap; import java.util.Iterator; /** * hash map of sizes of attachments in a reader post - created from the json "attachments" section * of the post endpoints */ public class ImageSizeMap extends HashMap<String, ImageSizeMap.ImageSize> { private static final String EMPTY_JSON = "{}"; public ImageSizeMap(@NonNull String postContent, String jsonString) { if (TextUtils.isEmpty(jsonString) || jsonString.equals(EMPTY_JSON)) { return; } try { JSONObject json = new JSONObject(jsonString); Iterator<String> it = json.keys(); if (!it.hasNext()) { return; } while (it.hasNext()) { JSONObject jsonAttach = json.optJSONObject(it.next()); if (jsonAttach != null && JSONUtils.getString(jsonAttach, "mime_type").startsWith("image")) { String normUrl = UrlUtils.normalizeUrl(UrlUtils.removeQuery(JSONUtils.getString(jsonAttach, "URL"))); // make sure this image actually appears in the post content - it's possible for // an image to be in the attachments but not in the post itself String path = Uri.parse(normUrl).getPath(); if (postContent.contains(path)) { int width = jsonAttach.optInt("width"); int height = jsonAttach.optInt("height"); // chech if data-orig-size is present and use it String originalSize = jsonAttach.optString("data-orig-size", null); if (originalSize != null) { String[] sizes = originalSize.split(","); if (sizes != null && sizes.length == 2) { width = Integer.parseInt(sizes[0]); height = Integer.parseInt(sizes[1]); } } this.put(normUrl, new ImageSize(width, height)); } } } } catch (JSONException e) { AppLog.e(AppLog.T.READER, e); } } public ImageSize getImageSize(final String imageUrl) { if (imageUrl == null) { return null; } else { return super.get(UrlUtils.normalizeUrl(UrlUtils.removeQuery(imageUrl))); } } public String getLargestImageUrl(int minImageWidth) { String currentImageUrl = null; int currentMaxWidth = minImageWidth; for (Entry<String, ImageSize> attach: this.entrySet()) { if (attach.getValue().width > currentMaxWidth) { currentImageUrl = attach.getKey(); currentMaxWidth = attach.getValue().width; } } return currentImageUrl; } public static class ImageSize { public final int width; public final int height; public ImageSize(int width, int height) { this.width = width; this.height = height; } } }