// // Copyright (c) 2014 VK.com // // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // package com.vk.sdk.api.model; import android.os.Parcel; import android.os.Parcelable; import org.json.JSONArray; import org.json.JSONObject; import java.util.Collections; /** * Model to parse a list of photo with <a href="http://vk.com/dev/photo_sizes">photo sizes<a/> format. * * When {@code photo_sizes=1} parameter is used in methods, * response contains an info about original photo * copies with different sizes in sizes array with objects, * each of them contains following fields: <br /> * <ul> * <li>src — url of image copy;</li> * <li> width — copy width, px;</li> * <li> height — copy height, px;</li> * <li>type — notation for copy size and ratio.</li> * </ul> */ @SuppressWarnings("unused") public class VKPhotoSizes extends VKList<VKApiPhotoSize> implements Parcelable { private static float sQuality = 1.0f; /** * Sets the quality modifier for sampling algorithm of image resolution. * @param quality positive number between 0.0f and 1.0f. */ public static void setQuality(float quality) { sQuality = quality; } /** * Original width of photo in pixels. */ private int mOriginalWidth = 1; /** * Original height of photo in pixels. */ private int mOriginalHeight = 1; /** * URL of last image thumb for width sampling algorithm. */ private String mWidthThumb; /** * URL of last image thumb for height sampling algorithm. */ private String mHeightThumb; /** * Width of last image thumb for width sampling algorithm. */ private int mLastWidth; /** * Height of last image thumb for width sampling algorithm. */ private int mLastHeight; /** * Parser that's used for parsing photo sizes. */ private final Parser<VKApiPhotoSize> parser = new Parser<VKApiPhotoSize>() { @Override public VKApiPhotoSize parseObject(JSONObject source) throws Exception { return VKApiPhotoSize.parse(source, mOriginalWidth, mOriginalHeight); } }; /** * Creates empty list of photo sizes. */ public VKPhotoSizes() { super(); } /** * Creates and fills list of photo sizes. */ public VKPhotoSizes(JSONArray from) { super(); fill(from); } /** * Creates list of photo sizes which fill with according data. * @param from array of photo sizes returned by VK. * @param width original photo width in pixels. * @param height original photo height in pixels. */ public void fill(JSONArray from, int width, int height) { setOriginalDimension(width, height); fill(from); } /** * Fill list according with given data. * @param from array of photo sizes returned by VK. */ public void fill(JSONArray from) { fill(from, parser); sort(); } /** * Return image according with given type of thumb. * @return URL of image thumb, or null if image with this thumb is not found in the list. */ public String getByType(char type) { for(VKApiPhotoSize size: this) { if(size.type == type) { return size.src; } } return null; } /** * Sets original image dimensions. * @param width original photo width in pixels. * @param height original photo height in pixels. */ public void setOriginalDimension(int width, int height) { if(width != 0) { this.mOriginalWidth = width; } if(height != 0) { this.mOriginalHeight = height; } } /** * Sorts thumbs according to their width. */ public void sort() { Collections.sort(this); } /** * Finds an image that fits perfectly into the specified dimensions. * Method is uses a cache of last thumbs for better performance. * @param width required minimum width of image in pixels. * @param height required minimum height of image in pixels. * @return URL of selected thumb or null if image with what parameters is not found. */ public String getImageForDimension(int width, int height) { return width >= height ? getImageForWidth(width) : getImageForHeight(height); } private String getImageForWidth(int width) { if((mWidthThumb != null && mLastWidth != width) || isEmpty()) { return mWidthThumb; } mLastWidth = width; mWidthThumb = null; width = (int) (width * sQuality); for(VKApiPhotoSize size : this) { if(size.width >= width) { mWidthThumb = size.src; break; } } return mWidthThumb; } private String getImageForHeight(int height) { if((mHeightThumb != null && mLastHeight != height) || isEmpty()) { return mHeightThumb; } mLastHeight = height; mHeightThumb = null; height = (int) (height * sQuality); for(VKApiPhotoSize size : this) { if(size.height >= height) { mHeightThumb = size.src; break; } } return mHeightThumb; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(this.mOriginalWidth); dest.writeInt(this.mOriginalHeight); dest.writeString(this.mWidthThumb); dest.writeInt(this.mLastWidth); } private VKPhotoSizes(Parcel in) { super(in); this.mOriginalWidth = in.readInt(); this.mOriginalHeight = in.readInt(); this.mWidthThumb = in.readString(); this.mLastWidth = in.readInt(); } public static Creator<VKPhotoSizes> CREATOR = new Creator<VKPhotoSizes>() { public VKPhotoSizes createFromParcel(Parcel source) { return new VKPhotoSizes(source); } public VKPhotoSizes[] newArray(int size) { return new VKPhotoSizes[size]; } }; }