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

Commit 230d4501 authored by Alex Shabalin's avatar Alex Shabalin
Browse files

Clean up avoid_binder_calls_during_render

Test: atest MediaSwitchingControllerTest InfoMediaManagerTest
BluetoothMediaDeviceTest
Flag: EXEMPT flag cleanup
Fix: 426671009

Change-Id: Ic347245850b0bff3802fd5787dac7d5d72645b08
parent f61612ae
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -260,16 +260,6 @@ flag {
    bug: "293743975"
}

flag {
    name: "avoid_binder_calls_during_render"
    namespace: "media_better_together"
    description: "Reduces number of expensive binder calls during rendering."
    bug: "414668703"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "avoid_binder_calls_for_muting_expected_device"
    namespace: "media_better_together"
+6 −10
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@
 */
package com.android.settingslib.media;

import static com.android.media.flags.Flags.avoidBinderCallsDuringRender;
import static com.android.media.flags.Flags.avoidBinderCallsForMutingExpectedDevice;
import static com.android.settingslib.media.MediaDevice.SelectionBehavior.SELECTION_BEHAVIOR_TRANSFER;

@@ -71,7 +70,6 @@ public class BluetoothMediaDevice extends MediaDevice {

    @Override
    public String getName() {
        if (avoidBinderCallsDuringRender()) {
        if (mRouteInfo != null) {
            // Prefer name from route info since CachedBluetoothDevice#getName results in an
            // IPC call.
@@ -79,9 +77,7 @@ public class BluetoothMediaDevice extends MediaDevice {
        } else {
            return mCachedDevice.getName();
        }
        }

        return mCachedDevice.getName();
    }

    @Override
+11 −87
Original line number Diff line number Diff line
@@ -45,12 +45,10 @@ import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
import static android.media.session.MediaController.PlaybackInfo;

import static com.android.media.flags.Flags.avoidBinderCallsDuringRender;
import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_CONNECTED;
import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_CONNECTING;
import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_CONNECTING_FAILED;
import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_DISCONNECTED;
import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_GROUPING;
import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_SELECTED;

import android.annotation.TargetApi;
@@ -371,13 +369,9 @@ public abstract class InfoMediaManager {
    protected abstract List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName);

    protected final void rebuildDeviceList() {
        if (avoidBinderCallsDuringRender()) {
        synchronized (mLock) {
            buildAvailableRoutes();
        }
        } else {
            buildAvailableRoutes();
        }
    }

    protected final void notifyCurrentConnectedDeviceChanged() {
@@ -602,113 +596,44 @@ public abstract class InfoMediaManager {
     */
    @NonNull
    List<MediaDevice> getSelectableMediaDevices() {
        if (avoidBinderCallsDuringRender()) {
        synchronized (mLock) {
            return mMediaDevices.stream().filter(MediaDevice::isSelectable).toList();
        }
    }

        final RoutingSessionInfo info = getActiveRoutingSession();

        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getSelectableRoutes(info)) {
            if (com.android.media.flags.Flags.enableOutputSwitcherPersonalAudioSharing()) {
                deviceList.add(
                        createMediaDeviceFromRoute(route, /* dynamicRouteAttributes= */ null));
            } else {
                deviceList.add(
                        new InfoMediaDevice(mContext, route, /* dynamicRouteAttributes= */ null,
                                mPreferenceItemMap.get(route.getId())));
            }
        }
        return deviceList;
    }

    /**
     * Returns the list of {@link MediaDevice media devices} that can be transferred to with the
     * current {@link RoutingSessionInfo routing session} by the media route provider.
     */
    @NonNull
    List<MediaDevice> getTransferableMediaDevices() {
        if (avoidBinderCallsDuringRender()) {
        synchronized (mLock) {
            return mMediaDevices.stream().filter(MediaDevice::isTransferable).toList();
        }
    }

        final RoutingSessionInfo info = getActiveRoutingSession();

        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getTransferableRoutes(info)) {
            if (com.android.media.flags.Flags.enableOutputSwitcherPersonalAudioSharing()) {
                deviceList.add(
                        createMediaDeviceFromRoute(route, /* dynamicRouteAttributes= */ null));
            } else {
                deviceList.add(
                        new InfoMediaDevice(mContext, route, /* dynamicRouteAttributes= */ null,
                                mPreferenceItemMap.get(route.getId())));
            }
        }
        return deviceList;
    }

    /**
     * Returns the list of {@link MediaDevice media devices} that can be deselected from the current
     * {@link RoutingSessionInfo routing session}.
     */
    @NonNull
    List<MediaDevice> getDeselectableMediaDevices() {
        if (avoidBinderCallsDuringRender()) {
        synchronized (mLock) {
            return mMediaDevices.stream().filter(MediaDevice::isDeselectable).toList();
        }
    }

        final RoutingSessionInfo info = getActiveRoutingSession();

        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getDeselectableRoutes(info)) {
            if (com.android.media.flags.Flags.enableOutputSwitcherPersonalAudioSharing()) {
                deviceList.add(
                        createMediaDeviceFromRoute(route, /* dynamicRouteAttributes= */ null));
            } else {
                deviceList.add(
                        new InfoMediaDevice(mContext, route,  /* dynamicRouteAttributes= */ null,
                                mPreferenceItemMap.get(route.getId())));
            }
            Log.d(TAG, route.getName() + " is deselectable for " + mPackageName);
        }
        return deviceList;
    }

    /**
     * Returns the list of {@link MediaDevice media devices} that are selected in the current {@link
     * RoutingSessionInfo routing session}.
     */
    @NonNull
    List<MediaDevice> getSelectedMediaDevices() {
        if (avoidBinderCallsDuringRender()) {
        synchronized (mLock) {
            return mMediaDevices.stream().filter(MediaDevice::isSelected).toList();
        }
    }

        RoutingSessionInfo info = getActiveRoutingSession();

        final List<MediaDevice> deviceList = new ArrayList<>();
        for (MediaRoute2Info route : getSelectedRoutes(info)) {
            if (com.android.media.flags.Flags.enableOutputSwitcherPersonalAudioSharing()) {
                deviceList.add(
                        createMediaDeviceFromRoute(route, /* dynamicRouteAttributes= */ null));
            } else {
                deviceList.add(
                        new InfoMediaDevice(mContext, route,  /* dynamicRouteAttributes= */ null,
                                mPreferenceItemMap.get(route.getId())));
            }
        }
        return deviceList;
    }

    /* package */ void adjustDeviceVolume(MediaDevice device, int volume) {
        if (device.mRouteInfo == null) {
            Log.w(TAG, "Unable to set volume. RouteInfo is empty");
@@ -981,8 +906,7 @@ public abstract class InfoMediaManager {
    @VisibleForTesting
    void addMediaDevice(@NonNull MediaRoute2Info route, @NonNull RoutingSessionInfo activeSession) {
        DynamicRouteAttributes dynamicRouteAttributes =
                avoidBinderCallsDuringRender()
                        ? getDynamicRouteAttributes(activeSession, route) : null;
                getDynamicRouteAttributes(activeSession, route);
        MediaDevice mediaDevice = createMediaDeviceFromRoute(route, dynamicRouteAttributes);
        if (mediaDevice != null) {
            if (activeSession.getSelectedRoutes().contains(route.getId())) {
@@ -994,7 +918,7 @@ public abstract class InfoMediaManager {

    @Nullable
    private MediaDevice createMediaDeviceFromRoute(@NonNull MediaRoute2Info route,
            @Nullable DynamicRouteAttributes dynamicRouteAttributes) {
            @NonNull DynamicRouteAttributes dynamicRouteAttributes) {
        final int deviceType = route.getType();
        MediaDevice mediaDevice = null;
        if (isInfoMediaDevice(deviceType)) {
+0 −2
Original line number Diff line number Diff line
@@ -134,7 +134,6 @@ public class BluetoothMediaDeviceTest {
        assertThat(mBluetoothMediaDevice.getId()).isEqualTo(TEST_ADDRESS);
    }

    @EnableFlags(Flags.FLAG_AVOID_BINDER_CALLS_DURING_RENDER)
    @Test
    public void getName_hasRouteInfo_usesNameFromRoute() {
        when(mRouteInfo.getName()).thenReturn(TEST_ROUTE_NAME);
@@ -145,7 +144,6 @@ public class BluetoothMediaDeviceTest {
        assertThat(bluetoothMediaDevice.getName()).isEqualTo(TEST_ROUTE_NAME);
    }

    @EnableFlags(Flags.FLAG_AVOID_BINDER_CALLS_DURING_RENDER)
    @Test
    public void getName_noRouteInfo_usesNameFromCachedDevice() {
        when(mDevice.getName()).thenReturn(TEST_CACHED_DEVICE_NAME);
+0 −39
Original line number Diff line number Diff line
@@ -55,7 +55,6 @@ import android.media.RoutingSessionInfo;
import android.media.SuggestedDeviceInfo;
import android.media.session.MediaSessionManager;
import android.os.Build;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;

@@ -622,7 +621,6 @@ public class InfoMediaManagerTest {
        assertThat(mInfoMediaManager.removeDeviceFromPlayMedia(device)).isFalse();
    }

    @EnableFlags(Flags.FLAG_AVOID_BINDER_CALLS_DURING_RENDER)
    @Test
    public void populateDynamicRouteAttributes_checkList() {
        final CachedBluetoothDeviceManager cachedBluetoothDeviceManager =
@@ -725,7 +723,6 @@ public class InfoMediaManagerTest {
        assertThat(deselectableDevice.isDeselectable()).isTrue();
    }

    @EnableFlags(Flags.FLAG_AVOID_BINDER_CALLS_DURING_RENDER)
    @Test
    public void getSelectableMediaDevice_notContainPackageName_returnEmpty() {
        final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
@@ -736,42 +733,6 @@ public class InfoMediaManagerTest {
        assertThat(mInfoMediaManager.getSelectableMediaDevices()).isEmpty();
    }

    @DisableFlags(Flags.FLAG_AVOID_BINDER_CALLS_DURING_RENDER)
    @Test
    public void getTransferableMediaDevice_checkList() {
        final List<MediaRoute2Info> mediaRoute2Infos = new ArrayList<>();
        final MediaRoute2Info mediaRoute2Info = mock(MediaRoute2Info.class);
        mediaRoute2Infos.add(mediaRoute2Info);
        when(mediaRoute2Info.getName()).thenReturn(TEST_NAME);
        when(mediaRoute2Info.getId()).thenReturn(TEST_ID);
        when(mRouterManager.getRoutingSessions(TEST_PACKAGE_NAME))
                .thenReturn(List.of(TEST_REMOTE_ROUTING_SESSION));
        when(mRouter2.getRoutes()).thenReturn(mediaRoute2Infos);
        when(mRoutingController.getTransferableRoutes()).thenReturn(mediaRoute2Infos);

        final List<MediaDevice> mediaDevices = mInfoMediaManager.getTransferableMediaDevices();

        assertThat(mediaDevices.size()).isEqualTo(1);
        assertThat(mediaDevices.get(0).getName()).isEqualTo(TEST_NAME);
    }

    @DisableFlags(Flags.FLAG_AVOID_BINDER_CALLS_DURING_RENDER)
    @Test
    public void getDeselectableMediaDevice_checkList() {
        final List<MediaRoute2Info> mediaRoute2Infos = new ArrayList<>();
        final MediaRoute2Info mediaRoute2Info = mock(MediaRoute2Info.class);
        mediaRoute2Infos.add(mediaRoute2Info);
        when(mRouter2.getRoutes()).thenReturn(mediaRoute2Infos);
        when(mRoutingController.getDeselectableRoutes()).thenReturn(mediaRoute2Infos);
        when(mediaRoute2Info.getName()).thenReturn(TEST_NAME);
        when(mediaRoute2Info.getId()).thenReturn(TEST_ID);

        final List<MediaDevice> mediaDevices = mInfoMediaManager.getDeselectableMediaDevices();

        assertThat(mediaDevices.size()).isEqualTo(1);
        assertThat(mediaDevices.get(0).getName()).isEqualTo(TEST_NAME);
    }

    @Test
    public void adjustSessionVolume_routingSessionInfoIsNull_noCrash() {
        mInfoMediaManager.adjustSessionVolume(null, 10);
Loading