From 797d80ee9010a0d1fc1c4ae14e6cdc51b3643ce7 Mon Sep 17 00:00:00 2001
From: Jernej Virag <jernej@google.com>
Date: Thu, 22 Feb 2024 14:30:58 +0100
Subject: [PATCH] Use ashmem memory to transport MediaDescription to other
 processes

This follows the pattern used by Icon objects (for e.g. Notifications) where contructing the object creates a shared memory Bitmap so updates and transport to other processes doesn't add extra large memory copies. This is important for things like album art which can be rather large (we see 1000x1000 bitmaps occasionally).

Bug: 288241280
Flag: ACONFIG com.android.media.performance.MEDIA_DESCRIPTION_ASHMEM_BITMAP DISABLED
Test: on cheetah with media applications
Change-Id: I6320b000ed4a3785b67c8574aa3ad3b3195ee273
---
 AconfigFlags.bp                                  | 16 ++++++++++++++++
 media/java/android/media/MediaDescription.java   | 10 ++++++++--
 .../java/android/media/flags/performance.aconfig | 11 +++++++++++
 3 files changed, 35 insertions(+), 2 deletions(-)
 create mode 100644 media/java/android/media/flags/performance.aconfig

diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 14658e5d9e4f..e3714df07441 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -81,6 +81,7 @@ aconfig_declarations_group {
         "com.android.internal.pm.pkg.component.flags-aconfig-java",
         "com.android.media.flags.bettertogether-aconfig-java",
         "com.android.media.flags.editing-aconfig-java",
+        "com.android.media.flags.performance-aconfig-java",
         "com.android.media.flags.projection-aconfig-java",
         "com.android.net.thread.platform.flags-aconfig-java",
         "com.android.server.flags.services-aconfig-java",
@@ -533,6 +534,21 @@ java_aconfig_library {
     defaults: ["framework-minus-apex-aconfig-java-defaults"],
 }
 
+// Media Performance
+aconfig_declarations {
+    name: "com.android.media.flags.performance-aconfig",
+    package: "com.android.media.performance.flags",
+    srcs: [
+        "media/java/android/media/flags/performance.aconfig",
+    ],
+}
+
+java_aconfig_library {
+    name: "com.android.media.flags.performance-aconfig-java",
+    aconfig_declarations: "com.android.media.flags.performance-aconfig",
+    defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
 // Media TV
 aconfig_declarations {
     name: "android.media.tv.flags-aconfig",
diff --git a/media/java/android/media/MediaDescription.java b/media/java/android/media/MediaDescription.java
index dece6bdbb35f..ec95279f48f1 100644
--- a/media/java/android/media/MediaDescription.java
+++ b/media/java/android/media/MediaDescription.java
@@ -397,8 +397,14 @@ public class MediaDescription implements Parcelable {
          * @return a new media description.
          */
         public MediaDescription build() {
-            return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon, mIconUri,
-                    mExtras, mMediaUri);
+            if (com.android.media.performance.flags.Flags.mediaDescriptionAshmemBitmap()) {
+                Bitmap icon = mIcon != null ? mIcon.asShared() : null;
+                return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, icon,
+                        mIconUri, mExtras, mMediaUri);
+            } else {
+                return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon,
+                        mIconUri, mExtras, mMediaUri);
+            }
         }
     }
 }
diff --git a/media/java/android/media/flags/performance.aconfig b/media/java/android/media/flags/performance.aconfig
new file mode 100644
index 000000000000..9e9197ef5039
--- /dev/null
+++ b/media/java/android/media/flags/performance.aconfig
@@ -0,0 +1,11 @@
+package: "com.android.media.performance.flags"
+
+flag {
+    name: "media_description_ashmem_bitmap"
+    namespace: "systemui"
+    description: "Use ashmem to pass bitmaps in MediaDescription to avoid excessive Bitmap copies."
+    bug: "288241280"
+    metadata {
+      purpose: PURPOSE_BUGFIX
+    }
+}
-- 
GitLab