| // 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/ambient_managed_slideshow_ui_launcher.h" |
| |
| #include <vector> |
| |
| #include "ash/ambient/ambient_managed_photo_controller.h" |
| #include "ash/ambient/ambient_photo_controller.h" |
| #include "ash/ambient/ambient_view_delegate_impl.h" |
| #include "ash/ambient/managed/screensaver_images_policy_handler.h" |
| #include "ash/ambient/metrics/managed_screensaver_metrics.h" |
| #include "ash/ambient/model/ambient_slideshow_photo_config.h" |
| #include "ash/ambient/ui/photo_view.h" |
| #include "ash/login/ui/lock_screen.h" |
| #include "base/check.h" |
| #include "base/functional/callback.h" |
| #include "base/memory/weak_ptr.h" |
| |
| namespace ash { |
| |
| AmbientManagedSlideshowUiLauncher::AmbientManagedSlideshowUiLauncher( |
| AmbientViewDelegateImpl* view_delegate, |
| ScreensaverImagesPolicyHandler* policy_handler) |
| : photo_controller_(*view_delegate, |
| CreateAmbientManagedSlideshowPhotoConfig()), |
| delegate_(view_delegate), |
| screensaver_images_policy_handler_(policy_handler) { |
| ambient_backend_model_observer_.Observe( |
| photo_controller_.ambient_backend_model()); |
| photo_controller_.SetObserver(this); |
| |
| CHECK(screensaver_images_policy_handler_); |
| screensaver_images_policy_handler_->SetScreensaverImagesUpdatedCallback( |
| base::BindRepeating( |
| &AmbientManagedSlideshowUiLauncher::UpdateImageFilePaths, |
| weak_factory_.GetWeakPtr())); |
| } |
| |
| AmbientManagedSlideshowUiLauncher::~AmbientManagedSlideshowUiLauncher() = |
| default; |
| |
| void AmbientManagedSlideshowUiLauncher::OnImagesReady() { |
| CHECK(initialization_callback_); |
| std::move(initialization_callback_).Run(/*success=*/true); |
| } |
| |
| void AmbientManagedSlideshowUiLauncher::OnErrorStateChanged() { |
| SetReadyState(ComputeReadyState()); |
| } |
| |
| void AmbientManagedSlideshowUiLauncher::OnLockStateChanged(bool locked) { |
| SetReadyState(ComputeReadyState()); |
| } |
| |
| void AmbientManagedSlideshowUiLauncher::Initialize( |
| InitializationCallback on_done) { |
| initialization_callback_ = std::move(on_done); |
| // TODO(b/281056480): Remove this line and add the login screen visible method |
| // to session observer. This is required because if we compute the ready state |
| // in the constructor, some of the login screen tests fail as there is no |
| // lock/login screen at the time of construction and the ready state is false. |
| // This will be a no-op if the ready state is already true. |
| SetReadyState(ComputeReadyState()); |
| photo_controller_.UpdateImageFilePaths( |
| screensaver_images_policy_handler_->GetScreensaverImages()); |
| photo_controller_.StartScreenUpdate(); |
| } |
| |
| void AmbientManagedSlideshowUiLauncher::UpdateImageFilePaths( |
| const std::vector<base::FilePath>& path_to_images) { |
| // If the photo controller has screen update errors, still allow adding |
| // more images to it, even when it is inactive. So that, errors like |
| // insufficient images or decoding failures can be cleared when new data |
| // is available. |
| if (!photo_controller_.IsScreenUpdateActive() && |
| !photo_controller_.HasScreenUpdateErrors()) { |
| return; |
| } |
| photo_controller_.UpdateImageFilePaths(path_to_images); |
| } |
| |
| std::unique_ptr<views::View> AmbientManagedSlideshowUiLauncher::CreateView() { |
| PhotoViewConfig config{.peripheral_ui_visible = false, |
| .force_resize_to_fit = true}; |
| |
| return std::make_unique<PhotoView>(delegate_, config); |
| } |
| |
| void AmbientManagedSlideshowUiLauncher::Finalize() { |
| photo_controller_.StopScreenUpdate(); |
| } |
| |
| AmbientBackendModel* |
| AmbientManagedSlideshowUiLauncher::GetAmbientBackendModel() { |
| return photo_controller_.ambient_backend_model(); |
| } |
| |
| AmbientPhotoController* |
| AmbientManagedSlideshowUiLauncher::GetAmbientPhotoController() { |
| return nullptr; |
| } |
| |
| bool AmbientManagedSlideshowUiLauncher::ComputeReadyState() { |
| return LockScreen::HasInstance() && |
| !photo_controller_.HasScreenUpdateErrors(); |
| } |
| |
| std::unique_ptr<AmbientSessionMetricsRecorder::Delegate> |
| AmbientManagedSlideshowUiLauncher::CreateMetricsDelegate(AmbientUiSettings) { |
| return std::make_unique<ManagedScreensaverMetricsDelegate>(); |
| } |
| |
| } // namespace ash |