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;
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.JNINamespace;
import org.chromium.chrome.browser.document.ChromeIntentUtil;
......@@ -37,6 +41,13 @@ public class ChromeMediaRouterClient extends MediaRouterClient {
ChromeMediaNotificationManager.show(notificationInfo);
}
@Override
public FragmentManager getSupportFragmentManager(WebContents initiator) {
FragmentActivity currentActivity =
(FragmentActivity) ApplicationStatus.getLastTrackedFocusedActivity();
return currentActivity == null ? null : currentActivity.getSupportFragmentManager();
}
@CalledByNative
public static void initialize() {
if (MediaRouterClient.getInstance() != null) return;
......
......@@ -23,6 +23,7 @@ android_library("java") {
"//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:androidx_collection_collection_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_media:android_media_java",
]
......@@ -42,7 +43,6 @@ android_library("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/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/MediaRouteProvider.java",
"java/src/org/chromium/components/media_router/MediaRouterClient.java",
......@@ -95,6 +95,7 @@ android_library("test_support_java") {
"//components/browser_ui/media/android:java",
"//content/public/android:content_java",
"//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:androidx_fragment_fragment_java",
]
}
......@@ -128,6 +129,7 @@ java_library("junit") {
deps = [
":java",
":test_support_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_java",
......
......@@ -10,17 +10,16 @@ import android.widget.FrameLayout;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.mediarouter.media.MediaRouteSelector;
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.
* Call saveSystemVisibility() in onCreateDialog() of the DialogFragment and later
......@@ -62,21 +61,13 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan
protected DialogFragment mDialogFragment;
@Override
public void openDialog() {
public void openDialog(WebContents initiator) {
if (mAndroidMediaRouter == null) {
mDelegate.onDialogCancelled();
return;
}
FragmentActivity currentActivity =
(FragmentActivity) ApplicationStatus.getLastTrackedFocusedActivity();
if (currentActivity == null) {
mDelegate.onDialogCancelled();
return;
}
FragmentManager fm = currentActivity.getSupportFragmentManager();
FragmentManager fm = MediaRouterClient.getInstance().getSupportFragmentManager(initiator);
if (fm == null) {
mDelegate.onDialogCancelled();
return;
......@@ -89,7 +80,6 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan
}
}
@Override
public void closeDialog() {
if (mDialogFragment == null) return;
......@@ -97,7 +87,6 @@ public abstract class BaseMediaRouteDialogManager implements MediaRouteDialogMan
mDialogFragment = null;
}
@Override
public boolean isShowingDialog() {
return mDialogFragment != null && mDialogFragment.isVisible();
}
......
......@@ -13,6 +13,7 @@ import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.components.media_router.caf.CastMediaSource;
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
......@@ -24,16 +25,19 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg
"android.support.v7.mediarouter:MediaRouteControllerDialogFragment";
private final long mNativeDialogController;
private MediaRouteDialogManager mDialogManager;
private BaseMediaRouteDialogManager mDialogManager;
private WebContents mWebContents;
/**
* Returns a new initialized {@link BrowserMediaRouterDialogController}.
* @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.
*/
@CalledByNative
public static BrowserMediaRouterDialogController create(long nativeDialogController) {
return new BrowserMediaRouterDialogController(nativeDialogController);
public static BrowserMediaRouterDialogController create(
long nativeDialogController, WebContents webContents) {
return new BrowserMediaRouterDialogController(nativeDialogController, webContents);
}
/**
......@@ -62,7 +66,7 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg
mDialogManager =
new MediaRouteChooserDialogManager(source.getSourceId(), routeSelector, this);
mDialogManager.openDialog();
mDialogManager.openDialog(mWebContents);
}
/**
......@@ -87,7 +91,7 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg
mDialogManager = new MediaRouteControllerDialogManager(
source.getSourceId(), routeSelector, mediaRouteId, this);
mDialogManager.openDialog();
mDialogManager.openDialog(mWebContents);
}
/**
......@@ -136,8 +140,10 @@ public class BrowserMediaRouterDialogController implements MediaRouteDialogDeleg
mNativeDialogController, BrowserMediaRouterDialogController.this);
}
private BrowserMediaRouterDialogController(long nativeDialogController) {
private BrowserMediaRouterDialogController(
long nativeDialogController, WebContents webContents) {
mNativeDialogController = nativeDialogController;
mWebContents = webContents;
}
@NativeMethods
......
......@@ -5,7 +5,7 @@
package org.chromium.components.media_router;
/**
* An interface providing callbacks for {@link MediaRouteDialogManager}.
* An interface providing callbacks for {@link BaseMediaRouteDialogManager}.
*/
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;
import android.annotation.SuppressLint;
import android.content.Intent;
import androidx.fragment.app.FragmentManager;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.content_public.browser.WebContents;
......@@ -47,4 +49,11 @@ public abstract class MediaRouterClient {
* that should be shown.
*/
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;
import android.content.Intent;
import androidx.fragment.app.FragmentManager;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
......@@ -14,7 +16,7 @@ import org.chromium.content_public.browser.WebContents;
/** Provides Test-specific behavior for Media Router. */
@JNINamespace("media_router")
public class TestMediaRouterClient extends MediaRouterClient {
private TestMediaRouterClient() {}
public TestMediaRouterClient() {}
@Override
public int getTabId(WebContents webContents) {
......@@ -29,6 +31,11 @@ public class TestMediaRouterClient extends MediaRouterClient {
@Override
public void showNotification(MediaNotificationInfo notificationInfo) {}
@Override
public FragmentManager getSupportFragmentManager(WebContents initiator) {
return null;
}
@CalledByNative
public static void initialize() {
if (MediaRouterClient.getInstance() != null) return;
......
......@@ -9,8 +9,6 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import android.content.Intent;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
......@@ -19,7 +17,6 @@ import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature;
import org.chromium.components.browser_ui.media.MediaNotificationInfo;
import org.chromium.content_public.browser.WebContents;
/**
......@@ -41,20 +38,12 @@ public class BrowserMediaRouterRouteTest extends BrowserMediaRouterTestBase {
doReturn(false).when(mWebContents1).isIncognito();
doReturn(false).when(mWebContents2).isIncognito();
MediaRouterClient.setInstance(new MediaRouterClient() {
MediaRouterClient.setInstance(new TestMediaRouterClient() {
@Override
public int getTabId(WebContents webContents) {
if (webContents == mWebContents1) return TAB_ID1;
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;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.Intent;
import androidx.mediarouter.media.MediaRouter;
......@@ -44,13 +43,12 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLooper;
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.MediaRoute;
import org.chromium.components.media_router.MediaRouteManager;
import org.chromium.components.media_router.MediaRouterClient;
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.
......@@ -99,20 +97,7 @@ public class CafMediaRouteProviderTest {
public void setUp() {
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) {}
});
MediaRouterClient.setInstance(new TestMediaRouterClient());
mContext = RuntimeEnvironment.application;
ShadowCastContext.setInstance(mCastContext);
......
......@@ -120,7 +120,7 @@ MediaRouterDialogControllerAndroid::MediaRouterDialogControllerAndroid(
: MediaRouterDialogController(web_contents) {
JNIEnv* env = base::android::AttachCurrentThread();
java_dialog_controller_.Reset(Java_BrowserMediaRouterDialogController_create(
env, reinterpret_cast<jlong>(this)));
env, reinterpret_cast<jlong>(this), web_contents->GetJavaWebContents()));
}
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