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

Commit 6c54751c authored by Sal Savage's avatar Sal Savage
Browse files

Make URI based image support optional and off by default

URI based images require us to cache a local copy of an image we fetch
on our own. Applications that rely on this, especially for the now
playing list, can cause our memory usage to spike as we put those
images on our heap.

The easiest and most consistent way to handle this is to disable URI
based images altogether. We'll create an easy way to enable it for those
that want to experiment.

Tag: #stability
Bug: 186706117
Test: atest BluetoothInstrumentationTests

Change-Id: Icad1aecd283f613712c99cc357d3f5eef49cf570
parent 859ca44b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -105,6 +105,9 @@
    <!-- For enabling the AVRCP Target Cover Artowrk feature-->
    <bool name="avrcp_target_enable_cover_art">true</bool>

    <!-- Enable support for URI based images. Off by default due to increased memory usage -->
    <bool name="avrcp_target_cover_art_uri_images">false</bool>

    <!-- Package that is responsible for user interaction on pairing request,
         success or cancel.
         Receives:
+6 −3
Original line number Diff line number Diff line
@@ -130,7 +130,8 @@ public class Metadata implements Cloneable {
            if (data.containsKey(MediaMetadata.METADATA_KEY_DURATION)) {
                mMetadata.duration = "" + data.getLong(MediaMetadata.METADATA_KEY_DURATION);
            }
            if ((mContext != null && (data.containsKey(MediaMetadata.METADATA_KEY_ART_URI)
            if ((mContext != null && Util.areUriImagesSupported(mContext)
                    && (data.containsKey(MediaMetadata.METADATA_KEY_ART_URI)
                    || data.containsKey(MediaMetadata.METADATA_KEY_ALBUM_ART_URI)
                    || data.containsKey(MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI)))
                    || data.containsKey(MediaMetadata.METADATA_KEY_ART)
@@ -163,7 +164,8 @@ public class Metadata implements Cloneable {
            // Check for artwork
            if (desc.getIconBitmap() != null) {
                mMetadata.image = new Image(mContext, desc.getIconBitmap());
            } else if (mContext != null && desc.getIconUri() != null) {
            } else if (mContext != null && Util.areUriImagesSupported(mContext)
                    && desc.getIconUri() != null) {
                mMetadata.image = new Image(mContext, desc.getIconUri());
            }

@@ -209,7 +211,8 @@ public class Metadata implements Cloneable {
            if (bundle.containsKey(MediaMetadata.METADATA_KEY_DURATION)) {
                mMetadata.duration = "" + bundle.getLong(MediaMetadata.METADATA_KEY_DURATION);
            }
            if ((mContext != null && (bundle.containsKey(MediaMetadata.METADATA_KEY_ART_URI)
            if ((mContext != null && Util.areUriImagesSupported(mContext)
                    && (bundle.containsKey(MediaMetadata.METADATA_KEY_ART_URI)
                    || bundle.containsKey(MediaMetadata.METADATA_KEY_ALBUM_ART_URI)
                    || bundle.containsKey(MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI)))
                    || bundle.containsKey(MediaMetadata.METADATA_KEY_ART)
+12 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.media.session.MediaSession;
import android.os.Bundle;
import android.util.Log;

import com.android.bluetooth.R;

import java.util.ArrayList;
import java.util.List;

@@ -54,6 +56,16 @@ class Util {
        return ret;
    }

    /**
     * Get whether or not Bluetooth is configured to support URI images or not.
     *
     * Note that creating URI images will dramatically increase memory usage.
     */
    public static boolean areUriImagesSupported(Context context) {
        if (context == null) return false;
        return context.getResources().getBoolean(R.bool.avrcp_target_cover_art_uri_images);
    }

    /**
     * Translate a bundle of MediaMetadata keys to audio_util's Metadata
     */
+5 −0
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.bluetooth.R;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -68,6 +70,7 @@ public class BrowserPlayerWrapperTest {
    private HandlerThread mThread;

    @Mock Context mMockContext;
    @Mock Resources mMockResources;
    private Context mTargetContext;
    private Resources mTestResources;
    private MockContentResolver mTestContentResolver;
@@ -114,6 +117,8 @@ public class BrowserPlayerWrapperTest {
        });

        when(mMockContext.getContentResolver()).thenReturn(mTestContentResolver);
        when(mMockResources.getBoolean(R.bool.avrcp_target_cover_art_uri_images)).thenReturn(true);
        when(mMockContext.getResources()).thenReturn(mMockResources);

        // Set up Looper thread for the timeout handler
        mThread = new HandlerThread("MediaPlayerWrapperTestThread");
+6 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.bluetooth.R;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -69,6 +71,7 @@ public class MediaPlayerWrapperTest {
    @Mock MediaController mMockController;
    @Mock MediaPlayerWrapper.Callback mTestCbs;
    @Mock Context mMockContext;
    @Mock Resources mMockResources;

    List<MediaSession.QueueItem> getQueueFromDescriptions(
            List<MediaDescription.Builder> descriptions) {
@@ -96,6 +99,9 @@ public class MediaPlayerWrapperTest {
        }
        mTestBitmap = loadImage(com.android.bluetooth.tests.R.raw.image_200_200);

        when(mMockResources.getBoolean(R.bool.avrcp_target_cover_art_uri_images)).thenReturn(true);
        when(mMockContext.getResources()).thenReturn(mMockResources);

        // Set failure handler to capture Log.wtf messages
        Log.setWtfHandler(mFailHandler);

Loading