blob: 49c11b5bbe03b30c8248013417e63532abc27082 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_PROJECTOR_PROJECTOR_UI_CONTROLLER_H_
#define ASH_PROJECTOR_PROJECTOR_UI_CONTROLLER_H_
#include <optional>
#include "ash/ash_export.h"
#include "ash/projector/projector_metrics.h"
#include "ash/public/cpp/projector/projector_session.h"
#include "ash/strings/grit/ash_strings.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "third_party/skia/include/core/SkColor.h"
namespace aura {
class Window;
} // namespace aura
namespace ash {
class ProjectorControllerImpl;
struct AnnotatorTool;
// The controller in charge of UI.
class ASH_EXPORT ProjectorUiController : public ProjectorSessionObserver {
public:
// Shows a notification informing the user that a Projector error has
// occurred.
static void ShowFailureNotification(
int message_id,
int title_id = IDS_ASH_PROJECTOR_FAILURE_TITLE);
// Shows a notification informing the user that a Projector save error has
// occurred.
static void ShowSaveFailureNotification();
explicit ProjectorUiController(ProjectorControllerImpl* projector_controller);
ProjectorUiController(const ProjectorUiController&) = delete;
ProjectorUiController& operator=(const ProjectorUiController&) = delete;
~ProjectorUiController() override;
// Show Projector annotation tray for `current_root`. Virtual for testing.
virtual void ShowAnnotationTray(aura::Window* current_root);
// Hide Projector annotation tray. Virtual for testing.
virtual void HideAnnotationTray();
// Invoked when marker button is pressed. Virtual for testing.
virtual void EnableAnnotatorTool();
// Sets the annotator tool.
virtual void SetAnnotatorTool(const AnnotatorTool& tool);
// Resets and disables the annotator tools and clears the canvas.
void ResetTools();
// Invoked when the canvas has either succeeded or failed to initialize.
void OnCanvasInitialized(bool success);
// Returns if the annotation canvas has been initialized.
bool GetAnnotatorAvailability();
// Toggles the UI of the annotation tray and the marker's enabled state.
void ToggleAnnotationTray();
void OnRecordedWindowChangingRoot(aura::Window* new_root);
bool is_annotator_enabled() { return annotator_enabled_; }
private:
// ProjectorSessionObserver:
void OnProjectorSessionActiveStateChanged(bool active) override;
ProjectorMarkerColor GetMarkerColorForMetrics(SkColor color);
void UpdateTrayEnabledState();
bool annotator_enabled_ = false;
// The current root window in which the video recording is happening.
raw_ptr<aura::Window, DanglingUntriaged> current_root_ = nullptr;
// True if the canvas is initialized successfully, false if it failed to
// initialize. An absent value indicates that the initialization has not
// completed.
std::optional<bool> canvas_initialized_state_;
base::ScopedObservation<ProjectorSession, ProjectorSessionObserver>
projector_session_observation_{this};
};
} // namespace ash
#endif // ASH_PROJECTOR_PROJECTOR_UI_CONTROLLER_H_