1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/chromeos/network/network_icon_animation.h"
6
7#include "ui/chromeos/network/network_icon_animation_observer.h"
8
9namespace {
10const int kThrobDurationMs = 750;  // Animation cycle length.
11}
12
13namespace ui {
14namespace network_icon {
15
16NetworkIconAnimation::NetworkIconAnimation()
17    : animation_(this) {
18  // Set up the animation throbber.
19  animation_.SetThrobDuration(kThrobDurationMs);
20  animation_.SetTweenType(gfx::Tween::LINEAR);
21}
22
23NetworkIconAnimation::~NetworkIconAnimation() {
24}
25
26void NetworkIconAnimation::AnimationProgressed(
27    const gfx::Animation* animation) {
28  if (animation != &animation_)
29    return;
30  FOR_EACH_OBSERVER(AnimationObserver, observers_, NetworkIconChanged());
31}
32
33double NetworkIconAnimation::GetAnimation() {
34  if (!animation_.is_animating()) {
35    animation_.Reset();
36    animation_.StartThrobbing(-1 /*throb indefinitely*/);
37    return 0;
38  }
39  return animation_.GetCurrentValue();
40}
41
42void NetworkIconAnimation::AddObserver(AnimationObserver* observer) {
43  if (!observers_.HasObserver(observer))
44    observers_.AddObserver(observer);
45}
46
47void NetworkIconAnimation::RemoveObserver(AnimationObserver* observer) {
48  observers_.RemoveObserver(observer);
49  if (!observers_.might_have_observers())
50    animation_.Reset();  // Stops the animation and resets the current value.
51}
52
53// static
54NetworkIconAnimation* NetworkIconAnimation::GetInstance() {
55  static NetworkIconAnimation* s_icon_animation =
56      new NetworkIconAnimation();
57  return s_icon_animation;
58}
59
60}  // namespace network_icon
61}  // namespace ui
62