Import of Volley from GitHub to AOSP.

  - dbfc43945655acaf7cc18e4a30ceb26a46c05f58 Adding setDefaultImageDrawable and setErrorImageDrawable ... by Yuhan Zhao <poligun@gmail.com>
  - 83ea07d3e3ea251221da834c43705897dec6d34e Pin to a specific errorprone version. (#266) by Jeff Davidson <jpd236@cornell.edu>

GitOrigin-RevId: dbfc43945655acaf7cc18e4a30ceb26a46c05f58
Change-Id: If34fda708841eb5bf3788865b66e23f342523537
diff --git a/build.gradle b/build.gradle
index 1765a3a..828a192 100644
--- a/build.gradle
+++ b/build.gradle
@@ -14,6 +14,8 @@
 //     include(":volley")
 //     project(':volley').buildFileName = 'rules.gradle'
 
+import net.ltgt.gradle.errorprone.CheckSeverity
+
 buildscript {
     repositories {
         jcenter()
@@ -26,7 +28,9 @@
 
 plugins {
     id "com.github.sherter.google-java-format" version "0.6"
-    id "net.ltgt.errorprone" version "0.0.13"
+    // NOTE: 0.7 or newer will require upgrading to a newer Android gradle plugin:
+    // https://github.com/tbroyer/gradle-errorprone-plugin/commit/65b1026ebeae1b7ed8c28578c7f6eea512c16bea
+    id "net.ltgt.errorprone" version "0.6.1"
 }
 
 googleJavaFormat {
@@ -41,6 +45,15 @@
     google()
 }
 
+dependencies {
+    // NOTE: Updating ErrorProne introduces new checks that may cause the build to fail. Pin to a
+    // specific version to control these updates.
+    errorprone("com.google.errorprone:error_prone_core:2.3.2")
+    // ErrorProne requires a JDK 9 compiler, so pull one in as a dependency since we use Java 8:
+    // https://github.com/tbroyer/gradle-errorprone-plugin#jdk-8-support
+    errorproneJavac("com.google.errorprone:javac:9+181-r4173-1")
+}
+
 group = 'com.android.volley'
 version = '1.2.0-SNAPSHOT'
 
@@ -55,7 +68,9 @@
 }
 
 tasks.withType(JavaCompile) {
-    options.compilerArgs << "-Xep:ParameterComment:ERROR"
+    options.errorprone {
+        check("ParameterComment", CheckSeverity.ERROR)
+    }
 }
 
 apply from: 'rules.gradle'
diff --git a/src/main/java/com/android/volley/toolbox/NetworkImageView.java b/src/main/java/com/android/volley/toolbox/NetworkImageView.java
index 53affc3..a24b3e2 100644
--- a/src/main/java/com/android/volley/toolbox/NetworkImageView.java
+++ b/src/main/java/com/android/volley/toolbox/NetworkImageView.java
@@ -15,6 +15,7 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.ViewGroup.LayoutParams;
@@ -32,25 +33,37 @@
 
     /**
      * Resource ID of the image to be used as a placeholder until the network image is loaded. Won't
-     * be set at the same time as mDefaultImageBitmap.
+     * be set at the same time as mDefaultImageDrawable or mDefaultImageBitmap.
      */
     private int mDefaultImageId;
 
     /**
-     * Bitmap of the image to be used as a placeholder until the network image is loaded. Won't be
-     * set at the same time as mDefaultImageId.
+     * Drawable of the image to be used as a placeholder until the network image is loaded. Won't be
+     * set at the same time as mDefaultImageId or mDefaultImageBitmap.
      */
-    @Nullable Bitmap mDefaultImageBitmap;
+    @Nullable private Drawable mDefaultImageDrawable;
+
+    /**
+     * Bitmap of the image to be used as a placeholder until the network image is loaded. Won't be
+     * set at the same time as mDefaultImageId or mDefaultImageDrawable.
+     */
+    @Nullable private Bitmap mDefaultImageBitmap;
 
     /**
      * Resource ID of the image to be used if the network response fails. Won't be set at the same
-     * time as mErrorImageBitmap.
+     * time as mErrorImageDrawable or mErrorImageBitmap.
      */
     private int mErrorImageId;
 
     /**
      * Bitmap of the image to be used if the network response fails. Won't be set at the same time
-     * as mErrorImageId.
+     * as mErrorImageId or mErrorImageBitmap.
+     */
+    @Nullable private Drawable mErrorImageDrawable;
+
+    /**
+     * Bitmap of the image to be used if the network response fails. Won't be set at the same time
+     * as mErrorImageId or mErrorImageDrawable.
      */
     @Nullable private Bitmap mErrorImageBitmap;
 
@@ -100,21 +113,38 @@
      * Sets the default image resource ID to be used for this view until the attempt to load it
      * completes.
      *
-     * <p>This will clear anything set by {@link NetworkImageView#setDefaultImageBitmap}.
+     * <p>This will clear anything set by {@link NetworkImageView#setDefaultImageBitmap} or {@link
+     * NetworkImageView#setDefaultImageDrawable}.
      */
     public void setDefaultImageResId(int defaultImage) {
         mDefaultImageBitmap = null;
+        mDefaultImageDrawable = null;
         mDefaultImageId = defaultImage;
     }
 
     /**
+     * Sets the default image drawable to be used for this view until the attempt to load it
+     * completes.
+     *
+     * <p>This will clear anything set by {@link NetworkImageView#setDefaultImageResId} or {@link
+     * NetworkImageView#setDefaultImageBitmap}.
+     */
+    public void setDefaultImageDrawable(@Nullable Drawable defaultImageDrawable) {
+        mDefaultImageId = 0;
+        mDefaultImageBitmap = null;
+        mDefaultImageDrawable = defaultImageDrawable;
+    }
+
+    /**
      * Sets the default image bitmap to be used for this view until the attempt to load it
      * completes.
      *
-     * <p>This will clear anything set by {@link NetworkImageView#setDefaultImageResId}.
+     * <p>This will clear anything set by {@link NetworkImageView#setDefaultImageResId} or {@link
+     * NetworkImageView#setDefaultImageDrawable}.
      */
     public void setDefaultImageBitmap(Bitmap defaultImage) {
         mDefaultImageId = 0;
+        mDefaultImageDrawable = null;
         mDefaultImageBitmap = defaultImage;
     }
 
@@ -122,21 +152,38 @@
      * Sets the error image resource ID to be used for this view in the event that the image
      * requested fails to load.
      *
-     * <p>This will clear anything set by {@link NetworkImageView#setErrorImageBitmap}.
+     * <p>This will clear anything set by {@link NetworkImageView#setErrorImageBitmap} or {@link
+     * NetworkImageView#setErrorImageDrawable}.
      */
     public void setErrorImageResId(int errorImage) {
         mErrorImageBitmap = null;
+        mErrorImageDrawable = null;
         mErrorImageId = errorImage;
     }
 
     /**
+     * Sets the error image drawable to be used for this view in the event that the image requested
+     * fails to load.
+     *
+     * <p>This will clear anything set by {@link NetworkImageView#setErrorImageResId} or {@link
+     * NetworkImageView#setDefaultImageBitmap}.
+     */
+    public void setErrorImageDrawable(@Nullable Drawable errorImageDrawable) {
+        mErrorImageId = 0;
+        mErrorImageBitmap = null;
+        mErrorImageDrawable = errorImageDrawable;
+    }
+
+    /**
      * Sets the error image bitmap to be used for this view in the event that the image requested
      * fails to load.
      *
-     * <p>This will clear anything set by {@link NetworkImageView#setErrorImageResId}.
+     * <p>This will clear anything set by {@link NetworkImageView#setErrorImageResId} or {@link
+     * NetworkImageView#setDefaultImageDrawable}.
      */
     public void setErrorImageBitmap(Bitmap errorImage) {
         mErrorImageId = 0;
+        mErrorImageDrawable = null;
         mErrorImageBitmap = errorImage;
     }
 
@@ -202,6 +249,8 @@
                             public void onErrorResponse(VolleyError error) {
                                 if (mErrorImageId != 0) {
                                     setImageResource(mErrorImageId);
+                                } else if (mErrorImageDrawable != null) {
+                                    setImageDrawable(mErrorImageDrawable);
                                 } else if (mErrorImageBitmap != null) {
                                     setImageBitmap(mErrorImageBitmap);
                                 }
@@ -232,6 +281,8 @@
                                     setImageBitmap(response.getBitmap());
                                 } else if (mDefaultImageId != 0) {
                                     setImageResource(mDefaultImageId);
+                                } else if (mDefaultImageDrawable != null) {
+                                    setImageDrawable(mDefaultImageDrawable);
                                 } else if (mDefaultImageBitmap != null) {
                                     setImageBitmap(mDefaultImageBitmap);
                                 }
@@ -245,6 +296,8 @@
     private void setDefaultImageOrNull() {
         if (mDefaultImageId != 0) {
             setImageResource(mDefaultImageId);
+        } else if (mDefaultImageDrawable != null) {
+            setImageDrawable(mDefaultImageDrawable);
         } else if (mDefaultImageBitmap != null) {
             setImageBitmap(mDefaultImageBitmap);
         } else {
diff --git a/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java b/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java
index 7705a8f..fd2073e 100644
--- a/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java
+++ b/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java
@@ -21,6 +21,7 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.ViewGroup.LayoutParams;
 import android.widget.ImageView.ScaleType;
@@ -90,8 +91,10 @@
 
         assertNotNull(
                 NetworkImageView.class.getMethod("setImageUrl", String.class, ImageLoader.class));
+        assertNotNull(NetworkImageView.class.getMethod("setDefaultImageDrawable", Drawable.class));
         assertNotNull(NetworkImageView.class.getMethod("setDefaultImageBitmap", Bitmap.class));
         assertNotNull(NetworkImageView.class.getMethod("setDefaultImageResId", int.class));
+        assertNotNull(NetworkImageView.class.getMethod("setErrorImageDrawable", Drawable.class));
         assertNotNull(NetworkImageView.class.getMethod("setErrorImageBitmap", Bitmap.class));
         assertNotNull(NetworkImageView.class.getMethod("setErrorImageResId", int.class));
     }