Commit 92940353 authored by Wei Lee's avatar Wei Lee Committed by Chromium LUCI CQ

[CCA] Run CameraAppWindowManager as a singleton

To enable CCA on guest mode, CameraAppWindowManager cannot be a
KeyedService since it does not work under guest mode.

Therefore, this CL changes CameraAppWindowManager as a singleton object.

Bug: b/172343942
Test: Manually
Change-Id: Ia4e8970e2e2083af6db58f20d22f00ab17f20b92
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2592184
Commit-Queue: Wei Lee <wtlee@chromium.org>
Reviewed-by: default avatarShik Chen <shik@chromium.org>
Cr-Commit-Position: refs/heads/master@{#837043}
parent 5fc78807
...@@ -16,8 +16,6 @@ static_library("camera_app_ui") { ...@@ -16,8 +16,6 @@ static_library("camera_app_ui") {
"camera_app_ui_delegate.h", "camera_app_ui_delegate.h",
"camera_app_window_manager.cc", "camera_app_window_manager.cc",
"camera_app_window_manager.h", "camera_app_window_manager.h",
"camera_app_window_manager_factory.cc",
"camera_app_window_manager_factory.h",
"camera_app_window_state_controller.cc", "camera_app_window_state_controller.cc",
"camera_app_window_state_controller.h", "camera_app_window_state_controller.h",
"resources.h", "resources.h",
...@@ -36,8 +34,6 @@ static_library("camera_app_ui") { ...@@ -36,8 +34,6 @@ static_library("camera_app_ui") {
"//chromeos/strings", "//chromeos/strings",
"//chromeos/system", "//chromeos/system",
"//components/arc", "//components/arc",
"//components/keyed_service/content",
"//components/keyed_service/core",
"//content/public/browser", "//content/public/browser",
"//content/public/common", "//content/public/common",
"//media/capture:capture_lib", "//media/capture:capture_lib",
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include "ash/public/cpp/window_properties.h" #include "ash/public/cpp/window_properties.h"
#include "base/bind.h" #include "base/bind.h"
#include "chromeos/components/camera_app_ui/camera_app_helper_impl.h" #include "chromeos/components/camera_app_ui/camera_app_helper_impl.h"
#include "chromeos/components/camera_app_ui/camera_app_window_manager_factory.h"
#include "chromeos/components/camera_app_ui/resources.h" #include "chromeos/components/camera_app_ui/resources.h"
#include "chromeos/components/camera_app_ui/url_constants.h" #include "chromeos/components/camera_app_ui/url_constants.h"
#include "components/arc/intent_helper/arc_intent_helper_bridge.h" #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
...@@ -251,8 +250,7 @@ aura::Window* CameraAppUI::window() { ...@@ -251,8 +250,7 @@ aura::Window* CameraAppUI::window() {
} }
CameraAppWindowManager* CameraAppUI::app_window_manager() { CameraAppWindowManager* CameraAppUI::app_window_manager() {
return chromeos::CameraAppWindowManagerFactory::GetForBrowserContext( return chromeos::CameraAppWindowManager::GetInstance();
web_ui()->GetWebContents()->GetBrowserContext());
} }
const GURL& CameraAppUI::url() { const GURL& CameraAppUI::url() {
......
...@@ -6,20 +6,26 @@ ...@@ -6,20 +6,26 @@
#include "chromeos/components/camera_app_ui/camera_app_helper_impl.h" #include "chromeos/components/camera_app_ui/camera_app_helper_impl.h"
#include "chromeos/components/camera_app_ui/url_constants.h" #include "chromeos/components/camera_app_ui/url_constants.h"
#include "content/public/browser/browser_thread.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
namespace chromeos { namespace chromeos {
CameraAppWindowManager::CameraAppWindowManager() = default;
CameraAppWindowManager::~CameraAppWindowManager() = default; CameraAppWindowManager::~CameraAppWindowManager() = default;
// static
CameraAppWindowManager* CameraAppWindowManager::GetInstance() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
return base::Singleton<CameraAppWindowManager>::get();
}
void CameraAppWindowManager::SetCameraUsageMonitor( void CameraAppWindowManager::SetCameraUsageMonitor(
aura::Window* window, aura::Window* window,
mojo::PendingRemote<chromeos_camera::mojom::CameraUsageOwnershipMonitor> mojo::PendingRemote<chromeos_camera::mojom::CameraUsageOwnershipMonitor>
usage_monitor, usage_monitor,
base::OnceCallback<void()> callback) { base::OnceCallback<void()> callback) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
auto* widget = views::Widget::GetWidgetForNativeWindow(window); auto* widget = views::Widget::GetWidgetForNativeWindow(window);
mojo::Remote<chromeos_camera::mojom::CameraUsageOwnershipMonitor> remote( mojo::Remote<chromeos_camera::mojom::CameraUsageOwnershipMonitor> remote(
...@@ -39,6 +45,7 @@ void CameraAppWindowManager::SetCameraUsageMonitor( ...@@ -39,6 +45,7 @@ void CameraAppWindowManager::SetCameraUsageMonitor(
void CameraAppWindowManager::OnWidgetVisibilityChanged(views::Widget* widget, void CameraAppWindowManager::OnWidgetVisibilityChanged(views::Widget* widget,
bool visible) { bool visible) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
// This event will be triggered and the |visible| will be set to: // This event will be triggered and the |visible| will be set to:
// * True: // * True:
// 1. When the window is restored from minimized. // 1. When the window is restored from minimized.
...@@ -75,6 +82,7 @@ void CameraAppWindowManager::OnWidgetVisibilityChanged(views::Widget* widget, ...@@ -75,6 +82,7 @@ void CameraAppWindowManager::OnWidgetVisibilityChanged(views::Widget* widget,
void CameraAppWindowManager::OnWidgetActivationChanged(views::Widget* widget, void CameraAppWindowManager::OnWidgetActivationChanged(views::Widget* widget,
bool active) { bool active) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
// This event will be triggered and the |active| will be set to: // This event will be triggered and the |active| will be set to:
// * True: // * True:
// 1. When the window is restored from minimized. // 1. When the window is restored from minimized.
...@@ -113,9 +121,12 @@ void CameraAppWindowManager::OnWidgetActivationChanged(views::Widget* widget, ...@@ -113,9 +121,12 @@ void CameraAppWindowManager::OnWidgetActivationChanged(views::Widget* widget,
} }
void CameraAppWindowManager::OnWidgetDestroying(views::Widget* widget) { void CameraAppWindowManager::OnWidgetDestroying(views::Widget* widget) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
widget->RemoveObserver(this); widget->RemoveObserver(this);
} }
CameraAppWindowManager::CameraAppWindowManager() = default;
void CameraAppWindowManager::OnMonitorMojoConnectionError( void CameraAppWindowManager::OnMonitorMojoConnectionError(
views::Widget* widget) { views::Widget* widget) {
camera_usage_monitors_.erase(widget); camera_usage_monitors_.erase(widget);
...@@ -192,6 +203,4 @@ void CameraAppWindowManager::ResumeNextOrIdle() { ...@@ -192,6 +203,4 @@ void CameraAppWindowManager::ResumeNextOrIdle() {
} }
} }
void CameraAppWindowManager::Shutdown() {}
} // namespace chromeos } // namespace chromeos
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
#define CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_H_ #define CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_H_
#include "base/containers/flat_map.h" #include "base/containers/flat_map.h"
#include "base/memory/singleton.h"
#include "chromeos/components/camera_app_ui/camera_app_helper.mojom.h" #include "chromeos/components/camera_app_ui/camera_app_helper.mojom.h"
#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote.h"
#include "ui/views/widget/widget_observer.h" #include "ui/views/widget/widget_observer.h"
...@@ -22,16 +22,16 @@ class Widget; ...@@ -22,16 +22,16 @@ class Widget;
namespace chromeos { namespace chromeos {
// A manager to manage the camera usage ownership between multiple camera app // A manager to manage the camera usage ownership between multiple camera app
// windows. The windows share the same window manager if they are under same // windows. The clients should only use this object as a singleton instance and
// browser context. // should only access it on the UI thread.
class CameraAppWindowManager : public KeyedService, class CameraAppWindowManager : public views::WidgetObserver {
public views::WidgetObserver {
public: public:
CameraAppWindowManager();
CameraAppWindowManager(const CameraAppWindowManager&) = delete; CameraAppWindowManager(const CameraAppWindowManager&) = delete;
CameraAppWindowManager& operator=(const CameraAppWindowManager&) = delete; CameraAppWindowManager& operator=(const CameraAppWindowManager&) = delete;
~CameraAppWindowManager() override; ~CameraAppWindowManager() override;
static CameraAppWindowManager* GetInstance();
void SetCameraUsageMonitor( void SetCameraUsageMonitor(
aura::Window* window, aura::Window* window,
mojo::PendingRemote<chromeos_camera::mojom::CameraUsageOwnershipMonitor> mojo::PendingRemote<chromeos_camera::mojom::CameraUsageOwnershipMonitor>
...@@ -44,6 +44,9 @@ class CameraAppWindowManager : public KeyedService, ...@@ -44,6 +44,9 @@ class CameraAppWindowManager : public KeyedService,
void OnWidgetDestroying(views::Widget* widget) override; void OnWidgetDestroying(views::Widget* widget) override;
private: private:
CameraAppWindowManager();
friend struct base::DefaultSingletonTraits<CameraAppWindowManager>;
enum class TransferState { enum class TransferState {
kIdle, kIdle,
kSuspending, kSuspending,
...@@ -56,9 +59,6 @@ class CameraAppWindowManager : public KeyedService, ...@@ -56,9 +59,6 @@ class CameraAppWindowManager : public KeyedService,
void OnResumedCameraUsage(views::Widget* prev_owner); void OnResumedCameraUsage(views::Widget* prev_owner);
void ResumeNextOrIdle(); void ResumeNextOrIdle();
// KeyedService:
void Shutdown() override;
base::flat_map< base::flat_map<
views::Widget*, views::Widget*,
mojo::Remote<chromeos_camera::mojom::CameraUsageOwnershipMonitor>> mojo::Remote<chromeos_camera::mojom::CameraUsageOwnershipMonitor>>
......
// 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 "chromeos/components/camera_app_ui/camera_app_window_manager_factory.h"
#include "base/macros.h"
#include "chromeos/components/camera_app_ui/camera_app_window_manager.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/browser_context.h"
namespace chromeos {
// static
CameraAppWindowManager* CameraAppWindowManagerFactory::GetForBrowserContext(
content::BrowserContext* browser_context) {
return static_cast<CameraAppWindowManager*>(
GetInstance()->GetServiceForBrowserContext(browser_context, true));
}
// static
CameraAppWindowManagerFactory* CameraAppWindowManagerFactory::GetInstance() {
return base::Singleton<CameraAppWindowManagerFactory>::get();
}
CameraAppWindowManagerFactory::CameraAppWindowManagerFactory()
: BrowserContextKeyedServiceFactory(
"CameraAppWindowManagerFactory",
BrowserContextDependencyManager::GetInstance()) {}
CameraAppWindowManagerFactory::~CameraAppWindowManagerFactory() {}
KeyedService* CameraAppWindowManagerFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
return new CameraAppWindowManager();
}
} // namespace chromeos
// 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 CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_FACTORY_H_
#define CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_FACTORY_H_
#include "base/memory/singleton.h"
#include "chromeos/components/camera_app_ui/camera_app_window_manager.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
class KeyedService;
namespace content {
class BrowserContext;
} // namespace content
namespace chromeos {
// Owns CameraAppWindowManager instances and associates them with Profiles. Note
// that the window manager can also work for app instance even if it is launched
// by typing URL under incognito mode.
class CameraAppWindowManagerFactory : public BrowserContextKeyedServiceFactory {
public:
static CameraAppWindowManager* GetForBrowserContext(
content::BrowserContext* context);
static CameraAppWindowManagerFactory* GetInstance();
private:
friend struct base::DefaultSingletonTraits<CameraAppWindowManagerFactory>;
CameraAppWindowManagerFactory();
~CameraAppWindowManagerFactory() override;
// BrowserContextKeyedServiceFactory:
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const override;
DISALLOW_COPY_AND_ASSIGN(CameraAppWindowManagerFactory);
};
} // namespace chromeos
#endif // CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_FACTORY_H_
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