| Index: ash/rotator/screen_rotation_animator.cc
|
| diff --git a/ash/rotator/screen_rotation_animator.cc b/ash/rotator/screen_rotation_animator.cc
|
| index c0dbe2058d6f7a4c33314ed1f07650cde2446195..102b8d0e7b3082f7ff25656d2f1243ecad206e22 100644
|
| --- a/ash/rotator/screen_rotation_animator.cc
|
| +++ b/ash/rotator/screen_rotation_animator.cc
|
| @@ -14,9 +14,11 @@
|
| #include "ash/shell.h"
|
| #include "base/command_line.h"
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| #include "base/time/time.h"
|
| #include "ui/aura/window.h"
|
| #include "ui/compositor/layer.h"
|
| +#include "ui/compositor/layer_animation_element.h"
|
| #include "ui/compositor/layer_animation_observer.h"
|
| #include "ui/compositor/layer_animation_sequence.h"
|
| #include "ui/compositor/layer_animator.h"
|
| @@ -143,7 +145,7 @@ LayerCleanupObserver::~LayerCleanupObserver() {
|
| void LayerCleanupObserver::OnLayerAnimationEnded(
|
| ui::LayerAnimationSequence* sequence) {
|
| if (animator_)
|
| - animator_->OnLayerAnimationEnded();
|
| + animator_->ProcessAnimationQueue();
|
|
|
| delete this;
|
| }
|
| @@ -151,7 +153,7 @@ void LayerCleanupObserver::OnLayerAnimationEnded(
|
| void LayerCleanupObserver::OnLayerAnimationAborted(
|
| ui::LayerAnimationSequence* sequence) {
|
| if (animator_)
|
| - animator_->OnLayerAnimationAborted();
|
| + animator_->ProcessAnimationQueue();
|
|
|
| delete this;
|
| }
|
| @@ -167,6 +169,20 @@ void LayerCleanupObserver::OnDetachedFromSequence(
|
| sequence_ = nullptr;
|
| }
|
|
|
| +class ScreenRotationAnimationMetricsReporter
|
| + : public ui::AnimationMetricsReporter {
|
| + public:
|
| + ScreenRotationAnimationMetricsReporter() {}
|
| + ~ScreenRotationAnimationMetricsReporter() override {}
|
| +
|
| + void Report(int value) override {
|
| + UMA_HISTOGRAM_PERCENTAGE("Ash.Rotation.AnimationSmoothness", value);
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ScreenRotationAnimationMetricsReporter);
|
| +};
|
| +
|
| } // namespace
|
|
|
| struct ScreenRotationAnimator::ScreenRotationRequest {
|
| @@ -180,10 +196,22 @@ struct ScreenRotationAnimator::ScreenRotationRequest {
|
| ScreenRotationAnimator::ScreenRotationAnimator(int64_t display_id)
|
| : display_id_(display_id),
|
| is_rotating_(false),
|
| + metrics_reporter_(
|
| + base::MakeUnique<ScreenRotationAnimationMetricsReporter>()),
|
| disable_animation_timers_for_test_(false),
|
| weak_factory_(this) {}
|
|
|
| -ScreenRotationAnimator::~ScreenRotationAnimator() {}
|
| +ScreenRotationAnimator::~ScreenRotationAnimator() {
|
| + // To prevent a call to |LayerCleanupObserver::OnLayerAnimationAborted()| from
|
| + // calling a method on the |animator_|.
|
| + weak_factory_.InvalidateWeakPtrs();
|
| +
|
| + // Explicitly reset the |old_layer_tree_owner_| and |metrics_reporter_| in
|
| + // order to make sure |metrics_reporter_| outlives the attached animation
|
| + // sequence.
|
| + old_layer_tree_owner_.reset();
|
| + metrics_reporter_.reset();
|
| +}
|
|
|
| void ScreenRotationAnimator::AnimateRotation(
|
| std::unique_ptr<ScreenRotationRequest> rotation_request) {
|
| @@ -278,6 +306,7 @@ void ScreenRotationAnimator::AnimateRotation(
|
| // 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());
|
|
|
| rotation_request.reset();
|
| @@ -313,15 +342,6 @@ void ScreenRotationAnimator::RemoveScreenRotationAnimatorObserver(
|
| screen_rotation_animator_observers_.RemoveObserver(observer);
|
| }
|
|
|
| -void ScreenRotationAnimator::OnLayerAnimationEnded() {
|
| - ProcessAnimationQueue();
|
| -}
|
| -
|
| -void ScreenRotationAnimator::OnLayerAnimationAborted() {
|
| - AbortAnimations(old_layer_tree_owner_->root());
|
| - ProcessAnimationQueue();
|
| -}
|
| -
|
| void ScreenRotationAnimator::ProcessAnimationQueue() {
|
| is_rotating_ = false;
|
| old_layer_tree_owner_.reset();
|
|
|