Commit c2b4d7c7 authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

Android MediaRouter: get FragmentManager from embedder.

ApplicationStatus doesn't work outside of //chrome (crbug.com/470582),
so this code must be deferred to the embedder.

A WebContents parameter is included because it's necessary for WebLayer,
even though Chrome doesn't use it.

The MediaRouteDialogManager interface is also removed as it only has a
single implementor, BaseMediaRouteDialogManager.

Bug: 1057100
Change-Id: Ifab92742162cf64e42c75eacfdac6b014940b3df
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2430586
Commit-Queue: Evan Stade <estade@chromium.org>
Reviewed-by: default avatarThomas Guilbert <tguilbert@chromium.org>
Cr-Commit-Position: refs/heads/master@{#810837}
parent e4a1cc36
...@@ -6,6 +6,10 @@ package org.chromium.chrome.browser.media.router; ...@@ -6,6 +6,10 @@ package org.chromium.chrome.browser.media.router;
import android.content.Intent; import android.content.Intent;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.browser.document.ChromeIntentUtil; import org.chromium.chrome.browser.document.ChromeIntentUtil;
...@@ -37,6 +41,13 @@ public class ChromeMediaRouterClient extends MediaRouterClient { ...@@ -37,6 +41,13 @@ public class ChromeMediaRouterClient extends MediaRouterClient {
ChromeMediaNotificationManager.show(notificationInfo); ChromeMediaNotificationManager.show(notificationInfo);
} }
@Override
public FragmentManager getSupportFragmentManager(WebContents initiator) {
FragmentActivity currentActivity =
(FragmentActivity) ApplicationStatus.getLastTrackedFocusedActivity();
return currentActivity == null ? null : currentActivity.getSupportFragmentManager();
}
@CalledByNative @CalledByNative
public static void initialize() { public static void initialize() {
if (MediaRouterClient.getInstance() != null) return; if (MediaRouterClient.getInstance() != null) return;
......
...@@ -23,6 +23,7 @@ android_library("java") { ...@@ -23,6 +23,7 @@ android_library("java") {
"//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:androidx_collection_collection_java", "//third_party/android_deps:androidx_collection_collection_java",
"//third_party/android_deps:androidx_core_core_java", "//third_party/android_deps:androidx_core_core_java",
"//third_party/android_deps:androidx_fragment_fragment_java",
"//third_party/android_deps:androidx_mediarouter_mediarouter_java", "//third_party/android_deps:androidx_mediarouter_mediarouter_java",
"//third_party/android_media:android_media_java", "//third_party/android_media:android_media_java",
] ]
...@@ -42,7 +43,6 @@ android_library("java") { ...@@ -42,7 +43,6 @@ android_library("java") {
"java/src/org/chromium/components/media_router/MediaRouteChooserDialogManager.java", "java/src/org/chromium/components/media_router/MediaRouteChooserDialogManager.java",
"java/src/org/chromium/components/media_router/MediaRouteControllerDialogManager.java", "java/src/org/chromium/components/media_router/MediaRouteControllerDialogManager.java",
"java/src/org/chromium/components/media_router/MediaRouteDialogDelegate.java", "java/src/org/chromium/components/media_router/MediaRouteDialogDelegate.java",
"java/src/org/chromium/components/media_router/MediaRouteDialogManager.java",
"java/src/org/chromium/components/media_router/MediaRouteManager.java", "java/src/org/chromium/components/media_router/MediaRouteManager.java",
"java/src/org/chromium/components/media_router/MediaRouteProvider.java", "java/src/org/chromium/components/media_router/MediaRouteProvider.java",
"java/src/org/chromium/components/media_router/MediaRouterClient.java", "java/src/org/chromium/components/media_router/MediaRouterClient.java",
...@@ -95,6 +95,7 @@ android_library("test_support_java") { ...@@ -95,6 +95,7 @@ android_library("test_support_java") {
"//components/browser_ui/media/android:java", "//components/browser_ui/media/android:java",
"//content/public/android:content_java", "//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_fragment_fragment_java",
] ]
} }
...@@ -128,6 +129,7 @@ java_library("junit") { ...@@ -128,6 +129,7 @@ java_library("junit") {
deps = [ deps = [
":java", ":java",
":test_support_java",
"$google_play_services_package:google_play_services_basement_java", "$google_play_services_package:google_play_services_basement_java",
"$google_play_services_package:google_play_services_cast_framework_java", "$google_play_services_package:google_play_services_cast_framework_java",
"$google_play_services_package:google_play_services_cast_java", "$google_play_services_package:google_play_services_cast_java",
......
...@@ -10,17 +10,16 @@ import android.widget.FrameLayout; ...@@ -10,17 +10,16 @@ import android.widget.FrameLayout;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.mediarouter.media.MediaRouteSelector; import androidx.mediarouter.media.MediaRouteSelector;
import androidx.mediarouter.media.MediaRouter; import androidx.mediarouter.media.MediaRouter;
import org.chromium.base.ApplicationStatus; import org.chromium.content_public.browser.WebContents;
/** /**
* Shared code for {@link MediaRouteDialogManager} implementations. * Shared code for media route dialogs.
*/ */
public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogManager { public abstract class BaseMediaRouteDialogManager {
/** /**
* A helper class to handle the system visibility change caused by the dialog showing up. * A helper class to handle the system visibility change caused by the dialog showing up.
* Call saveSystemVisibility() in onCreateDialog() of the DialogFragment and later * Call saveSystemVisibility() in onCreateDialog() of the DialogFragment and later
...@@ -62,21 +61,13 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan ...@@ -62,21 +61,13 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan
protected DialogFragment mDialogFragment; protected DialogFragment mDialogFragment;
@Override public void openDialog(WebContents initiator) {
public void openDialog() {
if (mAndroidMediaRouter == null) { if (mAndroidMediaRouter == null) {
mDelegate.onDialogCancelled(); mDelegate.onDialogCancelled();
return; return;
} }
FragmentActivity currentActivity = FragmentManager fm = MediaRouterClient.getInstance().getSupportFragmentManager(initiator);
(FragmentActivity) ApplicationStatus.getLastTrackedFocusedActivity();
if (currentActivity == null) {
mDelegate.onDialogCancelled();
return;
}
FragmentManager fm = currentActivity.getSupportFragmentManager();
if (fm == null) { if (fm == null) {
mDelegate.onDialogCancelled(); mDelegate.onDialogCancelled();
return; return;
...@@ -89,7 +80,6 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan ...@@ -89,7 +80,6 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan
} }
} }
@Override
public void closeDialog() { public void closeDialog() {
if (mDialogFragment == null) return; if (mDialogFragment == null) return;
...@@ -97,7 +87,6 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan ...@@ -97,7 +87,6 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan
mDialogFragment = null; mDialogFragment = null;
} }
@Override
public boolean isShowingDialog() { public boolean isShowingDialog() {
return mDialogFragment != null && mDialogFragment.isVisible(); return mDialogFragment != null && mDialogFragment.isVisible();
} }
......
...@@ -13,6 +13,7 @@ import org.chromium.base.annotations.JNINamespace; ...@@ -13,6 +13,7 @@ import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.components.media_router.caf.CastMediaSource; import org.chromium.components.media_router.caf.CastMediaSource;
import org.chromium.components.media_router.caf.remoting.RemotingMediaSource; import org.chromium.components.media_router.caf.remoting.RemotingMediaSource;
import org.chromium.content_public.browser.WebContents;
/** /**
* Implements the JNI interface called from the C++ Media Router dialog controller implementation * Implements the JNI interface called from the C++ Media Router dialog controller implementation
...@@ -24,16 +25,19 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg ...@@ -24,16 +25,19 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg
"android.support.v7.mediarouter:MediaRouteControllerDialogFragment"; "android.support.v7.mediarouter:MediaRouteControllerDialogFragment";
private final long mNativeDialogController; private final long mNativeDialogController;
private MediaRouteDialogManager mDialogManager; private BaseMediaRouteDialogManager mDialogManager;
private WebContents mWebContents;
/** /**
* Returns a new initialized {@link BrowserMediaRouterDialogController}. * Returns a new initialized {@link BrowserMediaRouterDialogController}.
* @param nativeDialogController the handle of the native object. * @param nativeDialogController the handle of the native object.
* @param webContents the initiator of the dialog.
* @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 BrowserMediaRouterDialogController create(long nativeDialogController) { public static BrowserMediaRouterDialogController create(
return new BrowserMediaRouterDialogController(nativeDialogController); long nativeDialogController, WebContents webContents) {
return new BrowserMediaRouterDialogController(nativeDialogController, webContents);
} }
/** /**
...@@ -62,7 +66,7 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg ...@@ -62,7 +66,7 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg
mDialogManager = mDialogManager =
new MediaRouteChooserDialogManager(source.getSourceId(), routeSelector, this); new MediaRouteChooserDialogManager(source.getSourceId(), routeSelector, this);
mDialogManager.openDialog(); mDialogManager.openDialog(mWebContents);
} }
/** /**
...@@ -87,7 +91,7 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg ...@@ -87,7 +91,7 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg
mDialogManager = new MediaRouteControllerDialogManager( mDialogManager = new MediaRouteControllerDialogManager(
source.getSourceId(), routeSelector, mediaRouteId, this); source.getSourceId(), routeSelector, mediaRouteId, this);
mDialogManager.openDialog(); mDialogManager.openDialog(mWebContents);
} }
/** /**
...@@ -136,8 +140,10 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg ...@@ -136,8 +140,10 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg
mNativeDialogController, BrowserMediaRouterDialogController.this); mNativeDialogController, BrowserMediaRouterDialogController.this);
} }
private BrowserMediaRouterDialogController(long nativeDialogController) { private BrowserMediaRouterDialogController(
long nativeDialogController, WebContents webContents) {
mNativeDialogController = nativeDialogController; mNativeDialogController = nativeDialogController;
mWebContents = webContents;
} }
@NativeMethods @NativeMethods
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
package org.chromium.components.media_router; package org.chromium.components.media_router;
/** /**
* An interface providing callbacks for {@link MediaRouteDialogManager}. * An interface providing callbacks for {@link BaseMediaRouteDialogManager}.
*/ */
public interface MediaRouteDialogDelegate { public interface MediaRouteDialogDelegate {
/** /**
......
// Copyright 2015 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.components.media_router;
import androidx.mediarouter.app.MediaRouteChooserDialog;
import androidx.mediarouter.app.MediaRouteControllerDialog;
/**
* A common interface to be implemented by various media route dialog handlers
* (e.g {@link MediaRouteChooserDialog} or {@link MediaRouteControllerDialog}.
*/
public interface MediaRouteDialogManager {
/**
* Opens the dialog managed by the implementation of the interface.
*/
void openDialog();
/**
* Closes the currently open dialog.
*/
void closeDialog();
/**
* @return if a chooser or controller dialog is shown.
*/
boolean isShowingDialog();
}
...@@ -7,6 +7,8 @@ package org.chromium.components.media_router; ...@@ -7,6 +7,8 @@ package org.chromium.components.media_router;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Intent; import android.content.Intent;
import androidx.fragment.app.FragmentManager;
import org.chromium.components.browser_ui.media.MediaNotificationInfo; import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
...@@ -47,4 +49,11 @@ public abstract class MediaRouterClient { ...@@ -47,4 +49,11 @@ public abstract class MediaRouterClient {
* that should be shown. * that should be shown.
*/ */
public abstract void showNotification(MediaNotificationInfo notificationInfo); public abstract void showNotification(MediaNotificationInfo notificationInfo);
/**
* @param initiator the web contents that initiated the request.
* @return a {@link FragmentManager} suitable for displaying a media router {@link
* DialogFragment} in.
*/
public abstract FragmentManager getSupportFragmentManager(WebContents initiator);
} }
...@@ -6,6 +6,8 @@ package org.chromium.components.media_router; ...@@ -6,6 +6,8 @@ package org.chromium.components.media_router;
import android.content.Intent; import android.content.Intent;
import androidx.fragment.app.FragmentManager;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.components.browser_ui.media.MediaNotificationInfo; import org.chromium.components.browser_ui.media.MediaNotificationInfo;
...@@ -14,7 +16,7 @@ import org.chromium.content_public.browser.WebContents; ...@@ -14,7 +16,7 @@ import org.chromium.content_public.browser.WebContents;
/** Provides Test-specific behavior for Media Router. */ /** Provides Test-specific behavior for Media Router. */
@JNINamespace("media_router") @JNINamespace("media_router")
public class TestMediaRouterClient extends MediaRouterClient { public class TestMediaRouterClient extends MediaRouterClient {
private TestMediaRouterClient() {} public TestMediaRouterClient() {}
@Override @Override
public int getTabId(WebContents webContents) { public int getTabId(WebContents webContents) {
...@@ -29,6 +31,11 @@ public class TestMediaRouterClient extends MediaRouterClient { ...@@ -29,6 +31,11 @@ public class TestMediaRouterClient extends MediaRouterClient {
@Override @Override
public void showNotification(MediaNotificationInfo notificationInfo) {} public void showNotification(MediaNotificationInfo notificationInfo) {}
@Override
public FragmentManager getSupportFragmentManager(WebContents initiator) {
return null;
}
@CalledByNative @CalledByNative
public static void initialize() { public static void initialize() {
if (MediaRouterClient.getInstance() != null) return; if (MediaRouterClient.getInstance() != null) return;
......
...@@ -9,8 +9,6 @@ import static org.junit.Assert.assertTrue; ...@@ -9,8 +9,6 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.content.Intent;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
...@@ -19,7 +17,6 @@ import org.robolectric.annotation.Config; ...@@ -19,7 +17,6 @@ import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
/** /**
...@@ -41,20 +38,12 @@ public class BrowserMediaRouterRouteTest extends BrowserMediaRouterTestBase { ...@@ -41,20 +38,12 @@ public class BrowserMediaRouterRouteTest extends BrowserMediaRouterTestBase {
doReturn(false).when(mWebContents1).isIncognito(); doReturn(false).when(mWebContents1).isIncognito();
doReturn(false).when(mWebContents2).isIncognito(); doReturn(false).when(mWebContents2).isIncognito();
MediaRouterClient.setInstance(new MediaRouterClient() { MediaRouterClient.setInstance(new TestMediaRouterClient() {
@Override @Override
public int getTabId(WebContents webContents) { public int getTabId(WebContents webContents) {
if (webContents == mWebContents1) return TAB_ID1; if (webContents == mWebContents1) return TAB_ID1;
return TAB_ID2; return TAB_ID2;
} }
@Override
public Intent createBringTabToFrontIntent(int tabId) {
return null;
}
@Override
public void showNotification(MediaNotificationInfo notificationInfo) {}
}); });
} }
......
...@@ -22,7 +22,6 @@ import static org.mockito.Mockito.spy; ...@@ -22,7 +22,6 @@ 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;
...@@ -44,13 +43,12 @@ import org.robolectric.annotation.Config; ...@@ -44,13 +43,12 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLooper; import org.robolectric.shadows.ShadowLooper;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.components.media_router.ClientRecord; import org.chromium.components.media_router.ClientRecord;
import org.chromium.components.media_router.MediaRoute; import org.chromium.components.media_router.MediaRoute;
import org.chromium.components.media_router.MediaRouteManager; import org.chromium.components.media_router.MediaRouteManager;
import org.chromium.components.media_router.MediaRouterClient; import org.chromium.components.media_router.MediaRouterClient;
import org.chromium.components.media_router.MediaSink; import org.chromium.components.media_router.MediaSink;
import org.chromium.content_public.browser.WebContents; import org.chromium.components.media_router.TestMediaRouterClient;
/** /**
* Robolectric tests for CafMediaRouteProvider. * Robolectric tests for CafMediaRouteProvider.
...@@ -99,20 +97,7 @@ public class CafMediaRouteProviderTest { ...@@ -99,20 +97,7 @@ public class CafMediaRouteProviderTest {
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
MediaRouterClient.setInstance(new MediaRouterClient() { MediaRouterClient.setInstance(new TestMediaRouterClient());
@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);
......
...@@ -120,7 +120,7 @@ MediaRouterDialogControllerAndroid::MediaRouterDialogControllerAndroid( ...@@ -120,7 +120,7 @@ MediaRouterDialogControllerAndroid::MediaRouterDialogControllerAndroid(
: MediaRouterDialogController(web_contents) { : MediaRouterDialogController(web_contents) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
java_dialog_controller_.Reset(Java_BrowserMediaRouterDialogController_create( java_dialog_controller_.Reset(Java_BrowserMediaRouterDialogController_create(
env, reinterpret_cast<jlong>(this))); env, reinterpret_cast<jlong>(this), web_contents->GetJavaWebContents()));
} }
MediaRouterDialogControllerAndroid::~MediaRouterDialogControllerAndroid() {} MediaRouterDialogControllerAndroid::~MediaRouterDialogControllerAndroid() {}
......
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