Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49ffc0ff authored by Ray Chen's avatar Ray Chen
Browse files

Revise ThumbnailUtils API.

parent 0bcc74cc
Loading
Loading
Loading
Loading
+15 −32
Original line number Diff line number Diff line
@@ -83971,7 +83971,7 @@
 visibility="public"
>
</constructor>
<method name="createImageThumbnail"
<method name="createVideoThumbnail"
 return="android.graphics.Bitmap"
 abstract="false"
 native="false"
@@ -83981,20 +83981,10 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="cr" type="android.content.ContentResolver">
</parameter>
<parameter name="filePath" type="java.lang.String">
</parameter>
<parameter name="uri" type="android.net.Uri">
</parameter>
<parameter name="origId" type="long">
</parameter>
<parameter name="kind" type="int">
</parameter>
<parameter name="saveMini" type="boolean">
</parameter>
</method>
<method name="createVideoThumbnail"
<method name="extractThumbnail"
 return="android.graphics.Bitmap"
 abstract="false"
 native="false"
@@ -84004,10 +83994,14 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="filePath" type="java.lang.String">
<parameter name="source" type="android.graphics.Bitmap">
</parameter>
<parameter name="width" type="int">
</parameter>
<parameter name="height" type="int">
</parameter>
</method>
<method name="extractMiniThumb"
<method name="extractThumbnail"
 return="android.graphics.Bitmap"
 abstract="false"
 native="false"
@@ -84023,43 +84017,32 @@
</parameter>
<parameter name="height" type="int">
</parameter>
<parameter name="recycle" type="boolean">
<parameter name="options" type="int">
</parameter>
</method>
<field name="MINI_THUMB_TARGET_SIZE"
<field name="OPTIONS_RECYCLE_INPUT"
 type="int"
 transient="false"
 volatile="false"
 value="96"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="NO_RECYCLE_INPUT"
 type="boolean"
 transient="false"
 volatile="false"
 value="false"
 value="4"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="RECYCLE_INPUT"
 type="boolean"
<field name="TARGET_SIZE_MICRO_THUMBNAIL"
 type="int"
 transient="false"
 volatile="false"
 value="true"
 value="96"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="THUMBNAIL_TARGET_SIZE"
<field name="TARGET_SIZE_NORMAL_THUMBNAIL"
 type="int"
 transient="false"
 volatile="false"
+4 −4
Original line number Diff line number Diff line
@@ -383,10 +383,10 @@ public final class MediaStore {
                    if (isVideo) {
                        bitmap = ThumbnailUtils.createVideoThumbnail(filePath);
                        if (kind == MICRO_KIND && bitmap != null) {
                            bitmap = ThumbnailUtils.extractMiniThumb(bitmap,
                                    ThumbnailUtils.MINI_THUMB_TARGET_SIZE,
                                    ThumbnailUtils.MINI_THUMB_TARGET_SIZE,
                                    ThumbnailUtils.RECYCLE_INPUT);
                            bitmap = ThumbnailUtils.extractThumbnail(bitmap,
                                    ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL,
                                    ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL,
                                    ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
                        }
                    } else {
                        bitmap = ThumbnailUtils.createImageThumbnail(cr, filePath, uri, origId,
+45 −60
Original line number Diff line number Diff line
@@ -46,41 +46,32 @@ public class ThumbnailUtils {
    private static final String TAG = "ThumbnailUtils";

    /* Maximum pixels size for created bitmap. */
    private static final int THUMBNAIL_MAX_NUM_PIXELS = 512 * 384;
    private static final int MINI_THUMB_MAX_NUM_PIXELS = 128 * 128;
    private static final int MAX_NUM_PIXELS_THUMBNAIL = 512 * 384;
    private static final int MAX_NUM_PIXELS_MICRO_THUMBNAIL = 128 * 128;
    private static final int UNCONSTRAINED = -1;

    /* Whether we should rotate the resulting bitmap. */
    private static final boolean ROTATE_AS_NEEDED = true;
    private static final boolean NO_ROTATE = false;

    /* Whether we should create bitmap in native memory. */
    private static final boolean USE_NATIVE = true;
    private static final boolean NO_NATIVE = false;
    /* Options used internally. */
    private static final int OPTIONS_NONE = 0x0;
    private static final int OPTIONS_DO_NOT_USE_NATIVE = 0x1;
    private static final int OPTIONS_SCALE_UP = 0x2;

    /**
     * Constant used to indicate we should recycle the input in
     * {@link #extractMiniThumb(Bitmap, int, int, boolean)} unless the output is the input.
     */
    public static final boolean RECYCLE_INPUT = true;

    /**
     * Constant used to indicate we should not recycle the input in
     * {@link #extractMiniThumb(Bitmap, int, int, boolean)}.
     * {@link #extractThumbnail(Bitmap, int, int, int)} unless the output is the input.
     */
    public static final boolean NO_RECYCLE_INPUT = false;
    public static final int OPTIONS_RECYCLE_INPUT = 0x4;

    /**
     * Constant used to indicate the dimension of normal thumbnail in
     * {@link #extractMiniThumb(Bitmap, int, int, boolean)}.
     * {@link #extractThumbnail(Bitmap, int, int, int)}.
     */
    public static final int THUMBNAIL_TARGET_SIZE = 320;
    public static final int TARGET_SIZE_NORMAL_THUMBNAIL = 320;

    /**
     * Constant used to indicate the dimension of mini thumbnail in
     * {@link #extractMiniThumb(Bitmap, int, int, boolean)}.
     * Constant used to indicate the dimension of micro thumbnail in
     * {@link #extractThumbnail(Bitmap, int, int, int)}.
     */
    public static final int MINI_THUMB_TARGET_SIZE = 96;
    public static final int TARGET_SIZE_MICRO_THUMBNAIL = 96;

    /**
     * This method first examines if the thumbnail embedded in EXIF is bigger than our target
@@ -97,14 +88,16 @@ public class ThumbnailUtils {
     * @param kind either MINI_KIND or MICRO_KIND
     * @param saveMini Whether to save MINI_KIND thumbnail obtained in this method.
     * @return Bitmap
     *
     * @hide This method is only used by media framework and media provider internally.
     */
    public static Bitmap createImageThumbnail(ContentResolver cr, String filePath, Uri uri,
            long origId, int kind, boolean saveMini) {
        boolean wantMini = (kind == Images.Thumbnails.MINI_KIND || saveMini);
        int targetSize = wantMini ?
                THUMBNAIL_TARGET_SIZE : MINI_THUMB_TARGET_SIZE;
                TARGET_SIZE_NORMAL_THUMBNAIL : TARGET_SIZE_MICRO_THUMBNAIL;
        int maxPixels = wantMini ?
                THUMBNAIL_MAX_NUM_PIXELS : MINI_THUMB_MAX_NUM_PIXELS;
                MAX_NUM_PIXELS_THUMBNAIL : MAX_NUM_PIXELS_MICRO_THUMBNAIL;
        SizedThumbnailBitmap sizedThumbnailBitmap = new SizedThumbnailBitmap();
        Bitmap bitmap = null;
        MediaFileType fileType = MediaFile.getFileType(filePath);
@@ -134,16 +127,16 @@ public class ThumbnailUtils {

        if (kind == Images.Thumbnails.MICRO_KIND) {
            // now we make it a "square thumbnail" for MICRO_KIND thumbnail
            bitmap = extractMiniThumb(bitmap,
                    MINI_THUMB_TARGET_SIZE,
                    MINI_THUMB_TARGET_SIZE, RECYCLE_INPUT);
            bitmap = extractThumbnail(bitmap,
                    TARGET_SIZE_MICRO_THUMBNAIL,
                    TARGET_SIZE_MICRO_THUMBNAIL, OPTIONS_RECYCLE_INPUT);
        }
        return bitmap;
    }

    /**
     * Create a video thumbnail for a video. May return null if the video is
     * corrupt.
     * corrupt or the format is not supported.
     *
     * @param filePath
     */
@@ -174,10 +167,22 @@ public class ThumbnailUtils {
     * @param source original bitmap source
     * @param width targeted width
     * @param height targeted height
     * @param recycle whether we want to recycle the input
     */
    public static Bitmap extractMiniThumb(
            Bitmap source, int width, int height, boolean recycle) {
    public static Bitmap extractThumbnail(
            Bitmap source, int width, int height) {
        return extractThumbnail(source, width, height, OPTIONS_NONE);
    }

    /**
     * Creates a centered bitmap of the desired size.
     *
     * @param source original bitmap source
     * @param width targeted width
     * @param height targeted height
     * @param options options used during thumbnail extraction
     */
    public static Bitmap extractThumbnail(
            Bitmap source, int width, int height, int options) {
        if (source == null) {
            return null;
        }
@@ -190,8 +195,9 @@ public class ThumbnailUtils {
        }
        Matrix matrix = new Matrix();
        matrix.setScale(scale, scale);
        Bitmap miniThumbnail = transform(matrix, source, width, height, true, recycle);
        return miniThumbnail;
        Bitmap thumbnail = transform(matrix, source, width, height,
                OPTIONS_SCALE_UP | options);
        return thumbnail;
    }

    /*
@@ -272,7 +278,7 @@ public class ThumbnailUtils {
    private static Bitmap makeBitmap(int minSideLength, int maxNumOfPixels,
            Uri uri, ContentResolver cr) {
        return makeBitmap(minSideLength, maxNumOfPixels, uri, cr,
                NO_NATIVE);
            OPTIONS_DO_NOT_USE_NATIVE);
    }

    /**
@@ -281,7 +287,8 @@ public class ThumbnailUtils {
     * whether they want the Bitmap be created in native memory.
     */
    private static Bitmap makeBitmap(int minSideLength, int maxNumOfPixels,
            Uri uri, ContentResolver cr, boolean useNative) {
            Uri uri, ContentResolver cr, int opt) {
        boolean useNative = (opt & OPTIONS_DO_NOT_USE_NATIVE) != 0;
        ParcelFileDescriptor input = null;
        try {
            input = cr.openFileDescriptor(uri, "r");
@@ -340,29 +347,6 @@ public class ThumbnailUtils {
        return b;
    }

    /**
     * Rotates the bitmap by the specified degree.
     * If a new bitmap is created, the original bitmap is recycled.
     */
    private static Bitmap rotate(Bitmap b, int degrees) {
        if (degrees != 0 && b != null) {
            Matrix m = new Matrix();
            m.setRotate(degrees,
                    (float) b.getWidth() / 2, (float) b.getHeight() / 2);
            try {
                Bitmap b2 = Bitmap.createBitmap(
                        b, 0, 0, b.getWidth(), b.getHeight(), m, true);
                if (b != b2) {
                    b.recycle();
                    b = b2;
                }
            } catch (OutOfMemoryError ex) {
                // We have no memory to rotate. Return the original bitmap.
            }
        }
        return b;
    }

    private static void closeSilently(ParcelFileDescriptor c) {
      if (c == null) return;
      try {
@@ -388,8 +372,9 @@ public class ThumbnailUtils {
            Bitmap source,
            int targetWidth,
            int targetHeight,
            boolean scaleUp,
            boolean recycle) {
            int options) {
        boolean scaleUp = (options & OPTIONS_SCALE_UP) != 0;
        boolean recycle = (options & OPTIONS_RECYCLE_INPUT) != 0;

        int deltaX = source.getWidth() - targetWidth;
        int deltaY = source.getHeight() - targetHeight;