diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 50bbfbdb1f23f..27f1640f9c120 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1942,4 +1942,8 @@ false + + + 320dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d4ce14cf1933c..cbc379b2a26dd 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1810,6 +1810,8 @@ + + diff --git a/media/java/android/media/MediaMetadata.java b/media/java/android/media/MediaMetadata.java index 924078c455fdc..754da0efe5a97 100644 --- a/media/java/android/media/MediaMetadata.java +++ b/media/java/android/media/MediaMetadata.java @@ -16,8 +16,6 @@ package android.media; import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.ContentProviderClient; import android.content.ContentResolver; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -25,16 +23,14 @@ import android.media.browse.MediaBrowser; import android.media.session.MediaController; import android.net.Uri; import android.os.Bundle; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; -import android.util.Size; import android.util.SparseArray; +import java.util.ArrayList; import java.util.Set; /** @@ -568,6 +564,29 @@ public final class MediaMetadata implements Parcelable { mBundle = new Bundle(source.mBundle); } + /** + * Create a Builder using a {@link MediaMetadata} instance to set + * initial values, but replace bitmaps with a scaled down copy if they + * are larger than maxBitmapSize. + * + * @param source The original metadata to copy. + * @param maxBitmapSize The maximum height/width for bitmaps contained + * in the metadata. + * @hide + */ + public Builder(MediaMetadata source, int maxBitmapSize) { + this(source); + for (String key : mBundle.keySet()) { + Object value = mBundle.get(key); + if (value != null && value instanceof Bitmap) { + Bitmap bmp = (Bitmap) value; + if (bmp.getHeight() > maxBitmapSize || bmp.getWidth() > maxBitmapSize) { + putBitmap(key, scaleBitmap(bmp, maxBitmapSize)); + } + } + } + } + /** * Put a CharSequence value into the metadata. Custom keys may be used, * but if the METADATA_KEYs defined in this class are used they may only @@ -707,6 +726,10 @@ public final class MediaMetadata implements Parcelable { *
  • {@link #METADATA_KEY_ALBUM_ART}
  • *
  • {@link #METADATA_KEY_DISPLAY_ICON}
  • * + *

    + * Large bitmaps may be scaled down by the system. To pass full + * resolution images {@link Uri Uris} should be used with + * {@link #putString}. * * @param key The key for referencing this value * @param value The Bitmap to store @@ -731,5 +754,15 @@ public final class MediaMetadata implements Parcelable { public MediaMetadata build() { return new MediaMetadata(mBundle); } + + private Bitmap scaleBitmap(Bitmap bmp, int maxSize) { + float maxSizeF = maxSize; + float widthScale = maxSizeF / bmp.getWidth(); + float heightScale = maxSizeF / bmp.getHeight(); + float scale = Math.min(widthScale, heightScale); + int height = (int) (bmp.getHeight() * scale); + int width = (int) (bmp.getWidth() * scale); + return Bitmap.createScaledBitmap(bmp, width, height, true); + } } } diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index 973527f0741ec..e13f0082a6593 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -104,6 +104,7 @@ public final class MediaSession { public @interface SessionFlags { } private final Object mLock = new Object(); + private final int mMaxBitmapSize; private final MediaSession.Token mSessionToken; private final MediaController mController; @@ -147,6 +148,8 @@ public final class MediaSession { if (TextUtils.isEmpty(tag)) { throw new IllegalArgumentException("tag cannot be null or empty"); } + mMaxBitmapSize = context.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.config_mediaMetadataBitmapMaxSize); mCbStub = new CallbackStub(this); MediaSessionManager manager = (MediaSessionManager) context .getSystemService(Context.MEDIA_SESSION_SERVICE); @@ -409,6 +412,7 @@ public final class MediaSession { * @param metadata The new metadata */ public void setMetadata(@Nullable MediaMetadata metadata) { + metadata = (new MediaMetadata.Builder(metadata, mMaxBitmapSize)).build(); try { mBinder.setMetadata(metadata); } catch (RemoteException e) {