Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2406)

Unified Diff: ash/common/shelf/shelf_background_animator.cc

Issue 2679333002: [ash-md] Remove the number of animators used for the Shelf animations. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/common/shelf/shelf_background_animator.cc
diff --git a/ash/common/shelf/shelf_background_animator.cc b/ash/common/shelf/shelf_background_animator.cc
index 2ebf9f012b950117412c3322505c5554cf26cebb..d0aad30691bdb8f4721f88e211b61a910b426597 100644
--- a/ash/common/shelf/shelf_background_animator.cc
+++ b/ash/common/shelf/shelf_background_animator.cc
@@ -10,15 +10,24 @@
#include "ash/common/shelf/shelf_background_animator_observer.h"
#include "ash/common/shelf/shelf_constants.h"
#include "ash/common/shelf/wm_shelf.h"
+#include "ui/gfx/animation/slide_animation.h"
namespace ash {
-namespace {
-// The total number of animators that will call BackgroundAnimationEnded().
-const int kNumAnimators = 3;
+const int ShelfBackgroundAnimator::kMaxAlpha = 255;
James Cook 2017/02/08 00:31:27 Can this be initialized in header?
bruthig 2017/02/10 18:49:09 Done.
-const int kMaxAlpha = 255;
-} // namespace
+void ShelfBackgroundAnimator::AnimationValues::UpdateCurrentValues(double t) {
+ current_alpha_ =
+ gfx::Tween::IntValueBetween(t, initial_alpha_, target_alpha_);
+}
+
+void ShelfBackgroundAnimator::AnimationValues::SetTargetValues(
+ int target_alpha) {
+ DCHECK_LE(target_alpha, kMaxAlpha);
+ DCHECK_GE(target_alpha, 0);
+ initial_alpha_ = current_alpha_;
+ target_alpha_ = target_alpha;
+}
ShelfBackgroundAnimator::ShelfBackgroundAnimator(
ShelfBackgroundType background_type,
@@ -28,7 +37,7 @@ ShelfBackgroundAnimator::ShelfBackgroundAnimator(
wm_shelf_->AddObserver(this);
// Initialize animators so that adding observers get notified with consistent
// values.
- AnimateBackground(background_type, BACKGROUND_CHANGE_IMMEDIATE);
+ AnimateBackground(background_type, gfx::ANIMATION_CHANGE_IMMEDIATE);
}
ShelfBackgroundAnimator::~ShelfBackgroundAnimator() {
@@ -39,7 +48,7 @@ ShelfBackgroundAnimator::~ShelfBackgroundAnimator() {
void ShelfBackgroundAnimator::AddObserver(
ShelfBackgroundAnimatorObserver* observer) {
observers_.AddObserver(observer);
- Initialize(observer);
+ NotifyObserver(observer);
}
void ShelfBackgroundAnimator::RemoveObserver(
@@ -47,140 +56,121 @@ void ShelfBackgroundAnimator::RemoveObserver(
observers_.RemoveObserver(observer);
}
-void ShelfBackgroundAnimator::Initialize(
- ShelfBackgroundAnimatorObserver* observer) const {
- observer->UpdateShelfOpaqueBackground(opaque_background_animator_->alpha());
- observer->UpdateShelfItemBackground(item_background_animator_->alpha());
+void ShelfBackgroundAnimator::NotifyObserver(
+ ShelfBackgroundAnimatorObserver* observer) {
+ observer->UpdateShelfBackground(shelf_background_values_.current_alpha());
+ observer->UpdateShelfItemBackground(item_background_values_.current_alpha());
}
void ShelfBackgroundAnimator::PaintBackground(
ShelfBackgroundType background_type,
- BackgroundAnimatorChangeType change_type) {
+ gfx::AnimationChangeType change_type) {
if (target_background_type_ == background_type &&
- change_type == BACKGROUND_CHANGE_ANIMATE) {
+ change_type == gfx::ANIMATION_CHANGE_ANIMATE) {
return;
}
AnimateBackground(background_type, change_type);
}
-void ShelfBackgroundAnimator::OnBackgroundTypeChanged(
- ShelfBackgroundType background_type,
- BackgroundAnimatorChangeType change_type) {
- PaintBackground(background_type, change_type);
+void ShelfBackgroundAnimator::AnimationProgressed(
+ const gfx::Animation* animation) {
+ shelf_background_values_.UpdateCurrentValues(animation->GetCurrentValue());
+ item_background_values_.UpdateCurrentValues(animation->GetCurrentValue());
+ NotifyObservers();
}
-void ShelfBackgroundAnimator::UpdateBackground(BackgroundAnimator* animator,
- int alpha) {
- OnAlphaChanged(animator, alpha);
+void ShelfBackgroundAnimator::AnimationEnded(const gfx::Animation* animation) {
+ shelf_background_values_.UpdateCurrentValues(animation->GetCurrentValue());
+ item_background_values_.UpdateCurrentValues(animation->GetCurrentValue());
+ NotifyObservers();
}
-void ShelfBackgroundAnimator::BackgroundAnimationEnded(
- BackgroundAnimator* animator) {
- ++successful_animator_count_;
- DCHECK_LE(successful_animator_count_, kNumAnimators);
- // UpdateBackground() is only called when alpha values change, this ensures
- // observers are always notified for every background change.
- OnAlphaChanged(animator, animator->alpha());
+void ShelfBackgroundAnimator::OnBackgroundTypeChanged(
+ ShelfBackgroundType background_type,
+ gfx::AnimationChangeType change_type) {
+ PaintBackground(background_type, change_type);
}
-void ShelfBackgroundAnimator::OnAlphaChanged(BackgroundAnimator* animator,
- int alpha) {
- if (animator == opaque_background_animator_.get()) {
- for (auto& observer : observers_)
- observer.UpdateShelfOpaqueBackground(alpha);
- } else if (animator == item_background_animator_.get()) {
- for (auto& observer : observers_)
- observer.UpdateShelfItemBackground(alpha);
- } else {
- NOTREACHED();
- }
+void ShelfBackgroundAnimator::NotifyObservers() {
+ for (auto& observer : observers_)
+ NotifyObserver(&observer);
}
void ShelfBackgroundAnimator::AnimateBackground(
ShelfBackgroundType background_type,
- BackgroundAnimatorChangeType change_type) {
- // Ensure BackgroundAnimationEnded() has been called for all the
- // BackgroundAnimators owned by this so that |successful_animator_count_|
- // is stable and doesn't get updated as a side effect of destroying/animating
- // the animators.
- StopAnimators();
-
- bool show_background = true;
- if (can_reuse_animators_ && previous_background_type_ == background_type) {
- DCHECK_EQ(opaque_background_animator_->paints_background(),
- item_background_animator_->paints_background());
-
- show_background = !opaque_background_animator_->paints_background();
+ gfx::AnimationChangeType change_type) {
+ const bool was_animating = animator_ && animator_->is_animating();
+ StopAnimator();
+
+ const bool change_immediately =
+ change_type == gfx::ANIMATION_CHANGE_IMMEDIATE;
+ if (can_reuse_animator_ && previous_background_type_ == background_type) {
+ if (animator_->IsShowing()) {
James Cook 2017/02/08 00:31:27 You're checking for null animator_ on line 103. Ca
bruthig 2017/02/10 18:49:09 Comment added, WDYT?
+ if (change_immediately)
+ animator_->HideImmediately();
+ else
+ animator_->Hide();
+ } else {
+ if (change_immediately)
+ animator_->ShowImmediately();
+ else
+ animator_->Show();
+ }
} else {
- CreateAnimators(background_type, change_type);
-
- // If all the previous animators completed successfully and the animation
- // was between 2 distinct states, then the last alpha values are valid
- // end state values.
- can_reuse_animators_ = target_background_type_ != background_type &&
- successful_animator_count_ == kNumAnimators;
+ // If the previous animator completed successfully and the animation was
+ // between 2 distinct states, then the last values are valid end state
+ // values.
+ can_reuse_animator_ =
+ target_background_type_ != background_type && !was_animating;
+
+ CreateAnimator(background_type);
+
+ if (change_immediately)
+ animator_->ShowImmediately();
+ else
+ animator_->Show();
}
- successful_animator_count_ = 0;
-
- opaque_background_animator_->SetPaintsBackground(show_background,
- change_type);
- item_background_animator_->SetPaintsBackground(show_background, change_type);
-
if (target_background_type_ != background_type) {
previous_background_type_ = target_background_type_;
target_background_type_ = background_type;
}
}
-void ShelfBackgroundAnimator::CreateAnimators(
- ShelfBackgroundType background_type,
- BackgroundAnimatorChangeType change_type) {
- const int opaque_background_alpha =
- opaque_background_animator_ ? opaque_background_animator_->alpha() : 0;
- const int item_background_alpha =
- item_background_animator_ ? item_background_animator_->alpha() : 0;
-
- const bool is_material = MaterialDesignController::IsShelfMaterial();
+void ShelfBackgroundAnimator::CreateAnimator(
+ ShelfBackgroundType background_type) {
int duration_ms = 0;
+ int target_shelf_background = 0;
+ int target_shelf_item_background = 0;
switch (background_type) {
case SHELF_BACKGROUND_DEFAULT:
- duration_ms = is_material ? 500 : 1000;
- opaque_background_animator_.reset(
- new BackgroundAnimator(this, opaque_background_alpha, 0));
- item_background_animator_.reset(
- new BackgroundAnimator(this, item_background_alpha,
- GetShelfConstant(SHELF_BACKGROUND_ALPHA)));
+ duration_ms = 500;
+ target_shelf_background = 0;
+ target_shelf_item_background = kShelfTranslucentAlpha;
break;
case SHELF_BACKGROUND_OVERLAP:
- duration_ms = is_material ? 500 : 1000;
- opaque_background_animator_.reset(new BackgroundAnimator(
- this, opaque_background_alpha,
- is_material ? GetShelfConstant(SHELF_BACKGROUND_ALPHA) : 0));
- item_background_animator_.reset(new BackgroundAnimator(
- this, item_background_alpha,
- is_material ? 0 : GetShelfConstant(SHELF_BACKGROUND_ALPHA)));
+ duration_ms = 500;
+ target_shelf_background = kShelfTranslucentAlpha;
+ target_shelf_item_background = 0;
break;
case SHELF_BACKGROUND_MAXIMIZED:
- duration_ms = is_material ? 250 : 1000;
- opaque_background_animator_.reset(
- new BackgroundAnimator(this, opaque_background_alpha, kMaxAlpha));
- item_background_animator_.reset(new BackgroundAnimator(
- this, item_background_alpha, is_material ? 0 : kMaxAlpha));
+ duration_ms = 250;
+ target_shelf_background = kMaxAlpha;
+ target_shelf_item_background = 0;
break;
}
- opaque_background_animator_->SetDuration(duration_ms);
- item_background_animator_->SetDuration(duration_ms);
+ animator_.reset(new gfx::SlideAnimation(this));
+ animator_->SetSlideDuration(duration_ms);
+ shelf_background_values_.SetTargetValues(target_shelf_background);
+ item_background_values_.SetTargetValues(target_shelf_item_background);
}
-void ShelfBackgroundAnimator::StopAnimators() {
- if (opaque_background_animator_)
- opaque_background_animator_->Stop();
- if (item_background_animator_)
- item_background_animator_->Stop();
+void ShelfBackgroundAnimator::StopAnimator() {
+ if (animator_)
+ animator_->Stop();
}
} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698