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

Commit b19aff12 authored by Iván Budnik's avatar Iván Budnik
Browse files

Do not filter receiver-driven transferable routes

All in-session transferable routes must be shown in the Output Switcher
regardless of their route features. RouterInfoMediaManager now matches
the behaviour of ManagerInfoMediaManager#getTransferableRoutes.

Test: `adb shell device_config put media_solutions
com.android.settingslib.media.flags.use_media_router2_for_info_media_manager true`
and then verify transferable routes appear in Output Switcher.
Bug: 192657812
Bug: 306391272

Change-Id: Iaaf91a623f3f62f31c2ed20fb58fe10b1a001ead
parent 30c1f002
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -1398,6 +1398,20 @@ public final class MediaRouter2 {
            return getRoutesWithIds(deselectableRouteIds);
        }

        /**
         * Returns the unmodifiable list of transferable routes for the session.
         *
         * @hide
         */
        @NonNull
        public List<MediaRoute2Info> getTransferableRoutes() {
            List<String> transferableRoutes;
            synchronized (mControllerLock) {
                transferableRoutes = mSessionInfo.getTransferableRoutes();
            }
            return getRoutesWithIds(transferableRoutes);
        }

        /**
         * Returns the current {@link RoutingSessionInfo} associated to this controller.
         */
+16 −15
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -244,25 +245,25 @@ public final class RouterInfoMediaManager extends InfoMediaManager {
    @NonNull
    @Override
    protected List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName) {
        List<MediaRoute2Info> transferableRoutes = new ArrayList<>();

        List<RoutingController> controllers = mRouter.getControllers();
        RoutingController activeController = controllers.get(controllers.size() - 1);
        RoutingSessionInfo sessionInfo = activeController.getRoutingSessionInfo();
        List<MediaRoute2Info> routes = mRouter.getRoutes();
        HashMap<String, MediaRoute2Info> transferableRoutes = new HashMap<>();

        for (MediaRoute2Info route : routes) {
            boolean isCrossDeviceTransfer = sessionInfo.isSystemSession() ^ route.isSystemRoute();
        activeController
                .getTransferableRoutes()
                .forEach(route -> transferableRoutes.put(route.getId(), route));

            // Always show remote routes if transfer is local -> remote or viceversa regardless of
            // whether route is in transferable routes list.
            if (sessionInfo.getTransferableRoutes().contains(route.getId())
                    || isCrossDeviceTransfer) {
                transferableRoutes.add(route);
            }
        if (activeController.getRoutingSessionInfo().isSystemSession()) {
            mRouter.getRoutes().stream()
                    .filter(route -> !route.isSystemRoute())
                    .forEach(route -> transferableRoutes.put(route.getId(), route));
        } else {
            mRouter.getRoutes().stream()
                    .filter(route -> route.isSystemRoute())
                    .forEach(route -> transferableRoutes.put(route.getId(), route));
        }

        return transferableRoutes;
        return new ArrayList<>(transferableRoutes.values());
    }

    @Nullable