OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/common/shelf/shelf_background_animator.h" | 5 #include "ash/common/shelf/shelf_background_animator.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ash/animation/animation_change_type.h" | 9 #include "ash/animation/animation_change_type.h" |
10 #include "ash/common/shelf/shelf_background_animator_observer.h" | 10 #include "ash/common/shelf/shelf_background_animator_observer.h" |
11 #include "ash/common/shelf/shelf_constants.h" | 11 #include "ash/common/shelf/shelf_constants.h" |
12 #include "ash/common/shelf/wm_shelf.h" | 12 #include "ash/common/shelf/wm_shelf.h" |
| 13 #include "ash/common/wallpaper/wallpaper_controller.h" |
13 #include "ui/gfx/animation/slide_animation.h" | 14 #include "ui/gfx/animation/slide_animation.h" |
| 15 #include "ui/gfx/color_utils.h" |
14 | 16 |
15 namespace ash { | 17 namespace ash { |
16 | 18 |
17 ShelfBackgroundAnimator::AnimationValues::AnimationValues() {} | 19 ShelfBackgroundAnimator::AnimationValues::AnimationValues() {} |
18 | 20 |
19 ShelfBackgroundAnimator::AnimationValues::~AnimationValues() {} | 21 ShelfBackgroundAnimator::AnimationValues::~AnimationValues() {} |
20 | 22 |
21 void ShelfBackgroundAnimator::AnimationValues::UpdateCurrentValues(double t) { | 23 void ShelfBackgroundAnimator::AnimationValues::UpdateCurrentValues(double t) { |
22 current_alpha_ = | 24 current_color_ = |
23 gfx::Tween::IntValueBetween(t, initial_alpha_, target_alpha_); | 25 gfx::Tween::ColorValueBetween(t, initial_color_, target_color_); |
24 } | 26 } |
25 | 27 |
26 void ShelfBackgroundAnimator::AnimationValues::SetTargetValues( | 28 void ShelfBackgroundAnimator::AnimationValues::SetTargetValues( |
27 int target_alpha) { | 29 SkColor target_color) { |
28 DCHECK_LE(target_alpha, kMaxAlpha); | 30 initial_color_ = current_color_; |
29 DCHECK_GE(target_alpha, 0); | 31 target_color_ = target_color; |
30 initial_alpha_ = current_alpha_; | |
31 target_alpha_ = target_alpha; | |
32 } | 32 } |
33 | 33 |
34 bool ShelfBackgroundAnimator::AnimationValues::InitialValuesEqualTargetValuesOf( | 34 bool ShelfBackgroundAnimator::AnimationValues::InitialValuesEqualTargetValuesOf( |
35 const AnimationValues& other) const { | 35 const AnimationValues& other) const { |
36 return initial_alpha_ == other.target_alpha_; | 36 return initial_color_ == other.target_color_; |
37 } | 37 } |
38 | 38 |
39 ShelfBackgroundAnimator::ShelfBackgroundAnimator( | 39 ShelfBackgroundAnimator::ShelfBackgroundAnimator( |
40 ShelfBackgroundType background_type, | 40 ShelfBackgroundType background_type, |
41 WmShelf* wm_shelf) | 41 WmShelf* wm_shelf, |
42 : wm_shelf_(wm_shelf) { | 42 WallpaperController* wallpaper_controller) |
| 43 : wm_shelf_(wm_shelf), wallpaper_controller_(wallpaper_controller) { |
| 44 if (wallpaper_controller_) |
| 45 wallpaper_controller_->AddObserver(this); |
43 if (wm_shelf_) | 46 if (wm_shelf_) |
44 wm_shelf_->AddObserver(this); | 47 wm_shelf_->AddObserver(this); |
| 48 |
45 // Initialize animators so that adding observers get notified with consistent | 49 // Initialize animators so that adding observers get notified with consistent |
46 // values. | 50 // values. |
47 AnimateBackground(background_type, AnimationChangeType::IMMEDIATE); | 51 AnimateBackground(background_type, AnimationChangeType::IMMEDIATE); |
48 } | 52 } |
49 | 53 |
50 ShelfBackgroundAnimator::~ShelfBackgroundAnimator() { | 54 ShelfBackgroundAnimator::~ShelfBackgroundAnimator() { |
| 55 if (wallpaper_controller_) |
| 56 wallpaper_controller_->RemoveObserver(this); |
51 if (wm_shelf_) | 57 if (wm_shelf_) |
52 wm_shelf_->RemoveObserver(this); | 58 wm_shelf_->RemoveObserver(this); |
53 } | 59 } |
54 | 60 |
55 void ShelfBackgroundAnimator::AddObserver( | 61 void ShelfBackgroundAnimator::AddObserver( |
56 ShelfBackgroundAnimatorObserver* observer) { | 62 ShelfBackgroundAnimatorObserver* observer) { |
57 observers_.AddObserver(observer); | 63 observers_.AddObserver(observer); |
58 NotifyObserver(observer); | 64 NotifyObserver(observer); |
59 } | 65 } |
60 | 66 |
61 void ShelfBackgroundAnimator::RemoveObserver( | 67 void ShelfBackgroundAnimator::RemoveObserver( |
62 ShelfBackgroundAnimatorObserver* observer) { | 68 ShelfBackgroundAnimatorObserver* observer) { |
63 observers_.RemoveObserver(observer); | 69 observers_.RemoveObserver(observer); |
64 } | 70 } |
65 | 71 |
66 void ShelfBackgroundAnimator::NotifyObserver( | 72 void ShelfBackgroundAnimator::NotifyObserver( |
67 ShelfBackgroundAnimatorObserver* observer) { | 73 ShelfBackgroundAnimatorObserver* observer) { |
68 observer->UpdateShelfBackground(shelf_background_values_.current_alpha()); | 74 observer->UpdateShelfBackground(shelf_background_values_.current_color()); |
69 observer->UpdateShelfItemBackground(item_background_values_.current_alpha()); | 75 observer->UpdateShelfItemBackground(item_background_values_.current_color()); |
70 } | 76 } |
71 | 77 |
72 void ShelfBackgroundAnimator::PaintBackground( | 78 void ShelfBackgroundAnimator::PaintBackground( |
73 ShelfBackgroundType background_type, | 79 ShelfBackgroundType background_type, |
74 AnimationChangeType change_type) { | 80 AnimationChangeType change_type) { |
75 if (target_background_type_ == background_type && | 81 if (target_background_type_ == background_type && |
76 change_type == AnimationChangeType::ANIMATE) { | 82 change_type == AnimationChangeType::ANIMATE) { |
77 return; | 83 return; |
78 } | 84 } |
79 | 85 |
(...skipping 13 matching lines...) Expand all Loading... |
93 } | 99 } |
94 | 100 |
95 void ShelfBackgroundAnimator::AnimationCanceled( | 101 void ShelfBackgroundAnimator::AnimationCanceled( |
96 const gfx::Animation* animation) { | 102 const gfx::Animation* animation) { |
97 DCHECK_EQ(animation, animator_.get()); | 103 DCHECK_EQ(animation, animator_.get()); |
98 SetAnimationValues(animator_->IsShowing() ? 1.0 : 0.0); | 104 SetAnimationValues(animator_->IsShowing() ? 1.0 : 0.0); |
99 // Animations are only cancelled when they are being pre-empted so we don't | 105 // Animations are only cancelled when they are being pre-empted so we don't |
100 // destroy the |animator_| because it may be re-used immediately. | 106 // destroy the |animator_| because it may be re-used immediately. |
101 } | 107 } |
102 | 108 |
| 109 void ShelfBackgroundAnimator::OnWallpaperDataChanged() {} |
| 110 |
| 111 void ShelfBackgroundAnimator::OnWallpaperColorsChanged() { |
| 112 AnimateBackground(target_background_type_, AnimationChangeType::ANIMATE); |
| 113 } |
| 114 |
103 void ShelfBackgroundAnimator::OnBackgroundTypeChanged( | 115 void ShelfBackgroundAnimator::OnBackgroundTypeChanged( |
104 ShelfBackgroundType background_type, | 116 ShelfBackgroundType background_type, |
105 AnimationChangeType change_type) { | 117 AnimationChangeType change_type) { |
106 PaintBackground(background_type, change_type); | 118 PaintBackground(background_type, change_type); |
107 } | 119 } |
108 | 120 |
109 void ShelfBackgroundAnimator::NotifyObservers() { | 121 void ShelfBackgroundAnimator::NotifyObservers() { |
110 for (auto& observer : observers_) | 122 for (auto& observer : observers_) |
111 NotifyObserver(&observer); | 123 NotifyObserver(&observer); |
112 } | 124 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 void ShelfBackgroundAnimator::SetTargetValues( | 196 void ShelfBackgroundAnimator::SetTargetValues( |
185 ShelfBackgroundType background_type) { | 197 ShelfBackgroundType background_type) { |
186 GetTargetValues(background_type, &shelf_background_values_, | 198 GetTargetValues(background_type, &shelf_background_values_, |
187 &item_background_values_); | 199 &item_background_values_); |
188 } | 200 } |
189 | 201 |
190 void ShelfBackgroundAnimator::GetTargetValues( | 202 void ShelfBackgroundAnimator::GetTargetValues( |
191 ShelfBackgroundType background_type, | 203 ShelfBackgroundType background_type, |
192 AnimationValues* shelf_background_values, | 204 AnimationValues* shelf_background_values, |
193 AnimationValues* item_background_values) const { | 205 AnimationValues* item_background_values) const { |
194 int target_shelf_background = 0; | 206 int target_shelf_background_alpha = 0; |
195 int target_shelf_item_background = 0; | 207 int target_shelf_item_background_alpha = 0; |
196 | 208 |
197 switch (background_type) { | 209 switch (background_type) { |
198 case SHELF_BACKGROUND_DEFAULT: | 210 case SHELF_BACKGROUND_DEFAULT: |
199 target_shelf_background = 0; | 211 target_shelf_background_alpha = 0; |
200 target_shelf_item_background = kShelfTranslucentAlpha; | 212 target_shelf_item_background_alpha = kShelfTranslucentAlpha; |
201 break; | 213 break; |
202 case SHELF_BACKGROUND_OVERLAP: | 214 case SHELF_BACKGROUND_OVERLAP: |
203 target_shelf_background = kShelfTranslucentAlpha; | 215 target_shelf_background_alpha = kShelfTranslucentAlpha; |
204 target_shelf_item_background = 0; | 216 target_shelf_item_background_alpha = 0; |
205 break; | 217 break; |
206 case SHELF_BACKGROUND_MAXIMIZED: | 218 case SHELF_BACKGROUND_MAXIMIZED: |
207 target_shelf_background = kMaxAlpha; | 219 target_shelf_background_alpha = kMaxAlpha; |
208 target_shelf_item_background = 0; | 220 target_shelf_item_background_alpha = 0; |
209 break; | 221 break; |
210 } | 222 } |
211 shelf_background_values->SetTargetValues(target_shelf_background); | 223 |
212 item_background_values->SetTargetValues(target_shelf_item_background); | 224 SkColor target_color = wallpaper_controller_ |
| 225 ? wallpaper_controller_->prominent_color() |
| 226 : kShelfDefaultBaseColor; |
| 227 |
| 228 if (target_color == SK_ColorTRANSPARENT) |
| 229 target_color = kShelfDefaultBaseColor; |
| 230 |
| 231 shelf_background_values->SetTargetValues( |
| 232 SkColorSetA(target_color, target_shelf_background_alpha)); |
| 233 item_background_values->SetTargetValues( |
| 234 SkColorSetA(target_color, target_shelf_item_background_alpha)); |
213 } | 235 } |
214 | 236 |
215 void ShelfBackgroundAnimator::SetAnimationValues(double t) { | 237 void ShelfBackgroundAnimator::SetAnimationValues(double t) { |
216 DCHECK_GE(t, 0.0); | 238 DCHECK_GE(t, 0.0); |
217 DCHECK_LE(t, 1.0); | 239 DCHECK_LE(t, 1.0); |
218 shelf_background_values_.UpdateCurrentValues(t); | 240 shelf_background_values_.UpdateCurrentValues(t); |
219 item_background_values_.UpdateCurrentValues(t); | 241 item_background_values_.UpdateCurrentValues(t); |
220 NotifyObservers(); | 242 NotifyObservers(); |
221 } | 243 } |
222 | 244 |
223 } // namespace ash | 245 } // namespace ash |
OLD | NEW |