Merge "Add ImageDecoder.ImageInfo.getMimeType"
diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp
index 5bdad08..c237564 100644
--- a/core/jni/android/graphics/ImageDecoder.cpp
+++ b/core/jni/android/graphics/ImageDecoder.cpp
@@ -15,6 +15,7 @@
  */
 
 #include "Bitmap.h"
+#include "BitmapFactory.h"
 #include "ByteBufferStreamAdaptor.h"
 #include "CreateJavaOutputStreamAdaptor.h"
 #include "GraphicsJNI.h"
@@ -500,6 +501,11 @@
     delete reinterpret_cast<ImageDecoder*>(nativePtr);
 }
 
+static jstring ImageDecoder_nGetMimeType(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
+    auto* decoder = reinterpret_cast<ImageDecoder*>(nativePtr);
+    return encodedFormatToString(env, decoder->mCodec->getEncodedFormat());
+}
+
 static const JNINativeMethod gImageDecoderMethods[] = {
     { "nCreate",        "(J)Landroid/graphics/ImageDecoder;",    (void*) ImageDecoder_nCreateAsset },
     { "nCreate",        "(Ljava/nio/ByteBuffer;II)Landroid/graphics/ImageDecoder;", (void*) ImageDecoder_nCreateByteBuffer },
@@ -511,6 +517,7 @@
     { "nGetSampledSize","(JI)Landroid/graphics/Point;",          (void*) ImageDecoder_nGetSampledSize },
     { "nGetPadding",    "(JLandroid/graphics/Rect;)V",           (void*) ImageDecoder_nGetPadding },
     { "nClose",         "(J)V",                                  (void*) ImageDecoder_nClose},
+    { "nGetMimeType",   "(J)Ljava/lang/String;",                 (void*) ImageDecoder_nGetMimeType },
 };
 
 int register_android_graphics_ImageDecoder(JNIEnv* env) {
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 400c928..94b219a 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -210,13 +210,31 @@
      *  Contains information about the encoded image.
      */
     public static class ImageInfo {
+        /**
+         * Width of the image, without scaling or cropping.
+         */
         public final int width;
-        public final int height;
-        // TODO?: Add more info? mimetype, ninepatch etc?
 
-        ImageInfo(int width, int height) {
-            this.width = width;
-            this.height = height;
+        /**
+         * Height of the image, without scaling or cropping.
+         */
+        public final int height;
+
+        /* @hide */
+        ImageDecoder decoder;
+
+        /* @hide */
+        ImageInfo(ImageDecoder decoder) {
+            this.width   = decoder.mWidth;
+            this.height  = decoder.mHeight;
+            this.decoder = decoder;
+        }
+
+        /**
+         * The mimeType of the image, if known.
+         */
+        public String getMimeType() {
+            return decoder.getMimeType();
         }
     };
 
@@ -671,8 +689,12 @@
             @Nullable OnHeaderDecodedListener listener) throws IOException {
         try (ImageDecoder decoder = src.createImageDecoder()) {
             if (listener != null) {
-                ImageInfo info = new ImageInfo(decoder.mWidth, decoder.mHeight);
-                listener.onHeaderDecoded(info, decoder);
+                ImageInfo info = new ImageInfo(decoder);
+                try {
+                    listener.onHeaderDecoded(info, decoder);
+                } finally {
+                    info.decoder = null;
+                }
             }
 
             decoder.checkState();
@@ -753,8 +775,12 @@
             @Nullable OnHeaderDecodedListener listener) throws IOException {
         try (ImageDecoder decoder = src.createImageDecoder()) {
             if (listener != null) {
-                ImageInfo info = new ImageInfo(decoder.mWidth, decoder.mHeight);
-                listener.onHeaderDecoded(info, decoder);
+                ImageInfo info = new ImageInfo(decoder);
+                try {
+                    listener.onHeaderDecoded(info, decoder);
+                } finally {
+                    info.decoder = null;
+                }
             }
 
             decoder.checkState();
@@ -773,6 +799,10 @@
         }
     }
 
+    private String getMimeType() {
+        return nGetMimeType(mNativePtr);
+    }
+
     /**
      *  See {@link #decodeBitmap(Source, OnHeaderDecodedListener)}.
      */
@@ -802,4 +832,5 @@
                                                 int sampleSize);
     private static native void nGetPadding(long nativePtr, Rect outRect);
     private static native void nClose(long nativePtr);
+    private static native String nGetMimeType(long nativePtr);
 }