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

Commit 163ad3de authored by Alexandr Shabalin's avatar Alexandr Shabalin Committed by Android (Google) Code Review
Browse files

Merge changes I92287dcd,Ic3472458 into main

* changes:
  Clean up avoid_binder_calls_for_muting_expected_device
  Clean up avoid_binder_calls_during_render
parents 54cfb429 a747a967
Loading
Loading
Loading
Loading
+0 −20
Original line number Diff line number Diff line
@@ -260,26 +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"
    description: "Sets isMutingExpectedDevice attribute during construction of MediaDevice."
    bug: "414668703"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "enable_output_switcher_personal_audio_sharing"
    namespace: "cross_device_experiences"
+7 −16
Original line number Diff line number Diff line
@@ -15,8 +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;

import android.annotation.NonNull;
@@ -71,7 +69,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 +76,7 @@ public class BluetoothMediaDevice extends MediaDevice {
        } else {
            return mCachedDevice.getName();
        }
        }

        return mCachedDevice.getName();
    }

    @Override
@@ -158,12 +153,8 @@ public class BluetoothMediaDevice extends MediaDevice {

    @Override
    public boolean isMutingExpectedDevice() {
        if (avoidBinderCallsForMutingExpectedDevice()) {
        return mIsMutingExpectedDevice;
    }
        return mAudioManager.getMutingExpectedDevice() != null && mCachedDevice.getAddress().equals(
                mAudioManager.getMutingExpectedDevice().getAddress());
    }

    @Override
    public boolean isConnected() {
+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 −5
Original line number Diff line number Diff line
@@ -26,10 +26,8 @@ import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.media.MediaRoute2Info;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;

import com.android.media.flags.Flags;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;

import org.junit.Before;
@@ -134,7 +132,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 +142,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);
@@ -155,7 +151,6 @@ public class BluetoothMediaDeviceTest {
        assertThat(bluetoothMediaDevice.getName()).isEqualTo(TEST_CACHED_DEVICE_NAME);
    }

    @EnableFlags(Flags.FLAG_AVOID_BINDER_CALLS_FOR_MUTING_EXPECTED_DEVICE)
    @Test
    public void getIsMutingExpectedDevice_dependsOnConstructorArgument() {
        MediaDevice bluetoothMediaDevice = new BluetoothMediaDevice(mContext, mDevice,
+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