#ifndef ASH_CAPTURE_MODE_CAPTURE_MODE_CAMERA_PREVIEW_VIEW_H_
#define ASH_CAPTURE_MODE_CAPTURE_MODE_CAMERA_PREVIEW_VIEW_H_
#include "ash/accessibility/accessibility_controller.h"
#include "ash/accessibility/accessibility_observer.h"
#include "ash/capture_mode/camera_video_frame_renderer.h"
#include "ash/capture_mode/capture_mode_camera_controller.h"
#include "ash/capture_mode/capture_mode_session_focus_cycler.h"
#include "ash/style/icon_button.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/gfx/geometry/size.h"
#include "ui/views/view.h"
namespace media {
struct VideoCaptureFormat;
}
namespace video_capture::mojom {
class VideoSource;
}
namespace views {
class NativeViewHost;
}
namespace ash {
class CaptureModeCameraController;
class ScopedA11yOverrideWindowSetter;
class CameraPreviewResizeButton
: public IconButton,
public CaptureModeSessionFocusCycler::HighlightableView {
METADATA_HEADER(CameraPreviewResizeButton, IconButton)
public:
CameraPreviewResizeButton(CameraPreviewView* camera_preview_view,
views::Button::PressedCallback callback,
const gfx::VectorIcon& icon);
CameraPreviewResizeButton(const CameraPreviewResizeButton&) = delete;
CameraPreviewResizeButton& operator=(const CameraPreviewResizeButton&) =
delete;
~CameraPreviewResizeButton() override;
views::View* GetView() override;
void PseudoFocus() override;
void PseudoBlur() override;
private:
const raw_ptr<CameraPreviewView> camera_preview_view_;
};
class CameraPreviewView
: public views::View,
public CaptureModeSessionFocusCycler::HighlightableView,
public AccessibilityObserver {
METADATA_HEADER(CameraPreviewView, views::View)
public:
CameraPreviewView(
CaptureModeCameraController* camera_controller,
const CameraId& camera_id,
mojo::Remote<video_capture::mojom::VideoSource> camera_video_source,
const media::VideoCaptureFormat& capture_format,
bool should_flip_frames_horizontally);
CameraPreviewView(const CameraPreviewView&) = delete;
CameraPreviewView& operator=(const CameraPreviewView&) = delete;
~CameraPreviewView() override;
const CameraId& camera_id() const { return camera_id_; }
CameraPreviewResizeButton* resize_button() const { return resize_button_; }
bool is_collapsible() const { return is_collapsible_; }
bool should_flip_frames_horizontally() const {
return camera_video_renderer_.should_flip_frames_horizontally();
}
void Initialize();
void SetIsCollapsible(bool value);
bool MaybeHandleKeyEvent(const ui::KeyEvent* event);
void RefreshResizeButtonVisibility();
void UpdateA11yOverrideWindow();
void MaybeBlurFocus(const ui::MouseEvent& event);
void AddedToWidget() override;
bool OnMousePressed(const ui::MouseEvent& event) override;
bool OnMouseDragged(const ui::MouseEvent& event) override;
void OnMouseReleased(const ui::MouseEvent& event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
void OnMouseEntered(const ui::MouseEvent& event) override;
void OnMouseExited(const ui::MouseEvent& event) override;
void Layout(PassKey) override;
views::View* GetView() override;
std::unique_ptr<views::HighlightPathGenerator> CreatePathGenerator() override;
void OnAccessibilityStatusChanged() override;
void OnAccessibilityControllerShutdown() override;
base::OneShotTimer* resize_button_hide_timer_for_test() {
return &resize_button_hide_timer_;
}
private:
friend class CameraPreviewResizeButton;
friend class CaptureModeTestApi;
void OnResizeButtonPressed();
void UpdateResizeButton();
void UpdateResizeButtonTooltip();
void DisableEventHandlingInCameraVideoHostHierarchy();
void FadeInResizeButton();
void FadeOutResizeButton();
void ScheduleRefreshResizeButtonVisibility();
float CalculateResizeButtonTargetOpacity();
void BlurA11yFocus();
const raw_ptr<CaptureModeCameraController> camera_controller_;
const CameraId camera_id_;
CameraVideoFrameRenderer camera_video_renderer_;
const raw_ptr<views::NativeViewHost> camera_video_host_view_;
const raw_ptr<CameraPreviewResizeButton> resize_button_;
base::OneShotTimer resize_button_hide_timer_;
bool is_collapsible_ = true;
bool has_been_tapped_ = false;
base::ScopedObservation<AccessibilityController, AccessibilityObserver>
accessibility_observation_{this};
std::unique_ptr<ScopedA11yOverrideWindowSetter> scoped_a11y_overrider_;
base::WeakPtrFactory<CameraPreviewView> weak_ptr_factory_{this};
};
}
#endif