@Override public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo route) { if (route == null || !route.matchesSelector(mRouteSelector)) return; MediaSink sink = MediaSink.fromRoute(route); if (mSinks.contains(sink)) return; mSinks.add(sink); updateChromeMediaRouter(); }
@Override public void startObservingMediaSinks(String sourceId) { if (mAndroidMediaRouter == null) return; MediaSource source = MediaSource.from(sourceId); if (source == null) return; MediaRouteSelector routeSelector = source.buildRouteSelector(); if (routeSelector == null) { // If the application invalid, report no devices available. onSinksReceived(sourceId, new ArrayList<MediaSink>()); return; } String applicationId = source.getApplicationId(); DiscoveryCallback callback = mDiscoveryCallbacks.get(applicationId); if (callback != null) { callback.addSourceUrn(sourceId); return; } List<MediaSink> knownSinks = new ArrayList<MediaSink>(); for (RouteInfo route : mAndroidMediaRouter.getRoutes()) { if (route.matchesSelector(routeSelector)) { knownSinks.add(MediaSink.fromRoute(route)); } } callback = new DiscoveryCallback(sourceId, knownSinks, this, routeSelector); mAndroidMediaRouter.addCallback( routeSelector, callback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); mDiscoveryCallbacks.put(applicationId, callback); }
@Override public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) { // Sometimes onRouteAdded is not called for the route as it doesn't yet match the selector. // onRouteChanged() will be called later when the matching category is added. if (route == null) return; if (route.matchesSelector(mRouteSelector)) { onRouteAdded(router, route); } else { onRouteRemoved(router, route); } }