OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/test/test_session_state_animator.h" | 5 #include "ash/test/test_session_state_animator.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 | 10 |
11 namespace ash { | 11 namespace ash { |
12 namespace test { | 12 namespace test { |
13 | 13 |
14 namespace { | 14 namespace { |
15 // A no-op callback that can be used when managing an animation that didn't | 15 // A no-op callback that can be used when managing an animation that didn't |
16 // actually have a callback given. | 16 // actually have a callback given. |
17 void DummyCallback() {} | 17 void DummyCallback() {} |
18 } | 18 } |
19 | 19 |
20 const SessionStateAnimator::Container | 20 const SessionStateAnimator::Container |
21 TestSessionStateAnimator::kAllContainers[] = { | 21 TestSessionStateAnimator::kAllContainers[] = { |
22 SessionStateAnimator::DESKTOP_BACKGROUND, | 22 SessionStateAnimator::DESKTOP_BACKGROUND, |
23 SessionStateAnimator::LAUNCHER, | 23 SessionStateAnimator::LAUNCHER, |
24 SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, | 24 SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, |
25 SessionStateAnimator::LOCK_SCREEN_BACKGROUND, | 25 SessionStateAnimator::LOCK_SCREEN_BACKGROUND, |
26 SessionStateAnimator::LOCK_SCREEN_CONTAINERS, | 26 SessionStateAnimator::LOCK_SCREEN_CONTAINERS, |
27 SessionStateAnimator::LOCK_SCREEN_RELATED_CONTAINERS, | 27 SessionStateAnimator::LOCK_SCREEN_RELATED_CONTAINERS, |
28 SessionStateAnimator::ROOT_CONTAINER | 28 SessionStateAnimator::ROOT_CONTAINER}; |
29 }; | |
30 | 29 |
31 // A simple SessionStateAnimator::AnimationSequence that tracks the number of | 30 // A simple SessionStateAnimator::AnimationSequence that tracks the number of |
32 // attached sequences. The callback will be invoked if all animations complete | 31 // attached sequences. The callback will be invoked if all animations complete |
33 // successfully. | 32 // successfully. |
34 class TestSessionStateAnimator::AnimationSequence | 33 class TestSessionStateAnimator::AnimationSequence |
35 : public SessionStateAnimator::AnimationSequence { | 34 : public SessionStateAnimator::AnimationSequence { |
36 public: | 35 public: |
37 AnimationSequence(base::Closure callback, TestSessionStateAnimator* animator) | 36 AnimationSequence(base::Closure callback, TestSessionStateAnimator* animator) |
38 : SessionStateAnimator::AnimationSequence(callback), | 37 : SessionStateAnimator::AnimationSequence(callback), |
39 sequence_count_(0), | 38 sequence_count_(0), |
40 sequence_aborted_(false), | 39 sequence_aborted_(false), |
41 animator_(animator) { | 40 animator_(animator) {} |
42 } | |
43 | 41 |
44 ~AnimationSequence() override {} | 42 ~AnimationSequence() override {} |
45 | 43 |
46 virtual void SequenceAttached() { | 44 virtual void SequenceAttached() { ++sequence_count_; } |
47 ++sequence_count_; | |
48 } | |
49 | 45 |
50 // Notify the sequence that is has completed. | 46 // Notify the sequence that is has completed. |
51 virtual void SequenceFinished(bool successfully) { | 47 virtual void SequenceFinished(bool successfully) { |
52 DCHECK_GT(sequence_count_, 0); | 48 DCHECK_GT(sequence_count_, 0); |
53 --sequence_count_; | 49 --sequence_count_; |
54 sequence_aborted_ |= !successfully; | 50 sequence_aborted_ |= !successfully; |
55 if (sequence_count_ == 0) { | 51 if (sequence_count_ == 0) { |
56 if (sequence_aborted_) | 52 if (sequence_aborted_) |
57 OnAnimationAborted(); | 53 OnAnimationAborted(); |
58 else | 54 else |
(...skipping 28 matching lines...) Expand all Loading... |
87 AnimationType type, | 83 AnimationType type, |
88 AnimationSpeed speed, | 84 AnimationSpeed speed, |
89 base::Closure success_callback, | 85 base::Closure success_callback, |
90 base::Closure failed_callback) | 86 base::Closure failed_callback) |
91 : animation_epoch(animation_epoch), | 87 : animation_epoch(animation_epoch), |
92 remaining_duration(duration), | 88 remaining_duration(duration), |
93 container(container), | 89 container(container), |
94 type(type), | 90 type(type), |
95 speed(speed), | 91 speed(speed), |
96 success_callback(success_callback), | 92 success_callback(success_callback), |
97 failed_callback(failed_callback) { | 93 failed_callback(failed_callback) {} |
98 } | |
99 | 94 |
100 TestSessionStateAnimator::ActiveAnimation::ActiveAnimation( | 95 TestSessionStateAnimator::ActiveAnimation::ActiveAnimation( |
101 const ActiveAnimation& other) = default; | 96 const ActiveAnimation& other) = default; |
102 | 97 |
103 TestSessionStateAnimator::ActiveAnimation::~ActiveAnimation() { | 98 TestSessionStateAnimator::ActiveAnimation::~ActiveAnimation() {} |
104 } | |
105 | 99 |
106 TestSessionStateAnimator::TestSessionStateAnimator() | 100 TestSessionStateAnimator::TestSessionStateAnimator() |
107 : last_animation_epoch_(0), | 101 : last_animation_epoch_(0), is_background_hidden_(false) {} |
108 is_background_hidden_(false) { | |
109 } | |
110 | 102 |
111 TestSessionStateAnimator::~TestSessionStateAnimator() { | 103 TestSessionStateAnimator::~TestSessionStateAnimator() { |
112 CompleteAllAnimations(false); | 104 CompleteAllAnimations(false); |
113 } | 105 } |
114 | 106 |
115 void TestSessionStateAnimator::ResetAnimationEpoch() { | 107 void TestSessionStateAnimator::ResetAnimationEpoch() { |
116 CompleteAllAnimations(false); | 108 CompleteAllAnimations(false); |
117 last_animation_epoch_ = 0; | 109 last_animation_epoch_ = 0; |
118 } | 110 } |
119 | 111 |
120 void TestSessionStateAnimator::Advance(const base::TimeDelta& duration) { | 112 void TestSessionStateAnimator::Advance(const base::TimeDelta& duration) { |
121 for (ActiveAnimationsMap::iterator container_iter = | 113 for (ActiveAnimationsMap::iterator container_iter = |
122 active_animations_.begin(); | 114 active_animations_.begin(); |
123 container_iter != active_animations_.end(); | 115 container_iter != active_animations_.end(); ++container_iter) { |
124 ++container_iter) { | |
125 AnimationList::iterator animation_iter = (*container_iter).second.begin(); | 116 AnimationList::iterator animation_iter = (*container_iter).second.begin(); |
126 while (animation_iter != (*container_iter).second.end()) { | 117 while (animation_iter != (*container_iter).second.end()) { |
127 ActiveAnimation& active_animation = *animation_iter; | 118 ActiveAnimation& active_animation = *animation_iter; |
128 active_animation.remaining_duration -= duration; | 119 active_animation.remaining_duration -= duration; |
129 if (active_animation.remaining_duration <= base::TimeDelta()) { | 120 if (active_animation.remaining_duration <= base::TimeDelta()) { |
130 active_animation.success_callback.Run(); | 121 active_animation.success_callback.Run(); |
131 animation_iter = (*container_iter).second.erase(animation_iter); | 122 animation_iter = (*container_iter).second.erase(animation_iter); |
132 } else { | 123 } else { |
133 ++animation_iter; | 124 ++animation_iter; |
134 } | 125 } |
135 } | 126 } |
136 } | 127 } |
137 } | 128 } |
138 | 129 |
139 void TestSessionStateAnimator::CompleteAnimations(int animation_epoch, | 130 void TestSessionStateAnimator::CompleteAnimations(int animation_epoch, |
140 bool completed_successfully) { | 131 bool completed_successfully) { |
141 for (ActiveAnimationsMap::iterator container_iter = | 132 for (ActiveAnimationsMap::iterator container_iter = |
142 active_animations_.begin(); | 133 active_animations_.begin(); |
143 container_iter != active_animations_.end(); | 134 container_iter != active_animations_.end(); ++container_iter) { |
144 ++container_iter) { | |
145 AnimationList::iterator animation_iter = (*container_iter).second.begin(); | 135 AnimationList::iterator animation_iter = (*container_iter).second.begin(); |
146 while (animation_iter != (*container_iter).second.end()) { | 136 while (animation_iter != (*container_iter).second.end()) { |
147 ActiveAnimation active_animation = *animation_iter; | 137 ActiveAnimation active_animation = *animation_iter; |
148 if (active_animation.animation_epoch <= animation_epoch) { | 138 if (active_animation.animation_epoch <= animation_epoch) { |
149 if (completed_successfully) | 139 if (completed_successfully) |
150 active_animation.success_callback.Run(); | 140 active_animation.success_callback.Run(); |
151 else | 141 else |
152 active_animation.failed_callback.Run(); | 142 active_animation.failed_callback.Run(); |
153 animation_iter = (*container_iter).second.erase(animation_iter); | 143 animation_iter = (*container_iter).second.erase(animation_iter); |
154 } else { | 144 } else { |
155 ++animation_iter; | 145 ++animation_iter; |
156 } | 146 } |
157 } | 147 } |
158 } | 148 } |
159 } | 149 } |
160 | 150 |
161 void TestSessionStateAnimator::CompleteAllAnimations( | 151 void TestSessionStateAnimator::CompleteAllAnimations( |
162 bool completed_successfully) { | 152 bool completed_successfully) { |
163 CompleteAnimations(last_animation_epoch_, completed_successfully); | 153 CompleteAnimations(last_animation_epoch_, completed_successfully); |
164 } | 154 } |
165 | 155 |
166 bool TestSessionStateAnimator::IsContainerAnimated( | 156 bool TestSessionStateAnimator::IsContainerAnimated( |
167 SessionStateAnimator::Container container, | 157 SessionStateAnimator::Container container, |
168 SessionStateAnimator::AnimationType type) const { | 158 SessionStateAnimator::AnimationType type) const { |
169 ActiveAnimationsMap::const_iterator container_iter = | 159 ActiveAnimationsMap::const_iterator container_iter = |
170 active_animations_.find(container); | 160 active_animations_.find(container); |
171 if (container_iter != active_animations_.end()) { | 161 if (container_iter != active_animations_.end()) { |
172 for (AnimationList::const_iterator animation_iter = | 162 for (AnimationList::const_iterator animation_iter = |
173 (*container_iter).second.begin(); | 163 (*container_iter).second.begin(); |
174 animation_iter != (*container_iter).second.end(); | 164 animation_iter != (*container_iter).second.end(); ++animation_iter) { |
175 ++animation_iter) { | |
176 const ActiveAnimation& active_animation = *animation_iter; | 165 const ActiveAnimation& active_animation = *animation_iter; |
177 if (active_animation.type == type) | 166 if (active_animation.type == type) |
178 return true; | 167 return true; |
179 } | 168 } |
180 } | 169 } |
181 return false; | 170 return false; |
182 } | 171 } |
183 | 172 |
184 bool TestSessionStateAnimator::AreContainersAnimated( | 173 bool TestSessionStateAnimator::AreContainersAnimated( |
185 int container_mask, SessionStateAnimator::AnimationType type) const { | 174 int container_mask, |
| 175 SessionStateAnimator::AnimationType type) const { |
186 for (size_t i = 0; i < arraysize(kAllContainers); ++i) { | 176 for (size_t i = 0; i < arraysize(kAllContainers); ++i) { |
187 if (container_mask & kAllContainers[i] && | 177 if (container_mask & kAllContainers[i] && |
188 !IsContainerAnimated(kAllContainers[i], type)) { | 178 !IsContainerAnimated(kAllContainers[i], type)) { |
189 return false; | 179 return false; |
190 } | 180 } |
191 } | 181 } |
192 return true; | 182 return true; |
193 } | 183 } |
194 | 184 |
195 size_t TestSessionStateAnimator::GetAnimationCount() const { | 185 size_t TestSessionStateAnimator::GetAnimationCount() const { |
196 size_t count = 0; | 186 size_t count = 0; |
197 for (ActiveAnimationsMap::const_iterator container_iter = | 187 for (ActiveAnimationsMap::const_iterator container_iter = |
198 active_animations_.begin(); | 188 active_animations_.begin(); |
199 container_iter != active_animations_.end(); | 189 container_iter != active_animations_.end(); ++container_iter) { |
200 ++container_iter) { | |
201 count += (*container_iter).second.size(); | 190 count += (*container_iter).second.size(); |
202 } | 191 } |
203 return count; | 192 return count; |
204 } | 193 } |
205 | 194 |
206 void TestSessionStateAnimator::StartAnimation(int container_mask, | 195 void TestSessionStateAnimator::StartAnimation(int container_mask, |
207 AnimationType type, | 196 AnimationType type, |
208 AnimationSpeed speed) { | 197 AnimationSpeed speed) { |
209 ++last_animation_epoch_; | 198 ++last_animation_epoch_; |
210 for (size_t i = 0; i < arraysize(kAllContainers); ++i) { | 199 for (size_t i = 0; i < arraysize(kAllContainers); ++i) { |
(...skipping 14 matching lines...) Expand all Loading... |
225 ++last_animation_epoch_; | 214 ++last_animation_epoch_; |
226 for (size_t i = 0; i < arraysize(kAllContainers); ++i) | 215 for (size_t i = 0; i < arraysize(kAllContainers); ++i) |
227 if (container_mask & kAllContainers[i]) { | 216 if (container_mask & kAllContainers[i]) { |
228 // ash::SessionStateAnimatorImpl invokes the callback whether or not the | 217 // ash::SessionStateAnimatorImpl invokes the callback whether or not the |
229 // animation was completed successfully or not. | 218 // animation was completed successfully or not. |
230 AddAnimation(kAllContainers[i], type, speed, callback, callback); | 219 AddAnimation(kAllContainers[i], type, speed, callback, callback); |
231 } | 220 } |
232 } | 221 } |
233 | 222 |
234 ash::SessionStateAnimator::AnimationSequence* | 223 ash::SessionStateAnimator::AnimationSequence* |
235 TestSessionStateAnimator::BeginAnimationSequence(base::Closure callback) { | 224 TestSessionStateAnimator::BeginAnimationSequence(base::Closure callback) { |
236 return new AnimationSequence(callback, this); | 225 return new AnimationSequence(callback, this); |
237 } | 226 } |
238 | 227 |
239 bool TestSessionStateAnimator::IsBackgroundHidden() const { | 228 bool TestSessionStateAnimator::IsBackgroundHidden() const { |
240 return is_background_hidden_; | 229 return is_background_hidden_; |
241 } | 230 } |
242 | 231 |
243 void TestSessionStateAnimator::ShowBackground() { | 232 void TestSessionStateAnimator::ShowBackground() { |
244 is_background_hidden_ = false; | 233 is_background_hidden_ = false; |
245 } | 234 } |
(...skipping 11 matching lines...) Expand all Loading... |
257 for (size_t i = 0; i < arraysize(kAllContainers); ++i) { | 246 for (size_t i = 0; i < arraysize(kAllContainers); ++i) { |
258 if (container_mask & kAllContainers[i]) { | 247 if (container_mask & kAllContainers[i]) { |
259 base::Closure success_callback = | 248 base::Closure success_callback = |
260 base::Bind(&AnimationSequence::SequenceFinished, | 249 base::Bind(&AnimationSequence::SequenceFinished, |
261 base::Unretained(animation_sequence), true); | 250 base::Unretained(animation_sequence), true); |
262 base::Closure failed_callback = | 251 base::Closure failed_callback = |
263 base::Bind(&AnimationSequence::SequenceFinished, | 252 base::Bind(&AnimationSequence::SequenceFinished, |
264 base::Unretained(animation_sequence), false); | 253 base::Unretained(animation_sequence), false); |
265 animation_sequence->SequenceAttached(); | 254 animation_sequence->SequenceAttached(); |
266 AddAnimation(kAllContainers[i], type, speed, success_callback, | 255 AddAnimation(kAllContainers[i], type, speed, success_callback, |
267 failed_callback); | 256 failed_callback); |
268 } | 257 } |
269 } | 258 } |
270 } | 259 } |
271 | 260 |
272 void TestSessionStateAnimator::AddAnimation( | 261 void TestSessionStateAnimator::AddAnimation( |
273 SessionStateAnimator::Container container, | 262 SessionStateAnimator::Container container, |
274 AnimationType type, | 263 AnimationType type, |
275 AnimationSpeed speed, | 264 AnimationSpeed speed, |
276 base::Closure success_callback, | 265 base::Closure success_callback, |
277 base::Closure failed_callback) { | 266 base::Closure failed_callback) { |
278 base::TimeDelta duration = GetDuration(speed); | 267 base::TimeDelta duration = GetDuration(speed); |
279 ActiveAnimation active_animation(last_animation_epoch_, | 268 ActiveAnimation active_animation(last_animation_epoch_, duration, container, |
280 duration, | 269 type, speed, success_callback, |
281 container, | |
282 type, | |
283 speed, | |
284 success_callback, | |
285 failed_callback); | 270 failed_callback); |
286 // This test double is limited to only have one animation active for a given | 271 // This test double is limited to only have one animation active for a given |
287 // container at a time. | 272 // container at a time. |
288 AbortAnimation(container); | 273 AbortAnimation(container); |
289 active_animations_[container].push_back(active_animation); | 274 active_animations_[container].push_back(active_animation); |
290 } | 275 } |
291 | 276 |
292 void TestSessionStateAnimator::AbortAnimation( | 277 void TestSessionStateAnimator::AbortAnimation( |
293 SessionStateAnimator::Container container) { | 278 SessionStateAnimator::Container container) { |
294 ActiveAnimationsMap::iterator container_iter = | 279 ActiveAnimationsMap::iterator container_iter = |
295 active_animations_.find(container); | 280 active_animations_.find(container); |
296 if (container_iter != active_animations_.end()) { | 281 if (container_iter != active_animations_.end()) { |
297 AnimationList::iterator animation_iter = (*container_iter).second.begin(); | 282 AnimationList::iterator animation_iter = (*container_iter).second.begin(); |
298 while (animation_iter != (*container_iter).second.end()) { | 283 while (animation_iter != (*container_iter).second.end()) { |
299 ActiveAnimation active_animation = *animation_iter; | 284 ActiveAnimation active_animation = *animation_iter; |
300 active_animation.failed_callback.Run(); | 285 active_animation.failed_callback.Run(); |
301 animation_iter = (*container_iter).second.erase(animation_iter); | 286 animation_iter = (*container_iter).second.erase(animation_iter); |
302 } | 287 } |
303 } | 288 } |
304 } | 289 } |
305 | 290 |
306 } // namespace test | 291 } // namespace test |
307 } // namespace ash | 292 } // namespace ash |
OLD | NEW |