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

Commit 6eea4db4 authored by Alex Shabalin's avatar Alex Shabalin
Browse files

Don't cache the RLP items in InfoMediaManager.

To makes things simpler, request the list of RLP items every time the
device list is rebuilt.

Bug: 428663871
Flag: EXEMPT refactor
Test: atest InfoMediaManagerTest
Change-Id: Ief1db7746eebdf8c4106090be76b07f40596c13b
parent 69e91bb1
Loading
Loading
Loading
Loading
+40 −63
Original line number Diff line number Diff line
@@ -66,7 +66,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.Executor;
import java.util.function.Function;
@@ -140,8 +139,6 @@ public abstract class InfoMediaManager {
    private MediaController mMediaController;
    private PlaybackInfo mLastKnownPlaybackInfo;
    private final LocalBluetoothManager mBluetoothManager;
    private final Map<String, RouteListingPreference.Item> mPreferenceItemMap =
            new ConcurrentHashMap<>();
    @GuardedBy("mLock")
    private final Map<String, List<SuggestedDeviceInfo>> mSuggestedDeviceMap = new HashMap<>();
    @GuardedBy("mLock")
@@ -218,15 +215,6 @@ public abstract class InfoMediaManager {
        startScanOnRouter();
    }

    private void updateRouteListingPreference() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
            RouteListingPreference routeListingPreference =
                    getRouteListingPreference();
            Api34Impl.onRouteListingPreferenceUpdated(routeListingPreference,
                    mPreferenceItemMap);
        }
    }

    public final void stopScan() {
        Log.i(TAG, "stopScan()");
        stopScanOnRouter();
@@ -310,7 +298,18 @@ public abstract class InfoMediaManager {
    @RequiresApi(34)
    protected final void notifyRouteListingPreferenceUpdated(
            RouteListingPreference routeListingPreference) {
        Api34Impl.onRouteListingPreferenceUpdated(routeListingPreference, mPreferenceItemMap);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
            if (DEBUG) {
                if (routeListingPreference != null) {
                    Log.d(TAG, "RouteListingPreference. useSystemOrder = "
                            + routeListingPreference.getUseSystemOrdering());
                    for (RouteListingPreference.Item rlpItem : routeListingPreference.getItems()) {
                        Log.d(TAG, rlpItem.toString());
                    }
                }
            }
        }
        // TODO: b/435500030 - update the device list whenever RLP changes.
    }

    @VisibleForTesting
@@ -358,7 +357,6 @@ public abstract class InfoMediaManager {
            if (mMediaController != null) {
                mMediaController.registerCallback(mMediaControllerCallback, callbackHandler);
            }
            updateRouteListingPreference();
            refreshDevices();
        }
    }
@@ -822,12 +820,13 @@ public abstract class InfoMediaManager {
    // MediaRoute2Info.getType was made public on API 34, but exists since API 30.
    @SuppressWarnings("NewApi")
    private void buildAvailableRoutes() {
        Map<String, RouteListingPreference.Item> rlpItemMap = getRouteListingPreferenceMap();
        synchronized (mLock) {
            mMediaDevices.clear();
            RoutingSessionInfo activeSession = getActiveRoutingSession();

            for (MediaRoute2Info route : getAvailableRoutes(activeSession)) {
                addMediaDeviceLocked(route, activeSession);
                addMediaDeviceLocked(route, activeSession, rlpItemMap.get(route.getId()));
            }

            // In practice, mMediaDevices should always have at least one route.
@@ -838,6 +837,18 @@ public abstract class InfoMediaManager {
        }
    }

    @NonNull
    private Map<String, RouteListingPreference.Item> getRouteListingPreferenceMap() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
            RouteListingPreference routeListingPreference = getRouteListingPreference();
            if (routeListingPreference != null) {
                return routeListingPreference.getItems().stream().collect(
                        Collectors.toMap(RouteListingPreference.Item::getRouteId, item -> item));
            }
        }
        return new HashMap<>();
    }

    private List<MediaRoute2Info> getAvailableRoutes(
            RoutingSessionInfo activeSession) {
        List<MediaRoute2Info> availableRoutes = new ArrayList<>();
@@ -877,33 +888,17 @@ public abstract class InfoMediaManager {
    @GuardedBy("mLock")
    @VisibleForTesting
    void addMediaDeviceLocked(@NonNull MediaRoute2Info route,
            @NonNull RoutingSessionInfo activeSession) {
            @NonNull RoutingSessionInfo activeSession,
            @Nullable RouteListingPreference.Item rlpItem) {
        DynamicRouteAttributes dynamicRouteAttributes =
                getDynamicRouteAttributes(activeSession, route);
        MediaDevice mediaDevice = createMediaDeviceFromRouteLocked(route, dynamicRouteAttributes);
        if (mediaDevice != null) {
            if (mediaDevice.isSelected()) {
                mediaDevice.setState(STATE_SELECTED);
            } else if (route.getConnectionState() == CONNECTION_STATE_CONNECTING) {
                mediaDevice.setState(STATE_CONNECTING);
            }
            mMediaDevices.add(mediaDevice);
        }
    }

    @GuardedBy("mLock")
    @Nullable
    private MediaDevice createMediaDeviceFromRouteLocked(@NonNull MediaRoute2Info route,
            @NonNull DynamicRouteAttributes dynamicRouteAttributes) {
        final int deviceType = route.getType();
        MediaDevice mediaDevice = null;
        if (isInfoMediaDevice(deviceType)) {
            mediaDevice = new InfoMediaDevice(mContext, route, dynamicRouteAttributes,
                    mPreferenceItemMap.get(route.getId()));
            mediaDevice = new InfoMediaDevice(mContext, route, dynamicRouteAttributes, rlpItem);

        } else if (isPhoneMediaDevice(deviceType)) {
            mediaDevice = new PhoneMediaDevice(mContext, route, dynamicRouteAttributes,
                    mPreferenceItemMap.getOrDefault(route.getId(), null));
            mediaDevice = new PhoneMediaDevice(mContext, route, dynamicRouteAttributes, rlpItem);

        } else if (isBluetoothMediaDevice(deviceType)) {
            if (route.getAddress() == null) {
@@ -915,19 +910,23 @@ public abstract class InfoMediaManager {
                        mBluetoothManager.getCachedDeviceManager().findDevice(device);
                if (cachedDevice != null) {
                    mediaDevice = new BluetoothMediaDevice(mContext, cachedDevice, route,
                            dynamicRouteAttributes,
                            mPreferenceItemMap.getOrDefault(route.getId(), null));
                            dynamicRouteAttributes, rlpItem);
                }
            }
        } else if (isComplexMediaDevice(deviceType)) {
            mediaDevice = new ComplexMediaDevice(mContext, route, dynamicRouteAttributes,
                    mPreferenceItemMap.get(route.getId()));

            mediaDevice = new ComplexMediaDevice(mContext, route, dynamicRouteAttributes, rlpItem);
        } else {
            Log.w(TAG, "createRouteToMediaDevice() unknown device type : " + deviceType);
        }

        return mediaDevice;
        if (mediaDevice != null) {
            if (mediaDevice.isSelected()) {
                mediaDevice.setState(STATE_SELECTED);
            } else if (route.getConnectionState() == CONNECTION_STATE_CONNECTING) {
                mediaDevice.setState(STATE_CONNECTING);
            }
            mMediaDevices.add(mediaDevice);
        }
    }

    @NonNull
@@ -1061,28 +1060,6 @@ public abstract class InfoMediaManager {
            return routeListingPreference == null ? null
                    : routeListingPreference.getLinkedItemComponentName();
        }

        @DoNotInline
        static void onRouteListingPreferenceUpdated(
                RouteListingPreference routeListingPreference,
                Map<String, RouteListingPreference.Item> preferenceItemMap) {
            Log.i(TAG, "onRouteListingPreferenceUpdated(), hasRLP: " + (routeListingPreference
                    != null));
            if (DEBUG) {
                if (routeListingPreference != null) {
                    Log.d(TAG, "RouteListingPreference. useSystemOrder = "
                            + routeListingPreference.getUseSystemOrdering());
                    for (RouteListingPreference.Item rlpItem : routeListingPreference.getItems()) {
                        Log.d(TAG, rlpItem.toString());
                    }
                }
            }
            preferenceItemMap.clear();
            if (routeListingPreference != null) {
                routeListingPreference.getItems().forEach((item) ->
                        preferenceItemMap.put(item.getRouteId(), item));
            }
        }
    }

    private final class MediaControllerCallback extends MediaController.Callback {
+4 −0
Original line number Diff line number Diff line
@@ -71,6 +71,10 @@ public final class RouterInfoMediaManager extends InfoMediaManager {
    @VisibleForTesting
    final Consumer<RouteListingPreference> mRouteListingPreferenceCallback =
            (preference) -> {
                if (DEBUG) {
                    Log.d(TAG,
                            "onRouteListingPreferenceUpdated(), hasRLP: " + (preference != null));
                }
                notifyRouteListingPreferenceUpdated(preference);
                refreshDevices();
            };
+8 −8
Original line number Diff line number Diff line
@@ -865,19 +865,19 @@ public class InfoMediaManagerTest {

        when(route2Info.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
        when(route2Info.getId()).thenReturn(TEST_ID);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION, null);
        assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof InfoMediaDevice).isTrue();

        when(route2Info.getType()).thenReturn(TYPE_USB_DEVICE);
        when(route2Info.getId()).thenReturn(TEST_ID);
        mInfoMediaManager.mMediaDevices.clear();
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION, null);
        assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();

        when(route2Info.getType()).thenReturn(TYPE_WIRED_HEADSET);
        when(route2Info.getId()).thenReturn(TEST_ID);
        mInfoMediaManager.mMediaDevices.clear();
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION, null);
        assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();

        when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP);
@@ -888,12 +888,12 @@ public class InfoMediaManagerTest {
        when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class)))
                .thenReturn(cachedDevice);
        mInfoMediaManager.mMediaDevices.clear();
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION, null);
        assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof BluetoothMediaDevice).isTrue();

        when(route2Info.getType()).thenReturn(TYPE_BUILTIN_SPEAKER);
        mInfoMediaManager.mMediaDevices.clear();
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION, null);
        assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue();
    }

@@ -903,7 +903,7 @@ public class InfoMediaManagerTest {
        when(route2Info.getConnectionState()).thenReturn(CONNECTION_STATE_CONNECTING);
        when(route2Info.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
        when(route2Info.getId()).thenReturn(TEST_ID);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION, null);

        assertThat(mInfoMediaManager.mMediaDevices.get(0).getState()).isEqualTo(STATE_CONNECTING);
    }
@@ -922,7 +922,7 @@ public class InfoMediaManagerTest {
                .thenReturn(null);

        mInfoMediaManager.mMediaDevices.clear();
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION);
        mInfoMediaManager.addMediaDeviceLocked(route2Info, TEST_SYSTEM_ROUTING_SESSION, null);

        assertThat(mInfoMediaManager.mMediaDevices.size()).isEqualTo(0);
    }
@@ -939,7 +939,7 @@ public class InfoMediaManagerTest {
        when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class))).thenReturn(null);

        mInfoMediaManager.mMediaDevices.clear();
        mInfoMediaManager.addMediaDeviceLocked(bluetoothRoute, TEST_SYSTEM_ROUTING_SESSION);
        mInfoMediaManager.addMediaDeviceLocked(bluetoothRoute, TEST_SYSTEM_ROUTING_SESSION, null);

        assertThat(mInfoMediaManager.mMediaDevices.size()).isEqualTo(0);
    }