chromium/ios/chrome/browser/shared/ui/util/optional_property_animator.mm

// Copyright 2018 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/shared/ui/util/optional_property_animator.h"

@interface OptionalPropertyAnimator ()

// Redefine property as readwrite.
@property(nonatomic, readwrite) BOOL hasAnimations;

@end

@implementation OptionalPropertyAnimator
@synthesize hasAnimations = _hasAnimations;

#pragma mark - UIViewPropertyAnimator

- (instancetype)initWithDuration:(NSTimeInterval)duration
                           curve:(UIViewAnimationCurve)curve
                      animations:(void (^__nullable)(void))animations {
  if ((self = [super initWithDuration:duration
                                curve:curve
                           animations:animations])) {
    _hasAnimations = !!animations;
  }
  return self;
}

- (instancetype)initWithDuration:(NSTimeInterval)duration
                   controlPoint1:(CGPoint)point1
                   controlPoint2:(CGPoint)point2
                      animations:(void (^__nullable)(void))animations {
  if ((self = [super initWithDuration:duration
                        controlPoint1:point1
                        controlPoint2:point2
                           animations:animations])) {
    _hasAnimations = !!animations;
  }
  return self;
}

- (instancetype)initWithDuration:(NSTimeInterval)duration
                    dampingRatio:(CGFloat)ratio
                      animations:(void (^__nullable)(void))animations {
  if ((self = [super initWithDuration:duration
                         dampingRatio:ratio
                           animations:animations])) {
    _hasAnimations = !!animations;
  }
  return self;
}

#pragma mark - UIViewImplicitlyAnimating

- (void)addAnimations:(void (^)(void))animation
          delayFactor:(CGFloat)delayFactor {
  if (animation) {
    self.hasAnimations = YES;
  }
  [super addAnimations:animation delayFactor:delayFactor];
}

- (void)addAnimations:(void (^)(void))animation {
  if (animation) {
    self.hasAnimations = YES;
  }
  [super addAnimations:animation];
}

#pragma mark - UIViewAnimating

- (void)startAnimation {
  if (!self.hasAnimations) {
    return;
  }
  [super startAnimation];
}

- (void)startAnimationAfterDelay:(NSTimeInterval)delay {
  if (!self.hasAnimations) {
    return;
  }
  [super startAnimationAfterDelay:delay];
}

@end