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

Unified Diff: ash/rotator/screen_rotation_animator.cc

Issue 2786563003: Add a NOT_DRAWN window in between the root_window and its children. (Closed)
Patch Set: Rebased to origin/master. Created 3 years, 8 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
« no previous file with comments | « ash/root_window_controller.cc ('k') | ash/wm/root_window_layout_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/rotator/screen_rotation_animator.cc
diff --git a/ash/rotator/screen_rotation_animator.cc b/ash/rotator/screen_rotation_animator.cc
index 279238d9e04c036375d505f63429e1c01691689f..f1c51a4c70edb8a1783d996859033570c3e60f9e 100644
--- a/ash/rotator/screen_rotation_animator.cc
+++ b/ash/rotator/screen_rotation_animator.cc
@@ -10,6 +10,7 @@
#include "ash/ash_switches.h"
#include "ash/display/window_tree_host_manager.h"
+#include "ash/public/cpp/shell_window_ids.h"
#include "ash/rotator/screen_rotation_animation.h"
#include "ash/rotator/screen_rotation_animator_observer.h"
#include "ash/shell.h"
@@ -52,14 +53,6 @@ const int kRotationDurationInMs = 250;
const int kCounterClockWiseRotationFactor = 1;
const int kClockWiseRotationFactor = -1;
-// Aborts the active animations of the layer, and recurses upon its child
-// layers.
-void AbortAnimations(ui::Layer* layer) {
- for (ui::Layer* child_layer : layer->children())
- AbortAnimations(child_layer);
- layer->GetAnimator()->AbortAllAnimations();
-}
-
display::Display::Rotation GetCurrentScreenRotation(int64_t display_id) {
return Shell::Get()
->display_manager()
@@ -317,31 +310,25 @@ void ScreenRotationAnimator::AnimateRotation(
const gfx::Point pivot = gfx::Point(rotated_screen_bounds.width() / 2,
rotated_screen_bounds.height() / 2);
- // We must animate each non-cloned child layer individually because the cloned
- // layer was added as a child to |root_window|'s layer so that it will be
- // rendered.
- // TODO(bruthig): Add a NOT_DRAWN layer in between the root_window's layer and
- // its current children so that we only need to initiate two
- // LayerAnimationSequences. One for the new layers and one for the old layer.
- for (ui::Layer* child_layer : root_window->layer()->children()) {
- // Skip the cloned layer because it has a different animation.
- if (child_layer == old_root_layer)
- continue;
-
- std::unique_ptr<ScreenRotationAnimation> screen_rotation =
- base::MakeUnique<ScreenRotationAnimation>(
- child_layer, kRotationDegrees * rotation_factor,
- 0 /* end_degrees */, child_layer->opacity(),
- 1.0f /* target_opacity */, pivot, duration, tween_type);
-
- ui::LayerAnimator* animator = child_layer->GetAnimator();
- animator->set_preemption_strategy(
- ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
- std::unique_ptr<ui::LayerAnimationSequence> animation_sequence =
- base::MakeUnique<ui::LayerAnimationSequence>(
- std::move(screen_rotation));
- animator->StartAnimation(animation_sequence.release());
- }
+ ui::Layer* screen_rotation_container_layer =
+ root_window->GetChildById(kShellWindowId_ScreenRotationContainer)
+ ->layer();
+ std::unique_ptr<ScreenRotationAnimation> current_layer_screen_rotation =
+ base::MakeUnique<ScreenRotationAnimation>(
+ screen_rotation_container_layer, kRotationDegrees * rotation_factor,
+ 0 /* end_degrees */, screen_rotation_container_layer->opacity(),
+ screen_rotation_container_layer->opacity() /* target_opacity */,
+ pivot, duration, tween_type);
+
+ ui::LayerAnimator* current_layer_animator =
+ screen_rotation_container_layer->GetAnimator();
+ current_layer_animator->set_preemption_strategy(
+ ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
+ std::unique_ptr<ui::LayerAnimationSequence> current_layer_animation_sequence =
+ base::MakeUnique<ui::LayerAnimationSequence>(
+ std::move(current_layer_screen_rotation));
+ current_layer_animator->StartAnimation(
+ current_layer_animation_sequence.release());
// The old layer will also be transformed into the new orientation. We will
// translate it so that the old layer's center point aligns with the new
@@ -353,7 +340,7 @@ void ScreenRotationAnimator::AnimateRotation(
(rotated_screen_bounds.height() - original_screen_bounds.height()) / 2);
old_root_layer->SetTransform(translate_transform);
- std::unique_ptr<ScreenRotationAnimation> screen_rotation =
+ std::unique_ptr<ScreenRotationAnimation> old_layer_screen_rotation =
base::MakeUnique<ScreenRotationAnimation>(
old_root_layer, old_layer_initial_rotation_degrees * rotation_factor,
(old_layer_initial_rotation_degrees - kRotationDegrees) *
@@ -361,20 +348,25 @@ void ScreenRotationAnimator::AnimateRotation(
old_root_layer->opacity(), 0.0f /* target_opacity */, pivot, duration,
tween_type);
- ui::LayerAnimator* animator = old_root_layer->GetAnimator();
- animator->set_preemption_strategy(
+ ui::LayerAnimator* old_layer_animator = old_root_layer->GetAnimator();
+ old_layer_animator->set_preemption_strategy(
ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS);
- std::unique_ptr<ui::LayerAnimationSequence> animation_sequence =
- base::MakeUnique<ui::LayerAnimationSequence>(std::move(screen_rotation));
+ std::unique_ptr<ui::LayerAnimationSequence> old_layer_animation_sequence =
+ base::MakeUnique<ui::LayerAnimationSequence>(
+ std::move(old_layer_screen_rotation));
// Add an observer so that the cloned layers can be cleaned up with the
// animation completes/aborts.
- animation_sequence->AddObserver(old_layer_cleanup_observer.release());
+ old_layer_animation_sequence->AddObserver(
+ old_layer_cleanup_observer.release());
// In unit test, we can use ash::test::ScreenRotationAnimatorTestApi to
// control the animation.
if (disable_animation_timers_for_test_)
- animator->set_disable_timer_for_test(true);
- animation_sequence->SetAnimationMetricsReporter(metrics_reporter_.get());
- animator->StartAnimation(animation_sequence.release());
+ old_layer_animator->set_disable_timer_for_test(true);
+ old_layer_animation_sequence->SetAnimationMetricsReporter(
+ metrics_reporter_.get());
+ old_layer_animator->StartAnimation(old_layer_animation_sequence.release());
+
+ rotation_request.reset();
}
void ScreenRotationAnimator::Rotate(display::Display::Rotation new_rotation,
@@ -434,15 +426,13 @@ void ScreenRotationAnimator::set_disable_animation_timers_for_test(
}
void ScreenRotationAnimator::StopAnimating() {
- aura::Window* root_window = GetRootWindow(display_id_);
- for (ui::Layer* child_layer : root_window->layer()->children()) {
- if (child_layer == old_layer_tree_owner_->root())
- continue;
-
- child_layer->GetAnimator()->StopAnimating();
- }
-
- old_layer_tree_owner_->root()->GetAnimator()->StopAnimating();
+ GetRootWindow(display_id_)
+ ->GetChildById(kShellWindowId_ScreenRotationContainer)
+ ->layer()
+ ->GetAnimator()
+ ->StopAnimating();
+ if (old_layer_tree_owner_)
+ old_layer_tree_owner_->root()->GetAnimator()->StopAnimating();
}
} // namespace ash
« no previous file with comments | « ash/root_window_controller.cc ('k') | ash/wm/root_window_layout_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698