| 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/common/material_design/material_design_controller.h" | |
| 10 #include "ash/common/shelf/shelf_background_animator_observer.h" | 9 #include "ash/common/shelf/shelf_background_animator_observer.h" |
| 11 #include "ash/common/shelf/shelf_constants.h" | 10 #include "ash/common/shelf/shelf_constants.h" |
| 12 #include "ash/common/shelf/wm_shelf.h" | 11 #include "ash/common/shelf/wm_shelf.h" |
| 13 | 12 |
| 14 namespace ash { | 13 namespace ash { |
| 15 | 14 |
| 16 namespace { | 15 namespace { |
| 17 // The total number of animators that will call BackgroundAnimationEnded(). | 16 // The total number of animators that will call BackgroundAnimationEnded(). |
| 18 const int kNumAnimators = 3; | 17 const int kNumAnimators = 2; |
| 19 | 18 |
| 20 const int kMaxAlpha = 255; | 19 const int kMaxAlpha = 255; |
| 21 } // namespace | 20 } // namespace |
| 22 | 21 |
| 23 ShelfBackgroundAnimator::ShelfBackgroundAnimator( | 22 ShelfBackgroundAnimator::ShelfBackgroundAnimator( |
| 24 ShelfBackgroundType background_type, | 23 ShelfBackgroundType background_type, |
| 25 WmShelf* wm_shelf) | 24 WmShelf* wm_shelf) |
| 26 : wm_shelf_(wm_shelf) { | 25 : wm_shelf_(wm_shelf) { |
| 27 if (wm_shelf_) | 26 if (wm_shelf_) |
| 28 wm_shelf_->AddObserver(this); | 27 wm_shelf_->AddObserver(this); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 43 } | 42 } |
| 44 | 43 |
| 45 void ShelfBackgroundAnimator::RemoveObserver( | 44 void ShelfBackgroundAnimator::RemoveObserver( |
| 46 ShelfBackgroundAnimatorObserver* observer) { | 45 ShelfBackgroundAnimatorObserver* observer) { |
| 47 observers_.RemoveObserver(observer); | 46 observers_.RemoveObserver(observer); |
| 48 } | 47 } |
| 49 | 48 |
| 50 void ShelfBackgroundAnimator::Initialize( | 49 void ShelfBackgroundAnimator::Initialize( |
| 51 ShelfBackgroundAnimatorObserver* observer) const { | 50 ShelfBackgroundAnimatorObserver* observer) const { |
| 52 observer->UpdateShelfOpaqueBackground(opaque_background_animator_->alpha()); | 51 observer->UpdateShelfOpaqueBackground(opaque_background_animator_->alpha()); |
| 53 observer->UpdateShelfAssetBackground(asset_background_animator_->alpha()); | |
| 54 observer->UpdateShelfItemBackground(item_background_animator_->alpha()); | 52 observer->UpdateShelfItemBackground(item_background_animator_->alpha()); |
| 55 } | 53 } |
| 56 | 54 |
| 57 void ShelfBackgroundAnimator::PaintBackground( | 55 void ShelfBackgroundAnimator::PaintBackground( |
| 58 ShelfBackgroundType background_type, | 56 ShelfBackgroundType background_type, |
| 59 BackgroundAnimatorChangeType change_type) { | 57 BackgroundAnimatorChangeType change_type) { |
| 60 if (target_background_type_ == background_type && | 58 if (target_background_type_ == background_type && |
| 61 change_type == BACKGROUND_CHANGE_ANIMATE) { | 59 change_type == BACKGROUND_CHANGE_ANIMATE) { |
| 62 return; | 60 return; |
| 63 } | 61 } |
| (...skipping 19 matching lines...) Expand all Loading... |
| 83 // UpdateBackground() is only called when alpha values change, this ensures | 81 // UpdateBackground() is only called when alpha values change, this ensures |
| 84 // observers are always notified for every background change. | 82 // observers are always notified for every background change. |
| 85 OnAlphaChanged(animator, animator->alpha()); | 83 OnAlphaChanged(animator, animator->alpha()); |
| 86 } | 84 } |
| 87 | 85 |
| 88 void ShelfBackgroundAnimator::OnAlphaChanged(BackgroundAnimator* animator, | 86 void ShelfBackgroundAnimator::OnAlphaChanged(BackgroundAnimator* animator, |
| 89 int alpha) { | 87 int alpha) { |
| 90 if (animator == opaque_background_animator_.get()) { | 88 if (animator == opaque_background_animator_.get()) { |
| 91 for (auto& observer : observers_) | 89 for (auto& observer : observers_) |
| 92 observer.UpdateShelfOpaqueBackground(alpha); | 90 observer.UpdateShelfOpaqueBackground(alpha); |
| 93 } else if (animator == asset_background_animator_.get()) { | |
| 94 for (auto& observer : observers_) | |
| 95 observer.UpdateShelfAssetBackground(alpha); | |
| 96 } else if (animator == item_background_animator_.get()) { | 91 } else if (animator == item_background_animator_.get()) { |
| 97 for (auto& observer : observers_) | 92 for (auto& observer : observers_) |
| 98 observer.UpdateShelfItemBackground(alpha); | 93 observer.UpdateShelfItemBackground(alpha); |
| 99 } else { | 94 } else { |
| 100 NOTREACHED(); | 95 NOTREACHED(); |
| 101 } | 96 } |
| 102 } | 97 } |
| 103 | 98 |
| 104 void ShelfBackgroundAnimator::AnimateBackground( | 99 void ShelfBackgroundAnimator::AnimateBackground( |
| 105 ShelfBackgroundType background_type, | 100 ShelfBackgroundType background_type, |
| 106 BackgroundAnimatorChangeType change_type) { | 101 BackgroundAnimatorChangeType change_type) { |
| 107 // Ensure BackgroundAnimationEnded() has been called for all the | 102 // Ensure BackgroundAnimationEnded() has been called for all the |
| 108 // BackgroundAnimators owned by this so that |successful_animator_count_| | 103 // BackgroundAnimators owned by this so that |successful_animator_count_| |
| 109 // is stable and doesn't get updated as a side effect of destroying/animating | 104 // is stable and doesn't get updated as a side effect of destroying/animating |
| 110 // the animators. | 105 // the animators. |
| 111 StopAnimators(); | 106 StopAnimators(); |
| 112 | 107 |
| 113 bool show_background = true; | 108 bool show_background = true; |
| 114 if (can_reuse_animators_ && previous_background_type_ == background_type) { | 109 if (can_reuse_animators_ && previous_background_type_ == background_type) { |
| 115 DCHECK_EQ(opaque_background_animator_->paints_background(), | 110 DCHECK_EQ(opaque_background_animator_->paints_background(), |
| 116 asset_background_animator_->paints_background()); | |
| 117 DCHECK_EQ(asset_background_animator_->paints_background(), | |
| 118 item_background_animator_->paints_background()); | 111 item_background_animator_->paints_background()); |
| 119 | 112 |
| 120 show_background = !opaque_background_animator_->paints_background(); | 113 show_background = !opaque_background_animator_->paints_background(); |
| 121 } else { | 114 } else { |
| 122 CreateAnimators(background_type, change_type); | 115 CreateAnimators(background_type, change_type); |
| 123 | 116 |
| 124 // If all the previous animators completed successfully and the animation | 117 // If all the previous animators completed successfully and the animation |
| 125 // was between 2 distinct states, then the last alpha values are valid | 118 // was between 2 distinct states, then the last alpha values are valid |
| 126 // end state values. | 119 // end state values. |
| 127 can_reuse_animators_ = target_background_type_ != background_type && | 120 can_reuse_animators_ = target_background_type_ != background_type && |
| 128 successful_animator_count_ == kNumAnimators; | 121 successful_animator_count_ == kNumAnimators; |
| 129 } | 122 } |
| 130 | 123 |
| 131 successful_animator_count_ = 0; | 124 successful_animator_count_ = 0; |
| 132 | 125 |
| 133 opaque_background_animator_->SetPaintsBackground(show_background, | 126 opaque_background_animator_->SetPaintsBackground(show_background, |
| 134 change_type); | 127 change_type); |
| 135 asset_background_animator_->SetPaintsBackground(show_background, change_type); | |
| 136 item_background_animator_->SetPaintsBackground(show_background, change_type); | 128 item_background_animator_->SetPaintsBackground(show_background, change_type); |
| 137 | 129 |
| 138 if (target_background_type_ != background_type) { | 130 if (target_background_type_ != background_type) { |
| 139 previous_background_type_ = target_background_type_; | 131 previous_background_type_ = target_background_type_; |
| 140 target_background_type_ = background_type; | 132 target_background_type_ = background_type; |
| 141 } | 133 } |
| 142 } | 134 } |
| 143 | 135 |
| 144 void ShelfBackgroundAnimator::CreateAnimators( | 136 void ShelfBackgroundAnimator::CreateAnimators( |
| 145 ShelfBackgroundType background_type, | 137 ShelfBackgroundType background_type, |
| 146 BackgroundAnimatorChangeType change_type) { | 138 BackgroundAnimatorChangeType change_type) { |
| 147 const int opaque_background_alpha = | 139 const int opaque_background_alpha = |
| 148 opaque_background_animator_ ? opaque_background_animator_->alpha() : 0; | 140 opaque_background_animator_ ? opaque_background_animator_->alpha() : 0; |
| 149 const int asset_background_alpha = | |
| 150 asset_background_animator_ ? asset_background_animator_->alpha() : 0; | |
| 151 const int item_background_alpha = | 141 const int item_background_alpha = |
| 152 item_background_animator_ ? item_background_animator_->alpha() : 0; | 142 item_background_animator_ ? item_background_animator_->alpha() : 0; |
| 153 | 143 |
| 154 const bool is_material = MaterialDesignController::IsShelfMaterial(); | |
| 155 int duration_ms = 0; | 144 int duration_ms = 0; |
| 156 | 145 |
| 157 switch (background_type) { | 146 switch (background_type) { |
| 158 case SHELF_BACKGROUND_DEFAULT: | 147 case SHELF_BACKGROUND_DEFAULT: |
| 159 duration_ms = is_material ? 500 : 1000; | 148 duration_ms = 500; |
| 160 opaque_background_animator_.reset( | 149 opaque_background_animator_.reset( |
| 161 new BackgroundAnimator(this, opaque_background_alpha, 0)); | 150 new BackgroundAnimator(this, opaque_background_alpha, 0)); |
| 162 asset_background_animator_.reset( | 151 item_background_animator_.reset(new BackgroundAnimator( |
| 163 new BackgroundAnimator(this, asset_background_alpha, 0)); | 152 this, item_background_alpha, kShelfTranslucentAlpha)); |
| 164 item_background_animator_.reset( | |
| 165 new BackgroundAnimator(this, item_background_alpha, | |
| 166 GetShelfConstant(SHELF_BACKGROUND_ALPHA))); | |
| 167 break; | 153 break; |
| 168 case SHELF_BACKGROUND_OVERLAP: | 154 case SHELF_BACKGROUND_OVERLAP: |
| 169 duration_ms = is_material ? 500 : 1000; | 155 duration_ms = 500; |
| 170 opaque_background_animator_.reset(new BackgroundAnimator( | 156 opaque_background_animator_.reset(new BackgroundAnimator( |
| 171 this, opaque_background_alpha, | 157 this, opaque_background_alpha, kShelfTranslucentAlpha)); |
| 172 is_material ? GetShelfConstant(SHELF_BACKGROUND_ALPHA) : 0)); | 158 item_background_animator_.reset( |
| 173 asset_background_animator_.reset(new BackgroundAnimator( | 159 new BackgroundAnimator(this, item_background_alpha, 0)); |
| 174 this, asset_background_alpha, | |
| 175 is_material ? 0 : GetShelfConstant(SHELF_BACKGROUND_ALPHA))); | |
| 176 item_background_animator_.reset(new BackgroundAnimator( | |
| 177 this, item_background_alpha, | |
| 178 is_material ? 0 : GetShelfConstant(SHELF_BACKGROUND_ALPHA))); | |
| 179 break; | 160 break; |
| 180 case SHELF_BACKGROUND_MAXIMIZED: | 161 case SHELF_BACKGROUND_MAXIMIZED: |
| 181 duration_ms = is_material ? 250 : 1000; | 162 duration_ms = 250; |
| 182 opaque_background_animator_.reset( | 163 opaque_background_animator_.reset( |
| 183 new BackgroundAnimator(this, opaque_background_alpha, kMaxAlpha)); | 164 new BackgroundAnimator(this, opaque_background_alpha, kMaxAlpha)); |
| 184 asset_background_animator_.reset(new BackgroundAnimator( | 165 item_background_animator_.reset( |
| 185 this, asset_background_alpha, | 166 new BackgroundAnimator(this, item_background_alpha, 0)); |
| 186 is_material ? 0 : GetShelfConstant(SHELF_BACKGROUND_ALPHA))); | |
| 187 item_background_animator_.reset(new BackgroundAnimator( | |
| 188 this, item_background_alpha, is_material ? 0 : kMaxAlpha)); | |
| 189 break; | 167 break; |
| 190 } | 168 } |
| 191 | 169 |
| 192 opaque_background_animator_->SetDuration(duration_ms); | 170 opaque_background_animator_->SetDuration(duration_ms); |
| 193 asset_background_animator_->SetDuration(duration_ms); | |
| 194 item_background_animator_->SetDuration(duration_ms); | 171 item_background_animator_->SetDuration(duration_ms); |
| 195 } | 172 } |
| 196 | 173 |
| 197 void ShelfBackgroundAnimator::StopAnimators() { | 174 void ShelfBackgroundAnimator::StopAnimators() { |
| 198 if (opaque_background_animator_) | 175 if (opaque_background_animator_) |
| 199 opaque_background_animator_->Stop(); | 176 opaque_background_animator_->Stop(); |
| 200 if (asset_background_animator_) | |
| 201 asset_background_animator_->Stop(); | |
| 202 if (item_background_animator_) | 177 if (item_background_animator_) |
| 203 item_background_animator_->Stop(); | 178 item_background_animator_->Stop(); |
| 204 } | 179 } |
| 205 | 180 |
| 206 } // namespace ash | 181 } // namespace ash |
| OLD | NEW |