// Copyright (c) 2012 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.

#ifndef UI_COMPOSITOR_TEST_TEST_LAYER_ANIMATION_OBSERVER_H_
#define UI_COMPOSITOR_TEST_TEST_LAYER_ANIMATION_OBSERVER_H_

#include "base/compiler_specific.h"
#include "ui/compositor/layer_animation_observer.h"

namespace ui {

class LayerAnimationSequence;

// Listens to animation ended notifications. Remembers the last sequence that
// it was notified about.
class TestLayerAnimationObserver : public LayerAnimationObserver {
 public:
  TestLayerAnimationObserver();
  ~TestLayerAnimationObserver() override;

  void OnLayerAnimationEnded(LayerAnimationSequence* sequence) override;

  void OnLayerAnimationAborted(LayerAnimationSequence* sequence) override;

  void OnLayerAnimationScheduled(LayerAnimationSequence* sequence) override;

  bool RequiresNotificationWhenAnimatorDestroyed() const override;

  const LayerAnimationSequence* last_ended_sequence() const {
    return last_ended_sequence_;
  }

  const LayerAnimationSequence* last_scheduled_sequence() const {
    return last_scheduled_sequence_;
  }

  const LayerAnimationSequence* last_aborted_sequence() const {
    return last_aborted_sequence_;
  }

  void set_requires_notification_when_animator_destroyed(bool value) {
    requires_notification_when_animator_destroyed_ = value;
  }

 private:
  const LayerAnimationSequence* last_ended_sequence_;
  const LayerAnimationSequence* last_scheduled_sequence_;
  const LayerAnimationSequence* last_aborted_sequence_;
  bool requires_notification_when_animator_destroyed_;

  // Copy and assign are allowed.
};

}  // namespace ui

#endif  // UI_COMPOSITOR_TEST_TEST_LAYER_ANIMATION_OBSERVER_H_
