blob: f6ed8bd647f093ac109ed4a3be481d965cfab52a [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.
#ifndef ASH_WEBUI_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_H_
#define ASH_WEBUI_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_H_
#include "ash/webui/camera_app_ui/camera_app_helper.mojom.h"
#include "base/containers/flat_map.h"
#include "base/memory/singleton.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "ui/views/widget/widget_observer.h"
namespace aura {
class Window;
} // namespace aura
namespace views {
class Widget;
} // namespace views
namespace ash {
// A manager to manage the camera usage ownership between multiple camera app
// 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(const CameraAppWindowManager&) = delete;
CameraAppWindowManager& operator=(const CameraAppWindowManager&) = delete;
~CameraAppWindowManager() override;
static CameraAppWindowManager* GetInstance();
void SetCameraUsageMonitor(
aura::Window* window,
mojo::PendingRemote<camera_app::mojom::CameraUsageOwnershipMonitor>
usage_monitor,
base::OnceCallback<void(bool)> callback);
void SetDevToolsEnabled(bool enabled);
bool IsDevToolsEnabled();
// views::WidgetObserver:
void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override;
void OnWidgetActivationChanged(views::Widget* widget, bool active) override;
void OnWidgetDestroying(views::Widget* widget) override;
private:
friend class CameraAppWindowManagerTest;
CameraAppWindowManager();
friend struct base::DefaultSingletonTraits<CameraAppWindowManager>;
enum class TransferState {
kIdle,
kSuspending,
kResuming,
};
void OnMonitorMojoConnectionError(views::Widget* widget);
void SuspendCameraUsage();
void OnSuspendedCameraUsage(views::Widget* prev_owner);
void ResumeCameraUsage();
void OnResumedCameraUsage(views::Widget* prev_owner);
void ResumeNextOrIdle();
// Whether dev tools window should be opened when opening CCA window.
bool dev_tools_enabled_ = false;
base::flat_map<views::Widget*,
mojo::Remote<camera_app::mojom::CameraUsageOwnershipMonitor>>
camera_usage_monitors_;
// Whether the |owner_| is transferring the camera usage.
TransferState transfer_state_ = TransferState::kIdle;
// The widget which has the camera usage ownership currently.
views::Widget* owner_ = nullptr;
// For the pending camera usage owner, there are three possible values:
// 1. absl::nullopt: When there is no pending owner. Transfer can stop.
// 2. nullptr: When there should be no active window after the transfer
// is stopped.
// 3. non-null: When there is another window which should own camera
// usage.
absl::optional<views::Widget*> pending_transfer_;
};
} // namespace ash
#endif // ASH_WEBUI_CAMERA_APP_UI_CAMERA_APP_WINDOW_MANAGER_H_