Loading media/java/android/media/MediaRouter2Manager.java +11 −4 Original line number Original line Diff line number Diff line Loading @@ -342,7 +342,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); } else { } else { Loading Loading @@ -581,7 +588,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()); Loading @@ -597,7 +604,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) Loading @@ -615,7 +622,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) Loading media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java +37 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -81,6 +82,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; Loading Loading @@ -311,6 +314,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 */ */ Loading Loading @@ -670,8 +703,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); Loading Loading
media/java/android/media/MediaRouter2Manager.java +11 −4 Original line number Original line Diff line number Diff line Loading @@ -342,7 +342,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); } else { } else { Loading Loading @@ -581,7 +588,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()); Loading @@ -597,7 +604,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) Loading @@ -615,7 +622,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) Loading
media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java +37 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -81,6 +82,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; Loading Loading @@ -311,6 +314,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 */ */ Loading Loading @@ -670,8 +703,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); Loading