// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/fullscreen/animated_scoped_fullscreen_disabler.h"
#import "base/check.h"
#import "base/functional/callback.h"
#import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
#import "ios/chrome/common/material_timing.h"
AnimatedScopedFullscreenDisabler::AnimatedScopedFullscreenDisabler(
FullscreenController* controller)
: controller_(controller) {
DCHECK(controller_);
controller_->AddObserver(this);
}
AnimatedScopedFullscreenDisabler::~AnimatedScopedFullscreenDisabler() {
if (controller_) {
if (disabling_) {
controller_->DecrementDisabledCounter();
}
controller_->RemoveObserver(this);
controller_ = nullptr;
}
}
void AnimatedScopedFullscreenDisabler::StartAnimation() {
// StartAnimation() should be idempotent, so early return if this disabler has
// already incremented the disabled counter.
if (disabling_ || !controller_) {
return;
}
disabling_ = true;
if (controller_->IsEnabled()) {
// Increment the disabled counter in an animation block if the controller is
// not already disabled.
base::WeakPtr<AnimatedScopedFullscreenDisabler> weak_ptr =
weak_factory_.GetWeakPtr();
base::RepeatingClosure animation_started = base::BindRepeating(
&AnimatedScopedFullscreenDisabler::OnAnimationStart, weak_ptr);
[UIView animateWithDuration:kMaterialDuration1
animations:^{
if (!animation_started.IsCancelled()) {
animation_started.Run();
}
}
completion:nil];
} else {
// If `controller_` is already disabled, no animation is necessary.
controller_->IncrementDisabledCounter();
}
}
void AnimatedScopedFullscreenDisabler::FullscreenControllerWillShutDown(
FullscreenController* controller) {
DCHECK_EQ(controller, controller_);
controller_->RemoveObserver(this);
controller_ = nullptr;
}
void AnimatedScopedFullscreenDisabler::OnAnimationStart() {
if (controller_)
controller_->IncrementDisabledCounter();
}