Commit 80ca3d20 authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

Prepare Media Router Java code for componentization.

This change introduces a client interface for Media Router
which separates the embedder specific actions from shared
behavior, MediaRouterClient. The term "client" is used over
"delegate" because it's a singleton.

Additionally, symbol names that use "Chrome" are updated to
use "Browser" instead.

After this change, all of [...]chrome.browser.media.router
(save the new client, ChromeMediaRouterClient, which is
Chrome specific) can be moved to [...]components.media_router.

Bug: 1057100

Change-Id: I94b538b4fdb5868eda2149847b5e23c048f3cd28
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2373293Reviewed-by: default avatarmark a. foltz <mfoltz@chromium.org>
Reviewed-by: default avatarThomas Guilbert <tguilbert@chromium.org>
Reviewed-by: default avatarZhiqiang Zhang <zqzhang@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#804074}
parent ba9ef9f8
...@@ -18,7 +18,11 @@ android_library("java") { ...@@ -18,7 +18,11 @@ android_library("java") {
"//base:base_java", "//base:base_java",
"//base:jni_java", "//base:jni_java",
"//chrome/android:chrome_java", "//chrome/android:chrome_java",
"//chrome/browser/tab:java",
"//components/browser_ui/media/android:java", "//components/browser_ui/media/android:java",
# For WebContents.
"//content/public/android:content_java",
"//services/media_session/public/cpp/android:media_session_java", "//services/media_session/public/cpp/android:media_session_java",
"//third_party/android_deps:android_support_v7_appcompat_java", "//third_party/android_deps:android_support_v7_appcompat_java",
"//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_annotation_annotation_java",
...@@ -29,10 +33,11 @@ android_library("java") { ...@@ -29,10 +33,11 @@ android_library("java") {
] ]
sources = [ sources = [
"java/src/org/chromium/chrome/browser/media/router/BaseMediaRouteDialogManager.java", "java/src/org/chromium/chrome/browser/media/router/BaseMediaRouteDialogManager.java",
"java/src/org/chromium/chrome/browser/media/router/BrowserMediaRouter.java",
"java/src/org/chromium/chrome/browser/media/router/BrowserMediaRouterDialogController.java",
"java/src/org/chromium/chrome/browser/media/router/CastRequestIdGenerator.java", "java/src/org/chromium/chrome/browser/media/router/CastRequestIdGenerator.java",
"java/src/org/chromium/chrome/browser/media/router/CastSessionUtil.java", "java/src/org/chromium/chrome/browser/media/router/CastSessionUtil.java",
"java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java", "java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterClient.java",
"java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java",
"java/src/org/chromium/chrome/browser/media/router/ClientRecord.java", "java/src/org/chromium/chrome/browser/media/router/ClientRecord.java",
"java/src/org/chromium/chrome/browser/media/router/DiscoveryCallback.java", "java/src/org/chromium/chrome/browser/media/router/DiscoveryCallback.java",
"java/src/org/chromium/chrome/browser/media/router/DiscoveryDelegate.java", "java/src/org/chromium/chrome/browser/media/router/DiscoveryDelegate.java",
...@@ -46,6 +51,7 @@ android_library("java") { ...@@ -46,6 +51,7 @@ android_library("java") {
"java/src/org/chromium/chrome/browser/media/router/MediaRouteDialogManager.java", "java/src/org/chromium/chrome/browser/media/router/MediaRouteDialogManager.java",
"java/src/org/chromium/chrome/browser/media/router/MediaRouteManager.java", "java/src/org/chromium/chrome/browser/media/router/MediaRouteManager.java",
"java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java", "java/src/org/chromium/chrome/browser/media/router/MediaRouteProvider.java",
"java/src/org/chromium/chrome/browser/media/router/MediaRouterClient.java",
"java/src/org/chromium/chrome/browser/media/router/MediaSink.java", "java/src/org/chromium/chrome/browser/media/router/MediaSink.java",
"java/src/org/chromium/chrome/browser/media/router/MediaSource.java", "java/src/org/chromium/chrome/browser/media/router/MediaSource.java",
"java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java", "java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java",
...@@ -74,8 +80,9 @@ android_library("java") { ...@@ -74,8 +80,9 @@ android_library("java") {
generate_jni("jni_headers") { generate_jni("jni_headers") {
sources = [ sources = [
"java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java", "java/src/org/chromium/chrome/browser/media/router/BrowserMediaRouter.java",
"java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java", "java/src/org/chromium/chrome/browser/media/router/BrowserMediaRouterDialogController.java",
"java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterClient.java",
"java/src/org/chromium/chrome/browser/media/router/FlingingControllerBridge.java", "java/src/org/chromium/chrome/browser/media/router/FlingingControllerBridge.java",
"java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java", "java/src/org/chromium/chrome/browser/media/router/MediaStatusBridge.java",
] ]
...@@ -111,9 +118,9 @@ android_library("test_java") { ...@@ -111,9 +118,9 @@ android_library("test_java") {
junit_binary("media_router_junit_tests") { junit_binary("media_router_junit_tests") {
sources = [ sources = [
"junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterRouteTest.java", "junit/src/org/chromium/chrome/browser/media/router/BrowserMediaRouterRouteTest.java",
"junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterSinkObservationTest.java", "junit/src/org/chromium/chrome/browser/media/router/BrowserMediaRouterSinkObservationTest.java",
"junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterTestBase.java", "junit/src/org/chromium/chrome/browser/media/router/BrowserMediaRouterTestBase.java",
"junit/src/org/chromium/chrome/browser/media/router/DiscoveryCallbackTest.java", "junit/src/org/chromium/chrome/browser/media/router/DiscoveryCallbackTest.java",
"junit/src/org/chromium/chrome/browser/media/router/JSONTestUtils.java", "junit/src/org/chromium/chrome/browser/media/router/JSONTestUtils.java",
"junit/src/org/chromium/chrome/browser/media/router/TestUtils.java", "junit/src/org/chromium/chrome/browser/media/router/TestUtils.java",
...@@ -136,6 +143,7 @@ junit_binary("media_router_junit_tests") { ...@@ -136,6 +143,7 @@ junit_binary("media_router_junit_tests") {
"//base:base_java", "//base:base_java",
"//base:base_java_test_support", "//base:base_java_test_support",
"//base:base_junit_test_support", "//base:base_junit_test_support",
"//content/public/android:content_java",
"//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:androidx_mediarouter_mediarouter_java", "//third_party/android_deps:androidx_mediarouter_mediarouter_java",
] ]
......
include_rules = [
"+chrome/browser/tab/java",
"+components/browser_ui/media/android",
"-content/public/android",
"+content/public/android/java/src/org/chromium/content_public",
]
...@@ -106,7 +106,7 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan ...@@ -106,7 +106,7 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan
String sourceId, MediaRouteSelector routeSelector, MediaRouteDialogDelegate delegate) { String sourceId, MediaRouteSelector routeSelector, MediaRouteDialogDelegate delegate) {
mSourceId = sourceId; mSourceId = sourceId;
mRouteSelector = routeSelector; mRouteSelector = routeSelector;
mAndroidMediaRouter = ChromeMediaRouter.getAndroidMediaRouter(); mAndroidMediaRouter = BrowserMediaRouter.getAndroidMediaRouter();
mDelegate = delegate; mDelegate = delegate;
} }
......
...@@ -22,6 +22,7 @@ import org.chromium.base.annotations.JNINamespace; ...@@ -22,6 +22,7 @@ import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.media.router.caf.CafMediaRouteProvider; import org.chromium.chrome.browser.media.router.caf.CafMediaRouteProvider;
import org.chromium.chrome.browser.media.router.caf.remoting.CafRemotingMediaRouteProvider; import org.chromium.chrome.browser.media.router.caf.remoting.CafRemotingMediaRouteProvider;
import org.chromium.content_public.browser.WebContents;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
...@@ -33,7 +34,7 @@ import java.util.Map; ...@@ -33,7 +34,7 @@ import java.util.Map;
* Owns a list of {@link MediaRouteProvider} implementations and dispatches native calls to them. * Owns a list of {@link MediaRouteProvider} implementations and dispatches native calls to them.
*/ */
@JNINamespace("media_router") @JNINamespace("media_router")
public class ChromeMediaRouter implements MediaRouteManager { public class BrowserMediaRouter implements MediaRouteManager {
private static final String TAG = "MediaRouter"; private static final String TAG = "MediaRouter";
private static final int MIN_GOOGLE_PLAY_SERVICES_APK_VERSION = 12600000; private static final int MIN_GOOGLE_PLAY_SERVICES_APK_VERSION = 12600000;
...@@ -149,8 +150,8 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -149,8 +150,8 @@ public class ChromeMediaRouter implements MediaRouteManager {
mSinksPerSource.put(sourceId, allSinksPerSource); mSinksPerSource.put(sourceId, allSinksPerSource);
if (mNativeMediaRouterAndroidBridge != 0) { if (mNativeMediaRouterAndroidBridge != 0) {
ChromeMediaRouterJni.get().onSinksReceived(mNativeMediaRouterAndroidBridge, BrowserMediaRouterJni.get().onSinksReceived(mNativeMediaRouterAndroidBridge,
ChromeMediaRouter.this, sourceId, allSinksPerSource.size()); BrowserMediaRouter.this, sourceId, allSinksPerSource.size());
} }
} }
...@@ -159,24 +160,24 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -159,24 +160,24 @@ public class ChromeMediaRouter implements MediaRouteManager {
MediaRouteProvider provider, boolean wasLaunched) { MediaRouteProvider provider, boolean wasLaunched) {
mRouteIdsToProviders.put(mediaRouteId, provider); mRouteIdsToProviders.put(mediaRouteId, provider);
if (mNativeMediaRouterAndroidBridge != 0) { if (mNativeMediaRouterAndroidBridge != 0) {
ChromeMediaRouterJni.get().onRouteCreated(mNativeMediaRouterAndroidBridge, BrowserMediaRouterJni.get().onRouteCreated(mNativeMediaRouterAndroidBridge,
ChromeMediaRouter.this, mediaRouteId, mediaSinkId, requestId, wasLaunched); BrowserMediaRouter.this, mediaRouteId, mediaSinkId, requestId, wasLaunched);
} }
} }
@Override @Override
public void onRouteRequestError(String errorText, int requestId) { public void onRouteRequestError(String errorText, int requestId) {
if (mNativeMediaRouterAndroidBridge != 0) { if (mNativeMediaRouterAndroidBridge != 0) {
ChromeMediaRouterJni.get().onRouteRequestError( BrowserMediaRouterJni.get().onRouteRequestError(
mNativeMediaRouterAndroidBridge, ChromeMediaRouter.this, errorText, requestId); mNativeMediaRouterAndroidBridge, BrowserMediaRouter.this, errorText, requestId);
} }
} }
@Override @Override
public void onRouteTerminated(String mediaRouteId) { public void onRouteTerminated(String mediaRouteId) {
if (mNativeMediaRouterAndroidBridge != 0) { if (mNativeMediaRouterAndroidBridge != 0) {
ChromeMediaRouterJni.get().onRouteTerminated( BrowserMediaRouterJni.get().onRouteTerminated(
mNativeMediaRouterAndroidBridge, ChromeMediaRouter.this, mediaRouteId); mNativeMediaRouterAndroidBridge, BrowserMediaRouter.this, mediaRouteId);
} }
mRouteIdsToProviders.remove(mediaRouteId); mRouteIdsToProviders.remove(mediaRouteId);
} }
...@@ -184,8 +185,8 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -184,8 +185,8 @@ public class ChromeMediaRouter implements MediaRouteManager {
@Override @Override
public void onRouteClosed(String mediaRouteId, String error) { public void onRouteClosed(String mediaRouteId, String error) {
if (mNativeMediaRouterAndroidBridge != 0) { if (mNativeMediaRouterAndroidBridge != 0) {
ChromeMediaRouterJni.get().onRouteClosed( BrowserMediaRouterJni.get().onRouteClosed(
mNativeMediaRouterAndroidBridge, ChromeMediaRouter.this, mediaRouteId, error); mNativeMediaRouterAndroidBridge, BrowserMediaRouter.this, mediaRouteId, error);
} }
mRouteIdsToProviders.remove(mediaRouteId); mRouteIdsToProviders.remove(mediaRouteId);
} }
...@@ -193,19 +194,19 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -193,19 +194,19 @@ public class ChromeMediaRouter implements MediaRouteManager {
@Override @Override
public void onMessage(String mediaRouteId, String message) { public void onMessage(String mediaRouteId, String message) {
if (mNativeMediaRouterAndroidBridge != 0) { if (mNativeMediaRouterAndroidBridge != 0) {
ChromeMediaRouterJni.get().onMessage( BrowserMediaRouterJni.get().onMessage(mNativeMediaRouterAndroidBridge,
mNativeMediaRouterAndroidBridge, ChromeMediaRouter.this, mediaRouteId, message); BrowserMediaRouter.this, mediaRouteId, message);
} }
} }
/** /**
* Initializes the media router and its providers. * Initializes the media router and its providers.
* @param nativeMediaRouterAndroidBridge the handler for the native counterpart of this instance * @param nativeMediaRouterAndroidBridge the handler for the native counterpart of this instance
* @return an initialized {@link ChromeMediaRouter} instance * @return an initialized {@link BrowserMediaRouter} instance
*/ */
@CalledByNative @CalledByNative
public static ChromeMediaRouter create(long nativeMediaRouterAndroidBridge) { public static BrowserMediaRouter create(long nativeMediaRouterAndroidBridge) {
ChromeMediaRouter router = new ChromeMediaRouter(nativeMediaRouterAndroidBridge); BrowserMediaRouter router = new BrowserMediaRouter(nativeMediaRouterAndroidBridge);
sRouteProviderFactory.addProviders(router); sRouteProviderFactory.addProviders(router);
return router; return router;
} }
...@@ -276,13 +277,12 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -276,13 +277,12 @@ public class ChromeMediaRouter implements MediaRouteManager {
* @param sinkId the id of the {@link MediaSink} to route the source to. * @param sinkId the id of the {@link MediaSink} to route the source to.
* @param presentationId the id of the presentation to be used by the page. * @param presentationId the id of the presentation to be used by the page.
* @param origin the origin of the frame requesting a new route. * @param origin the origin of the frame requesting a new route.
* @param tabId the id of the tab the requesting frame belongs to. * @param webContents the {@link WebContents} that owns the frame that requested the route.
* @param isOffTheRecord whether the route is being requested from an OffTheRecord profile.
* @param requestId the id of the route creation request tracked by the native side. * @param requestId the id of the route creation request tracked by the native side.
*/ */
@CalledByNative @CalledByNative
public void createRoute(String sourceId, String sinkId, String presentationId, String origin, public void createRoute(String sourceId, String sinkId, String presentationId, String origin,
int tabId, boolean isOffTheRecord, int requestId) { WebContents webContents, int requestId) {
MediaRouteProvider provider = getProviderForSource(sourceId); MediaRouteProvider provider = getProviderForSource(sourceId);
if (provider == null) { if (provider == null) {
onRouteRequestError("No provider supports createRoute with source: " + sourceId onRouteRequestError("No provider supports createRoute with source: " + sourceId
...@@ -291,8 +291,9 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -291,8 +291,9 @@ public class ChromeMediaRouter implements MediaRouteManager {
return; return;
} }
provider.createRoute( provider.createRoute(sourceId, sinkId, presentationId, origin,
sourceId, sinkId, presentationId, origin, tabId, isOffTheRecord, requestId); MediaRouterClient.getInstance().getTabId(webContents), webContents.isIncognito(),
requestId);
} }
/** /**
...@@ -302,19 +303,20 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -302,19 +303,20 @@ public class ChromeMediaRouter implements MediaRouteManager {
* @param sinkId the id of the {@link MediaSink} to route the source to. * @param sinkId the id of the {@link MediaSink} to route the source to.
* @param presentationId the id of the presentation to be used by the page. * @param presentationId the id of the presentation to be used by the page.
* @param origin the origin of the frame requesting a new route. * @param origin the origin of the frame requesting a new route.
* @param tabId the id of the tab the requesting frame belongs to. * @param webContents the {@link WebContents} that owns the frame that requested the route.
* @param requestId the id of the route creation request tracked by the native side. * @param requestId the id of the route creation request tracked by the native side.
*/ */
@CalledByNative @CalledByNative
public void joinRoute( public void joinRoute(String sourceId, String presentationId, String origin,
String sourceId, String presentationId, String origin, int tabId, int requestId) { WebContents webContents, int requestId) {
MediaRouteProvider provider = getProviderForSource(sourceId); MediaRouteProvider provider = getProviderForSource(sourceId);
if (provider == null) { if (provider == null) {
onRouteRequestError("Route not found.", requestId); onRouteRequestError("Route not found.", requestId);
return; return;
} }
provider.joinRoute(sourceId, presentationId, origin, tabId, requestId); provider.joinRoute(sourceId, presentationId, origin,
MediaRouterClient.getInstance().getTabId(webContents), requestId);
} }
/** /**
...@@ -375,7 +377,7 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -375,7 +377,7 @@ public class ChromeMediaRouter implements MediaRouteManager {
} }
@VisibleForTesting @VisibleForTesting
protected ChromeMediaRouter(long nativeMediaRouterAndroidBridge) { protected BrowserMediaRouter(long nativeMediaRouterAndroidBridge) {
mNativeMediaRouterAndroidBridge = nativeMediaRouterAndroidBridge; mNativeMediaRouterAndroidBridge = nativeMediaRouterAndroidBridge;
} }
...@@ -402,18 +404,18 @@ public class ChromeMediaRouter implements MediaRouteManager { ...@@ -402,18 +404,18 @@ public class ChromeMediaRouter implements MediaRouteManager {
@NativeMethods @NativeMethods
interface Natives { interface Natives {
void onSinksReceived(long nativeMediaRouterAndroidBridge, ChromeMediaRouter caller, void onSinksReceived(long nativeMediaRouterAndroidBridge, BrowserMediaRouter caller,
String sourceUrn, int count); String sourceUrn, int count);
void onRouteCreated(long nativeMediaRouterAndroidBridge, ChromeMediaRouter caller, void onRouteCreated(long nativeMediaRouterAndroidBridge, BrowserMediaRouter caller,
String mediaRouteId, String mediaSinkId, int createRouteRequestId, String mediaRouteId, String mediaSinkId, int createRouteRequestId,
boolean wasLaunched); boolean wasLaunched);
void onRouteRequestError(long nativeMediaRouterAndroidBridge, ChromeMediaRouter caller, void onRouteRequestError(long nativeMediaRouterAndroidBridge, BrowserMediaRouter caller,
String errorText, int createRouteRequestId); String errorText, int createRouteRequestId);
void onRouteTerminated( void onRouteTerminated(long nativeMediaRouterAndroidBridge, BrowserMediaRouter caller,
long nativeMediaRouterAndroidBridge, ChromeMediaRouter caller, String mediaRouteId); String mediaRouteId);
void onRouteClosed(long nativeMediaRouterAndroidBridge, ChromeMediaRouter caller, void onRouteClosed(long nativeMediaRouterAndroidBridge, BrowserMediaRouter caller,
String mediaRouteId, String message); String mediaRouteId, String message);
void onMessage(long nativeMediaRouterAndroidBridge, ChromeMediaRouter caller, void onMessage(long nativeMediaRouterAndroidBridge, BrowserMediaRouter caller,
String mediaRouteId, String message); String mediaRouteId, String message);
} }
} }
...@@ -19,7 +19,7 @@ import org.chromium.chrome.browser.media.router.caf.remoting.RemotingMediaSource ...@@ -19,7 +19,7 @@ import org.chromium.chrome.browser.media.router.caf.remoting.RemotingMediaSource
* on Android. * on Android.
*/ */
@JNINamespace("media_router") @JNINamespace("media_router")
public class ChromeMediaRouterDialogController implements MediaRouteDialogDelegate { public class BrowserMediaRouterDialogController implements MediaRouteDialogDelegate {
private static final String MEDIA_ROUTE_CONTROLLER_DIALOG_FRAGMENT = private static final String MEDIA_ROUTE_CONTROLLER_DIALOG_FRAGMENT =
"android.support.v7.mediarouter:MediaRouteControllerDialogFragment"; "android.support.v7.mediarouter:MediaRouteControllerDialogFragment";
...@@ -27,13 +27,13 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega ...@@ -27,13 +27,13 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega
private MediaRouteDialogManager mDialogManager; private MediaRouteDialogManager mDialogManager;
/** /**
* Returns a new initialized {@link ChromeMediaRouterDialogController}. * Returns a new initialized {@link BrowserMediaRouterDialogController}.
* @param nativeDialogController the handle of the native object. * @param nativeDialogController the handle of the native object.
* @return a new dialog controller to use from the native side. * @return a new dialog controller to use from the native side.
*/ */
@CalledByNative @CalledByNative
public static ChromeMediaRouterDialogController create(long nativeDialogController) { public static BrowserMediaRouterDialogController create(long nativeDialogController) {
return new ChromeMediaRouterDialogController(nativeDialogController); return new BrowserMediaRouterDialogController(nativeDialogController);
} }
/** /**
...@@ -55,8 +55,8 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega ...@@ -55,8 +55,8 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega
MediaRouteSelector routeSelector = source == null ? null : source.buildRouteSelector(); MediaRouteSelector routeSelector = source == null ? null : source.buildRouteSelector();
if (routeSelector == null) { if (routeSelector == null) {
ChromeMediaRouterDialogControllerJni.get().onMediaSourceNotSupported( BrowserMediaRouterDialogControllerJni.get().onMediaSourceNotSupported(
mNativeDialogController, ChromeMediaRouterDialogController.this); mNativeDialogController, BrowserMediaRouterDialogController.this);
return; return;
} }
...@@ -80,8 +80,8 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega ...@@ -80,8 +80,8 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega
MediaRouteSelector routeSelector = source == null ? null : source.buildRouteSelector(); MediaRouteSelector routeSelector = source == null ? null : source.buildRouteSelector();
if (routeSelector == null) { if (routeSelector == null) {
ChromeMediaRouterDialogControllerJni.get().onMediaSourceNotSupported( BrowserMediaRouterDialogControllerJni.get().onMediaSourceNotSupported(
mNativeDialogController, ChromeMediaRouterDialogController.this); mNativeDialogController, BrowserMediaRouterDialogController.this);
return; return;
} }
...@@ -112,15 +112,15 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega ...@@ -112,15 +112,15 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega
@Override @Override
public void onSinkSelected(String sourceUrn, MediaSink sink) { public void onSinkSelected(String sourceUrn, MediaSink sink) {
mDialogManager = null; mDialogManager = null;
ChromeMediaRouterDialogControllerJni.get().onSinkSelected(mNativeDialogController, BrowserMediaRouterDialogControllerJni.get().onSinkSelected(mNativeDialogController,
ChromeMediaRouterDialogController.this, sourceUrn, sink.getId()); BrowserMediaRouterDialogController.this, sourceUrn, sink.getId());
} }
@Override @Override
public void onRouteClosed(String mediaRouteId) { public void onRouteClosed(String mediaRouteId) {
mDialogManager = null; mDialogManager = null;
ChromeMediaRouterDialogControllerJni.get().onRouteClosed( BrowserMediaRouterDialogControllerJni.get().onRouteClosed(
mNativeDialogController, ChromeMediaRouterDialogController.this, mediaRouteId); mNativeDialogController, BrowserMediaRouterDialogController.this, mediaRouteId);
} }
@Override @Override
...@@ -132,23 +132,23 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega ...@@ -132,23 +132,23 @@ public class ChromeMediaRouterDialogController implements MediaRouteDialogDelega
if (mDialogManager == null) return; if (mDialogManager == null) return;
mDialogManager = null; mDialogManager = null;
ChromeMediaRouterDialogControllerJni.get().onDialogCancelled( BrowserMediaRouterDialogControllerJni.get().onDialogCancelled(
mNativeDialogController, ChromeMediaRouterDialogController.this); mNativeDialogController, BrowserMediaRouterDialogController.this);
} }
private ChromeMediaRouterDialogController(long nativeDialogController) { private BrowserMediaRouterDialogController(long nativeDialogController) {
mNativeDialogController = nativeDialogController; mNativeDialogController = nativeDialogController;
} }
@NativeMethods @NativeMethods
interface Natives { interface Natives {
void onDialogCancelled(long nativeMediaRouterDialogControllerAndroid, void onDialogCancelled(long nativeMediaRouterDialogControllerAndroid,
ChromeMediaRouterDialogController caller); BrowserMediaRouterDialogController caller);
void onSinkSelected(long nativeMediaRouterDialogControllerAndroid, void onSinkSelected(long nativeMediaRouterDialogControllerAndroid,
ChromeMediaRouterDialogController caller, String sourceUrn, String sinkId); BrowserMediaRouterDialogController caller, String sourceUrn, String sinkId);
void onRouteClosed(long nativeMediaRouterDialogControllerAndroid, void onRouteClosed(long nativeMediaRouterDialogControllerAndroid,
ChromeMediaRouterDialogController caller, String routeId); BrowserMediaRouterDialogController caller, String routeId);
void onMediaSourceNotSupported(long nativeMediaRouterDialogControllerAndroid, void onMediaSourceNotSupported(long nativeMediaRouterDialogControllerAndroid,
ChromeMediaRouterDialogController caller); BrowserMediaRouterDialogController caller);
} }
} }
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.media.router;
import android.content.Intent;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.browser.document.ChromeIntentUtil;
import org.chromium.chrome.browser.media.ui.ChromeMediaNotificationManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabUtils;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.content_public.browser.WebContents;
/** Provides Chrome-specific behavior for Media Router. */
@JNINamespace("media_router")
public class ChromeMediaRouterClient extends MediaRouterClient {
private ChromeMediaRouterClient() {}
@Override
public int getTabId(WebContents webContents) {
Tab tab = TabUtils.fromWebContents(webContents);
return tab == null ? -1 : tab.getId();
}
@Override
public Intent createBringTabToFrontIntent(int tabId) {
return ChromeIntentUtil.createBringTabToFrontIntent(tabId);
}
@Override
public void showNotification(MediaNotificationInfo notificationInfo) {
ChromeMediaNotificationManager.show(notificationInfo);
}
@CalledByNative
public static void initialize() {
if (MediaRouterClient.getInstance() != null) return;
MediaRouterClient.setInstance(new ChromeMediaRouterClient());
}
}
...@@ -15,7 +15,7 @@ import java.util.Set; ...@@ -15,7 +15,7 @@ import java.util.Set;
/** /**
* Callback for discovering routes with one particular filter. Keeps a set of all source URIs that * Callback for discovering routes with one particular filter. Keeps a set of all source URIs that
* media sinks were requested for. Once a route is added or removed, updates the * media sinks were requested for. Once a route is added or removed, updates the
* {@link ChromeMediaRouter} with the new routes. * {@link BrowserMediaRouter} with the new routes.
*/ */
public class DiscoveryCallback extends MediaRouter.Callback { public class DiscoveryCallback extends MediaRouter.Callback {
private final DiscoveryDelegate mDiscoveryDelegate; private final DiscoveryDelegate mDiscoveryDelegate;
...@@ -56,7 +56,7 @@ public class DiscoveryCallback extends MediaRouter.Callback { ...@@ -56,7 +56,7 @@ public class DiscoveryCallback extends MediaRouter.Callback {
MediaSink sink = MediaSink.fromRoute(route); MediaSink sink = MediaSink.fromRoute(route);
if (mSinks.contains(sink)) return; if (mSinks.contains(sink)) return;
mSinks.add(sink); mSinks.add(sink);
updateChromeMediaRouter(); updateBrowserMediaRouter();
} }
@Override @Override
...@@ -64,7 +64,7 @@ public class DiscoveryCallback extends MediaRouter.Callback { ...@@ -64,7 +64,7 @@ public class DiscoveryCallback extends MediaRouter.Callback {
MediaSink sink = MediaSink.fromRoute(route); MediaSink sink = MediaSink.fromRoute(route);
if (!mSinks.contains(sink)) return; if (!mSinks.contains(sink)) return;
mSinks.remove(sink); mSinks.remove(sink);
updateChromeMediaRouter(); updateBrowserMediaRouter();
} }
@Override @Override
...@@ -80,7 +80,7 @@ public class DiscoveryCallback extends MediaRouter.Callback { ...@@ -80,7 +80,7 @@ public class DiscoveryCallback extends MediaRouter.Callback {
} }
} }
private void updateChromeMediaRouter() { private void updateBrowserMediaRouter() {
for (String sourceUrn : mSourceUrns) { for (String sourceUrn : mSourceUrns) {
mDiscoveryDelegate.onSinksReceived(sourceUrn, new ArrayList<MediaSink>(mSinks)); mDiscoveryDelegate.onSinksReceived(sourceUrn, new ArrayList<MediaSink>(mSinks));
} }
......
...@@ -12,7 +12,7 @@ public class MediaRoute { ...@@ -12,7 +12,7 @@ public class MediaRoute {
private static final String MEDIA_ROUTE_ID_SEPARATOR = "/"; private static final String MEDIA_ROUTE_ID_SEPARATOR = "/";
/** /**
* The unique id of the route, assigned by the {@link ChromeMediaRouter}. * The unique id of the route, assigned by the {@link BrowserMediaRouter}.
*/ */
public final String id; public final String id;
......
...@@ -10,7 +10,7 @@ import java.util.List; ...@@ -10,7 +10,7 @@ import java.util.List;
/** /**
* A complimentary interface to {@link MediaRouteProvider}. Media route providers use the * A complimentary interface to {@link MediaRouteProvider}. Media route providers use the
* implementation to communicate back to the {@link ChromeMediaRouter}. * implementation to communicate back to the {@link BrowserMediaRouter}.
*/ */
public interface MediaRouteManager { public interface MediaRouteManager {
/** /**
......
...@@ -8,7 +8,7 @@ import androidx.annotation.Nullable; ...@@ -8,7 +8,7 @@ import androidx.annotation.Nullable;
/** /**
* An interface components providing media sinks and routes need to implement to hooks up into * An interface components providing media sinks and routes need to implement to hooks up into
* {@link ChromeMediaRouter}. * {@link BrowserMediaRouter}.
* *
* Note: Empty-string origins passed through this interface should be considered * Note: Empty-string origins passed through this interface should be considered
* "unique origins" from url::Origin for the purposes of comparison. * "unique origins" from url::Origin for the purposes of comparison.
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.media.router;
import android.annotation.SuppressLint;
import android.content.Intent;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.content_public.browser.WebContents;
/**
* An abstraction that allows embedders to implement behavior needed by shared Media Router code.
*/
public abstract class MediaRouterClient {
@SuppressLint("StaticFieldLeak")
private static MediaRouterClient sInstance;
/**
* Sets the singleton client instance.
* @param client the {@link Client} provided by the given embedder.
*/
public static void setInstance(MediaRouterClient mediaRouterClient) {
sInstance = mediaRouterClient;
}
public static MediaRouterClient getInstance() {
return sInstance;
}
/**
* @param webContents a {@link WebContents} in a tab.
* @return a unique integer identifier for the associated tab.
*/
public abstract int getTabId(WebContents webContents);
/**
* @param tabId a tab identifier.
* @return an {@link Intent} that brings the identified tab to the foreground.
*/
public abstract Intent createBringTabToFrontIntent(int tabId);
/**
* @param MediaNotificationInfo contains contents and metadata about a media notification
* that should be shown.
*/
public abstract void showNotification(MediaNotificationInfo notificationInfo);
}
...@@ -10,7 +10,7 @@ import com.google.android.gms.cast.CastDevice; ...@@ -10,7 +10,7 @@ import com.google.android.gms.cast.CastDevice;
import com.google.android.gms.cast.MediaStatus; import com.google.android.gms.cast.MediaStatus;
import com.google.android.gms.cast.framework.media.RemoteMediaClient; import com.google.android.gms.cast.framework.media.RemoteMediaClient;
import org.chromium.chrome.browser.media.ui.ChromeMediaNotificationManager; import org.chromium.chrome.browser.media.router.MediaRouterClient;
import org.chromium.chrome.media.router.R; import org.chromium.chrome.media.router.R;
import org.chromium.components.browser_ui.media.MediaNotificationInfo; import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.browser_ui.media.MediaNotificationListener; import org.chromium.components.browser_ui.media.MediaNotificationListener;
...@@ -21,9 +21,10 @@ import org.chromium.services.media_session.MediaMetadata; ...@@ -21,9 +21,10 @@ import org.chromium.services.media_session.MediaMetadata;
public abstract class BaseNotificationController public abstract class BaseNotificationController
implements MediaNotificationListener, BaseSessionController.Callback { implements MediaNotificationListener, BaseSessionController.Callback {
private MediaNotificationInfo.Builder mNotificationBuilder; private MediaNotificationInfo.Builder mNotificationBuilder;
protected final BaseSessionController mSessionController; private final BaseSessionController mSessionController;
public BaseNotificationController(BaseSessionController sessionController) { public BaseNotificationController(BaseSessionController sessionController) {
assert MediaRouterClient.getInstance() != null;
mSessionController = sessionController; mSessionController = sessionController;
} }
...@@ -46,7 +47,7 @@ public abstract class BaseNotificationController ...@@ -46,7 +47,7 @@ public abstract class BaseNotificationController
.setListener(this); .setListener(this);
updateNotificationMetadata(); updateNotificationMetadata();
ChromeMediaNotificationManager.show(mNotificationBuilder.build()); MediaRouterClient.getInstance().showNotification(mNotificationBuilder.build());
} }
@Override @Override
...@@ -73,7 +74,7 @@ public abstract class BaseNotificationController ...@@ -73,7 +74,7 @@ public abstract class BaseNotificationController
} else { } else {
mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP); mNotificationBuilder.setActions(MediaNotificationInfo.ACTION_STOP);
} }
ChromeMediaNotificationManager.show(mNotificationBuilder.build()); MediaRouterClient.getInstance().showNotification(mNotificationBuilder.build());
} }
/** Called when media metadata updated. */ /** Called when media metadata updated. */
...@@ -81,7 +82,7 @@ public abstract class BaseNotificationController ...@@ -81,7 +82,7 @@ public abstract class BaseNotificationController
public void onMetadataUpdated() { public void onMetadataUpdated() {
if (mNotificationBuilder == null) return; if (mNotificationBuilder == null) return;
updateNotificationMetadata(); updateNotificationMetadata();
ChromeMediaNotificationManager.show(mNotificationBuilder.build()); MediaRouterClient.getInstance().showNotification(mNotificationBuilder.build());
} }
private void updateNotificationMetadata() { private void updateNotificationMetadata() {
...@@ -145,6 +146,11 @@ public abstract class BaseNotificationController ...@@ -145,6 +146,11 @@ public abstract class BaseNotificationController
@Override @Override
public void onMediaSessionSeekTo(long pos) {} public void onMediaSessionSeekTo(long pos) {}
protected Intent createBringTabToFrontIntent() {
return MediaRouterClient.getInstance().createBringTabToFrontIntent(
mSessionController.getRouteCreationInfo().tabId);
}
// Abstract methods to be implemented by children. // Abstract methods to be implemented by children.
public abstract Intent createContentIntent(); public abstract Intent createContentIntent();
......
...@@ -14,7 +14,7 @@ import androidx.mediarouter.media.MediaRouter; ...@@ -14,7 +14,7 @@ import androidx.mediarouter.media.MediaRouter;
import com.google.android.gms.cast.framework.CastSession; import com.google.android.gms.cast.framework.CastSession;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.chrome.browser.media.router.ChromeMediaRouter; import org.chromium.chrome.browser.media.router.BrowserMediaRouter;
import org.chromium.chrome.browser.media.router.ClientRecord; import org.chromium.chrome.browser.media.router.ClientRecord;
import org.chromium.chrome.browser.media.router.MediaRoute; import org.chromium.chrome.browser.media.router.MediaRoute;
import org.chromium.chrome.browser.media.router.MediaRouteManager; import org.chromium.chrome.browser.media.router.MediaRouteManager;
...@@ -48,7 +48,7 @@ public class CafMediaRouteProvider extends CafBaseMediaRouteProvider { ...@@ -48,7 +48,7 @@ public class CafMediaRouteProvider extends CafBaseMediaRouteProvider {
private final CastSessionController mSessionController; private final CastSessionController mSessionController;
public static CafMediaRouteProvider create(MediaRouteManager manager) { public static CafMediaRouteProvider create(MediaRouteManager manager) {
return new CafMediaRouteProvider(ChromeMediaRouter.getAndroidMediaRouter(), manager); return new CafMediaRouteProvider(BrowserMediaRouter.getAndroidMediaRouter(), manager);
} }
public Map<String, ClientRecord> getClientIdToRecords() { public Map<String, ClientRecord> getClientIdToRecords() {
......
...@@ -6,7 +6,6 @@ package org.chromium.chrome.browser.media.router.caf; ...@@ -6,7 +6,6 @@ package org.chromium.chrome.browser.media.router.caf;
import android.content.Intent; import android.content.Intent;
import org.chromium.chrome.browser.document.ChromeIntentUtil;
import org.chromium.chrome.media.router.R; import org.chromium.chrome.media.router.R;
import org.chromium.components.browser_ui.media.MediaNotificationUma; import org.chromium.components.browser_ui.media.MediaNotificationUma;
...@@ -19,8 +18,7 @@ public class CafNotificationController extends BaseNotificationController { ...@@ -19,8 +18,7 @@ public class CafNotificationController extends BaseNotificationController {
@Override @Override
public Intent createContentIntent() { public Intent createContentIntent() {
Intent contentIntent = ChromeIntentUtil.createBringTabToFrontIntent( Intent contentIntent = createBringTabToFrontIntent();
mSessionController.getRouteCreationInfo().tabId);
if (contentIntent != null) { if (contentIntent != null) {
contentIntent.putExtra(MediaNotificationUma.INTENT_EXTRA_NAME, contentIntent.putExtra(MediaNotificationUma.INTENT_EXTRA_NAME,
MediaNotificationUma.Source.PRESENTATION); MediaNotificationUma.Source.PRESENTATION);
......
...@@ -8,7 +8,7 @@ import androidx.annotation.Nullable; ...@@ -8,7 +8,7 @@ import androidx.annotation.Nullable;
import androidx.mediarouter.media.MediaRouter; import androidx.mediarouter.media.MediaRouter;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.chrome.browser.media.router.ChromeMediaRouter; import org.chromium.chrome.browser.media.router.BrowserMediaRouter;
import org.chromium.chrome.browser.media.router.FlingingController; import org.chromium.chrome.browser.media.router.FlingingController;
import org.chromium.chrome.browser.media.router.MediaRouteManager; import org.chromium.chrome.browser.media.router.MediaRouteManager;
import org.chromium.chrome.browser.media.router.MediaRouteProvider; import org.chromium.chrome.browser.media.router.MediaRouteProvider;
...@@ -25,7 +25,7 @@ public class CafRemotingMediaRouteProvider extends CafBaseMediaRouteProvider { ...@@ -25,7 +25,7 @@ public class CafRemotingMediaRouteProvider extends CafBaseMediaRouteProvider {
public static CafRemotingMediaRouteProvider create(MediaRouteManager manager) { public static CafRemotingMediaRouteProvider create(MediaRouteManager manager) {
return new CafRemotingMediaRouteProvider( return new CafRemotingMediaRouteProvider(
ChromeMediaRouter.getAndroidMediaRouter(), manager); BrowserMediaRouter.getAndroidMediaRouter(), manager);
} }
@Override @Override
......
...@@ -87,7 +87,7 @@ public class MediaRouterIntegrationTest { ...@@ -87,7 +87,7 @@ public class MediaRouterIntegrationTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
ChromeMediaRouter.setRouteProviderFactoryForTest(new MockMediaRouteProvider.Factory()); BrowserMediaRouter.setRouteProviderFactoryForTest(new MockMediaRouteProvider.Factory());
mActivityTestRule.startMainActivityOnBlankPage(); mActivityTestRule.startMainActivityOnBlankPage();
// Temporary until support library is updated, see http://crbug.com/576393. // Temporary until support library is updated, see http://crbug.com/576393.
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
......
...@@ -21,89 +21,89 @@ import java.util.ArrayList; ...@@ -21,89 +21,89 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* Sink observation tests for ChromeMediaRouter. * Sink observation tests for BrowserMediaRouter.
*/ */
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE) @Config(manifest = Config.NONE)
public class ChromeMediaRouterSinkObservationTest extends ChromeMediaRouterTestBase { public class BrowserMediaRouterSinkObservationTest extends BrowserMediaRouterTestBase {
@Test @Test
@Feature({"MediaRouter"}) @Feature({"MediaRouter"})
public void testRouterOnSinksReceived() { public void testRouterOnSinksReceived() {
mChromeMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>()); mBrowserMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>());
assertEquals(1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().size()); assertEquals(1, mBrowserMediaRouter.getSinksPerSourcePerProviderForTest().size());
assertEquals( assertEquals(1,
1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size()); mBrowserMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size());
assertEquals(0, assertEquals(0,
mChromeMediaRouter.getSinksPerSourcePerProviderForTest() mBrowserMediaRouter.getSinksPerSourcePerProviderForTest()
.get(SOURCE_ID1) .get(SOURCE_ID1)
.get(mRouteProvider) .get(mRouteProvider)
.size()); .size());
assertEquals(1, mChromeMediaRouter.getSinksPerSourceForTest().size()); assertEquals(1, mBrowserMediaRouter.getSinksPerSourceForTest().size());
assertEquals(0, mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size()); assertEquals(0, mBrowserMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size());
} }
@Test @Test
@Feature({"MediaRouter"}) @Feature({"MediaRouter"})
public void testRouterOnSinksReceivedTwiceForOneSource() { public void testRouterOnSinksReceivedTwiceForOneSource() {
mChromeMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>()); mBrowserMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>());
List<MediaSink> sinkList = new ArrayList<MediaSink>(); List<MediaSink> sinkList = new ArrayList<MediaSink>();
MediaSink sink = new MediaSink(SINK_ID1, SINK_NAME1, null); MediaSink sink = new MediaSink(SINK_ID1, SINK_NAME1, null);
sinkList.add(sink); sinkList.add(sink);
mChromeMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, sinkList); mBrowserMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, sinkList);
assertEquals(1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().size()); assertEquals(1, mBrowserMediaRouter.getSinksPerSourcePerProviderForTest().size());
assertEquals( assertEquals(1,
1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size()); mBrowserMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size());
assertEquals(1, assertEquals(1,
mChromeMediaRouter.getSinksPerSourcePerProviderForTest() mBrowserMediaRouter.getSinksPerSourcePerProviderForTest()
.get(SOURCE_ID1) .get(SOURCE_ID1)
.get(mRouteProvider) .get(mRouteProvider)
.size()); .size());
assertTrue(mChromeMediaRouter.getSinksPerSourcePerProviderForTest() assertTrue(mBrowserMediaRouter.getSinksPerSourcePerProviderForTest()
.get(SOURCE_ID1) .get(SOURCE_ID1)
.get(mRouteProvider) .get(mRouteProvider)
.contains(sink)); .contains(sink));
assertEquals(1, mChromeMediaRouter.getSinksPerSourceForTest().size()); assertEquals(1, mBrowserMediaRouter.getSinksPerSourceForTest().size());
assertEquals(1, mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size()); assertEquals(1, mBrowserMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size());
assertTrue(mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).contains(sink)); assertTrue(mBrowserMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).contains(sink));
} }
@Test @Test
@Feature({"MediaRouter"}) @Feature({"MediaRouter"})
public void testRouterOnSinksReceivedForTwoSources() { public void testRouterOnSinksReceivedForTwoSources() {
mChromeMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>()); mBrowserMediaRouter.onSinksReceived(SOURCE_ID1, mRouteProvider, new ArrayList<MediaSink>());
List<MediaSink> sinkList = new ArrayList<MediaSink>(); List<MediaSink> sinkList = new ArrayList<MediaSink>();
MediaSink sink = new MediaSink(SINK_ID1, SINK_NAME1, null); MediaSink sink = new MediaSink(SINK_ID1, SINK_NAME1, null);
sinkList.add(sink); sinkList.add(sink);
mChromeMediaRouter.onSinksReceived(SOURCE_ID2, mRouteProvider, sinkList); mBrowserMediaRouter.onSinksReceived(SOURCE_ID2, mRouteProvider, sinkList);
assertEquals(2, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().size()); assertEquals(2, mBrowserMediaRouter.getSinksPerSourcePerProviderForTest().size());
assertEquals( assertEquals(1,
1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size()); mBrowserMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID1).size());
assertEquals(0, assertEquals(0,
mChromeMediaRouter.getSinksPerSourcePerProviderForTest() mBrowserMediaRouter.getSinksPerSourcePerProviderForTest()
.get(SOURCE_ID1) .get(SOURCE_ID1)
.get(mRouteProvider) .get(mRouteProvider)
.size()); .size());
assertEquals(
1, mChromeMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID2).size());
assertEquals(1, assertEquals(1,
mChromeMediaRouter.getSinksPerSourcePerProviderForTest() mBrowserMediaRouter.getSinksPerSourcePerProviderForTest().get(SOURCE_ID2).size());
assertEquals(1,
mBrowserMediaRouter.getSinksPerSourcePerProviderForTest()
.get(SOURCE_ID2) .get(SOURCE_ID2)
.get(mRouteProvider) .get(mRouteProvider)
.size()); .size());
assertTrue(mChromeMediaRouter.getSinksPerSourcePerProviderForTest() assertTrue(mBrowserMediaRouter.getSinksPerSourcePerProviderForTest()
.get(SOURCE_ID2) .get(SOURCE_ID2)
.get(mRouteProvider) .get(mRouteProvider)
.contains(sink)); .contains(sink));
assertEquals(2, mChromeMediaRouter.getSinksPerSourceForTest().size()); assertEquals(2, mBrowserMediaRouter.getSinksPerSourceForTest().size());
assertEquals(0, mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size()); assertEquals(0, mBrowserMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID1).size());
assertEquals(1, mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID2).size()); assertEquals(1, mBrowserMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID2).size());
assertTrue(mChromeMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID2).contains(sink)); assertTrue(mBrowserMediaRouter.getSinksPerSourceForTest().get(SOURCE_ID2).contains(sink));
} }
@Test @Test
...@@ -111,7 +111,7 @@ public class ChromeMediaRouterSinkObservationTest extends ChromeMediaRouterTestB ...@@ -111,7 +111,7 @@ public class ChromeMediaRouterSinkObservationTest extends ChromeMediaRouterTestB
public void testNotLowRamDevice() { public void testNotLowRamDevice() {
SysUtils.resetForTesting(); SysUtils.resetForTesting();
CommandLine.getInstance().appendSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE); CommandLine.getInstance().appendSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE);
assertTrue(mChromeMediaRouter.startObservingMediaSinks(SOURCE_ID1)); assertTrue(mBrowserMediaRouter.startObservingMediaSinks(SOURCE_ID1));
} }
@Test @Test
...@@ -119,6 +119,6 @@ public class ChromeMediaRouterSinkObservationTest extends ChromeMediaRouterTestB ...@@ -119,6 +119,6 @@ public class ChromeMediaRouterSinkObservationTest extends ChromeMediaRouterTestB
public void testIsLowRamDevice() { public void testIsLowRamDevice() {
SysUtils.resetForTesting(); SysUtils.resetForTesting();
CommandLine.getInstance().appendSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE); CommandLine.getInstance().appendSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE);
assertEquals(false, mChromeMediaRouter.startObservingMediaSinks(SOURCE_ID1)); assertEquals(false, mBrowserMediaRouter.startObservingMediaSinks(SOURCE_ID1));
} }
} }
...@@ -17,9 +17,9 @@ import org.robolectric.shadows.ShadowLog; ...@@ -17,9 +17,9 @@ import org.robolectric.shadows.ShadowLog;
import org.chromium.base.CommandLine; import org.chromium.base.CommandLine;
/** /**
* Robolectric test base class for ChromeMediaRouter. * Robolectric test base class for BrowserMediaRouter.
*/ */
public class ChromeMediaRouterTestBase { public class BrowserMediaRouterTestBase {
protected static final String SOURCE_ID1 = "cast:CCCCCCCC?" protected static final String SOURCE_ID1 = "cast:CCCCCCCC?"
+ "clientId=11111111111111111&" + "clientId=11111111111111111&"
+ "autoJoinPolicy=origin_scoped&" + "autoJoinPolicy=origin_scoped&"
...@@ -42,18 +42,18 @@ public class ChromeMediaRouterTestBase { ...@@ -42,18 +42,18 @@ public class ChromeMediaRouterTestBase {
protected static final int TAB_ID2 = 2; protected static final int TAB_ID2 = 2;
protected static final int REQUEST_ID1 = 1; protected static final int REQUEST_ID1 = 1;
protected static final int REQUEST_ID2 = 2; protected static final int REQUEST_ID2 = 2;
protected ChromeMediaRouter mChromeMediaRouter; protected BrowserMediaRouter mBrowserMediaRouter;
protected MediaRouteProvider mRouteProvider; protected MediaRouteProvider mRouteProvider;
@Before @Before
public void setUp() { public void setUp() {
ShadowLog.stream = System.out; ShadowLog.stream = System.out;
mChromeMediaRouter = spy(new ChromeMediaRouter(0)); mBrowserMediaRouter = spy(new BrowserMediaRouter(0));
mRouteProvider = mock(MediaRouteProvider.class); mRouteProvider = mock(MediaRouteProvider.class);
doReturn(true).when(mRouteProvider).supportsSource(anyString()); doReturn(true).when(mRouteProvider).supportsSource(anyString());
mChromeMediaRouter.addMediaRouteProvider(mRouteProvider); mBrowserMediaRouter.addMediaRouteProvider(mRouteProvider);
assertEquals(1, mChromeMediaRouter.getRouteProvidersForTest().size()); assertEquals(1, mBrowserMediaRouter.getRouteProvidersForTest().size());
assertEquals(mRouteProvider, mChromeMediaRouter.getRouteProvidersForTest().get(0)); assertEquals(mRouteProvider, mBrowserMediaRouter.getRouteProvidersForTest().get(0));
assertNotNull(mRouteProvider); assertNotNull(mRouteProvider);
// Initialize the command line to avoid an assertion failure in SysUtils. // Initialize the command line to avoid an assertion failure in SysUtils.
......
...@@ -33,7 +33,7 @@ import java.util.List; ...@@ -33,7 +33,7 @@ import java.util.List;
*/ */
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE) @Config(manifest = Config.NONE)
public class DiscoveryCallbackTest extends ChromeMediaRouterTestBase { public class DiscoveryCallbackTest extends BrowserMediaRouterTestBase {
protected DiscoveryDelegate mDiscoveryDelegate; protected DiscoveryDelegate mDiscoveryDelegate;
@Override @Override
......
...@@ -22,6 +22,7 @@ import static org.mockito.Mockito.spy; ...@@ -22,6 +22,7 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import androidx.mediarouter.media.MediaRouter; import androidx.mediarouter.media.MediaRouter;
...@@ -46,7 +47,10 @@ import org.chromium.base.test.BaseRobolectricTestRunner; ...@@ -46,7 +47,10 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.media.router.ClientRecord; import org.chromium.chrome.browser.media.router.ClientRecord;
import org.chromium.chrome.browser.media.router.MediaRoute; import org.chromium.chrome.browser.media.router.MediaRoute;
import org.chromium.chrome.browser.media.router.MediaRouteManager; import org.chromium.chrome.browser.media.router.MediaRouteManager;
import org.chromium.chrome.browser.media.router.MediaRouterClient;
import org.chromium.chrome.browser.media.router.MediaSink; import org.chromium.chrome.browser.media.router.MediaSink;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.content_public.browser.WebContents;
/** /**
* Robolectric tests for CafMediaRouteProvider. * Robolectric tests for CafMediaRouteProvider.
...@@ -94,6 +98,22 @@ public class CafMediaRouteProviderTest { ...@@ -94,6 +98,22 @@ public class CafMediaRouteProviderTest {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
MediaRouterClient.setInstance(new MediaRouterClient() {
@Override
public int getTabId(WebContents webContents) {
return 1;
}
@Override
public Intent createBringTabToFrontIntent(int tabId) {
return null;
}
@Override
public void showNotification(MediaNotificationInfo notificationInfo) {}
});
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
ShadowCastContext.setInstance(mCastContext); ShadowCastContext.setInstance(mCastContext);
ShadowCastMediaSource.setImplementation(mShadowCastMediaSource); ShadowCastMediaSource.setImplementation(mShadowCastMediaSource);
......
...@@ -1496,6 +1496,7 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer { ...@@ -1496,6 +1496,7 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
@NativeMethods @NativeMethods
interface Natives { interface Natives {
TabImpl fromWebContents(WebContents webContents);
void init(TabImpl caller); void init(TabImpl caller);
void destroy(long nativeTabAndroid, TabImpl caller); void destroy(long nativeTabAndroid, TabImpl caller);
void initWebContents(long nativeTabAndroid, TabImpl caller, boolean incognito, void initWebContents(long nativeTabAndroid, TabImpl caller, boolean incognito,
......
...@@ -66,4 +66,8 @@ public class TabUtils { ...@@ -66,4 +66,8 @@ public class TabUtils {
screenSize.x, screenSize.y); screenSize.x, screenSize.y);
return screenBounds; return screenBounds;
} }
public static Tab fromWebContents(WebContents webContents) {
return TabImplJni.get().fromWebContents(webContents);
}
} }
...@@ -2789,6 +2789,8 @@ static_library("browser") { ...@@ -2789,6 +2789,8 @@ static_library("browser") {
"media/android/cdm/per_device_provisioning_permission.h", "media/android/cdm/per_device_provisioning_permission.h",
"media/android/remote/flinging_controller_bridge.cc", "media/android/remote/flinging_controller_bridge.cc",
"media/android/remote/flinging_controller_bridge.h", "media/android/remote/flinging_controller_bridge.h",
"media/android/router/chrome_media_router_client.cc",
"media/android/router/chrome_media_router_client.h",
"media/android/router/media_router_android.cc", "media/android/router/media_router_android.cc",
"media/android/router/media_router_android.h", "media/android/router/media_router_android.h",
"media/android/router/media_router_android_bridge.cc", "media/android/router/media_router_android_bridge.cc",
......
...@@ -464,6 +464,20 @@ void TabAndroid::SetDevToolsAgentHost( ...@@ -464,6 +464,20 @@ void TabAndroid::SetDevToolsAgentHost(
devtools_host_ = std::move(host); devtools_host_ = std::move(host);
} }
base::android::ScopedJavaLocalRef<jobject> JNI_TabImpl_FromWebContents(
JNIEnv* env,
const JavaParamRef<jobject>& jweb_contents) {
base::android::ScopedJavaLocalRef<jobject> jtab;
content::WebContents* web_contents =
content::WebContents::FromJavaWebContents(jweb_contents);
TabAndroid* tab =
web_contents ? TabAndroid::FromWebContents(web_contents) : nullptr;
if (tab)
jtab = tab->GetJavaObject();
return jtab;
}
static void JNI_TabImpl_Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { static void JNI_TabImpl_Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
TRACE_EVENT0("native", "TabAndroid::Init"); TRACE_EVENT0("native", "TabAndroid::Init");
// This will automatically bind to the Java object and pass ownership there. // This will automatically bind to the Java object and pass ownership there.
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/android/router/chrome_media_router_client.h"
#include "base/android/jni_android.h"
#include "chrome/android/features/media_router/jni_headers/ChromeMediaRouterClient_jni.h"
namespace media_router {
void InitChromeMediaRouterJavaClient() {
Java_ChromeMediaRouterClient_initialize(base::android::AttachCurrentThread());
}
} // namespace media_router
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_ANDROID_ROUTER_CHROME_MEDIA_ROUTER_CLIENT_H_
#define CHROME_BROWSER_MEDIA_ANDROID_ROUTER_CHROME_MEDIA_ROUTER_CLIENT_H_
namespace media_router {
// Initializes Java code with behavior specific to Chrome.
void InitChromeMediaRouterJavaClient();
} // namespace media_router
#endif // CHROME_BROWSER_MEDIA_ANDROID_ROUTER_CHROME_MEDIA_ROUTER_CLIENT_H_
...@@ -13,14 +13,11 @@ ...@@ -13,14 +13,11 @@
#include "base/guid.h" #include "base/guid.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/media/router/media_routes_observer.h" #include "chrome/browser/media/router/media_routes_observer.h"
#include "chrome/browser/media/router/media_sinks_observer.h" #include "chrome/browser/media/router/media_sinks_observer.h"
#include "chrome/browser/media/router/route_message_observer.h" #include "chrome/browser/media/router/route_message_observer.h"
#include "chrome/browser/media/router/route_message_util.h" #include "chrome/browser/media/router/route_message_util.h"
#include "components/media_router/common/route_request_result.h" #include "components/media_router/common/route_request_result.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/web_contents.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace media_router { namespace media_router {
...@@ -91,7 +88,7 @@ MediaRouterAndroid::MediaRouteRequest::MediaRouteRequest( ...@@ -91,7 +88,7 @@ MediaRouterAndroid::MediaRouteRequest::MediaRouteRequest(
MediaRouterAndroid::MediaRouteRequest::~MediaRouteRequest() {} MediaRouterAndroid::MediaRouteRequest::~MediaRouteRequest() {}
MediaRouterAndroid::MediaRouterAndroid(content::BrowserContext*) MediaRouterAndroid::MediaRouterAndroid()
: bridge_(new MediaRouterAndroidBridge(this)) {} : bridge_(new MediaRouterAndroidBridge(this)) {}
MediaRouterAndroid::~MediaRouterAndroid() {} MediaRouterAndroid::~MediaRouterAndroid() {}
...@@ -116,20 +113,11 @@ void MediaRouterAndroid::CreateRoute(const MediaSource::Id& source_id, ...@@ -116,20 +113,11 @@ void MediaRouterAndroid::CreateRoute(const MediaSource::Id& source_id,
// TODO(avayvod): Implement timeouts (crbug.com/583036). // TODO(avayvod): Implement timeouts (crbug.com/583036).
std::string presentation_id = MediaRouterBase::CreatePresentationId(); std::string presentation_id = MediaRouterBase::CreatePresentationId();
int tab_id = -1;
TabAndroid* tab =
web_contents ? TabAndroid::FromWebContents(web_contents) : nullptr;
if (tab)
tab_id = tab->GetAndroidId();
bool is_incognito =
web_contents && web_contents->GetBrowserContext()->IsOffTheRecord();
int route_request_id = int route_request_id =
route_requests_.Add(std::make_unique<MediaRouteRequest>( route_requests_.Add(std::make_unique<MediaRouteRequest>(
MediaSource(source_id), presentation_id, std::move(callback))); MediaSource(source_id), presentation_id, std::move(callback)));
bridge_->CreateRoute(source_id, sink_id, presentation_id, origin, tab_id, bridge_->CreateRoute(source_id, sink_id, presentation_id, origin,
is_incognito, route_request_id); web_contents, route_request_id);
} }
void MediaRouterAndroid::ConnectRouteByRouteId( void MediaRouterAndroid::ConnectRouteByRouteId(
...@@ -152,18 +140,13 @@ void MediaRouterAndroid::JoinRoute(const MediaSource::Id& source_id, ...@@ -152,18 +140,13 @@ void MediaRouterAndroid::JoinRoute(const MediaSource::Id& source_id,
bool incognito) { bool incognito) {
DCHECK(callback); DCHECK(callback);
// TODO(avayvod): Implement timeouts (crbug.com/583036). // TODO(avayvod): Implement timeouts (crbug.com/583036).
int tab_id = -1;
TabAndroid* tab =
web_contents ? TabAndroid::FromWebContents(web_contents) : nullptr;
if (tab)
tab_id = tab->GetAndroidId();
DVLOG(2) << "JoinRoute: " << source_id << ", " << presentation_id << ", " DVLOG(2) << "JoinRoute: " << source_id << ", " << presentation_id << ", "
<< origin.GetURL().spec() << ", " << tab_id; << origin.GetURL().spec();
int request_id = route_requests_.Add(std::make_unique<MediaRouteRequest>( int request_id = route_requests_.Add(std::make_unique<MediaRouteRequest>(
MediaSource(source_id), presentation_id, std::move(callback))); MediaSource(source_id), presentation_id, std::move(callback)));
bridge_->JoinRoute(source_id, presentation_id, origin, tab_id, request_id); bridge_->JoinRoute(source_id, presentation_id, origin, web_contents,
request_id);
} }
void MediaRouterAndroid::TerminateRoute(const MediaRoute::Id& route_id) { void MediaRouterAndroid::TerminateRoute(const MediaRoute::Id& route_id) {
......
...@@ -19,10 +19,6 @@ ...@@ -19,10 +19,6 @@
#include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote.h"
namespace content {
class BrowserContext;
}
namespace media_router { namespace media_router {
// An implementation of MediaRouter interface on Android. // An implementation of MediaRouter interface on Android.
...@@ -137,7 +133,7 @@ class MediaRouterAndroid : public MediaRouterBase { ...@@ -137,7 +133,7 @@ class MediaRouterAndroid : public MediaRouterBase {
DISALLOW_COPY_AND_ASSIGN(PresentationConnectionProxy); DISALLOW_COPY_AND_ASSIGN(PresentationConnectionProxy);
}; };
explicit MediaRouterAndroid(content::BrowserContext*); MediaRouterAndroid();
// Removes the route with the given id from |active_routes_| and updates the // Removes the route with the given id from |active_routes_| and updates the
// registered route observers. // registered route observers.
......
...@@ -6,9 +6,10 @@ ...@@ -6,9 +6,10 @@
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "chrome/android/features/media_router/jni_headers/ChromeMediaRouter_jni.h" #include "chrome/android/features/media_router/jni_headers/BrowserMediaRouter_jni.h"
#include "chrome/browser/media/android/remote/flinging_controller_bridge.h" #include "chrome/browser/media/android/remote/flinging_controller_bridge.h"
#include "chrome/browser/media/android/router/media_router_android.h" #include "chrome/browser/media/android/router/media_router_android.h"
#include "content/public/browser/web_contents.h"
#include "media/base/media_controller.h" #include "media/base/media_controller.h"
using base::android::ConvertUTF8ToJavaString; using base::android::ConvertUTF8ToJavaString;
...@@ -22,113 +23,116 @@ namespace media_router { ...@@ -22,113 +23,116 @@ namespace media_router {
MediaRouterAndroidBridge::MediaRouterAndroidBridge(MediaRouterAndroid* router) MediaRouterAndroidBridge::MediaRouterAndroidBridge(MediaRouterAndroid* router)
: native_media_router_(router) { : native_media_router_(router) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
java_media_router_.Reset( java_media_router_.Reset(
Java_ChromeMediaRouter_create(env, reinterpret_cast<jlong>(this))); Java_BrowserMediaRouter_create(env, reinterpret_cast<jlong>(this)));
} }
MediaRouterAndroidBridge::~MediaRouterAndroidBridge() { MediaRouterAndroidBridge::~MediaRouterAndroidBridge() {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
// When |this| is destroyed, there might still pending runnables on the Java // When |this| is destroyed, there might still pending runnables on the Java
// side, that are keeping the Java object alive. These runnables might try to // side, that are keeping the Java object alive. These runnables might try to
// call back to the native side when executed. We need to signal to the Java // call back to the native side when executed. We need to signal to the Java
// counterpart that it can't call back into native anymore. // counterpart that it can't call back into native anymore.
Java_ChromeMediaRouter_teardown(env, java_media_router_); Java_BrowserMediaRouter_teardown(env, java_media_router_);
} }
void MediaRouterAndroidBridge::CreateRoute(const MediaSource::Id& source_id, void MediaRouterAndroidBridge::CreateRoute(const MediaSource::Id& source_id,
const MediaSink::Id& sink_id, const MediaSink::Id& sink_id,
const std::string& presentation_id, const std::string& presentation_id,
const url::Origin& origin, const url::Origin& origin,
int tab_id, content::WebContents* web_contents,
bool is_incognito,
int route_request_id) { int route_request_id) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> jsource_id = ScopedJavaLocalRef<jstring> jsource_id =
base::android::ConvertUTF8ToJavaString(env, source_id); ConvertUTF8ToJavaString(env, source_id);
ScopedJavaLocalRef<jstring> jsink_id = ScopedJavaLocalRef<jstring> jsink_id = ConvertUTF8ToJavaString(env, sink_id);
base::android::ConvertUTF8ToJavaString(env, sink_id);
ScopedJavaLocalRef<jstring> jpresentation_id = ScopedJavaLocalRef<jstring> jpresentation_id =
base::android::ConvertUTF8ToJavaString(env, presentation_id); ConvertUTF8ToJavaString(env, presentation_id);
ScopedJavaLocalRef<jstring> jorigin = ScopedJavaLocalRef<jstring> jorigin =
base::android::ConvertUTF8ToJavaString(env, origin.GetURL().spec()); ConvertUTF8ToJavaString(env, origin.GetURL().spec());
base::android::ScopedJavaLocalRef<jobject> java_web_contents;
if (web_contents)
java_web_contents = web_contents->GetJavaWebContents();
Java_ChromeMediaRouter_createRoute(env, java_media_router_, jsource_id, Java_BrowserMediaRouter_createRoute(env, java_media_router_, jsource_id,
jsink_id, jpresentation_id, jorigin, jsink_id, jpresentation_id, jorigin,
tab_id, is_incognito, route_request_id); java_web_contents, route_request_id);
} }
void MediaRouterAndroidBridge::JoinRoute(const MediaSource::Id& source_id, void MediaRouterAndroidBridge::JoinRoute(const MediaSource::Id& source_id,
const std::string& presentation_id, const std::string& presentation_id,
const url::Origin& origin, const url::Origin& origin,
int tab_id, content::WebContents* web_contents,
int route_request_id) { int route_request_id) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> jsource_id = ScopedJavaLocalRef<jstring> jsource_id =
base::android::ConvertUTF8ToJavaString(env, source_id); ConvertUTF8ToJavaString(env, source_id);
ScopedJavaLocalRef<jstring> jpresentation_id = ScopedJavaLocalRef<jstring> jpresentation_id =
base::android::ConvertUTF8ToJavaString(env, presentation_id); ConvertUTF8ToJavaString(env, presentation_id);
ScopedJavaLocalRef<jstring> jorigin = ScopedJavaLocalRef<jstring> jorigin =
base::android::ConvertUTF8ToJavaString(env, origin.GetURL().spec()); ConvertUTF8ToJavaString(env, origin.GetURL().spec());
base::android::ScopedJavaLocalRef<jobject> java_web_contents;
if (web_contents)
java_web_contents = web_contents->GetJavaWebContents();
Java_ChromeMediaRouter_joinRoute(env, java_media_router_, jsource_id, Java_BrowserMediaRouter_joinRoute(env, java_media_router_, jsource_id,
jpresentation_id, jorigin, tab_id, jpresentation_id, jorigin,
route_request_id); java_web_contents, route_request_id);
} }
void MediaRouterAndroidBridge::TerminateRoute(const MediaRoute::Id& route_id) { void MediaRouterAndroidBridge::TerminateRoute(const MediaRoute::Id& route_id) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> jroute_id = ScopedJavaLocalRef<jstring> jroute_id =
base::android::ConvertUTF8ToJavaString(env, route_id); ConvertUTF8ToJavaString(env, route_id);
Java_ChromeMediaRouter_closeRoute(env, java_media_router_, jroute_id); Java_BrowserMediaRouter_closeRoute(env, java_media_router_, jroute_id);
} }
void MediaRouterAndroidBridge::SendRouteMessage(const MediaRoute::Id& route_id, void MediaRouterAndroidBridge::SendRouteMessage(const MediaRoute::Id& route_id,
const std::string& message) { const std::string& message) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> jroute_id = ScopedJavaLocalRef<jstring> jroute_id =
base::android::ConvertUTF8ToJavaString(env, route_id); ConvertUTF8ToJavaString(env, route_id);
ScopedJavaLocalRef<jstring> jmessage = ScopedJavaLocalRef<jstring> jmessage = ConvertUTF8ToJavaString(env, message);
base::android::ConvertUTF8ToJavaString(env, message); Java_BrowserMediaRouter_sendStringMessage(env, java_media_router_, jroute_id,
Java_ChromeMediaRouter_sendStringMessage(env, java_media_router_, jroute_id, jmessage);
jmessage);
} }
void MediaRouterAndroidBridge::DetachRoute(const MediaRoute::Id& route_id) { void MediaRouterAndroidBridge::DetachRoute(const MediaRoute::Id& route_id) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> jroute_id = ScopedJavaLocalRef<jstring> jroute_id =
base::android::ConvertUTF8ToJavaString(env, route_id); ConvertUTF8ToJavaString(env, route_id);
Java_ChromeMediaRouter_detachRoute(env, java_media_router_, jroute_id); Java_BrowserMediaRouter_detachRoute(env, java_media_router_, jroute_id);
} }
bool MediaRouterAndroidBridge::StartObservingMediaSinks( bool MediaRouterAndroidBridge::StartObservingMediaSinks(
const MediaSource::Id& source_id) { const MediaSource::Id& source_id) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> jsource_id = ScopedJavaLocalRef<jstring> jsource_id =
base::android::ConvertUTF8ToJavaString(env, source_id); ConvertUTF8ToJavaString(env, source_id);
return Java_ChromeMediaRouter_startObservingMediaSinks( return Java_BrowserMediaRouter_startObservingMediaSinks(
env, java_media_router_, jsource_id); env, java_media_router_, jsource_id);
} }
void MediaRouterAndroidBridge::StopObservingMediaSinks( void MediaRouterAndroidBridge::StopObservingMediaSinks(
const MediaSource::Id& source_id) { const MediaSource::Id& source_id) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> jsource_id = ScopedJavaLocalRef<jstring> jsource_id =
base::android::ConvertUTF8ToJavaString(env, source_id); ConvertUTF8ToJavaString(env, source_id);
Java_ChromeMediaRouter_stopObservingMediaSinks(env, java_media_router_, Java_BrowserMediaRouter_stopObservingMediaSinks(env, java_media_router_,
jsource_id); jsource_id);
} }
std::unique_ptr<media::FlingingController> std::unique_ptr<media::FlingingController>
MediaRouterAndroidBridge::GetFlingingController( MediaRouterAndroidBridge::GetFlingingController(
const MediaRoute::Id& route_id) { const MediaRoute::Id& route_id) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jstring> jroute_id = ScopedJavaLocalRef<jstring> jroute_id =
base::android::ConvertUTF8ToJavaString(env, route_id); ConvertUTF8ToJavaString(env, route_id);
ScopedJavaGlobalRef<jobject> flinging_controller; ScopedJavaGlobalRef<jobject> flinging_controller;
flinging_controller.Reset(Java_ChromeMediaRouter_getFlingingControllerBridge( flinging_controller.Reset(Java_BrowserMediaRouter_getFlingingControllerBridge(
env, java_media_router_, jroute_id)); env, java_media_router_, jroute_id));
if (flinging_controller.is_null()) if (flinging_controller.is_null())
...@@ -145,10 +149,11 @@ void MediaRouterAndroidBridge::OnSinksReceived( ...@@ -145,10 +149,11 @@ void MediaRouterAndroidBridge::OnSinksReceived(
std::vector<MediaSink> sinks_converted; std::vector<MediaSink> sinks_converted;
sinks_converted.reserve(jcount); sinks_converted.reserve(jcount);
for (int i = 0; i < jcount; ++i) { for (int i = 0; i < jcount; ++i) {
ScopedJavaLocalRef<jstring> jsink_urn = Java_ChromeMediaRouter_getSinkUrn( ScopedJavaLocalRef<jstring> jsink_urn = Java_BrowserMediaRouter_getSinkUrn(
env, java_media_router_, jsource_urn, i);
ScopedJavaLocalRef<jstring> jsink_name = Java_ChromeMediaRouter_getSinkName(
env, java_media_router_, jsource_urn, i); env, java_media_router_, jsource_urn, i);
ScopedJavaLocalRef<jstring> jsink_name =
Java_BrowserMediaRouter_getSinkName(env, java_media_router_,
jsource_urn, i);
sinks_converted.push_back(MediaSink( sinks_converted.push_back(MediaSink(
ConvertJavaStringToUTF8(env, jsink_urn.obj()), ConvertJavaStringToUTF8(env, jsink_urn.obj()),
ConvertJavaStringToUTF8(env, jsink_name.obj()), SinkIconType::GENERIC)); ConvertJavaStringToUTF8(env, jsink_name.obj()), SinkIconType::GENERIC));
......
...@@ -13,6 +13,10 @@ ...@@ -13,6 +13,10 @@
#include "media/base/flinging_controller.h" #include "media/base/flinging_controller.h"
#include "url/origin.h" #include "url/origin.h"
namespace content {
class WebContents;
}
namespace media_router { namespace media_router {
class MediaRouterAndroid; class MediaRouterAndroid;
...@@ -29,13 +33,12 @@ class MediaRouterAndroidBridge { ...@@ -29,13 +33,12 @@ class MediaRouterAndroidBridge {
const MediaSink::Id& sink_id, const MediaSink::Id& sink_id,
const std::string& presentation_id, const std::string& presentation_id,
const url::Origin& origin, const url::Origin& origin,
int tab_id, content::WebContents* web_contents,
bool is_incognito,
int route_request_id); int route_request_id);
virtual void JoinRoute(const MediaSource::Id& source_id, virtual void JoinRoute(const MediaSource::Id& source_id,
const std::string& presentation_id, const std::string& presentation_id,
const url::Origin& origin, const url::Origin& origin,
int tab_id, content::WebContents* web_contents,
int route_request_id); int route_request_id);
virtual void TerminateRoute(const MediaRoute::Id& route_id); virtual void TerminateRoute(const MediaRoute::Id& route_id);
virtual void SendRouteMessage(const MediaRoute::Id& route_id, virtual void SendRouteMessage(const MediaRoute::Id& route_id,
......
...@@ -27,19 +27,18 @@ class MockMediaRouterAndroidBridge : public MediaRouterAndroidBridge { ...@@ -27,19 +27,18 @@ class MockMediaRouterAndroidBridge : public MediaRouterAndroidBridge {
MockMediaRouterAndroidBridge() : MediaRouterAndroidBridge(nullptr) {} MockMediaRouterAndroidBridge() : MediaRouterAndroidBridge(nullptr) {}
~MockMediaRouterAndroidBridge() override = default; ~MockMediaRouterAndroidBridge() override = default;
MOCK_METHOD7(CreateRoute, MOCK_METHOD6(CreateRoute,
void(const MediaSource::Id&, void(const MediaSource::Id&,
const MediaSink::Id&, const MediaSink::Id&,
const std::string&, const std::string&,
const url::Origin&, const url::Origin&,
int, content::WebContents*,
bool,
int)); int));
MOCK_METHOD5(JoinRoute, MOCK_METHOD5(JoinRoute,
void(const MediaSource::Id&, void(const MediaSource::Id&,
const std::string&, const std::string&,
const url::Origin&, const url::Origin&,
int, content::WebContents*,
int)); int));
MOCK_METHOD1(TerminateRoute, void(const MediaRoute::Id&)); MOCK_METHOD1(TerminateRoute, void(const MediaRoute::Id&));
MOCK_METHOD2(SendRouteMessage, MOCK_METHOD2(SendRouteMessage,
...@@ -53,7 +52,7 @@ class MediaRouterAndroidTest : public testing::Test { ...@@ -53,7 +52,7 @@ class MediaRouterAndroidTest : public testing::Test {
public: public:
void SetUp() override { void SetUp() override {
mock_bridge_ = new MockMediaRouterAndroidBridge(); mock_bridge_ = new MockMediaRouterAndroidBridge();
router_.reset(new MediaRouterAndroid(nullptr)); router_ = base::WrapUnique(new MediaRouterAndroid());
router_->SetMediaRouterBridgeForTest(mock_bridge_); router_->SetMediaRouterBridgeForTest(mock_bridge_);
} }
...@@ -77,7 +76,7 @@ TEST_F(MediaRouterAndroidTest, DetachRoute) { ...@@ -77,7 +76,7 @@ TEST_F(MediaRouterAndroidTest, DetachRoute) {
EXPECT_CALL(callback, Run(StateChangeInfoEquals(change_info_closed))); EXPECT_CALL(callback, Run(StateChangeInfoEquals(change_info_closed)));
Expectation createRouteExpectation = Expectation createRouteExpectation =
EXPECT_CALL(*mock_bridge_, CreateRoute(_, _, _, _, _, _, 1)) EXPECT_CALL(*mock_bridge_, CreateRoute(_, _, _, _, _, 1))
.WillOnce(Return()); .WillOnce(Return());
EXPECT_CALL(*mock_bridge_, DetachRoute("route")) EXPECT_CALL(*mock_bridge_, DetachRoute("route"))
.After(createRouteExpectation) .After(createRouteExpectation)
...@@ -99,7 +98,7 @@ TEST_F(MediaRouterAndroidTest, DetachRoute) { ...@@ -99,7 +98,7 @@ TEST_F(MediaRouterAndroidTest, DetachRoute) {
TEST_F(MediaRouterAndroidTest, OnRouteTerminated) { TEST_F(MediaRouterAndroidTest, OnRouteTerminated) {
Expectation createRouteExpectation = Expectation createRouteExpectation =
EXPECT_CALL(*mock_bridge_, CreateRoute(_, _, _, _, _, _, 1)) EXPECT_CALL(*mock_bridge_, CreateRoute(_, _, _, _, _, 1))
.WillOnce(Return()); .WillOnce(Return());
router_->CreateRoute("source", "sink", url::Origin(), nullptr, router_->CreateRoute("source", "sink", url::Origin(), nullptr,
...@@ -128,7 +127,7 @@ TEST_F(MediaRouterAndroidTest, OnRouteClosed) { ...@@ -128,7 +127,7 @@ TEST_F(MediaRouterAndroidTest, OnRouteClosed) {
EXPECT_CALL(callback, Run(StateChangeInfoEquals(change_info_closed))); EXPECT_CALL(callback, Run(StateChangeInfoEquals(change_info_closed)));
Expectation createRouteExpectation = Expectation createRouteExpectation =
EXPECT_CALL(*mock_bridge_, CreateRoute(_, _, _, _, _, _, 1)) EXPECT_CALL(*mock_bridge_, CreateRoute(_, _, _, _, _, 1))
.WillOnce(Return()); .WillOnce(Return());
router_->CreateRoute("source", "sink", url::Origin(), nullptr, router_->CreateRoute("source", "sink", url::Origin(), nullptr,
...@@ -156,7 +155,7 @@ TEST_F(MediaRouterAndroidTest, OnRouteClosedWithError) { ...@@ -156,7 +155,7 @@ TEST_F(MediaRouterAndroidTest, OnRouteClosedWithError) {
EXPECT_CALL(callback, Run(StateChangeInfoEquals(change_info_closed))); EXPECT_CALL(callback, Run(StateChangeInfoEquals(change_info_closed)));
Expectation createRouteExpectation = Expectation createRouteExpectation =
EXPECT_CALL(*mock_bridge_, CreateRoute(_, _, _, _, _, _, 1)) EXPECT_CALL(*mock_bridge_, CreateRoute(_, _, _, _, _, 1))
.WillOnce(Return()); .WillOnce(Return());
router_->CreateRoute("source", "sink", url::Origin(), nullptr, router_->CreateRoute("source", "sink", url::Origin(), nullptr,
......
...@@ -12,8 +12,7 @@ ...@@ -12,8 +12,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chrome/android/features/media_router/jni_headers/ChromeMediaRouterDialogController_jni.h" #include "chrome/android/features/media_router/jni_headers/BrowserMediaRouterDialogController_jni.h"
#include "chrome/browser/flags/android/chrome_feature_list.h"
#include "chrome/browser/media/android/router/media_router_android.h" #include "chrome/browser/media/android/router/media_router_android.h"
#include "chrome/browser/media/router/media_router.h" #include "chrome/browser/media/router/media_router.h"
#include "chrome/browser/media/router/media_router_factory.h" #include "chrome/browser/media/router/media_router_factory.h"
...@@ -130,7 +129,7 @@ MediaRouterDialogControllerAndroid::MediaRouterDialogControllerAndroid( ...@@ -130,7 +129,7 @@ MediaRouterDialogControllerAndroid::MediaRouterDialogControllerAndroid(
WebContents* web_contents) WebContents* web_contents)
: MediaRouterDialogController(web_contents) { : MediaRouterDialogController(web_contents) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
java_dialog_controller_.Reset(Java_ChromeMediaRouterDialogController_create( java_dialog_controller_.Reset(Java_BrowserMediaRouterDialogController_create(
env, reinterpret_cast<jlong>(this))); env, reinterpret_cast<jlong>(this)));
} }
...@@ -165,7 +164,7 @@ void MediaRouterDialogControllerAndroid::CreateMediaRouterDialog( ...@@ -165,7 +164,7 @@ void MediaRouterDialogControllerAndroid::CreateMediaRouterDialog(
base::android::ConvertUTF8ToJavaString( base::android::ConvertUTF8ToJavaString(
env, matching_route->media_route_id()); env, matching_route->media_route_id());
Java_ChromeMediaRouterDialogController_openRouteControllerDialog( Java_BrowserMediaRouterDialogController_openRouteControllerDialog(
env, java_dialog_controller_, jsource_id, jmedia_route_id); env, java_dialog_controller_, jsource_id, jmedia_route_id);
return; return;
} }
...@@ -176,20 +175,20 @@ void MediaRouterDialogControllerAndroid::CreateMediaRouterDialog( ...@@ -176,20 +175,20 @@ void MediaRouterDialogControllerAndroid::CreateMediaRouterDialog(
source_ids.push_back(base::UTF8ToUTF16(source.id())); source_ids.push_back(base::UTF8ToUTF16(source.id()));
ScopedJavaLocalRef<jobjectArray> jsource_ids = ScopedJavaLocalRef<jobjectArray> jsource_ids =
base::android::ToJavaArrayOfStrings(env, source_ids); base::android::ToJavaArrayOfStrings(env, source_ids);
Java_ChromeMediaRouterDialogController_openRouteChooserDialog( Java_BrowserMediaRouterDialogController_openRouteChooserDialog(
env, java_dialog_controller_, jsource_ids); env, java_dialog_controller_, jsource_ids);
} }
void MediaRouterDialogControllerAndroid::CloseMediaRouterDialog() { void MediaRouterDialogControllerAndroid::CloseMediaRouterDialog() {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
Java_ChromeMediaRouterDialogController_closeDialog(env, Java_BrowserMediaRouterDialogController_closeDialog(env,
java_dialog_controller_); java_dialog_controller_);
} }
bool MediaRouterDialogControllerAndroid::IsShowingMediaRouterDialog() const { bool MediaRouterDialogControllerAndroid::IsShowingMediaRouterDialog() const {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
return Java_ChromeMediaRouterDialogController_isShowingDialog( return Java_BrowserMediaRouterDialogController_isShowingDialog(
env, java_dialog_controller_); env, java_dialog_controller_);
} }
......
...@@ -6,10 +6,11 @@ ...@@ -6,10 +6,11 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/incognito_helpers.h"
#include "chrome/browser/profiles/profile.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/browser_context.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "chrome/browser/media/android/router/chrome_media_router_client.h"
#include "chrome/browser/media/android/router/media_router_android.h" #include "chrome/browser/media/android/router/media_router_android.h"
#else #else
#include "chrome/browser/media/router/event_page_request_manager_factory.h" #include "chrome/browser/media/router/event_page_request_manager_factory.h"
...@@ -74,7 +75,8 @@ KeyedService* MediaRouterFactory::BuildServiceInstanceFor( ...@@ -74,7 +75,8 @@ KeyedService* MediaRouterFactory::BuildServiceInstanceFor(
BrowserContext* context) const { BrowserContext* context) const {
MediaRouterBase* media_router = nullptr; MediaRouterBase* media_router = nullptr;
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
media_router = new MediaRouterAndroid(context); InitChromeMediaRouterJavaClient();
media_router = new MediaRouterAndroid();
#else #else
media_router = new MediaRouterDesktop(context); media_router = new MediaRouterDesktop(context);
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment