15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/desktop_background/desktop_background_widget_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_export.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/desktop_background/user_wallpaper_delegate.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/root_window_controller.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shell.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/layer_animation_observer.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/scoped_layer_animation_settings.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/views/widget/widget_observer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ShowWallpaperAnimationObserver : public ui::ImplicitAnimationObserver, 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public views::WidgetObserver { 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShowWallpaperAnimationObserver(RootWindowController* root_window_controller, 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch views::Widget* desktop_widget, 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool is_initial_animation) 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : root_window_controller_(root_window_controller), 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch desktop_widget_(desktop_widget), 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_initial_animation_(is_initial_animation) { 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(desktop_widget_); 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch desktop_widget_->AddObserver(this); 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~ShowWallpaperAnimationObserver() { 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StopObservingImplicitAnimations(); 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (desktop_widget_) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch desktop_widget_->RemoveObserver(this); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Overridden from ui::ImplicitAnimationObserver: 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnImplicitAnimationsScheduled() OVERRIDE { 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (is_initial_animation_) { 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_window_controller_-> 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HandleInitialDesktopBackgroundAnimationStarted(); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnImplicitAnimationsCompleted() OVERRIDE { 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_window_controller_->OnWallpaperAnimationFinished(desktop_widget_); 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delete this; 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Overridden from views::WidgetObserver. 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE { 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delete this; 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RootWindowController* root_window_controller_; 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch views::Widget* desktop_widget_; 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Is this object observing the initial brightness/grayscale animation? 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const bool is_initial_animation_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(ShowWallpaperAnimationObserver); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopBackgroundWidgetController::DesktopBackgroundWidgetController( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* widget) : widget_(widget) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(widget_); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->AddObserver(this); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopBackgroundWidgetController::~DesktopBackgroundWidgetController() { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->RemoveObserver(this); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->CloseNow(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_ = NULL; 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopBackgroundWidgetController::OnWidgetDestroying( 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget* widget) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->RemoveObserver(this); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_ = NULL; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DesktopBackgroundWidgetController::SetBounds(gfx::Rect bounds) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->SetBounds(bounds); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool DesktopBackgroundWidgetController::Reparent(aura::Window* root_window, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int src_container, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dest_container) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::ReparentNativeView(widget_->GetNativeView(), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_window->GetChildById(dest_container)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing to reparent. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid DesktopBackgroundWidgetController::StartAnimating( 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RootWindowController* root_window_controller) { 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (widget_) { 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::ScopedLayerAnimationSettings settings( 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch widget_->GetNativeView()->layer()->GetAnimator()); 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings.AddObserver(new ShowWallpaperAnimationObserver( 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_window_controller, widget_, 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Shell::GetInstance()->user_wallpaper_delegate()-> 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShouldShowInitialAnimation())); 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // When |widget_| shows, AnimateShowWindowCommon() is called to do the 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // animation. Sets transition duration to 0 to avoid animating to the 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // show animation's initial values. 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) settings.SetTransitionDuration(base::TimeDelta()); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch widget_->Show(); 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch widget_->GetNativeView()->SetName("DesktopBackgroundView"); 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AnimatingDesktopController::AnimatingDesktopController( 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DesktopBackgroundWidgetController* component) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_.reset(component); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AnimatingDesktopController::~AnimatingDesktopController() { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AnimatingDesktopController::StopAnimating() { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (controller_) { 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::Layer* layer = controller_->widget()->GetNativeView()->layer(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layer->GetAnimator()->StopAnimating(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopBackgroundWidgetController* AnimatingDesktopController::GetController( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pass_ownership) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pass_ownership) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.release(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller_.get(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 147