Filter selectable/deselectable routes

Only selected routes can be deselectable and not selected routes
can be selectable from this CL.

Bug: 154918270
Test: Manually and atest mediaroutertest
Change-Id: I2e66d814190b003c935b21a744d24fa2b5d2c7ac
This commit is contained in:
Kyunglyul Hyun
2020-05-08 15:21:13 +09:00
parent 672ebfc292
commit 45512bbd54
2 changed files with 60 additions and 14 deletions

View File

@@ -635,8 +635,11 @@ public final class MediaRouter2Manager {
public List<MediaRoute2Info> getSelectedRoutes(@NonNull RoutingSessionInfo sessionInfo) {
Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
List<String> routeIds = sessionInfo.getSelectedRoutes();
return getRoutesWithIds(routeIds);
synchronized (sLock) {
return sessionInfo.getSelectedRoutes().stream().map(mRoutes::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}
/**
@@ -646,8 +649,15 @@ public final class MediaRouter2Manager {
public List<MediaRoute2Info> getSelectableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
List<String> routeIds = sessionInfo.getSelectableRoutes();
return getRoutesWithIds(routeIds);
List<String> selectedRouteIds = sessionInfo.getSelectedRoutes();
synchronized (sLock) {
return sessionInfo.getSelectableRoutes().stream()
.filter(routeId -> !selectedRouteIds.contains(routeId))
.map(mRoutes::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}
/**
@@ -657,8 +667,15 @@ public final class MediaRouter2Manager {
public List<MediaRoute2Info> getDeselectableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
Objects.requireNonNull(sessionInfo, "sessionInfo must not be null");
List<String> routeIds = sessionInfo.getDeselectableRoutes();
return getRoutesWithIds(routeIds);
List<String> selectedRouteIds = sessionInfo.getSelectedRoutes();
synchronized (sLock) {
return sessionInfo.getDeselectableRoutes().stream()
.filter(routeId -> selectedRouteIds.contains(routeId))
.map(mRoutes::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}
/**
@@ -840,14 +857,6 @@ public final class MediaRouter2Manager {
sessionInfo.getOwnerPackageName());
}
private List<MediaRoute2Info> getRoutesWithIds(List<String> routeIds) {
synchronized (sLock) {
return routeIds.stream().map(mRoutes::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}
/**
* Interface for receiving events about media routing changes.
*/

View File

@@ -26,6 +26,7 @@ import static com.android.mediaroutertest.StubMediaRoute2ProviderService.FEATURE
import static com.android.mediaroutertest.StubMediaRoute2ProviderService.FEATURE_SPECIAL;
import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID1;
import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID2;
import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID4_TO_SELECT_AND_DESELECT;
import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID5_TO_TRANSFER_TO;
import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_FIXED_VOLUME;
import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_SPECIAL_FEATURE;
@@ -68,6 +69,7 @@ import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@RunWith(AndroidJUnit4.class)
@SmallTest
@@ -566,6 +568,41 @@ public class MediaRouter2ManagerTest {
assertFalse(failureLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
}
/**
* Tests if getSelectableRoutes and getDeselectableRoutes filter routes based on
* selected routes
*/
@Test
public void testGetSelectableRoutes_notReturnsSelectedRoutes() throws Exception {
Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL);
addRouterCallback(new RouteCallback() {});
CountDownLatch onSessionCreatedLatch = new CountDownLatch(1);
addManagerCallback(new MediaRouter2Manager.Callback() {
@Override
public void onTransferred(RoutingSessionInfo oldSessionInfo,
RoutingSessionInfo newSessionInfo) {
assertNotNull(newSessionInfo);
List<String> selectedRoutes = mManager.getSelectedRoutes(newSessionInfo).stream()
.map(MediaRoute2Info::getId)
.collect(Collectors.toList());
for (MediaRoute2Info selectableRoute :
mManager.getSelectableRoutes(newSessionInfo)) {
assertFalse(selectedRoutes.contains(selectableRoute.getId()));
}
for (MediaRoute2Info deselectableRoute :
mManager.getDeselectableRoutes(newSessionInfo)) {
assertTrue(selectedRoutes.contains(deselectableRoute.getId()));
}
onSessionCreatedLatch.countDown();
}
});
mManager.selectRoute(mPackageName, routes.get(ROUTE_ID4_TO_SELECT_AND_DESELECT));
assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
}
Map<String, MediaRoute2Info> waitAndGetRoutesWithManager(List<String> routeFeatures)
throws Exception {
CountDownLatch addedLatch = new CountDownLatch(1);