diff options
4 files changed, 71 insertions, 64 deletions
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 0be49d88d10c..910003270845 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -547,8 +547,6 @@ public class MediaRouter2 { * {@link SessionCallback#onSessionCreationFailed}. * <p> * Pass {@code null} to sessionInfo for the failure case. - * - * TODO: What should router do when the session is created by manager? */ void createControllerOnHandler(@Nullable RouteSessionInfo sessionInfo, int requestId) { SessionCreationRequest matchingRequest = null; @@ -559,40 +557,44 @@ public class MediaRouter2 { } } - if (matchingRequest == null) { - Log.w(TAG, "Ignoring session creation result for unknown request." - + " requestId=" + requestId + ", sessionInfo=" + sessionInfo); - return; - } + if (matchingRequest != null) { + mSessionCreationRequests.remove(matchingRequest); - mSessionCreationRequests.remove(matchingRequest); + MediaRoute2Info requestedRoute = matchingRequest.mRoute; + String requestedControlCategory = matchingRequest.mControlCategory; - MediaRoute2Info requestedRoute = matchingRequest.mRoute; - String requestedControlCategory = matchingRequest.mControlCategory; + if (sessionInfo == null) { + // TODO: We may need to distinguish between failure and rejection. + // One way can be introducing 'reason'. + notifySessionCreationFailed(requestedRoute, requestedControlCategory); + return; + } else if (!TextUtils.equals(requestedControlCategory, + sessionInfo.getControlCategory())) { + Log.w(TAG, "The session has different control category from what we requested. " + + "(requested=" + requestedControlCategory + + ", actual=" + sessionInfo.getControlCategory() + + ")"); + notifySessionCreationFailed(requestedRoute, requestedControlCategory); + return; + } else if (!sessionInfo.getSelectedRoutes().contains(requestedRoute.getId())) { + Log.w(TAG, "The session does not contain the requested route. " + + "(requestedRouteId=" + requestedRoute.getId() + + ", actualRoutes=" + sessionInfo.getSelectedRoutes() + + ")"); + notifySessionCreationFailed(requestedRoute, requestedControlCategory); + return; + } else if (!TextUtils.equals(requestedRoute.getProviderId(), + sessionInfo.getProviderId())) { + Log.w(TAG, "The session's provider ID does not match the requested route's. " + + "(requested route's providerId=" + requestedRoute.getProviderId() + + ", actual providerId=" + sessionInfo.getProviderId() + + ")"); + notifySessionCreationFailed(requestedRoute, requestedControlCategory); + return; + } + } - if (sessionInfo == null) { - // TODO: We may need to distinguish between failure and rejection. - // One way can be introducing 'reason'. - notifySessionCreationFailed(requestedRoute, requestedControlCategory); - } else if (!TextUtils.equals(requestedControlCategory, sessionInfo.getControlCategory())) { - Log.w(TAG, "The session has different control category from what we requested. " - + "(requested=" + requestedControlCategory - + ", actual=" + sessionInfo.getControlCategory() - + ")"); - notifySessionCreationFailed(requestedRoute, requestedControlCategory); - } else if (!sessionInfo.getSelectedRoutes().contains(requestedRoute.getId())) { - Log.w(TAG, "The session does not contain the requested route. " - + "(requestedRouteId=" + requestedRoute.getId() - + ", actualRoutes=" + sessionInfo.getSelectedRoutes() - + ")"); - notifySessionCreationFailed(requestedRoute, requestedControlCategory); - } else if (!TextUtils.equals(requestedRoute.getProviderId(), sessionInfo.getProviderId())) { - Log.w(TAG, "The session's provider ID does not match the requested route's. " - + "(requested route's providerId=" + requestedRoute.getProviderId() - + ", actual providerId=" + sessionInfo.getProviderId() - + ")"); - notifySessionCreationFailed(requestedRoute, requestedControlCategory); - } else { + if (sessionInfo != null) { RouteSessionController controller = new RouteSessionController(sessionInfo); mSessionControllers.put(controller.getUniqueSessionId(), controller); notifySessionCreated(controller); diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java index 1d51c9638bf0..83c7c173e8e8 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java @@ -29,6 +29,7 @@ import android.content.Intent; import android.media.MediaRoute2Info; import android.media.MediaRouter2; import android.media.MediaRouter2.RouteCallback; +import android.media.MediaRouter2.SessionCallback; import android.media.MediaRouter2Manager; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; @@ -101,8 +102,8 @@ public class MediaRouterManagerTest { private String mPackageName; private final List<MediaRouter2Manager.Callback> mManagerCallbacks = new ArrayList<>(); - private final List<RouteCallback> mRouteCallbacks = - new ArrayList<>(); + private final List<RouteCallback> mRouteCallbacks = new ArrayList<>(); + private final List<SessionCallback> mSessionCallbacks = new ArrayList<>(); public static final List<String> CATEGORIES_ALL = new ArrayList(); public static final List<String> CATEGORIES_SPECIAL = new ArrayList(); @@ -205,27 +206,26 @@ public class MediaRouterManagerTest { } /** - * Tests if MR2.Callback.onRouteSelected is called when a route is selected from MR2Manager. - * - * TODO: Change this test so that this test check whether the route is added in a session. - * Until then, temporailiy marking @Ignore + * Tests if MR2.SessionCallback.onSessionCreated is called + * when a route is selected from MR2Manager. */ @Test - @Ignore - public void testRouterOnRouteSelected() throws Exception { + public void testRouterOnSessionCreated() throws Exception { Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CATEGORIES_ALL); CountDownLatch latch = new CountDownLatch(1); addManagerCallback(new MediaRouter2Manager.Callback()); -// addRouterCallback(new RouteDiscoveryCallback() { -// @Override -// public void onRouteSelected(MediaRoute2Info route, int reason, Bundle controlHints) { -// if (route != null && TextUtils.equals(route.getId(), ROUTE_ID1)) { -// latch.countDown(); -// } -// } -// }); + //TODO: remove this when it's not necessary. + addRouterCallback(new MediaRouter2.RouteCallback()); + addSessionCallback(new SessionCallback() { + @Override + public void onSessionCreated(MediaRouter2.RouteSessionController controller) { + if (createRouteMap(controller.getSelectedRoutes()).containsKey(ROUTE_ID1)) { + latch.countDown(); + } + } + }); MediaRoute2Info routeToSelect = routes.get(ROUTE_ID1); assertNotNull(routeToSelect); @@ -446,6 +446,11 @@ public class MediaRouterManagerTest { mRouter2.registerRouteCallback(mExecutor, routeCallback); } + private void addSessionCallback(SessionCallback sessionCallback) { + mSessionCallbacks.add(sessionCallback); + mRouter2.registerSessionCallback(mExecutor, sessionCallback); + } + private void clearCallbacks() { for (MediaRouter2Manager.Callback callback : mManagerCallbacks) { mManager.unregisterCallback(callback); @@ -456,5 +461,10 @@ public class MediaRouterManagerTest { mRouter2.unregisterRouteCallback(routeCallback); } mRouteCallbacks.clear(); + + for (SessionCallback sessionCallback : mSessionCallbacks) { + mRouter2.unregisterSessionCallback(sessionCallback); + } + mSessionCallbacks.clear(); } } diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java index 423001fcb84f..f8d8f9fd5fbd 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java @@ -286,6 +286,11 @@ final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements Serv if (mActiveConnection != connection) { return; } + if (sessionInfo != null) { + sessionInfo = new RouteSessionInfo.Builder(sessionInfo) + .setProviderId(getUniqueId()) + .build(); + } mCallback.onSessionCreated(this, sessionInfo, requestId); } diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 0bdcc97b95c2..82d22505b303 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -1071,12 +1071,6 @@ class MediaRouter2ServiceImpl { return; } - //TODO: remove this when we are sure that request id is properly implemented. - if (matchingRequest.mClientRecord.mClientId != toClientId(requestId)) { - Slog.w(TAG, "Client id is changed. This shouldn't happen."); - return; - } - mSessionCreationRequests.remove(matchingRequest); if (sessionInfo == null) { @@ -1086,21 +1080,17 @@ class MediaRouter2ServiceImpl { return; } - RouteSessionInfo sessionInfoWithProviderId = new RouteSessionInfo.Builder(sessionInfo) - .setProviderId(provider.getUniqueId()) - .build(); - String originalRouteId = matchingRequest.mRoute.getId(); String originalCategory = matchingRequest.mControlCategory; Client2Record client2Record = matchingRequest.mClientRecord; - if (!sessionInfoWithProviderId.getSelectedRoutes().contains(originalRouteId) + if (!sessionInfo.getSelectedRoutes().contains(originalRouteId) || !TextUtils.equals(originalCategory, - sessionInfoWithProviderId.getControlCategory())) { + sessionInfo.getControlCategory())) { Slog.w(TAG, "Created session doesn't match the original request." + " originalRouteId=" + originalRouteId + ", originalCategory=" + originalCategory + ", requestId=" + requestId - + ", sessionInfo=" + sessionInfoWithProviderId); + + ", sessionInfo=" + sessionInfo); notifySessionCreationFailed(matchingRequest.mClientRecord, toClientRequestId(requestId)); return; @@ -1108,8 +1098,8 @@ class MediaRouter2ServiceImpl { // Succeeded notifySessionCreated(matchingRequest.mClientRecord, - sessionInfoWithProviderId, toClientRequestId(requestId)); - mSessionToClientMap.put(sessionInfoWithProviderId.getUniqueSessionId(), client2Record); + sessionInfo, toClientRequestId(requestId)); + mSessionToClientMap.put(sessionInfo.getUniqueSessionId(), client2Record); // TODO: Tell managers for the session creation } |