// Copyright 2020 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ash/public/cpp/autotest_ambient_api.h" #include "ash/ambient/ambient_controller.h" #include "ash/ambient/model/ambient_photo_config.h" #include "ash/ambient/ui/ambient_view_delegate.h" #include "ash/public/cpp/ambient/ambient_backend_controller.h" #include "ash/shell.h" #include "base/bind.h" #include "base/callback.h" #include "base/time/time.h" #include "base/timer/timer.h" namespace ash { namespace { class PhotoTransitionAnimationObserver : public AmbientViewDelegateObserver { public: PhotoTransitionAnimationObserver(int num_completions, base::TimeDelta timeout, base::OnceClosure on_complete, base::OnceClosure on_timeout) : num_completions_(num_completions), on_complete_(std::move(on_complete)), on_timeout_(std::move(on_timeout)) { DCHECK_GT(num_completions, 0); DCHECK_GT(timeout, base::TimeDelta()); DCHECK(on_complete_); DCHECK(on_timeout_); // |base::Unretained| is safe here because this timer will be abandoned in // the destructor. timer_.Start(FROM_HERE, timeout, base::BindOnce(&PhotoTransitionAnimationObserver::OnTimeout, base::Unretained(this))); scoped_observation_.Observe( Shell::Get()->ambient_controller()->ambient_view_delegate()); } PhotoTransitionAnimationObserver(const PhotoTransitionAnimationObserver&) = delete; PhotoTransitionAnimationObserver& operator=( const PhotoTransitionAnimationObserver&) = delete; ~PhotoTransitionAnimationObserver() override = default; // AmbientViewDelegateObserver: void OnMarkerHit(AmbientPhotoConfig::Marker marker) override { if (marker != AmbientPhotoConfig::Marker::kUiCycleEnded) return; --num_completions_; if (num_completions_ == 0) { Cleanup(); std::move(on_complete_).Run(); delete this; } } private: void OnTimeout() { Cleanup(); std::move(on_timeout_).Run(); delete this; } void Cleanup() { timer_.AbandonAndStop(); scoped_observation_.Reset(); } int num_completions_; base::OnceClosure on_complete_; base::OnceClosure on_timeout_; base::OneShotTimer timer_; base::ScopedObservation scoped_observation_{this}; }; } // namespace AutotestAmbientApi::AutotestAmbientApi() = default; AutotestAmbientApi::~AutotestAmbientApi() = default; void AutotestAmbientApi::WaitForPhotoTransitionAnimationCompleted( int num_completions, base::TimeDelta timeout, base::OnceClosure on_complete, base::OnceClosure on_timeout) { new PhotoTransitionAnimationObserver( num_completions, timeout, std::move(on_complete), std::move(on_timeout)); } } // namespace ash