Clear routes when media router manager has no callback

This CL clears routes when the last callback of MediaRouter2Manager
is unregistered. By doing this, we can ensure
MediaRouter2Manager#getAvailableRoutes() returns correct routes
during at least a single callback is registered.

A test for the behavior is added as well.

This CL also fixed a bug that unregistering a callback from MediaRouter2
disconnects it when multiple callback is used.

Bug: 153515567
Test: atest mediaroutertest & cts test & manually
 using MediaRouter2Demo and Sample OutputSwitcher to see
 if forgotten BT device is correctly removed.
 (w/o this CL forgotten BT device remains)
Change-Id: I31a5001115f1f163c8971bbd906516551b860252
This commit is contained in:
Kyunglyul Hyun
2020-04-17 23:09:08 +09:00
parent 9c5a02c269
commit 350d7b427e
4 changed files with 62 additions and 12 deletions

View File

@@ -237,9 +237,9 @@ public final class MediaRouter2 {
} catch (RemoteException ex) {
Log.e(TAG, "Unable to unregister media router.", ex);
}
mStub = null;
}
mShouldUpdateRoutes = true;
mStub = null;
}
}

View File

@@ -147,14 +147,16 @@ public final class MediaRouter2Manager {
}
synchronized (sLock) {
if (mCallbackRecords.size() == 0 && mClient != null) {
try {
mMediaRouterService.unregisterManager(mClient);
} catch (RemoteException ex) {
Log.e(TAG, "Unable to unregister media router manager", ex);
if (mCallbackRecords.size() == 0) {
if (mClient != null) {
try {
mMediaRouterService.unregisterManager(mClient);
} catch (RemoteException ex) {
Log.e(TAG, "Unable to unregister media router manager", ex);
}
mClient = null;
}
//TODO: clear mRoutes?
mClient = null;
mRoutes.clear();
mPreferredFeaturesMap.clear();
}
}

View File

@@ -36,6 +36,7 @@ import static com.android.mediaroutertest.StubMediaRoute2ProviderService.VOLUME_
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.content.Context;
@@ -160,6 +161,7 @@ public class MediaRouter2ManagerTest {
});
MediaRoute2Info routeToRemove = routes.get(ROUTE_ID2);
assertNotNull(routeToRemove);
StubMediaRoute2ProviderService sInstance =
StubMediaRoute2ProviderService.getInstance();
@@ -171,6 +173,52 @@ public class MediaRouter2ManagerTest {
assertTrue(addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
}
@Test
public void testGetRoutes_removedRoute_returnsCorrectRoutes() throws Exception {
CountDownLatch addedLatch = new CountDownLatch(1);
CountDownLatch removedLatch = new CountDownLatch(1);
RouteCallback routeCallback = new RouteCallback() {
// Used to ensure the removed route is added.
@Override
public void onRoutesAdded(List<MediaRoute2Info> routes) {
if (removedLatch.getCount() > 0) {
return;
}
addedLatch.countDown();
}
@Override
public void onRoutesRemoved(List<MediaRoute2Info> routes) {
removedLatch.countDown();
}
};
mRouter2.registerRouteCallback(mExecutor, routeCallback,
new RouteDiscoveryPreference.Builder(FEATURES_ALL, true).build());
mRouteCallbacks.add(routeCallback);
Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL);
MediaRoute2Info routeToRemove = routes.get(ROUTE_ID2);
assertNotNull(routeToRemove);
StubMediaRoute2ProviderService sInstance =
StubMediaRoute2ProviderService.getInstance();
assertNotNull(sInstance);
sInstance.removeRoute(ROUTE_ID2);
// Wait until the route is removed.
assertTrue(removedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
Map<String, MediaRoute2Info> newRoutes = waitAndGetRoutesWithManager(FEATURES_ALL);
assertNull(newRoutes.get(ROUTE_ID2));
// Revert the removal.
sInstance.addRoute(routeToRemove);
assertTrue(addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
mRouter2.unregisterRouteCallback(routeCallback);
}
/**
* Tests if we get proper routes for application that has special route feature.
*/
@@ -475,8 +523,8 @@ public class MediaRouter2ManagerTest {
MediaRouter2Manager.Callback managerCallback = new MediaRouter2Manager.Callback() {
@Override
public void onRoutesAdded(List<MediaRoute2Info> routes) {
for (int i = 0; i < routes.size(); i++) {
if (!routes.get(i).isSystemRoute()) {
for (MediaRoute2Info route : routes) {
if (!route.isSystemRoute()) {
addedLatch.countDown();
break;
}

View File

@@ -65,9 +65,9 @@ public class StubMediaRoute2ProviderService extends MediaRoute2ProviderService {
public static final String ROUTE_NAME_VARIABLE_VOLUME = "Variable Volume Route";
public static final String FEATURE_SAMPLE =
"com.android.mediarouteprovider.FEATURE_SAMPLE";
"com.android.mediaroutertest.FEATURE_SAMPLE";
public static final String FEATURE_SPECIAL =
"com.android.mediarouteprovider.FEATURE_SPECIAL";
"com.android.mediaroutertest..FEATURE_SPECIAL";
Map<String, MediaRoute2Info> mRoutes = new HashMap<>();
Map<String, String> mRouteIdToSessionId = new HashMap<>();