| Index: chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java
|
| index fd848c890a3eb6008cb496996d03a164a532f023..e8236b1667c8452009fd6d46685dfddf69c0b80b 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java
|
| @@ -31,10 +31,9 @@ public class ChromeMediaRouter implements MediaRouteManager {
|
|
|
| private static final String TAG = "MediaRouter";
|
|
|
| + // The pointer to the native object. Can be null only during tests.
|
| private final long mNativeMediaRouterAndroid;
|
| private final List<MediaRouteProvider> mRouteProviders = new ArrayList<MediaRouteProvider>();
|
| - private final Map<String, MediaRouteProvider> mSinkIdsToProviders =
|
| - new HashMap<String, MediaRouteProvider>();
|
| private final Map<String, MediaRouteProvider> mRouteIdsToProviders =
|
| new HashMap<String, MediaRouteProvider>();
|
| private final Map<String, Map<MediaRouteProvider, List<MediaSink>>> mSinksPerSourcePerProvider =
|
| @@ -42,6 +41,27 @@ public class ChromeMediaRouter implements MediaRouteManager {
|
| private final Map<String, List<MediaSink>> mSinksPerSource =
|
| new HashMap<String, List<MediaSink>>();
|
|
|
| + @VisibleForTesting
|
| + protected List<MediaRouteProvider> getRouteProvidersForTest() {
|
| + return mRouteProviders;
|
| + }
|
| +
|
| + @VisibleForTesting
|
| + protected Map<String, MediaRouteProvider> getRouteIdsToProvidersForTest() {
|
| + return mRouteIdsToProviders;
|
| + }
|
| +
|
| + @VisibleForTesting
|
| + protected Map<String, Map<MediaRouteProvider, List<MediaSink>>>
|
| + getSinksPerSourcePerProviderForTest() {
|
| + return mSinksPerSourcePerProvider;
|
| + }
|
| +
|
| + @VisibleForTesting
|
| + protected Map<String, List<MediaSink>> getSinksPerSourceForTest() {
|
| + return mSinksPerSource;
|
| + }
|
| +
|
| /**
|
| * Obtains the {@link MediaRouter} instance given the application context.
|
| * @param applicationContext The context to get the Android media router service for.
|
| @@ -78,7 +98,9 @@ public class ChromeMediaRouter implements MediaRouteManager {
|
| for (List<MediaSink> s : sinksPerProvider.values()) allSinksPerSource.addAll(s);
|
|
|
| mSinksPerSource.put(sourceId, allSinksPerSource);
|
| - nativeOnSinksReceived(mNativeMediaRouterAndroid, sourceId, allSinksPerSource.size());
|
| + if (mNativeMediaRouterAndroid != 0) {
|
| + nativeOnSinksReceived(mNativeMediaRouterAndroid, sourceId, allSinksPerSource.size());
|
| + }
|
| }
|
|
|
| @Override
|
| @@ -86,18 +108,25 @@ public class ChromeMediaRouter implements MediaRouteManager {
|
| String mediaRouteId, String mediaSinkId, int requestId, MediaRouteProvider provider,
|
| boolean wasLaunched) {
|
| mRouteIdsToProviders.put(mediaRouteId, provider);
|
| - nativeOnRouteCreated(mNativeMediaRouterAndroid, mediaRouteId, mediaSinkId, requestId,
|
| - wasLaunched);
|
| + if (mNativeMediaRouterAndroid != 0) {
|
| + nativeOnRouteCreated(mNativeMediaRouterAndroid, mediaRouteId, mediaSinkId, requestId,
|
| + wasLaunched);
|
| + }
|
| }
|
|
|
| @Override
|
| public void onRouteRequestError(String errorText, int requestId) {
|
| - nativeOnRouteRequestError(mNativeMediaRouterAndroid, errorText, requestId);
|
| + if (mNativeMediaRouterAndroid != 0) {
|
| + nativeOnRouteRequestError(mNativeMediaRouterAndroid, errorText, requestId);
|
| + }
|
| }
|
|
|
| @Override
|
| public void onRouteClosed(String mediaRouteId) {
|
| - nativeOnRouteClosed(mNativeMediaRouterAndroid, mediaRouteId);
|
| + if (mNativeMediaRouterAndroid != 0) {
|
| + nativeOnRouteClosed(mNativeMediaRouterAndroid, mediaRouteId);
|
| + }
|
| + mRouteIdsToProviders.remove(mediaRouteId);
|
| }
|
|
|
| @Override
|
| @@ -119,7 +148,11 @@ public class ChromeMediaRouter implements MediaRouteManager {
|
| @CalledByNative
|
| public static ChromeMediaRouter create(long nativeMediaRouterAndroid,
|
| Context applicationContext) {
|
| - return new ChromeMediaRouter(nativeMediaRouterAndroid, applicationContext);
|
| + ChromeMediaRouter router = new ChromeMediaRouter(nativeMediaRouterAndroid);
|
| + MediaRouteProvider provider = CastMediaRouteProvider.create(applicationContext, router);
|
| + if (provider != null) router.addMediaRouteProvider(provider);
|
| +
|
| + return router;
|
| }
|
|
|
| /**
|
| @@ -254,6 +287,7 @@ public class ChromeMediaRouter implements MediaRouteManager {
|
| assert provider != null;
|
|
|
| provider.detachRoute(routeId);
|
| + mRouteIdsToProviders.remove(routeId);
|
| }
|
|
|
| /**
|
| @@ -285,13 +319,15 @@ public class ChromeMediaRouter implements MediaRouteManager {
|
| }
|
|
|
| @VisibleForTesting
|
| - ChromeMediaRouter(long nativeMediaRouter, Context applicationContext) {
|
| - MediaRouteProvider provider = CastMediaRouteProvider.create(applicationContext, this);
|
| - if (provider != null) mRouteProviders.add(provider);
|
| -
|
| + protected ChromeMediaRouter(long nativeMediaRouter) {
|
| mNativeMediaRouterAndroid = nativeMediaRouter;
|
| }
|
|
|
| + @VisibleForTesting
|
| + protected void addMediaRouteProvider(MediaRouteProvider provider) {
|
| + mRouteProviders.add(provider);
|
| + }
|
| +
|
| private MediaSink getSink(String sourceId, int index) {
|
| assert mSinksPerSource.containsKey(sourceId);
|
| return mSinksPerSource.get(sourceId).get(index);
|
| @@ -318,4 +354,4 @@ public class ChromeMediaRouter implements MediaRouteManager {
|
| native void nativeOnMessageSentResult(
|
| long nativeMediaRouterAndroid, boolean success, int callbackId);
|
| native void nativeOnMessage(long nativeMediaRouterAndroid, String mediaRouteId, String message);
|
| -}
|
| +}
|
|
|