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);
}