aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/android/volley/toolbox/ImageRequest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/android/volley/toolbox/ImageRequest.java')
-rw-r--r--src/main/java/com/android/volley/toolbox/ImageRequest.java117
1 files changed, 68 insertions, 49 deletions
diff --git a/src/main/java/com/android/volley/toolbox/ImageRequest.java b/src/main/java/com/android/volley/toolbox/ImageRequest.java
index 1db7e35..c804267 100644
--- a/src/main/java/com/android/volley/toolbox/ImageRequest.java
+++ b/src/main/java/com/android/volley/toolbox/ImageRequest.java
@@ -19,8 +19,9 @@ package com.android.volley.toolbox;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
+import android.support.annotation.GuardedBy;
+import android.support.annotation.VisibleForTesting;
import android.widget.ImageView.ScaleType;
-
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
@@ -28,10 +29,7 @@ import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyLog;
-/**
- * A canned request for getting an image at a given URL and calling
- * back with a decoded Bitmap.
- */
+/** A canned request for getting an image at a given URL and calling back with a decoded Bitmap. */
public class ImageRequest extends Request<Bitmap> {
/** Socket timeout in milliseconds for image requests */
public static final int DEFAULT_IMAGE_TIMEOUT_MS = 1000;
@@ -45,8 +43,9 @@ public class ImageRequest extends Request<Bitmap> {
/** Lock to guard mListener as it is cleared on cancel() and read on delivery. */
private final Object mLock = new Object();
- // @GuardedBy("mLock")
+ @GuardedBy("mLock")
private Response.Listener<Bitmap> mListener;
+
private final Config mDecodeConfig;
private final int mMaxWidth;
private final int mMaxHeight;
@@ -56,28 +55,34 @@ public class ImageRequest extends Request<Bitmap> {
private static final Object sDecodeLock = new Object();
/**
- * Creates a new image request, decoding to a maximum specified width and
- * height. If both width and height are zero, the image will be decoded to
- * its natural size. If one of the two is nonzero, that dimension will be
- * clamped and the other one will be set to preserve the image's aspect
- * ratio. If both width and height are nonzero, the image will be decoded to
- * be fit in the rectangle of dimensions width x height while keeping its
- * aspect ratio.
+ * Creates a new image request, decoding to a maximum specified width and height. If both width
+ * and height are zero, the image will be decoded to its natural size. If one of the two is
+ * nonzero, that dimension will be clamped and the other one will be set to preserve the image's
+ * aspect ratio. If both width and height are nonzero, the image will be decoded to be fit in
+ * the rectangle of dimensions width x height while keeping its aspect ratio.
*
* @param url URL of the image
* @param listener Listener to receive the decoded bitmap
* @param maxWidth Maximum width to decode this bitmap to, or zero for none
- * @param maxHeight Maximum height to decode this bitmap to, or zero for
- * none
+ * @param maxHeight Maximum height to decode this bitmap to, or zero for none
* @param scaleType The ImageViews ScaleType used to calculate the needed image size.
* @param decodeConfig Format to decode the bitmap to
* @param errorListener Error listener, or null to ignore errors
*/
- public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,
- ScaleType scaleType, Config decodeConfig, Response.ErrorListener errorListener) {
+ public ImageRequest(
+ String url,
+ Response.Listener<Bitmap> listener,
+ int maxWidth,
+ int maxHeight,
+ ScaleType scaleType,
+ Config decodeConfig,
+ Response.ErrorListener errorListener) {
super(Method.GET, url, errorListener);
- setRetryPolicy(new DefaultRetryPolicy(DEFAULT_IMAGE_TIMEOUT_MS, DEFAULT_IMAGE_MAX_RETRIES,
- DEFAULT_IMAGE_BACKOFF_MULT));
+ setRetryPolicy(
+ new DefaultRetryPolicy(
+ DEFAULT_IMAGE_TIMEOUT_MS,
+ DEFAULT_IMAGE_MAX_RETRIES,
+ DEFAULT_IMAGE_BACKOFF_MULT));
mListener = listener;
mDecodeConfig = decodeConfig;
mMaxWidth = maxWidth;
@@ -86,15 +91,27 @@ public class ImageRequest extends Request<Bitmap> {
}
/**
- * For API compatibility with the pre-ScaleType variant of the constructor. Equivalent to
- * the normal constructor with {@code ScaleType.CENTER_INSIDE}.
+ * For API compatibility with the pre-ScaleType variant of the constructor. Equivalent to the
+ * normal constructor with {@code ScaleType.CENTER_INSIDE}.
*/
@Deprecated
- public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,
- Config decodeConfig, Response.ErrorListener errorListener) {
- this(url, listener, maxWidth, maxHeight,
- ScaleType.CENTER_INSIDE, decodeConfig, errorListener);
+ public ImageRequest(
+ String url,
+ Response.Listener<Bitmap> listener,
+ int maxWidth,
+ int maxHeight,
+ Config decodeConfig,
+ Response.ErrorListener errorListener) {
+ this(
+ url,
+ listener,
+ maxWidth,
+ maxHeight,
+ ScaleType.CENTER_INSIDE,
+ decodeConfig,
+ errorListener);
}
+
@Override
public Priority getPriority() {
return Priority.LOW;
@@ -103,17 +120,20 @@ public class ImageRequest extends Request<Bitmap> {
/**
* Scales one side of a rectangle to fit aspect ratio.
*
- * @param maxPrimary Maximum size of the primary dimension (i.e. width for
- * max width), or zero to maintain aspect ratio with secondary
- * dimension
- * @param maxSecondary Maximum size of the secondary dimension, or zero to
- * maintain aspect ratio with primary dimension
+ * @param maxPrimary Maximum size of the primary dimension (i.e. width for max width), or zero
+ * to maintain aspect ratio with secondary dimension
+ * @param maxSecondary Maximum size of the secondary dimension, or zero to maintain aspect ratio
+ * with primary dimension
* @param actualPrimary Actual size of the primary dimension
* @param actualSecondary Actual size of the secondary dimension
* @param scaleType The ScaleType used to calculate the needed image size.
*/
- private static int getResizedDimension(int maxPrimary, int maxSecondary, int actualPrimary,
- int actualSecondary, ScaleType scaleType) {
+ private static int getResizedDimension(
+ int maxPrimary,
+ int maxSecondary,
+ int actualPrimary,
+ int actualSecondary,
+ ScaleType scaleType) {
// If no dominant value at all, just return the actual.
if ((maxPrimary == 0) && (maxSecondary == 0)) {
@@ -168,9 +188,7 @@ public class ImageRequest extends Request<Bitmap> {
}
}
- /**
- * The real guts of parseNetworkResponse. Broken out for readability.
- */
+ /** The real guts of parseNetworkResponse. Broken out for readability. */
private Response<Bitmap> doParse(NetworkResponse response) {
byte[] data = response.data;
BitmapFactory.Options decodeOptions = new BitmapFactory.Options();
@@ -186,25 +204,26 @@ public class ImageRequest extends Request<Bitmap> {
int actualHeight = decodeOptions.outHeight;
// Then compute the dimensions we would ideally like to decode to.
- int desiredWidth = getResizedDimension(mMaxWidth, mMaxHeight,
- actualWidth, actualHeight, mScaleType);
- int desiredHeight = getResizedDimension(mMaxHeight, mMaxWidth,
- actualHeight, actualWidth, mScaleType);
+ int desiredWidth =
+ getResizedDimension(
+ mMaxWidth, mMaxHeight, actualWidth, actualHeight, mScaleType);
+ int desiredHeight =
+ getResizedDimension(
+ mMaxHeight, mMaxWidth, actualHeight, actualWidth, mScaleType);
// Decode to the nearest power of two scaling factor.
decodeOptions.inJustDecodeBounds = false;
// TODO(ficus): Do we need this or is it okay since API 8 doesn't support it?
// decodeOptions.inPreferQualityOverSpeed = PREFER_QUALITY_OVER_SPEED;
decodeOptions.inSampleSize =
- findBestSampleSize(actualWidth, actualHeight, desiredWidth, desiredHeight);
- Bitmap tempBitmap =
- BitmapFactory.decodeByteArray(data, 0, data.length, decodeOptions);
+ findBestSampleSize(actualWidth, actualHeight, desiredWidth, desiredHeight);
+ Bitmap tempBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, decodeOptions);
// If necessary, scale down to the maximal acceptable size.
- if (tempBitmap != null && (tempBitmap.getWidth() > desiredWidth ||
- tempBitmap.getHeight() > desiredHeight)) {
- bitmap = Bitmap.createScaledBitmap(tempBitmap,
- desiredWidth, desiredHeight, true);
+ if (tempBitmap != null
+ && (tempBitmap.getWidth() > desiredWidth
+ || tempBitmap.getHeight() > desiredHeight)) {
+ bitmap = Bitmap.createScaledBitmap(tempBitmap, desiredWidth, desiredHeight, true);
tempBitmap.recycle();
} else {
bitmap = tempBitmap;
@@ -238,15 +257,15 @@ public class ImageRequest extends Request<Bitmap> {
}
/**
- * Returns the largest power-of-two divisor for use in downscaling a bitmap
- * that will not result in the scaling past the desired dimensions.
+ * Returns the largest power-of-two divisor for use in downscaling a bitmap that will not result
+ * in the scaling past the desired dimensions.
*
* @param actualWidth Actual width of the bitmap
* @param actualHeight Actual height of the bitmap
* @param desiredWidth Desired width of the bitmap
* @param desiredHeight Desired height of the bitmap
*/
- // Visible for testing.
+ @VisibleForTesting
static int findBestSampleSize(
int actualWidth, int actualHeight, int desiredWidth, int desiredHeight) {
double wr = (double) actualWidth / desiredWidth;