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

Commit a3be2de6 authored by Kyunglyul Hyun's avatar Kyunglyul Hyun
Browse files

Ignore transfer to an unknown route

This CL ignores attempts to transfer to unknown route in
MediaRouter2Manager.
This CL also fixes wrong acquisition of locks when getXXXRoutes.

Bug: 157875504
Test: atest mediaroutertest
Change-Id: Ic3415844551c672b42d19d9744d7538a9d7df7c3
parent 14756a8c
Loading
Loading
Loading
Loading
+11 −4
Original line number Original line Diff line number Diff line
@@ -337,7 +337,14 @@ public final class MediaRouter2Manager {
        Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
        Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
        Objects.requireNonNull(route, "route must not be null");
        Objects.requireNonNull(route, "route must not be null");


        //TODO(b/157875504): Ignore unknown route.
        synchronized (mRoutesLock) {
            if (!mRoutes.containsKey(route.getId())) {
                Log.w(TAG, "transfer: Ignoring an unknown route id=" + route.getId());
                notifyTransferFailed(sessionInfo, route);
                return;
            }
        }

        if (sessionInfo.getTransferableRoutes().contains(route.getId())) {
        if (sessionInfo.getTransferableRoutes().contains(route.getId())) {
            transferToRoute(sessionInfo, route);
            transferToRoute(sessionInfo, route);
            return;
            return;
@@ -595,7 +602,7 @@ public final class MediaRouter2Manager {
    public List<MediaRoute2Info> getSelectedRoutes(@NonNull RoutingSessionInfo sessionInfo) {
    public List<MediaRoute2Info> getSelectedRoutes(@NonNull RoutingSessionInfo sessionInfo) {
        Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
        Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");


        synchronized (sLock) {
        synchronized (mRoutesLock) {
            return sessionInfo.getSelectedRoutes().stream().map(mRoutes::get)
            return sessionInfo.getSelectedRoutes().stream().map(mRoutes::get)
                    .filter(Objects::nonNull)
                    .filter(Objects::nonNull)
                    .collect(Collectors.toList());
                    .collect(Collectors.toList());
@@ -611,7 +618,7 @@ public final class MediaRouter2Manager {


        List<String> selectedRouteIds = sessionInfo.getSelectedRoutes();
        List<String> selectedRouteIds = sessionInfo.getSelectedRoutes();


        synchronized (sLock) {
        synchronized (mRoutesLock) {
            return sessionInfo.getSelectableRoutes().stream()
            return sessionInfo.getSelectableRoutes().stream()
                    .filter(routeId -> !selectedRouteIds.contains(routeId))
                    .filter(routeId -> !selectedRouteIds.contains(routeId))
                    .map(mRoutes::get)
                    .map(mRoutes::get)
@@ -629,7 +636,7 @@ public final class MediaRouter2Manager {


        List<String> selectedRouteIds = sessionInfo.getSelectedRoutes();
        List<String> selectedRouteIds = sessionInfo.getSelectedRoutes();


        synchronized (sLock) {
        synchronized (mRoutesLock) {
            return sessionInfo.getDeselectableRoutes().stream()
            return sessionInfo.getDeselectableRoutes().stream()
                    .filter(routeId -> selectedRouteIds.contains(routeId))
                    .filter(routeId -> selectedRouteIds.contains(routeId))
                    .map(mRoutes::get)
                    .map(mRoutes::get)
+37 −2
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.mediaroutertest;
package com.android.mediaroutertest;


import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO;
import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO;
import static android.media.MediaRoute2Info.FEATURE_REMOTE_PLAYBACK;
import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_FIXED;
import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_FIXED;
import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE;
import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE;
import static android.media.MediaRoute2ProviderService.REASON_REJECTED;
import static android.media.MediaRoute2ProviderService.REASON_REJECTED;
@@ -79,6 +80,8 @@ public class MediaRouter2ManagerTest {
    private static final int TIMEOUT_MS = 5000;
    private static final int TIMEOUT_MS = 5000;
    private static final String TEST_KEY = "test_key";
    private static final String TEST_KEY = "test_key";
    private static final String TEST_VALUE = "test_value";
    private static final String TEST_VALUE = "test_value";
    private static final String TEST_ID_UNKNOWN = "id_unknown";
    private static final String TEST_NAME_UNKNOWN = "unknown";


    private Context mContext;
    private Context mContext;
    private MediaRouter2Manager mManager;
    private MediaRouter2Manager mManager;
@@ -309,6 +312,36 @@ public class MediaRouter2ManagerTest {
        assertEquals(1, mManager.getRoutingSessions(mPackageName).size());
        assertEquals(1, mManager.getRoutingSessions(mPackageName).size());
    }
    }


    @Test
    public void testTransfer_unknownRoute_fail() throws Exception {
        addRouterCallback(new RouteCallback() {});

        CountDownLatch onSessionCreatedLatch = new CountDownLatch(1);
        CountDownLatch onTransferFailedLatch = new CountDownLatch(1);

        addManagerCallback(new MediaRouter2Manager.Callback() {
            @Override
            public void onTransferred(RoutingSessionInfo oldSessionInfo,
                    RoutingSessionInfo newSessionInfo) {
                assertNotNull(newSessionInfo);
                onSessionCreatedLatch.countDown();
            }
            @Override
            public void onTransferFailed(RoutingSessionInfo session, MediaRoute2Info route) {
                onTransferFailedLatch.countDown();
            }
        });

        MediaRoute2Info unknownRoute =
                new MediaRoute2Info.Builder(TEST_ID_UNKNOWN, TEST_NAME_UNKNOWN)
                .addFeature(FEATURE_REMOTE_PLAYBACK)
                .build();

        mManager.transfer(mManager.getSystemRoutingSession(), unknownRoute);
        assertFalse(onSessionCreatedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
        assertTrue(onTransferFailedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
    }

    /**
    /**
     * Tests select, transfer, release of routes of a provider
     * Tests select, transfer, release of routes of a provider
     */
     */
@@ -639,8 +672,10 @@ public class MediaRouter2ManagerTest {
        mRouter2.registerRouteCallback(mExecutor, routeCallback,
        mRouter2.registerRouteCallback(mExecutor, routeCallback,
                new RouteDiscoveryPreference.Builder(routeFeatures, true).build());
                new RouteDiscoveryPreference.Builder(routeFeatures, true).build());
        try {
        try {
            addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
            if (mManager.getAllRoutes().isEmpty()) {
            featuresLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
                addedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS);
            }
            featuresLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS);
            return createRouteMap(mManager.getAvailableRoutes(mPackageName));
            return createRouteMap(mManager.getAvailableRoutes(mPackageName));
        } finally {
        } finally {
            mRouter2.unregisterRouteCallback(routeCallback);
            mRouter2.unregisterRouteCallback(routeCallback);