| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/ambient/ui/ambient_slideshow_peripheral_ui.h" |
| |
| #include <memory> |
| |
| #include "ash/ambient/ui/ambient_shield_view.h" |
| #include "ash/ambient/ui/ambient_slideshow_peripheral_ui.h" |
| #include "ash/ambient/ui/ambient_view_delegate.h" |
| #include "ash/ambient/ui/ambient_view_ids.h" |
| #include "ash/ambient/ui/jitter_calculator.h" |
| #include "ash/ambient/ui/media_string_view.h" |
| #include "ash/ambient/util/ambient_util.h" |
| #include "ash/public/cpp/ambient/ambient_ui_model.h" |
| #include "ash/style/ash_color_id.h" |
| #include "base/logging.h" |
| #include "ui/base/metadata/metadata_impl_macros.h" |
| #include "ui/compositor/layer.h" |
| #include "ui/views/border.h" |
| #include "ui/views/layout/box_layout.h" |
| #include "ui/views/layout/fill_layout.h" |
| #include "ui/views/layout/flex_layout_types.h" |
| #include "ui/views/view.h" |
| |
| namespace ash { |
| |
| namespace { |
| |
| // Appearance. |
| constexpr int kMediaStringMarginDip = 32; |
| |
| } // namespace |
| |
| AmbientSlideshowPeripheralUi::AmbientSlideshowPeripheralUi( |
| AmbientViewDelegate* delegate) |
| : jitter_calculator_(std::make_unique<JitterCalculator>( |
| AmbientUiModel::Get()->GetSlideshowPeripheralUiJitterConfig())) { |
| CHECK(delegate); |
| SetID(AmbientViewID::kAmbientSlideshowPeripheralUi); |
| InitLayout(delegate); |
| } |
| |
| AmbientSlideshowPeripheralUi::~AmbientSlideshowPeripheralUi() = default; |
| |
| void AmbientSlideshowPeripheralUi::InitLayout(AmbientViewDelegate* delegate) { |
| SetLayoutManager(std::make_unique<views::FillLayout>()); |
| AddChildView(std::make_unique<AmbientShieldView>()); |
| |
| ambient_info_view_ = |
| AddChildView(std::make_unique<AmbientInfoView>(delegate)); |
| |
| gfx::Insets shadow_insets = |
| gfx::ShadowValue::GetMargin(ambient::util::GetTextShadowValues(nullptr)); |
| |
| // Inits the media string view. The media string view is positioned on the |
| // right-top corner of the container. |
| views::View* media_string_view_container_ = |
| AddChildView(std::make_unique<views::View>()); |
| views::BoxLayout* media_string_layout = |
| media_string_view_container_->SetLayoutManager( |
| std::make_unique<views::BoxLayout>( |
| views::BoxLayout::Orientation::kVertical)); |
| media_string_layout->set_main_axis_alignment( |
| views::BoxLayout::MainAxisAlignment::kStart); |
| media_string_layout->set_cross_axis_alignment( |
| views::BoxLayout::CrossAxisAlignment::kEnd); |
| media_string_layout->set_inside_border_insets( |
| gfx::Insets::TLBR(kMediaStringMarginDip + shadow_insets.top(), 0, 0, |
| kMediaStringMarginDip + shadow_insets.right())); |
| media_string_view_ = media_string_view_container_->AddChildView( |
| std::make_unique<MediaStringView>(this)); |
| media_string_view_->SetVisible(false); |
| } |
| |
| MediaStringView::Settings AmbientSlideshowPeripheralUi::GetSettings() { |
| return MediaStringView::Settings( |
| {/*icon_light_mode_color=*/ambient::util::GetColor( |
| GetColorProvider(), kColorAshIconColorPrimary, |
| /*dark_mode_enabled=*/false), |
| /*icon_dark_mode_color=*/ |
| ambient::util::GetColor(GetColorProvider(), kColorAshIconColorPrimary, |
| /*dark_mode_enabled=*/true), |
| /*text_light_mode_color=*/ |
| ambient::util::GetColor(GetColorProvider(), kColorAshTextColorPrimary, |
| /*dark_mode_enabled=*/false), |
| /*text_dark_mode_color=*/ |
| ambient::util::GetColor(GetColorProvider(), kColorAshTextColorPrimary, |
| /*dark_mode_enabled=*/true), |
| /*text_shadow_elevation=*/ |
| ambient::util::kDefaultTextShadowElevation}); |
| } |
| |
| void AmbientSlideshowPeripheralUi::UpdateGlanceableInfoPosition() { |
| gfx::Vector2d jitter = jitter_calculator_->Calculate(); |
| gfx::Transform transform; |
| transform.Translate(jitter); |
| |
| DVLOG(4) << "Shifting peripheral ui by " << jitter.ToString(); |
| |
| ambient_info_view_->SetTextTransform(transform); |
| |
| if (media_string_view_->GetVisible()) { |
| gfx::Transform media_string_transform; |
| media_string_transform.Translate(-jitter.x(), -jitter.y()); |
| media_string_view_->layer()->SetTransform(media_string_transform); |
| } |
| } |
| |
| void AmbientSlideshowPeripheralUi::UpdateLeftPaddingToMatchBottom() { |
| ambient_info_view_->SetBorder(views::CreateEmptyBorder(gfx::Insets::TLBR( |
| 0, ambient_info_view_->GetAdjustedLeftPaddingToMatchBottom(), 0, 0))); |
| } |
| |
| void AmbientSlideshowPeripheralUi::UpdateImageDetails( |
| const std::u16string& details, |
| const std::u16string& related_details) { |
| ambient_info_view_->UpdateImageDetails(details, related_details); |
| } |
| |
| BEGIN_METADATA(AmbientSlideshowPeripheralUi) |
| END_METADATA |
| |
| } // namespace ash |