chromium/ios/chrome/browser/shared/ui/util/property_animator_group.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/property_animator_group.h"

#import "base/check.h"

@implementation PropertyAnimatorGroup {
  NSMutableArray<UIViewPropertyAnimator*>* _animators;
}

@synthesize animators = _animators;

- (instancetype)init {
  if ((self = [super init])) {
    _animators = [[NSMutableArray alloc] init];
  }
  return self;
}

- (void)addAnimator:(UIViewPropertyAnimator*)animator {
  DCHECK(self.animators.count == 0 ||
         animator.duration == self.animators[0].duration);
  DCHECK(self.animators.count == 0 ||
         animator.delay == self.animators[0].delay);
  [_animators addObject:animator];
}

#pragma mark UIViewAnimating

- (void)startAnimation {
  for (UIViewPropertyAnimator* animator in self.animators) {
    [animator startAnimation];
  }
}

- (void)startAnimationAfterDelay:(NSTimeInterval)delay {
  for (UIViewPropertyAnimator* animator in self.animators) {
    [animator startAnimationAfterDelay:delay];
  }
}

- (void)pauseAnimation {
  for (UIViewPropertyAnimator* animator in self.animators) {
    [animator pauseAnimation];
  }
}

- (void)stopAnimation:(BOOL)withoutFinishing {
  for (UIViewPropertyAnimator* animator in self.animators) {
    [animator stopAnimation:withoutFinishing];
  }
}

- (void)finishAnimationAtPosition:(UIViewAnimatingPosition)finalPosition {
  for (UIViewPropertyAnimator* animator in self.animators) {
    [animator finishAnimationAtPosition:finalPosition];
  }
}

- (CGFloat)fractionComplete {
  return self.animators[0].fractionComplete;
}

- (void)setFractionComplete:(CGFloat)fractionComplete {
  for (UIViewPropertyAnimator* animator in self.animators) {
    animator.fractionComplete = fractionComplete;
  }
}

- (BOOL)isReversed {
  return self.animators[0].reversed;
}

- (void)setReversed:(BOOL)reversed {
  for (UIViewPropertyAnimator* animator in self.animators) {
    animator.reversed = reversed;
  }
}

- (UIViewAnimatingState)state {
  return self.animators[0].state;
}

- (BOOL)isRunning {
  return self.animators[0].running;
}

#pragma mark UIViewImplicitlyAnimating

- (void)addAnimations:(void (^)())animation {
  [self.animators[0] addAnimations:animation];
}

- (void)addAnimations:(void (^)())animation delayFactor:(CGFloat)delayFactor {
  [self.animators[0] addAnimations:animation delayFactor:delayFactor];
}

- (void)addCompletion:(void (^)(UIViewAnimatingPosition))completion {
  [self.animators[0] addCompletion:completion];
}

- (void)continueAnimationWithTimingParameters:
            (id<UITimingCurveProvider>)parameters
                               durationFactor:(CGFloat)durationFactor {
  [self.animators[0] continueAnimationWithTimingParameters:parameters
                                            durationFactor:durationFactor];
}

@end