1 // Copyright 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 "chrome/browser/ui/autofill/loading_animation.h"
6
7 #include "base/logging.h"
8 #include "ui/gfx/animation/tween.h"
9
10 namespace autofill {
11
12 // Duration of one cycle of the animation.
13 static const int kDurationMs = 1800;
14
15 // The frame rate of the animation.
16 static const int kHertz = 60;
17
LoadingAnimation(gfx::AnimationDelegate * delegate,int font_height)18 LoadingAnimation::LoadingAnimation(gfx::AnimationDelegate* delegate,
19 int font_height)
20 : LinearAnimation(kDurationMs, kHertz, delegate),
21 first_cycle_(true),
22 font_height_(font_height) {}
23
~LoadingAnimation()24 LoadingAnimation::~LoadingAnimation() {}
25
Step(base::TimeTicks time_now)26 void LoadingAnimation::Step(base::TimeTicks time_now) {
27 LinearAnimation::Step(time_now);
28
29 if (!is_animating()) {
30 first_cycle_ = false;
31 Start();
32 }
33 }
34
GetCurrentValueForDot(size_t dot_i) const35 double LoadingAnimation::GetCurrentValueForDot(size_t dot_i) const {
36 double base_value = gfx::LinearAnimation::GetCurrentValue();
37
38 const double kSecondDotDelayMs = 100.0;
39 const double kThirdDotDelayMs = 300.0;
40 if (dot_i == 1)
41 base_value -= kSecondDotDelayMs / kDurationMs;
42 else if (dot_i == 2)
43 base_value -= kThirdDotDelayMs / kDurationMs;
44
45 if (base_value < 0.0)
46 base_value = first_cycle_ ? 0.0 : base_value + 1.0;
47
48 double value = gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, base_value);
49
50 static AnimationFrame kAnimationFrames[] = {
51 { 0.0, 0.0 },
52 { 0.55, 0.0 },
53 { 0.6, -1.0 },
54 { 0.8, 0.3 },
55 { 0.9, -0.2 },
56 { 0.95, 0.1 },
57 { 1.0, 0.0 },
58 };
59
60 for (size_t i = 0; i < arraysize(kAnimationFrames); ++i) {
61 if (value > kAnimationFrames[i].value)
62 continue;
63
64 double position;
65 if (i == 0) {
66 position = kAnimationFrames[i].position;
67 } else {
68 double inter_frame_value =
69 (value - kAnimationFrames[i - 1].value) /
70 (kAnimationFrames[i].value - kAnimationFrames[i - 1].value);
71 position = gfx::Tween::FloatValueBetween(inter_frame_value,
72 kAnimationFrames[i - 1].position,
73 kAnimationFrames[i].position);
74 }
75 return position * font_height_ / 2.0;
76 }
77
78 NOTREACHED();
79 return 0.0;
80 }
81
Reset()82 void LoadingAnimation::Reset() {
83 Stop();
84 first_cycle_ = true;
85 }
86
87 } // namespace autofill
88