| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/desktop_background/desktop_background_widget_controller.h" |
| |
| #include "ash/ash_export.h" |
| #include "ash/desktop_background/user_wallpaper_delegate.h" |
| #include "ash/root_window_controller.h" |
| #include "ash/shell.h" |
| #include "ui/aura/window_event_dispatcher.h" |
| #include "ui/compositor/layer_animation_observer.h" |
| #include "ui/compositor/scoped_layer_animation_settings.h" |
| #include "ui/views/widget/widget.h" |
| #include "ui/views/widget/widget_observer.h" |
| |
| namespace ash { |
| namespace { |
| |
| class ShowWallpaperAnimationObserver : public ui::ImplicitAnimationObserver, |
| public views::WidgetObserver { |
| public: |
| ShowWallpaperAnimationObserver(RootWindowController* root_window_controller, |
| views::Widget* desktop_widget, |
| bool is_initial_animation) |
| : root_window_controller_(root_window_controller), |
| desktop_widget_(desktop_widget), |
| is_initial_animation_(is_initial_animation) { |
| DCHECK(desktop_widget_); |
| desktop_widget_->AddObserver(this); |
| } |
| |
| ~ShowWallpaperAnimationObserver() override { |
| StopObservingImplicitAnimations(); |
| if (desktop_widget_) |
| desktop_widget_->RemoveObserver(this); |
| } |
| |
| private: |
| // Overridden from ui::ImplicitAnimationObserver: |
| void OnImplicitAnimationsScheduled() override { |
| if (is_initial_animation_) { |
| root_window_controller_-> |
| HandleInitialDesktopBackgroundAnimationStarted(); |
| } |
| } |
| |
| void OnImplicitAnimationsCompleted() override { |
| root_window_controller_->OnWallpaperAnimationFinished(desktop_widget_); |
| delete this; |
| } |
| |
| // Overridden from views::WidgetObserver. |
| void OnWidgetDestroying(views::Widget* widget) override { delete this; } |
| |
| RootWindowController* root_window_controller_; |
| views::Widget* desktop_widget_; |
| |
| // Is this object observing the initial brightness/grayscale animation? |
| const bool is_initial_animation_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ShowWallpaperAnimationObserver); |
| }; |
| |
| } // namespace |
| |
| DesktopBackgroundWidgetController::DesktopBackgroundWidgetController( |
| views::Widget* widget) : widget_(widget) { |
| DCHECK(widget_); |
| widget_->AddObserver(this); |
| } |
| |
| DesktopBackgroundWidgetController::~DesktopBackgroundWidgetController() { |
| if (widget_) { |
| widget_->RemoveObserver(this); |
| widget_->CloseNow(); |
| widget_ = NULL; |
| } |
| } |
| |
| void DesktopBackgroundWidgetController::OnWidgetDestroying( |
| views::Widget* widget) { |
| widget_->RemoveObserver(this); |
| widget_ = NULL; |
| } |
| |
| void DesktopBackgroundWidgetController::SetBounds(gfx::Rect bounds) { |
| if (widget_) |
| widget_->SetBounds(bounds); |
| } |
| |
| bool DesktopBackgroundWidgetController::Reparent(aura::Window* root_window, |
| int src_container, |
| int dest_container) { |
| if (widget_) { |
| views::Widget::ReparentNativeView(widget_->GetNativeView(), |
| root_window->GetChildById(dest_container)); |
| return true; |
| } |
| // Nothing to reparent. |
| return false; |
| } |
| |
| void DesktopBackgroundWidgetController::StartAnimating( |
| RootWindowController* root_window_controller) { |
| if (widget_) { |
| ui::ScopedLayerAnimationSettings settings( |
| widget_->GetNativeView()->layer()->GetAnimator()); |
| settings.AddObserver(new ShowWallpaperAnimationObserver( |
| root_window_controller, widget_, |
| Shell::GetInstance()->user_wallpaper_delegate()-> |
| ShouldShowInitialAnimation())); |
| // When |widget_| shows, AnimateShowWindowCommon() is called to do the |
| // animation. Sets transition duration to 0 to avoid animating to the |
| // show animation's initial values. |
| settings.SetTransitionDuration(base::TimeDelta()); |
| widget_->Show(); |
| widget_->GetNativeView()->SetName("DesktopBackgroundView"); |
| } |
| } |
| |
| AnimatingDesktopController::AnimatingDesktopController( |
| DesktopBackgroundWidgetController* component) { |
| controller_.reset(component); |
| } |
| |
| AnimatingDesktopController::~AnimatingDesktopController() { |
| } |
| |
| void AnimatingDesktopController::StopAnimating() { |
| if (controller_) { |
| ui::Layer* layer = controller_->widget()->GetNativeView()->layer(); |
| layer->GetAnimator()->StopAnimating(); |
| } |
| } |
| |
| DesktopBackgroundWidgetController* AnimatingDesktopController::GetController( |
| bool pass_ownership) { |
| if (pass_ownership) |
| return controller_.release(); |
| return controller_.get(); |
| } |
| |
| } // namespace ash |