12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon_animation.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/chromeos/network/network_icon_animation_observer.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kThrobDurationMs = 750;  // Animation cycle length.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace network_icon {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkIconAnimation::NetworkIconAnimation()
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : animation_(this) {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up the animation throbber.
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  animation_.SetThrobDuration(kThrobDurationMs);
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  animation_.SetTweenType(gfx::Tween::LINEAR);
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkIconAnimation::~NetworkIconAnimation() {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void NetworkIconAnimation::AnimationProgressed(
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const gfx::Animation* animation) {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (animation != &animation_)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(AnimationObserver, observers_, NetworkIconChanged());
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double NetworkIconAnimation::GetAnimation() {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!animation_.is_animating()) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animation_.Reset();
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animation_.StartThrobbing(-1 /*throb indefinitely*/);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return animation_.GetCurrentValue();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkIconAnimation::AddObserver(AnimationObserver* observer) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!observers_.HasObserver(observer))
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observers_.AddObserver(observer);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkIconAnimation::RemoveObserver(AnimationObserver* observer) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observers_.RemoveObserver(observer);
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!observers_.might_have_observers())
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    animation_.Reset();  // Stops the animation and resets the current value.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkIconAnimation* NetworkIconAnimation::GetInstance() {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static NetworkIconAnimation* s_icon_animation =
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new NetworkIconAnimation();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return s_icon_animation;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace network_icon
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ash
62