| // 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/curtain/remote_maintenance_curtain_view.h" |
| |
| #include <memory> |
| |
| #include "ash/assistant/ui/base/stack_layout.h" |
| #include "ash/public/cpp/ash_web_view.h" |
| #include "ash/public/cpp/ash_web_view_factory.h" |
| #include "ash/public/cpp/oobe_dialog_util.h" |
| #include "ash/public/cpp/view_shadow.h" |
| #include "ash/wallpaper/views/wallpaper_view.h" |
| #include "ash/wallpaper/wallpaper_constants.h" |
| #include "base/check_deref.h" |
| #include "ui/base/metadata/metadata_impl_macros.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/gfx/geometry/rounded_corners_f.h" |
| #include "ui/gfx/geometry/size.h" |
| #include "ui/views/view.h" |
| |
| namespace ash::curtain { |
| |
| namespace { |
| |
| constexpr char kRemoteManagementCurtainUrl[] = "chrome://security-curtain/"; |
| |
| OobeDialogUtil& util() { |
| return OobeDialogUtil::Get(); |
| } |
| |
| gfx::Size CalculateCurtainViewSize(const gfx::Size& size) { |
| return util().CalculateDialogSize( |
| size, /*shelf_height=*/0, |
| /*is_horizontal=*/(size.width() >= size.height())); |
| } |
| |
| } // namespace |
| |
| RemoteMaintenanceCurtainView::RemoteMaintenanceCurtainView() { |
| Initialize(); |
| } |
| |
| RemoteMaintenanceCurtainView::~RemoteMaintenanceCurtainView() = default; |
| |
| void RemoteMaintenanceCurtainView::OnBoundsChanged(const gfx::Rect&) { |
| UpdateChildrenSize(size()); |
| } |
| |
| void RemoteMaintenanceCurtainView::UpdateChildrenSize( |
| const gfx::Size& new_size) { |
| wallpaper_view_->SetPreferredSize(new_size); |
| curtain_view_->SetPreferredSize(CalculateCurtainViewSize(new_size)); |
| } |
| |
| void RemoteMaintenanceCurtainView::Initialize() { |
| layout_ = SetLayoutManager(std::make_unique<StackLayout>()); |
| |
| AddWallpaper(); |
| AddCurtainWebView(); |
| } |
| |
| void RemoteMaintenanceCurtainView::AddWallpaper() { |
| // Add a copy of the wallpaper above the security curtain, since UX wants |
| // to see a blurred wallpaper but we can't expose the real wallpaper as that |
| // would require the security curtain to be translucent which would defeat |
| // its whole purpose. |
| DCHECK(!wallpaper_view_); |
| wallpaper_view_ = AddChildView( |
| std::make_unique<WallpaperView>(wallpaper_constants::kLockLoginBlur)); |
| } |
| |
| void RemoteMaintenanceCurtainView::AddCurtainWebView() { |
| DCHECK(!curtain_view_); |
| |
| curtain_view_ = AddChildView(AshWebViewFactory::Get()->Create( |
| {.rounded_corners = gfx::RoundedCornersF(util().GetCornerRadius())})); |
| |
| curtain_view_->SetID(kRemoteMaintenanceCurtainAshWebViewId); |
| layout_->SetVerticalAlignmentForView(curtain_view_, |
| StackLayout::VerticalAlignment::kCenter); |
| |
| // Add a shadow |
| curtain_view_shadow_ = std::make_unique<ViewShadow>( |
| curtain_view_.get(), util().GetShadowElevation()); |
| curtain_view_shadow_->SetRoundedCornerRadius(util().GetCornerRadius()); |
| |
| // Load the actual security curtain content. |
| curtain_view_->Navigate(GURL(kRemoteManagementCurtainUrl)); |
| } |
| |
| BEGIN_METADATA(RemoteMaintenanceCurtainView) |
| END_METADATA |
| |
| } // namespace ash::curtain |