Index: cc/input/top_controls_manager.cc |
diff --git a/cc/input/top_controls_manager.cc b/cc/input/top_controls_manager.cc |
index 02a015246452ba5ecd83c30c4bfcb5e50540bd1b..1eaedc6a371b20950e528405c8074a7b378472d2 100644 |
--- a/cc/input/top_controls_manager.cc |
+++ b/cc/input/top_controls_manager.cc |
@@ -40,7 +40,7 @@ TopControlsManager::TopControlsManager(TopControlsManagerClient* client, |
float top_controls_hide_threshold) |
: client_(client), |
animation_direction_(NO_ANIMATION), |
- visibility_restriction_(NONE), |
+ permitted_state_(BOTH), |
controls_top_offset_(0.f), |
top_controls_height_(top_controls_height), |
current_scroll_delta_(0.f), |
@@ -55,31 +55,37 @@ TopControlsManager::TopControlsManager(TopControlsManagerClient* client, |
TopControlsManager::~TopControlsManager() { |
} |
-void TopControlsManager::UpdateTopControlsState(bool enable_hiding, |
- bool enable_showing, |
+void TopControlsManager::UpdateTopControlsState(TopControlsState constraints, |
+ TopControlsState current, |
bool animate) { |
- float final_controls_position = 0.f; |
+ DCHECK(!(constraints == SHOWN && current == HIDDEN)); |
+ DCHECK(!(constraints == HIDDEN && current == SHOWN)); |
- if (enable_hiding && enable_showing) { |
- visibility_restriction_ = NONE; |
- } else if (enable_showing || !enable_hiding) { |
- visibility_restriction_ = ALWAYS_SHOWN; |
- } else { |
- visibility_restriction_ = ALWAYS_HIDDEN; |
+ permitted_state_ = constraints; |
+ |
+ // Don't do anything if it doesn't matter which state the controls are in. |
+ if (constraints == BOTH && current == BOTH) |
+ return; |
+ |
+ // Don't do anything if there is no change in offset. |
+ float final_controls_position = 0.f; |
+ if (constraints == HIDDEN || current == HIDDEN) { |
final_controls_position = -top_controls_height_; |
} |
+ if (final_controls_position == controls_top_offset_) { |
+ return; |
+ } |
- if (visibility_restriction_ != NONE && |
- final_controls_position != controls_top_offset_) { |
- ResetAnimations(); |
- if (animate) { |
- SetupAnimation(visibility_restriction_ == ALWAYS_SHOWN ? |
- SHOWING_CONTROLS : HIDING_CONTROLS); |
- } else { |
- controls_top_offset_ = final_controls_position; |
- } |
- client_->DidChangeTopControlsPosition(); |
+ AnimationDirection animation_direction = SHOWING_CONTROLS; |
+ if (constraints == HIDDEN || current == HIDDEN) |
+ animation_direction = HIDING_CONTROLS; |
+ ResetAnimations(); |
+ if (animate) { |
+ SetupAnimation(animation_direction); |
+ } else { |
+ controls_top_offset_ = final_controls_position; |
} |
+ client_->DidChangeTopControlsPosition(); |
} |
void TopControlsManager::ScrollBegin() { |
@@ -90,9 +96,9 @@ void TopControlsManager::ScrollBegin() { |
gfx::Vector2dF TopControlsManager::ScrollBy( |
const gfx::Vector2dF pending_delta) { |
- if (visibility_restriction_ == ALWAYS_SHOWN && pending_delta.y() > 0) |
+ if (permitted_state_ == SHOWN && pending_delta.y() > 0) |
return pending_delta; |
- else if (visibility_restriction_ == ALWAYS_HIDDEN && pending_delta.y() < 0) |
+ else if (permitted_state_ == HIDDEN && pending_delta.y() < 0) |
return pending_delta; |
current_scroll_delta_ += pending_delta.y(); |
@@ -153,6 +159,19 @@ void TopControlsManager::ResetAnimations() { |
} |
void TopControlsManager::SetupAnimation(AnimationDirection direction) { |
+ DCHECK(direction != NO_ANIMATION); |
+ |
+ if (direction == SHOWING_CONTROLS && controls_top_offset_ == 0) |
+ return; |
+ |
+ if (direction == HIDING_CONTROLS && |
+ controls_top_offset_ == -top_controls_height_) { |
+ return; |
+ } |
+ |
+ if (top_controls_animation_ && animation_direction_ == direction) |
+ return; |
+ |
top_controls_animation_ = KeyframedFloatAnimationCurve::Create(); |
double start_time = |
(base::TimeTicks::Now() - base::TimeTicks()).InMillisecondsF(); |
@@ -166,6 +185,7 @@ void TopControlsManager::SetupAnimation(AnimationDirection direction) { |
controls_top_offset_ + max_ending_offset, |
EaseTimingFunction::Create())); |
animation_direction_ = direction; |
+ client_->DidChangeTopControlsPosition(); |
} |
void TopControlsManager::StartAnimationIfNecessary() { |
@@ -187,11 +207,8 @@ void TopControlsManager::StartAnimationIfNecessary() { |
SHOWING_CONTROLS : HIDING_CONTROLS; |
} |
- if (show_controls != NO_ANIMATION && |
- (!top_controls_animation_ || animation_direction_ != show_controls)) { |
+ if (show_controls != NO_ANIMATION) |
SetupAnimation(show_controls); |
- client_->DidChangeTopControlsPosition(); |
- } |
} |
} |