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); |
-} |
+} |