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