Rename ImageDecoder.ERRORs

Bug: 73788969
Test: I501e8b76aacd785cb994165ab01dc1b39fea3a1c

Move them into ImageDecoder.DecodeException, which is where they are
actually used. This also provides some more context, so that the prefix
"ERROR_" is no longer necessary, fixing the redundancy/awkwardness in
ERROR_SOURCE_ERROR. Further rename that to SOURCE_MALFORMED_DATA, which
is more descriptive, and does not imply a Java Error.

Change-Id: Ied17ad343650f9c33d9a35b0f9d00ccc22264bd6
diff --git a/api/current.txt b/api/current.txt
index 854df47..de27da0 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -13650,14 +13650,14 @@
     field public static final int ALLOCATOR_HARDWARE = 3; // 0x3
     field public static final int ALLOCATOR_SHARED_MEMORY = 2; // 0x2
     field public static final int ALLOCATOR_SOFTWARE = 1; // 0x1
-    field public static final int ERROR_SOURCE_ERROR = 3; // 0x3
-    field public static final int ERROR_SOURCE_EXCEPTION = 1; // 0x1
-    field public static final int ERROR_SOURCE_INCOMPLETE = 2; // 0x2
   }
 
   public static final class ImageDecoder.DecodeException extends java.io.IOException {
     method public int getError();
     method public android.graphics.ImageDecoder.Source getSource();
+    field public static final int SOURCE_EXCEPTION = 1; // 0x1
+    field public static final int SOURCE_INCOMPLETE = 2; // 0x2
+    field public static final int SOURCE_MALFORMED_DATA = 3; // 0x3
   }
 
   public static class ImageDecoder.ImageInfo {
diff --git a/api/removed.txt b/api/removed.txt
index 7bbf376..1228fd1 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -155,6 +155,9 @@
   public final class ImageDecoder implements java.lang.AutoCloseable {
     method public deprecated boolean getAsAlphaMask();
     method public deprecated android.graphics.ImageDecoder setAsAlphaMask(boolean);
+    field public static final deprecated int ERROR_SOURCE_ERROR = 3; // 0x3
+    field public static final deprecated int ERROR_SOURCE_EXCEPTION = 1; // 0x1
+    field public static final deprecated int ERROR_SOURCE_INCOMPLETE = 2; // 0x2
   }
 
   public static deprecated class ImageDecoder.IncompleteException extends java.io.IOException {
diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp
index f4fec76..726c450 100644
--- a/core/jni/android/graphics/ImageDecoder.cpp
+++ b/core/jni/android/graphics/ImageDecoder.cpp
@@ -79,7 +79,7 @@
 
 static jobject native_create(JNIEnv* env, std::unique_ptr<SkStream> stream, jobject source) {
     if (!stream.get()) {
-        return throw_exception(env, ImageDecoder::kSourceError, "Failed to create a stream",
+        return throw_exception(env, ImageDecoder::kSourceMalformedData, "Failed to create a stream",
                                nullptr, source);
     }
     std::unique_ptr<ImageDecoder> decoder(new ImageDecoder);
@@ -96,8 +96,8 @@
                 SkString msg;
                 msg.printf("Failed to create image decoder with message '%s'",
                            SkCodec::ResultToString(result));
-                return throw_exception(env, ImageDecoder::kSourceError,  msg.c_str(), nullptr,
-                                       source);
+                return throw_exception(env, ImageDecoder::kSourceMalformedData,  msg.c_str(),
+                                       nullptr, source);
 
         }
     }
@@ -110,7 +110,7 @@
     decoder->mCodec = SkAndroidCodec::MakeFromCodec(std::move(codec),
             SkAndroidCodec::ExifOrientationBehavior::kRespect);
     if (!decoder->mCodec.get()) {
-        return throw_exception(env, ImageDecoder::kSourceError, "", nullptr, source);
+        return throw_exception(env, ImageDecoder::kSourceMalformedData, "", nullptr, source);
     }
 
     const auto& info = decoder->mCodec->getInfo();
@@ -127,7 +127,7 @@
 
     struct stat fdStat;
     if (fstat(descriptor, &fdStat) == -1) {
-        return throw_exception(env, ImageDecoder::kSourceError,
+        return throw_exception(env, ImageDecoder::kSourceMalformedData,
                                "broken file descriptor; fstat returned -1", nullptr, source);
     }
 
@@ -135,8 +135,8 @@
     FILE* file = fdopen(dupDescriptor, "r");
     if (file == NULL) {
         close(dupDescriptor);
-        return throw_exception(env, ImageDecoder::kSourceError, "Could not open file", nullptr,
-                               source);
+        return throw_exception(env, ImageDecoder::kSourceMalformedData, "Could not open file",
+                               nullptr, source);
     }
     std::unique_ptr<SkFILEStream> fileStream(new SkFILEStream(file));
 
@@ -157,7 +157,7 @@
     std::unique_ptr<SkStream> stream(CreateJavaInputStreamAdaptor(env, is, storage, false));
 
     if (!stream.get()) {
-        return throw_exception(env, ImageDecoder::kSourceError, "Failed to create a stream",
+        return throw_exception(env, ImageDecoder::kSourceMalformedData, "Failed to create a stream",
                                nullptr, source);
     }
 
@@ -179,7 +179,7 @@
     std::unique_ptr<SkStream> stream = CreateByteBufferStreamAdaptor(env, jbyteBuffer,
                                                                      initialPosition, limit);
     if (!stream) {
-        return throw_exception(env, ImageDecoder::kSourceError, "Failed to read ByteBuffer",
+        return throw_exception(env, ImageDecoder::kSourceMalformedData, "Failed to read ByteBuffer",
                                nullptr, source);
     }
     return native_create(env, std::move(stream), source);
@@ -313,7 +313,7 @@
             break;
         case SkCodec::kErrorInInput:
             if (!jexception) {
-                onPartialImageError = ImageDecoder::kSourceError;
+                onPartialImageError = ImageDecoder::kSourceMalformedData;
             }
             break;
         default:
diff --git a/core/jni/android/graphics/ImageDecoder.h b/core/jni/android/graphics/ImageDecoder.h
index e6e4920..fd9827b 100644
--- a/core/jni/android/graphics/ImageDecoder.h
+++ b/core/jni/android/graphics/ImageDecoder.h
@@ -35,9 +35,9 @@
 
     // These need to stay in sync with ImageDecoder.java's Error constants.
     enum Error {
-        kSourceException  = 1,
-        kSourceIncomplete = 2,
-        kSourceError      = 3,
+        kSourceException     = 1,
+        kSourceIncomplete    = 2,
+        kSourceMalformedData = 3,
     };
 
     // These need to stay in sync with PixelFormat.java's Format constants.
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index fa26ffd..5ca0ad6 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -457,31 +457,49 @@
 
     };
 
-    /**
-     *  An Exception was thrown reading the {@link Source}.
+    /** @removed
+     * @deprecated Replaced by {@link #DecodeException#SOURCE_EXCEPTION}.
      */
+    @java.lang.Deprecated
     public static final int ERROR_SOURCE_EXCEPTION  = 1;
 
-    /**
-     *  The encoded data was incomplete.
+    /** @removed
+     * @deprecated Replaced by {@link #DecodeException#SOURCE_INCOMPLETE}.
      */
+    @java.lang.Deprecated
     public static final int ERROR_SOURCE_INCOMPLETE = 2;
 
-    /**
-     *  The encoded data contained an error.
+    /** @removed
+     * @deprecated Replaced by {@link #DecodeException#SOURCE_MALFORMED_DATA}.
      */
+    @java.lang.Deprecated
     public static final int ERROR_SOURCE_ERROR      = 3;
 
-    /** @hide **/
-    @Retention(SOURCE)
-    @IntDef(value = { ERROR_SOURCE_EXCEPTION, ERROR_SOURCE_INCOMPLETE, ERROR_SOURCE_ERROR },
-            prefix = {"ERROR_"})
-    public @interface Error {};
-
     /**
      *  Information about an interrupted decode.
      */
     public static final class DecodeException extends IOException {
+        /**
+         *  An Exception was thrown reading the {@link Source}.
+         */
+        public static final int SOURCE_EXCEPTION  = 1;
+
+        /**
+         *  The encoded data was incomplete.
+         */
+        public static final int SOURCE_INCOMPLETE = 2;
+
+        /**
+         *  The encoded data contained an error.
+         */
+        public static final int SOURCE_MALFORMED_DATA      = 3;
+
+        /** @hide **/
+        @Retention(SOURCE)
+        @IntDef(value = { SOURCE_EXCEPTION, SOURCE_INCOMPLETE, SOURCE_MALFORMED_DATA },
+                prefix = {"SOURCE_"})
+        public @interface Error {};
+
         @Error final int mError;
         @NonNull final Source mSource;
 
@@ -505,7 +523,7 @@
         /**
          *  Retrieve the reason that decoding was interrupted.
          *
-         *  <p>If the error is {@link #ERROR_SOURCE_EXCEPTION}, the underlying
+         *  <p>If the error is {@link #SOURCE_EXCEPTION}, the underlying
          *  {@link java.lang.Throwable} can be retrieved with
          *  {@link java.lang.Throwable#getCause}.</p>
          */
@@ -524,11 +542,11 @@
 
         private static String errorMessage(@Error int error, @Nullable Throwable cause) {
             switch (error) {
-                case ERROR_SOURCE_EXCEPTION:
+                case SOURCE_EXCEPTION:
                     return "Exception in input: " + cause;
-                case ERROR_SOURCE_INCOMPLETE:
+                case SOURCE_INCOMPLETE:
                     return "Input was incomplete.";
-                case ERROR_SOURCE_ERROR:
+                case SOURCE_MALFORMED_DATA:
                     return "Input contained an error.";
                 default:
                     return "";
@@ -1368,7 +1386,7 @@
      * Private method called by JNI.
      */
     @SuppressWarnings("unused")
-    private void onPartialImage(@Error int error, @Nullable Throwable cause)
+    private void onPartialImage(@DecodeException.Error int error, @Nullable Throwable cause)
             throws DecodeException {
         DecodeException exception = new DecodeException(error, cause, mSource);
         if (mOnPartialImageListener == null