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

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

Dispatch onControllerUpdated() when route updates affect selected routes

This change ensures that clients always get updates on selected routes
regardless of the app's RouteDiscoveryPreference.

Bug: 309451111
Test: atest MediaRouter2Test SystemMediaRouter2Test
Change-Id: I23274d05541b1b2e81101cfa066387ca371aaa7b
parent e48ac5bb
Loading
Loading
Loading
Loading
+37 −8
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -141,7 +142,9 @@ public final class MediaRouter2 {
     * dispatch. This is only used to determine what callback a route should be assigned to (added,
     * removed, changed) in {@link #dispatchFilteredRoutesUpdatedOnHandler(List)}.
     */
    private volatile ArrayMap<String, MediaRoute2Info> mPreviousRoutes = new ArrayMap<>();
    private volatile ArrayMap<String, MediaRoute2Info> mPreviousFilteredRoutes = new ArrayMap<>();

    private final Map<String, MediaRoute2Info> mPreviousUnfilteredRoutes = new ArrayMap<>();

    /**
     * Stores the latest copy of exposed routes after filtering, sorting, and deduplication. Can be
@@ -886,7 +889,7 @@ public final class MediaRouter2 {
                newRoutes.stream().map(MediaRoute2Info::getId).collect(Collectors.toSet());

        for (MediaRoute2Info route : newRoutes) {
            MediaRoute2Info prevRoute = mPreviousRoutes.get(route.getId());
            MediaRoute2Info prevRoute = mPreviousFilteredRoutes.get(route.getId());
            if (prevRoute == null) {
                addedRoutes.add(route);
            } else if (!prevRoute.equals(route)) {
@@ -894,21 +897,21 @@ public final class MediaRouter2 {
            }
        }

        for (int i = 0; i < mPreviousRoutes.size(); i++) {
            if (!newRouteIds.contains(mPreviousRoutes.keyAt(i))) {
                removedRoutes.add(mPreviousRoutes.valueAt(i));
        for (int i = 0; i < mPreviousFilteredRoutes.size(); i++) {
            if (!newRouteIds.contains(mPreviousFilteredRoutes.keyAt(i))) {
                removedRoutes.add(mPreviousFilteredRoutes.valueAt(i));
            }
        }

        // update previous routes
        for (MediaRoute2Info route : removedRoutes) {
            mPreviousRoutes.remove(route.getId());
            mPreviousFilteredRoutes.remove(route.getId());
        }
        for (MediaRoute2Info route : addedRoutes) {
            mPreviousRoutes.put(route.getId(), route);
            mPreviousFilteredRoutes.put(route.getId(), route);
        }
        for (MediaRoute2Info route : changedRoutes) {
            mPreviousRoutes.put(route.getId(), route);
            mPreviousFilteredRoutes.put(route.getId(), route);
        }

        if (!addedRoutes.isEmpty()) {
@@ -927,6 +930,27 @@ public final class MediaRouter2 {
        }
    }

    void dispatchControllerUpdatedIfNeededOnHandler(Map<String, MediaRoute2Info> routesMap) {
        List<RoutingController> controllers = getControllers();
        for (RoutingController controller : controllers) {

            for (String selectedRoute : controller.getRoutingSessionInfo().getSelectedRoutes()) {
                if (routesMap.containsKey(selectedRoute)
                        && mPreviousUnfilteredRoutes.containsKey(selectedRoute)) {
                    MediaRoute2Info currentRoute = routesMap.get(selectedRoute);
                    MediaRoute2Info oldRoute = mPreviousUnfilteredRoutes.get(selectedRoute);
                    if (!currentRoute.equals(oldRoute)) {
                        notifyControllerUpdated(controller);
                        break;
                    }
                }
            }
        }

        mPreviousUnfilteredRoutes.clear();
        mPreviousUnfilteredRoutes.putAll(routesMap);
    }

    void updateRoutesOnHandler(List<MediaRoute2Info> newRoutes) {
        synchronized (mLock) {
            mRoutes.clear();
@@ -948,6 +972,11 @@ public final class MediaRouter2 {
                        MediaRouter2::dispatchFilteredRoutesUpdatedOnHandler,
                        this,
                        mFilteredRoutes));
        mHandler.sendMessage(
                obtainMessage(
                        MediaRouter2::dispatchControllerUpdatedIfNeededOnHandler,
                        this,
                        new HashMap<>(mRoutes)));
    }

    /**