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) {