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
13namespace aura {
14class Window;
15}  // namespace aura
16
17namespace chrome {
18
19class 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.
26class 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