blob: 2352026570bfee71c63672f0f3af0b63f0376987 [file] [log] [blame]
// 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/router/chrome_media_router_factory.h"
#include "build/build_config.h"
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/profiles/incognito_helpers.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/media_router/browser/media_router_dialog_controller.h"
#include "content/public/browser/browser_context.h"
#if defined(OS_ANDROID)
#include "chrome/browser/media/android/router/chrome_media_router_client.h"
#include "components/media_router/browser/android/media_router_android.h"
#include "components/media_router/browser/android/media_router_dialog_controller_android.h"
#else
#include "chrome/browser/media/router/mojo/media_router_desktop.h"
#endif
using content::BrowserContext;
namespace media_router {
namespace {
base::LazyInstance<ChromeMediaRouterFactory>::DestructorAtExit service_factory =
LAZY_INSTANCE_INITIALIZER;
} // namespace
// static
ChromeMediaRouterFactory* ChromeMediaRouterFactory::GetInstance() {
return &service_factory.Get();
}
// static
void ChromeMediaRouterFactory::DoPlatformInit() {
#if defined(OS_ANDROID)
InitChromeMediaRouterJavaClient();
// The desktop (Views) version of this is in ChromeBrowserMainExtraPartsViews
// because we can't reach into Views from this directory.
media_router::MediaRouterDialogController::SetGetOrCreate(
base::BindRepeating([](content::WebContents* web_contents) {
DCHECK(web_contents);
MediaRouterDialogController* controller = nullptr;
// This call does nothing if the controller already exists.
MediaRouterDialogControllerAndroid::CreateForWebContents(web_contents);
controller =
MediaRouterDialogControllerAndroid::FromWebContents(web_contents);
return controller;
}));
#endif
}
ChromeMediaRouterFactory::ChromeMediaRouterFactory() = default;
ChromeMediaRouterFactory::~ChromeMediaRouterFactory() = default;
content::BrowserContext* ChromeMediaRouterFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
return chrome::GetBrowserContextRedirectedInIncognito(context);
}
KeyedService* ChromeMediaRouterFactory::BuildServiceInstanceFor(
BrowserContext* context) const {
if (!MediaRouterEnabled(context)) {
NOTREACHED();
return nullptr;
}
MediaRouterBase* media_router = nullptr;
#if defined(OS_ANDROID)
media_router = new MediaRouterAndroid();
#else
media_router = new MediaRouterDesktop(context);
#endif
media_router->Initialize();
return media_router;
}
void ChromeMediaRouterFactory::BrowserContextShutdown(
content::BrowserContext* context) {
// Notify the MediaRouter (which uses the normal/base proflie) of incognito
// profile shutdown.
if (context->IsOffTheRecord()) {
MediaRouter* router =
static_cast<MediaRouter*>(GetServiceForBrowserContext(context, false));
if (router)
router->OnIncognitoProfileShutdown();
}
BrowserContextKeyedServiceFactory::BrowserContextShutdown(context);
}
} // namespace media_router