Commit 559e8c6d authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

WebLayer: add MediaRouter stub code.

This adds code to enable media router features, although the
implementation is still missing.

Notably,
- a feature flag is added to enable/disable MediaRouter code
- Media-related java, new and old, is moved into weblayer_private.media

Bug: 1057100
Change-Id: Ied1cfd60e19890166568fc3facbd012285c9fabf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2427289Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#811910}
parent 765cbc63
......@@ -76,6 +76,18 @@
android:process=":webview_service"
android:visibleToInstantApps="true">
</provider> # DIFF-ANCHOR: bfe37944
<receiver # DIFF-ANCHOR: 1091f66b
android:exported="false"
android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver">
</receiver> # DIFF-ANCHOR: 1091f66b
<service # DIFF-ANCHOR: 41539e3c
android:exported="false"
android:name="com.google.android.gms.cast.framework.ReconnectionService">
</service> # DIFF-ANCHOR: 41539e3c
<service # DIFF-ANCHOR: 7dad1ec5
android:exported="false"
android:name="com.google.android.gms.cast.framework.media.MediaNotificationService">
</service> # DIFF-ANCHOR: 7dad1ec5
<service # DIFF-ANCHOR: 3cd6d713
android:exported="true"
android:name="org.chromium.android_webview.services.AwMinidumpUploadJobService"
......
......@@ -76,6 +76,18 @@
android:process=":webview_service"
android:visibleToInstantApps="true">
</provider> # DIFF-ANCHOR: bfe37944
<receiver # DIFF-ANCHOR: 1091f66b
android:exported="false"
android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver">
</receiver> # DIFF-ANCHOR: 1091f66b
<service # DIFF-ANCHOR: 41539e3c
android:exported="false"
android:name="com.google.android.gms.cast.framework.ReconnectionService">
</service> # DIFF-ANCHOR: 41539e3c
<service # DIFF-ANCHOR: 7dad1ec5
android:exported="false"
android:name="com.google.android.gms.cast.framework.media.MediaNotificationService">
</service> # DIFF-ANCHOR: 7dad1ec5
<service # DIFF-ANCHOR: 3cd6d713
android:exported="true"
android:name="org.chromium.android_webview.services.AwMinidumpUploadJobService"
......
......@@ -9,6 +9,7 @@ common_resource_exclusion_regex = "drawable[^/]*-xxxhdpi"
common_resource_exclusion_exceptions = [
"*shadow*", # Combination of gradient & transparency cause pixelation.
"*.9.*", # Most nine-patches contain shadows.
"*ic_group_*", # Appear only in xxxhdpi.
]
# Remove WearOS resources (a couple exist in appcompat).
......
......@@ -153,7 +153,6 @@ template("chrome_public_common_apk_or_module_tmpl") {
resource_exclusion_exceptions += [
"*ic_file_download_white*", # Bottom edge seems misaligned.
"*ic_lock.*", # Bottom edge seems misaligned.
"*ic_group_*", # Appear only in xxxhdpi.
]
if (min_sdk_version >= 21) {
......
......@@ -545,6 +545,10 @@ source_set("weblayer_lib_base") {
"browser/js_communication/web_message_host_factory_proxy.h",
"browser/js_communication/web_message_reply_proxy_impl.cc",
"browser/js_communication/web_message_reply_proxy_impl.h",
"browser/media/local_presentation_manager_factory.cc",
"browser/media/local_presentation_manager_factory.h",
"browser/media/media_router_factory.cc",
"browser/media/media_router_factory.h",
"browser/new_tab_callback_proxy.cc",
"browser/new_tab_callback_proxy.h",
"browser/safe_browsing/real_time_url_lookup_service_factory.cc",
......@@ -606,6 +610,7 @@ source_set("weblayer_lib_base") {
"//components/infobars/content",
"//components/javascript_dialogs",
"//components/location/android:settings",
"//components/media_router/browser",
"//components/metrics",
"//components/minidump_uploader",
"//components/navigation_interception",
......
......@@ -30,6 +30,7 @@ include_rules = [
"+components/keyed_service/content",
"+components/keyed_service/core",
"+components/language/core/browser",
"+components/media_router",
"+components/metrics",
"+components/navigation_interception",
"+components/network_session_configurator",
......
......@@ -50,7 +50,10 @@
#include "net/base/network_change_notifier.h"
#include "weblayer/browser/android/metrics/uma_utils.h"
#include "weblayer/browser/java/jni/MojoInterfaceRegistrar_jni.h"
#include "weblayer/browser/media/local_presentation_manager_factory.h"
#include "weblayer/browser/media/media_router_factory.h"
#include "weblayer/browser/weblayer_factory_impl_android.h"
#include "weblayer/common/features.h"
#endif
#if defined(USE_X11)
......@@ -86,6 +89,12 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
TranslateRankerFactory::GetInstance();
PrerenderLinkManagerFactory::GetInstance();
PrerenderManagerFactory::GetInstance();
#if defined(OS_ANDROID)
if (base::FeatureList::IsEnabled(features::kMediaRouter)) {
LocalPresentationManagerFactory::GetInstance();
MediaRouterFactory::GetInstance();
}
#endif
}
void StopMessageLoop(base::OnceClosure quit_closure) {
......
......@@ -114,6 +114,7 @@
#include "components/cdm/browser/media_drm_storage_impl.h" // nogncheck
#include "components/crash/content/browser/crash_handler_host_linux.h"
#include "components/embedder_support/android/metrics/android_metrics_service_client.h"
#include "components/media_router/browser/presentation/presentation_service_delegate_impl.h" // nogncheck
#include "components/navigation_interception/intercept_navigation_delegate.h"
#include "components/safe_browsing/core/realtime/policy_engine.h" // nogncheck
#include "components/safe_browsing/core/realtime/url_lookup_service.h" // nogncheck
......@@ -126,6 +127,7 @@
#include "weblayer/browser/android_descriptors.h"
#include "weblayer/browser/browser_context_impl.h"
#include "weblayer/browser/devtools_manager_delegate_android.h"
#include "weblayer/browser/media/media_router_factory.h"
#include "weblayer/browser/safe_browsing/real_time_url_lookup_service_factory.h"
#include "weblayer/browser/safe_browsing/safe_browsing_service.h"
#include "weblayer/browser/tts_environment_android_impl.h"
......@@ -631,6 +633,20 @@ bool ContentBrowserClientImpl::CanCreateWindow(
web_contents->GetBrowserContext())) != nullptr;
}
content::ControllerPresentationServiceDelegate*
ContentBrowserClientImpl::GetControllerPresentationServiceDelegate(
content::WebContents* web_contents) {
#if defined(OS_ANDROID)
if (base::FeatureList::IsEnabled(features::kMediaRouter)) {
MediaRouterFactory::DoPlatformInitIfNeeded();
return media_router::PresentationServiceDelegateImpl::
GetOrCreateForWebContents(web_contents);
}
#endif
return nullptr;
}
std::vector<std::unique_ptr<content::NavigationThrottle>>
ContentBrowserClientImpl::CreateThrottlesForNavigation(
content::NavigationHandle* handle) {
......
......@@ -90,6 +90,9 @@ class ContentBrowserClientImpl : public content::ContentBrowserClient {
bool user_gesture,
bool opener_suppressed,
bool* no_javascript_access) override;
content::ControllerPresentationServiceDelegate*
GetControllerPresentationServiceDelegate(
content::WebContents* web_contents) override;
std::vector<std::unique_ptr<content::NavigationThrottle>>
CreateThrottlesForNavigation(content::NavigationHandle* handle) override;
content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
......
......@@ -114,8 +114,6 @@ android_library("java") {
"org/chromium/weblayer_private/IntentUtils.java",
"org/chromium/weblayer_private/InterceptNavigationDelegateClientImpl.java",
"org/chromium/weblayer_private/LocaleChangedBroadcastReceiver.java",
"org/chromium/weblayer_private/MediaSessionManager.java",
"org/chromium/weblayer_private/MediaStreamManager.java",
"org/chromium/weblayer_private/MojoInterfaceRegistrar.java",
"org/chromium/weblayer_private/NavigationControllerImpl.java",
"org/chromium/weblayer_private/NavigationImpl.java",
......@@ -140,6 +138,9 @@ android_library("java") {
"org/chromium/weblayer_private/WebLayerTabModalPresenter.java",
"org/chromium/weblayer_private/WebMessageReplyProxyImpl.java",
"org/chromium/weblayer_private/WebShareServiceFactory.java",
"org/chromium/weblayer_private/media/MediaRouterClientImpl.java",
"org/chromium/weblayer_private/media/MediaSessionManager.java",
"org/chromium/weblayer_private/media/MediaStreamManager.java",
"org/chromium/weblayer_private/metrics/MetricsServiceClient.java",
"org/chromium/weblayer_private/metrics/UmaUtils.java",
"org/chromium/weblayer_private/permissions/PermissionRequestUtils.java",
......@@ -193,6 +194,7 @@ android_library("java") {
"//components/infobars/core:infobar_enums_java",
"//components/javascript_dialogs/android:java",
"//components/location/android:settings_java",
"//components/media_router/browser/android:java",
"//components/metrics:metrics_java",
"//components/minidump_uploader:minidump_uploader_java",
"//components/navigation_interception/android:navigation_interception_java",
......@@ -312,7 +314,6 @@ generate_jni("jni") {
"org/chromium/weblayer_private/GoogleAccountsCallbackProxy.java",
"org/chromium/weblayer_private/InfoBarContainer.java",
"org/chromium/weblayer_private/LocaleChangedBroadcastReceiver.java",
"org/chromium/weblayer_private/MediaStreamManager.java",
"org/chromium/weblayer_private/MojoInterfaceRegistrar.java",
"org/chromium/weblayer_private/NavigationControllerImpl.java",
"org/chromium/weblayer_private/NavigationImpl.java",
......@@ -327,6 +328,8 @@ generate_jni("jni") {
"org/chromium/weblayer_private/WebLayerImpl.java",
"org/chromium/weblayer_private/WebMessageReplyProxyImpl.java",
"org/chromium/weblayer_private/WebViewCompatibilityHelperImpl.java",
"org/chromium/weblayer_private/media/MediaRouterClientImpl.java",
"org/chromium/weblayer_private/media/MediaStreamManager.java",
"org/chromium/weblayer_private/metrics/MetricsServiceClient.java",
"org/chromium/weblayer_private/metrics/UmaUtils.java",
"org/chromium/weblayer_private/permissions/PermissionRequestUtils.java",
......
......@@ -72,6 +72,8 @@ import org.chromium.weblayer_private.interfaces.IWebMessageCallbackClient;
import org.chromium.weblayer_private.interfaces.ObjectWrapper;
import org.chromium.weblayer_private.interfaces.ScrollNotificationType;
import org.chromium.weblayer_private.interfaces.StrictModeWorkaround;
import org.chromium.weblayer_private.media.MediaSessionManager;
import org.chromium.weblayer_private.media.MediaStreamManager;
import java.util.ArrayList;
import java.util.HashMap;
......
......@@ -74,7 +74,7 @@ public final class WebLayerFactoryImpl extends IWebLayerFactory.Stub {
}
@CalledByNative
static int getClientMajorVersion() {
public static int getClientMajorVersion() {
if (sClientMajorVersion == 0) {
throw new IllegalStateException(
"This should only be called once WebLayer is initialized");
......
......@@ -74,6 +74,8 @@ import org.chromium.weblayer_private.interfaces.IWebLayer;
import org.chromium.weblayer_private.interfaces.IWebLayerClient;
import org.chromium.weblayer_private.interfaces.ObjectWrapper;
import org.chromium.weblayer_private.interfaces.StrictModeWorkaround;
import org.chromium.weblayer_private.media.MediaSessionManager;
import org.chromium.weblayer_private.media.MediaStreamManager;
import org.chromium.weblayer_private.metrics.MetricsServiceClient;
import org.chromium.weblayer_private.metrics.UmaUtils;
......
......@@ -25,8 +25,9 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
/** Defines notification channels for WebLayer. */
@TargetApi(Build.VERSION_CODES.O)
class WebLayerNotificationChannels extends ChannelDefinitions {
public class WebLayerNotificationChannels extends ChannelDefinitions {
/**
* Version number identifying the current set of channels. This must be incremented whenever the
* set of channels returned by {@link #getStartupChannelIds()} or {@link #getLegacyChannelIds()}
......
......@@ -22,7 +22,7 @@ import org.chromium.components.browser_ui.notifications.NotificationWrapperStand
import org.chromium.components.browser_ui.notifications.channels.ChannelsInitializer;
/** A notification builder for WebLayer which has extra logic to make icons work correctly. */
final class WebLayerNotificationWrapperBuilder extends NotificationWrapperStandardBuilder {
public final class WebLayerNotificationWrapperBuilder extends NotificationWrapperStandardBuilder {
/** Creates a notification builder. */
public static WebLayerNotificationWrapperBuilder create(
@WebLayerNotificationChannels.ChannelId String channelId,
......
// 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.weblayer_private.media;
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;
import org.chromium.components.media_router.MediaRouterClient;
import org.chromium.content_public.browser.WebContents;
import org.chromium.weblayer_private.IntentUtils;
import org.chromium.weblayer_private.TabImpl;
/** Provides WebLayer-specific behavior for Media Router. */
@JNINamespace("weblayer")
public class MediaRouterClientImpl extends MediaRouterClient {
private MediaRouterClientImpl() {}
@Override
public int getTabId(WebContents webContents) {
TabImpl tab = TabImpl.fromWebContents(webContents);
return tab == null ? -1 : tab.getId();
}
@Override
public Intent createBringTabToFrontIntent(int tabId) {
return IntentUtils.createBringTabToFrontIntent(tabId);
}
@Override
public void showNotification(MediaNotificationInfo notificationInfo) {
// TODO: implement.
}
@Override
public FragmentManager getSupportFragmentManager(WebContents initiator) {
return null;
}
@CalledByNative
public static void initialize() {
if (MediaRouterClient.getInstance() != null) return;
MediaRouterClient.setInstance(new MediaRouterClientImpl());
}
}
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.weblayer_private;
package org.chromium.weblayer_private.media;
import android.app.Service;
import android.content.Intent;
......@@ -16,6 +16,10 @@ import org.chromium.components.browser_ui.notifications.ForegroundServiceUtils;
import org.chromium.components.browser_ui.notifications.NotificationMetadata;
import org.chromium.components.browser_ui.notifications.NotificationWrapper;
import org.chromium.components.browser_ui.notifications.NotificationWrapperBuilder;
import org.chromium.weblayer_private.IntentUtils;
import org.chromium.weblayer_private.WebLayerImpl;
import org.chromium.weblayer_private.WebLayerNotificationChannels;
import org.chromium.weblayer_private.WebLayerNotificationWrapperBuilder;
/**
* A glue class for MediaSession.
......@@ -23,10 +27,10 @@ import org.chromium.components.browser_ui.notifications.NotificationWrapperBuild
* It also manages the lifetime of {@link MediaNotificationController} and the {@link Service}
* associated with the notification.
*/
class MediaSessionManager {
public class MediaSessionManager {
private static int sNotificationId;
static void serviceStarted(Service service, Intent intent) {
public static void serviceStarted(Service service, Intent intent) {
MediaNotificationController controller = getController();
if (controller != null && controller.processIntent(service, intent)) return;
......@@ -41,13 +45,13 @@ class MediaSessionManager {
service.stopSelf();
}
static void serviceDestroyed() {
public static void serviceDestroyed() {
MediaNotificationController controller = getController();
if (controller != null) controller.onServiceDestroyed();
MediaNotificationManager.clear(getNotificationId());
}
static MediaSessionHelper.Delegate createMediaSessionHelperDelegate(int tabId) {
public static MediaSessionHelper.Delegate createMediaSessionHelperDelegate(int tabId) {
return new MediaSessionHelper.Delegate() {
@Override
public Intent createBringTabToFrontIntent() {
......
......@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.weblayer_private;
package org.chromium.weblayer_private.media;
import android.app.NotificationManager;
import android.content.Context;
......@@ -25,6 +25,12 @@ import org.chromium.components.browser_ui.notifications.PendingIntentProvider;
import org.chromium.components.webrtc.MediaCaptureNotificationUtil;
import org.chromium.components.webrtc.MediaCaptureNotificationUtil.MediaType;
import org.chromium.content_public.browser.WebContents;
import org.chromium.weblayer_private.IntentUtils;
import org.chromium.weblayer_private.TabImpl;
import org.chromium.weblayer_private.WebLayerFactoryImpl;
import org.chromium.weblayer_private.WebLayerImpl;
import org.chromium.weblayer_private.WebLayerNotificationChannels;
import org.chromium.weblayer_private.WebLayerNotificationWrapperBuilder;
import org.chromium.weblayer_private.interfaces.IMediaCaptureCallbackClient;
import org.chromium.weblayer_private.interfaces.ObjectWrapper;
......
// 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 "weblayer/browser/media/local_presentation_manager_factory.h"
#include "base/no_destructor.h"
namespace weblayer {
// static
LocalPresentationManagerFactory*
LocalPresentationManagerFactory::GetInstance() {
static base::NoDestructor<LocalPresentationManagerFactory> instance;
return instance.get();
}
LocalPresentationManagerFactory::LocalPresentationManagerFactory() = default;
LocalPresentationManagerFactory::~LocalPresentationManagerFactory() = default;
content::BrowserContext*
LocalPresentationManagerFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
return context;
}
} // namespace weblayer
// 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 WEBLAYER_BROWSER_MEDIA_LOCAL_PRESENTATION_MANAGER_FACTORY_H_
#define WEBLAYER_BROWSER_MEDIA_LOCAL_PRESENTATION_MANAGER_FACTORY_H_
#include "components/media_router/browser/presentation/local_presentation_manager_factory.h"
namespace base {
template <typename T>
class NoDestructor;
}
namespace content {
class BrowserContext;
}
namespace weblayer {
// A version of LocalPresentationManagerFactory that does not redirect from
// incognito to normal context.
class LocalPresentationManagerFactory
: public media_router::LocalPresentationManagerFactory {
public:
LocalPresentationManagerFactory(const LocalPresentationManagerFactory&) =
delete;
LocalPresentationManagerFactory& operator=(
const LocalPresentationManagerFactory&) = delete;
static LocalPresentationManagerFactory* GetInstance();
private:
friend base::NoDestructor<LocalPresentationManagerFactory>;
LocalPresentationManagerFactory();
~LocalPresentationManagerFactory() override;
// BrowserContextKeyedServiceFactory interface.
content::BrowserContext* GetBrowserContextToUse(
content::BrowserContext* context) const override;
};
} // namespace weblayer
#endif // WEBLAYER_BROWSER_MEDIA_LOCAL_PRESENTATION_MANAGER_FACTORY_H_
// 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 "weblayer/browser/media/media_router_factory.h"
#include "base/android/jni_android.h"
#include "base/no_destructor.h"
#include "components/media_router/browser/android/media_router_android.h"
#include "components/media_router/browser/android/media_router_dialog_controller_android.h"
#include "components/media_router/browser/media_router_dialog_controller.h"
#include "content/public/browser/browser_context.h"
#include "weblayer/browser/java/jni/MediaRouterClientImpl_jni.h"
namespace weblayer {
// static
MediaRouterFactory* MediaRouterFactory::GetInstance() {
static base::NoDestructor<MediaRouterFactory> instance;
return instance.get();
}
// static
void MediaRouterFactory::DoPlatformInitIfNeeded() {
static bool init_done = false;
if (init_done)
return;
Java_MediaRouterClientImpl_initialize(base::android::AttachCurrentThread());
media_router::MediaRouterDialogController::SetGetOrCreate(
base::BindRepeating([](content::WebContents* web_contents) {
DCHECK(web_contents);
// This call does nothing if the controller already exists.
media_router::MediaRouterDialogControllerAndroid::CreateForWebContents(
web_contents);
return static_cast<media_router::MediaRouterDialogController*>(
media_router::MediaRouterDialogControllerAndroid::FromWebContents(
web_contents));
}));
init_done = true;
}
MediaRouterFactory::MediaRouterFactory() = default;
MediaRouterFactory::~MediaRouterFactory() = default;
content::BrowserContext* MediaRouterFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
return context;
}
KeyedService* MediaRouterFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
media_router::MediaRouterBase* media_router =
new media_router::MediaRouterAndroid();
media_router->Initialize();
return media_router;
}
} // namespace weblayer
// 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 WEBLAYER_BROWSER_MEDIA_MEDIA_ROUTER_FACTORY_H_
#define WEBLAYER_BROWSER_MEDIA_MEDIA_ROUTER_FACTORY_H_
#include "components/media_router/browser/media_router_factory.h"
namespace base {
template <typename T>
class NoDestructor;
}
namespace content {
class BrowserContext;
}
namespace weblayer {
class MediaRouterFactory : public media_router::MediaRouterFactory {
public:
MediaRouterFactory(const MediaRouterFactory&) = delete;
MediaRouterFactory& operator=(const MediaRouterFactory&) = delete;
static MediaRouterFactory* GetInstance();
// Performs platform and WebLayer-specific initialization for media_router.
static void DoPlatformInitIfNeeded();
private:
friend base::NoDestructor<MediaRouterFactory>;
MediaRouterFactory();
~MediaRouterFactory() override;
// MediaRouterFactory:
content::BrowserContext* GetBrowserContextToUse(
content::BrowserContext* context) const override;
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const override;
};
} // namespace weblayer
#endif // WEBLAYER_BROWSER_MEDIA_MEDIA_ROUTER_FACTORY_H_
......@@ -9,6 +9,11 @@ namespace features {
// Weblayer features in alphabetical order.
// Covers all media router features, i.e. Presentation API, Remote Playback API,
// and Media Fling (automatic casting of html5 videos).
const base::Feature kMediaRouter{"WebLayerMediaRouter",
base::FEATURE_DISABLED_BY_DEFAULT};
// Safebrowsing support for weblayer.
const base::Feature kWebLayerSafeBrowsing{"WebLayerSafeBrowsing",
base::FEATURE_ENABLED_BY_DEFAULT};
......
......@@ -12,6 +12,8 @@ namespace features {
// Weblayer features in alphabetical order.
extern const base::Feature kMediaRouter;
extern const base::Feature kWebLayerSafeBrowsing;
} // namespace features
......
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