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") {
"camera_app_ui_delegate.h",
"camera_app_window_manager.cc",
"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.h",
"resources.h",
......@@ -36,8 +34,6 @@ static_library("camera_app_ui") {
"//chromeos/strings",
"//chromeos/system",
"//components/arc",
"//components/keyed_service/content",
"//components/keyed_service/core",
"//content/public/browser",
"//content/public/common",
"//media/capture:capture_lib",
......
......@@ -7,7 +7,6 @@
#include "ash/public/cpp/window_properties.h"
#include "base/bind.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/url_constants.h"
#include "components/arc/intent_helper/arc_intent_helper_bridge.h"
......@@ -251,8 +250,7 @@ aura::Window* CameraAppUI::window() {
}
CameraAppWindowManager* CameraAppUI::app_window_manager() {
return chromeos::CameraAppWindowManagerFactory::GetForBrowserContext(
web_ui()->GetWebContents()->GetBrowserContext());
return chromeos::CameraAppWindowManager::GetInstance();
}
const GURL& CameraAppUI::url() {
......
......@@ -6,20 +6,26 @@
#include "chromeos/components/camera_app_ui/camera_app_helper_impl.h"
#include "chromeos/components/camera_app_ui/url_constants.h"
#include "content/public/browser/browser_thread.h"
#include "ui/aura/window.h"
#include "ui/views/widget/widget.h"
namespace chromeos {
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(
aura::Window* window,
mojo::PendingRemote<chromeos_camera::mojom::CameraUsageOwnershipMonitor>
usage_monitor,
base::OnceCallback<void()> callback) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
auto* widget = views::Widget::GetWidgetForNativeWindow(window);
mojo::Remote<chromeos_camera::mojom::CameraUsageOwnershipMonitor> remote(
......@@ -39,6 +45,7 @@ void CameraAppWindowManager::SetCameraUsageMonitor(
void CameraAppWindowManager::OnWidgetVisibilityChanged(views::Widget* widget,
bool visible) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
// This event will be triggered and the |visible| will be set to:
// * True:
// 1. When the window is restored from minimized.
......@@ -75,6 +82,7 @@ void CameraAppWindowManager::OnWidgetVisibilityChanged(views::Widget* widget,
void CameraAppWindowManager::OnWidgetActivationChanged(views::Widget* widget,
bool active) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
// This event will be triggered and the |active| will be set to:
// * True:
// 1. When the window is restored from minimized.
......@@ -113,9 +121,12 @@ void CameraAppWindowManager::OnWidgetActivationChanged(views::Widget* widget,
}
void CameraAppWindowManager::OnWidgetDestroying(views::Widget* widget) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
widget->RemoveObserver(this);
}
CameraAppWindowManager::CameraAppWindowManager() = default;
void CameraAppWindowManager::OnMonitorMojoConnectionError(
views::Widget* widget) {
camera_usage_monitors_.erase(widget);
......@@ -192,6 +203,4 @@ void CameraAppWindowManager::ResumeNextOrIdle() {
}
}
void CameraAppWindowManager::Shutdown() {}
} // namespace chromeos
......@@ -6,8 +6,8 @@
#define CHROMEOS_COMPONENTS_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_H_
#include "base/containers/flat_map.h"
#include "base/memory/singleton.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 "ui/views/widget/widget_observer.h"
......@@ -22,16 +22,16 @@ class Widget;
namespace chromeos {
// 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
// browser context.
class CameraAppWindowManager : public KeyedService,
public views::WidgetObserver {
// windows. The clients should only use this object as a singleton instance and
// should only access it on the UI thread.
class CameraAppWindowManager : public views::WidgetObserver {
public:
CameraAppWindowManager();
CameraAppWindowManager(const CameraAppWindowManager&) = delete;
CameraAppWindowManager& operator=(const CameraAppWindowManager&) = delete;
~CameraAppWindowManager() override;
static CameraAppWindowManager* GetInstance();
void SetCameraUsageMonitor(
aura::Window* window,
mojo::PendingRemote<chromeos_camera::mojom::CameraUsageOwnershipMonitor>
......@@ -44,6 +44,9 @@ class CameraAppWindowManager : public KeyedService,
void OnWidgetDestroying(views::Widget* widget) override;
private:
CameraAppWindowManager();
friend struct base::DefaultSingletonTraits<CameraAppWindowManager>;
enum class TransferState {
kIdle,
kSuspending,
......@@ -56,9 +59,6 @@ class CameraAppWindowManager : public KeyedService,
void OnResumedCameraUsage(views::Widget* prev_owner);
void ResumeNextOrIdle();
// KeyedService:
void Shutdown() override;
base::flat_map<
views::Widget*,
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