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