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

Commit 36ee3623 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Migrate to single sanely-sized thumbnails.

Instead of generating only a handful of thumbnail "kinds", none of
which scale with display density, shift to generating only a single
thumbnail whose dimensions are limited to half the smallest screen
width of the device.

This change also shifts to storing thumbnails on the relevant volume
where the source data actually came from.  This solves the problem
of having to GC thumbnails for a storage device that we haven't seen
in a long time.

Bug: 119887587
Test: atest cts/tests/tests/provider/src/android/provider/cts/MediaStore*
Change-Id: I2ce6c5051b7058d2f1bba523c077e84a1f0b46e9
parent 3f64ec57
Loading
Loading
Loading
Loading
+32 −30
Original line number Diff line number Diff line
@@ -38187,6 +38187,8 @@ package android.provider {
    field public static final String MEDIA_SCANNER_VOLUME = "volume";
    field public static final String META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE = "android.media.still_image_camera_preview_service";
    field public static final String UNKNOWN_STRING = "<unknown>";
    field public static final String VOLUME_EXTERNAL = "external";
    field public static final String VOLUME_INTERNAL = "internal";
  }
  public static final class MediaStore.Audio {
@@ -38393,28 +38395,28 @@ package android.provider {
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
  }
  public static class MediaStore.Images.Thumbnails implements android.provider.BaseColumns {
    ctor public MediaStore.Images.Thumbnails();
  @Deprecated public static class MediaStore.Images.Thumbnails implements android.provider.BaseColumns {
    ctor @Deprecated public MediaStore.Images.Thumbnails();
    method @Deprecated public static void cancelThumbnailRequest(android.content.ContentResolver, long);
    method @Deprecated public static void cancelThumbnailRequest(android.content.ContentResolver, long, long);
    method public static android.net.Uri getContentUri(String);
    method @Deprecated public static android.net.Uri getContentUri(String);
    method @Deprecated public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, int, android.graphics.BitmapFactory.Options);
    method @Deprecated public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, long, int, android.graphics.BitmapFactory.Options);
    method public static final android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    method public static final android.database.Cursor queryMiniThumbnail(android.content.ContentResolver, long, int, String[]);
    method public static final android.database.Cursor queryMiniThumbnails(android.content.ContentResolver, android.net.Uri, int, String[]);
    method @Deprecated public static final android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    method @Deprecated public static final android.database.Cursor queryMiniThumbnail(android.content.ContentResolver, long, int, String[]);
    method @Deprecated public static final android.database.Cursor queryMiniThumbnails(android.content.ContentResolver, android.net.Uri, int, String[]);
    field @Deprecated public static final String DATA = "_data";
    field public static final String DEFAULT_SORT_ORDER = "image_id ASC";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final int FULL_SCREEN_KIND = 2; // 0x2
    field public static final String HEIGHT = "height";
    field public static final String IMAGE_ID = "image_id";
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
    field public static final String KIND = "kind";
    field public static final int MICRO_KIND = 3; // 0x3
    field public static final int MINI_KIND = 1; // 0x1
    field public static final String THUMB_DATA = "thumb_data";
    field public static final String WIDTH = "width";
    field @Deprecated public static final String DEFAULT_SORT_ORDER = "image_id ASC";
    field @Deprecated public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field @Deprecated public static final int FULL_SCREEN_KIND = 2; // 0x2
    field @Deprecated public static final String HEIGHT = "height";
    field @Deprecated public static final String IMAGE_ID = "image_id";
    field @Deprecated public static final android.net.Uri INTERNAL_CONTENT_URI;
    field @Deprecated public static final String KIND = "kind";
    field @Deprecated public static final int MICRO_KIND = 3; // 0x3
    field @Deprecated public static final int MINI_KIND = 1; // 0x1
    field @Deprecated public static final String THUMB_DATA = "thumb_data";
    field @Deprecated public static final String WIDTH = "width";
  }
  public static interface MediaStore.MediaColumns extends android.provider.BaseColumns {
@@ -38466,24 +38468,24 @@ package android.provider {
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
  }
  public static class MediaStore.Video.Thumbnails implements android.provider.BaseColumns {
    ctor public MediaStore.Video.Thumbnails();
  @Deprecated public static class MediaStore.Video.Thumbnails implements android.provider.BaseColumns {
    ctor @Deprecated public MediaStore.Video.Thumbnails();
    method @Deprecated public static void cancelThumbnailRequest(android.content.ContentResolver, long);
    method @Deprecated public static void cancelThumbnailRequest(android.content.ContentResolver, long, long);
    method public static android.net.Uri getContentUri(String);
    method @Deprecated public static android.net.Uri getContentUri(String);
    method @Deprecated public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, int, android.graphics.BitmapFactory.Options);
    method @Deprecated public static android.graphics.Bitmap getThumbnail(android.content.ContentResolver, long, long, int, android.graphics.BitmapFactory.Options);
    field @Deprecated public static final String DATA = "_data";
    field public static final String DEFAULT_SORT_ORDER = "video_id ASC";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final int FULL_SCREEN_KIND = 2; // 0x2
    field public static final String HEIGHT = "height";
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
    field public static final String KIND = "kind";
    field public static final int MICRO_KIND = 3; // 0x3
    field public static final int MINI_KIND = 1; // 0x1
    field public static final String VIDEO_ID = "video_id";
    field public static final String WIDTH = "width";
    field @Deprecated public static final String DEFAULT_SORT_ORDER = "video_id ASC";
    field @Deprecated public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field @Deprecated public static final int FULL_SCREEN_KIND = 2; // 0x2
    field @Deprecated public static final String HEIGHT = "height";
    field @Deprecated public static final android.net.Uri INTERNAL_CONTENT_URI;
    field @Deprecated public static final String KIND = "kind";
    field @Deprecated public static final int MICRO_KIND = 3; // 0x3
    field @Deprecated public static final int MINI_KIND = 1; // 0x1
    field @Deprecated public static final String VIDEO_ID = "video_id";
    field @Deprecated public static final String WIDTH = "width";
  }
  public static interface MediaStore.Video.VideoColumns extends android.provider.MediaStore.MediaColumns {
+24 −2
Original line number Diff line number Diff line
@@ -89,9 +89,19 @@ public final class MediaStore {
    /** A content:// style uri to the authority for the media provider */
    public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);

    /** {@hide} */
    /**
     * Volume name used for content on "internal" storage of device. This
     * volume contains media distributed with the device, such as built-in
     * ringtones and wallpapers.
     */
    public static final String VOLUME_INTERNAL = "internal";
    /** {@hide} */

    /**
     * Volume name used for content on "external" storage of device. This only
     * includes media on the primary shared storage device; the contents of any
     * secondary storage devices can be obtained using
     * {@link #getAllVolumeNames(Context)}.
     */
    public static final String VOLUME_EXTERNAL = "external";

    /**
@@ -1566,7 +1576,13 @@ public final class MediaStore {
        /**
         * This class provides utility methods to obtain thumbnails for various
         * {@link Images} items.
         *
         * @deprecated Callers should migrate to using
         *             {@link ContentResolver#loadThumbnail}, since it offers
         *             richer control over requested thumbnail sizes and
         *             cancellation behavior.
         */
        @Deprecated
        public static class Thumbnails implements BaseColumns {
            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
                return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
@@ -2743,7 +2759,13 @@ public final class MediaStore {
        /**
         * This class provides utility methods to obtain thumbnails for various
         * {@link Video} items.
         *
         * @deprecated Callers should migrate to using
         *             {@link ContentResolver#loadThumbnail}, since it offers
         *             richer control over requested thumbnail sizes and
         *             cancellation behavior.
         */
        @Deprecated
        public static class Thumbnails implements BaseColumns {
            /**
             * Cancel any outstanding {@link #getThumbnail} requests, causing