#include "ash/capture_mode/capture_mode_bar_view.h"
#include <memory>
#include "ash/capture_mode/capture_mode_constants.h"
#include "ash/capture_mode/capture_mode_controller.h"
#include "ash/capture_mode/capture_mode_metrics.h"
#include "ash/capture_mode/capture_mode_session.h"
#include "ash/capture_mode/capture_mode_session_focus_cycler.h"
#include "ash/capture_mode/capture_mode_util.h"
#include "ash/public/cpp/style/color_provider.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/style/ash_color_id.h"
#include "ash/style/icon_button.h"
#include "ash/style/system_shadow.h"
#include "base/functional/bind.h"
#include "chromeos/constants/chromeos_features.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/compositor/layer.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/background.h"
#include "ui/views/highlight_border.h"
#include "ui/views/layout/box_layout.h"
namespace ash {
namespace {
constexpr auto kBarPadding = gfx::Insets::VH(14, 16);
}
CaptureModeBarView::~CaptureModeBarView() = default;
CaptureModeTypeView* CaptureModeBarView::GetCaptureTypeView() const {
return nullptr;
}
CaptureModeSourceView* CaptureModeBarView::GetCaptureSourceView() const {
return nullptr;
}
PillButton* CaptureModeBarView::GetStartRecordingButton() const {
return nullptr;
}
void CaptureModeBarView::OnCaptureSourceChanged(CaptureModeSource new_source) {
return;
}
void CaptureModeBarView::OnCaptureTypeChanged(CaptureModeType new_type) {
return;
}
void CaptureModeBarView::SetSettingsMenuShown(bool shown) {
settings_button_->SetToggled(shown);
}
bool CaptureModeBarView::IsEventOnSettingsButton(
gfx::Point screen_location) const {
return settings_button_ &&
settings_button_->GetBoundsInScreen().Contains(screen_location);
}
void CaptureModeBarView::AddedToWidget() {
auto* parent = layer()->parent();
parent->Add(shadow_->GetLayer());
parent->StackAtBottom(shadow_->GetLayer());
shadow_->ObserveColorProviderSource(GetWidget());
}
void CaptureModeBarView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
shadow_->SetContentBounds(layer()->bounds());
}
CaptureModeBarView::CaptureModeBarView()
: shadow_(SystemShadow::CreateShadowOnTextureLayer(
SystemShadow::Type::kElevation12)) {
SetPaintToLayer();
SetBackground(views::CreateSolidBackground(
chromeos::features::IsSystemBlurEnabled()
? static_cast<ui::ColorId>(kColorAshShieldAndBase80)
: cros_tokens::kCrosSysSystemOnBaseOpaque));
if (chromeos::features::IsSystemBlurEnabled()) {
layer()->SetFillsBoundsOpaquely(false);
layer()->SetBackgroundBlur(ColorProvider::kBackgroundBlurSigma);
layer()->SetBackdropFilterQuality(ColorProvider::kBackgroundBlurQuality);
}
const int border_radius = capture_mode::kCaptureBarHeight / 2;
layer()->SetRoundedCornerRadius(gfx::RoundedCornersF(border_radius));
auto* box_layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kHorizontal, kBarPadding,
capture_mode::kBetweenChildSpacing));
box_layout->set_cross_axis_alignment(
views::BoxLayout::CrossAxisAlignment::kCenter);
capture_mode_util::SetHighlightBorder(
this, border_radius,
views::HighlightBorder::Type::kHighlightBorderOnShadow);
shadow_->SetRoundedCornerRadius(border_radius);
}
void CaptureModeBarView::AppendSettingsButton() {
settings_button_ = AddChildView(std::make_unique<IconButton>(
base::BindRepeating(&CaptureModeBarView::OnSettingsButtonPressed,
base::Unretained(this)),
IconButton::Type::kMediumFloating, &kCaptureModeSettingsIcon,
l10n_util::GetStringUTF16(IDS_ASH_SCREEN_CAPTURE_TOOLTIP_SETTINGS),
true,
true));
settings_button_->SetIconToggledColor(kColorAshButtonIconColor);
settings_button_->SetBackgroundToggledColor(
kColorAshControlBackgroundColorInactive);
CaptureModeSessionFocusCycler::HighlightHelper::Install(settings_button_);
}
void CaptureModeBarView::AppendCloseButton(int accessible_name_id) {
close_button_ = AddChildView(std::make_unique<IconButton>(
base::BindRepeating(&CaptureModeBarView::OnCloseButtonPressed,
base::Unretained(this)),
IconButton::Type::kMediumFloating, &kCaptureModeCloseIcon,
l10n_util::GetStringUTF16(accessible_name_id),
false,
true));
CaptureModeSessionFocusCycler::HighlightHelper::Install(close_button_);
}
void CaptureModeBarView::OnSettingsButtonPressed(const ui::Event& event) {
CaptureModeSession* session = static_cast<CaptureModeSession*>(
CaptureModeController::Get()->capture_mode_session());
CHECK_EQ(session->session_type(), SessionType::kReal);
session->SetSettingsMenuShown(!settings_button_->toggled(),
event.IsKeyEvent());
}
void CaptureModeBarView::OnCloseButtonPressed() {
RecordCaptureModeBarButtonType(CaptureModeBarButtonType::kExit);
CaptureModeController::Get()->Stop();
}
BEGIN_METADATA(CaptureModeBarView)
END_METADATA
}