1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef CHROME_BROWSER_UI_ASH_MULTI_USER_USER_SWITCH_ANIMATOR_CHROMEOS_H_ 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define CHROME_BROWSER_UI_ASH_MULTI_USER_USER_SWITCH_ANIMATOR_CHROMEOS_H_ 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <string> 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/scoped_ptr.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/timer/timer.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace aura { 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass Window; 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace aura 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace chrome { 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MultiUserWindowManagerChromeOS; 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// A class which performs transitions animations between users. Upon creation, 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// the animation gets started and upon destruction the animation gets finished 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// if not done yet. 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Specifying |animation_disabled| upon creation will perform the transition 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// without visible animations. 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass UserSwichAnimatorChromeOS { 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The animation step for the user change animation. 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enum AnimationStep { 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ANIMATION_STEP_HIDE_OLD_USER, // Hiding the old user (and shelf). 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ANIMATION_STEP_SHOW_NEW_USER, // Show the shelf of the new user. 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ANIMATION_STEP_FINALIZE, // All animations are done - final cleanup. 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ANIMATION_STEP_ENDED // The animation has ended. 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UserSwichAnimatorChromeOS(MultiUserWindowManagerChromeOS* owner, 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& new_user_id, 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int animation_speed_ms); 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ~UserSwichAnimatorChromeOS(); 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Check if a window is covering the entire work area of the screen it is on. 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static bool CoversScreen(aura::Window* window); 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool IsAnimationFinished() { 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return animation_step_ == ANIMATION_STEP_ENDED; 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns the user id for which the wallpaper is currently shown. 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If a wallpaper is transitioning to B it will be returned as "->B". 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& wallpaper_user_id_for_test() { return wallpaper_user_id_; } 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Advances the user switch animation to the next step. It reads the current 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // step from |animation_step_| and increments it thereafter. When 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // |ANIMATION_STEP_FINALIZE| gets executed, the animation is finished and the 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // timer (if one exists) will get destroyed. 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void AdvanceUserTransitionAnimation(); 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // When the system is shutting down, the animation can be stopped without 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ending it. 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void CancelAnimation(); 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The window configuration of screen covering windows before an animation. 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enum TransitioningScreenCover { 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NO_USER_COVERS_SCREEN, // No window covers the entire screen. 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OLD_USER_COVERS_SCREEN, // The current user has at least one window 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // covering the entire screen. 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NEW_USER_COVERS_SCREEN, // The user which becomes active has at least one 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // window covering the entire screen. 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch BOTH_USERS_COVER_SCREEN // Both users have at least one window each 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // covering the entire screen. 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Finalizes the animation and ends the timer (if there is one). 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void FinalizeAnimation(); 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Execute the user wallpaper animations for |animation_step|. 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void TransitionWallpaper(AnimationStep animtion_step); 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Execute the user shelf animations for |animation_step|. 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void TransitionUserShelf(AnimationStep animtion_step); 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Execute the window animations for |animation_step|. 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void TransitionWindows(AnimationStep animation_step); 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Check if a window is maximized / fullscreen / covering the entire screen. 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // If a |root_window| is given, the screen coverage of that root_window is 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // tested, otherwise all screens. 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TransitioningScreenCover GetScreenCover(aura::Window* root_window); 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The owning window manager. 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MultiUserWindowManagerChromeOS* owner_; 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The new user to set. 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string new_user_id_; 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The animation speed in ms. If 0, animations are disabled. 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int animation_speed_ms_; 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The next animation step for AdvanceUserTransitionAnimation(). 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AnimationStep animation_step_; 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The screen cover status before the animation has started. 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TransitioningScreenCover screen_cover_; 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // A timer which watches to executes the second part of a "user changed" 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // animation. Note that this timer exists only during such an animation. 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<base::Timer> user_changed_animation_timer_; 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // For unit tests: Check which wallpaper was set. 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string wallpaper_user_id_; 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DISALLOW_COPY_AND_ASSIGN(UserSwichAnimatorChromeOS); 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace chrome 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif // CHROME_BROWSER_UI_ASH_MULTI_USER_USER_SWITCH_ANIMATOR_CHROMEOS_H_ 119