summaryrefslogtreecommitdiff
path: root/chromium/ash/wm/session_state_animator.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/wm/session_state_animator.h')
-rw-r--r--chromium/ash/wm/session_state_animator.h191
1 files changed, 191 insertions, 0 deletions
diff --git a/chromium/ash/wm/session_state_animator.h b/chromium/ash/wm/session_state_animator.h
new file mode 100644
index 00000000000..19ead2f26cb
--- /dev/null
+++ b/chromium/ash/wm/session_state_animator.h
@@ -0,0 +1,191 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_WM_SESSION_STATE_ANIMATOR_H_
+#define ASH_WM_SESSION_STATE_ANIMATOR_H_
+
+#include "ash/ash_export.h"
+#include "ash/wm/workspace/colored_window_controller.h"
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/timer/timer.h"
+#include "ui/aura/window.h"
+#include "ui/compositor/layer_animation_observer.h"
+
+namespace gfx {
+class Rect;
+class Size;
+}
+
+namespace ui {
+class Layer;
+}
+
+namespace ash {
+namespace internal {
+
+// Displays onscreen animations for session state changes (lock/unlock, sign
+// out, shut down).
+class ASH_EXPORT SessionStateAnimator {
+ public:
+ // Animations that can be applied to groups of containers.
+ enum AnimationType {
+ ANIMATION_PARTIAL_CLOSE = 0,
+ ANIMATION_UNDO_PARTIAL_CLOSE,
+ ANIMATION_FULL_CLOSE,
+ ANIMATION_FADE_IN,
+ ANIMATION_FADE_OUT,
+ ANIMATION_HIDE_IMMEDIATELY,
+ ANIMATION_RESTORE,
+ // Animations that raise/lower windows to/from area "in front" of the
+ // screen.
+ ANIMATION_LIFT,
+ ANIMATION_UNDO_LIFT,
+ ANIMATION_DROP,
+ // Animations that raise/lower windows from/to area "behind" of the screen.
+ ANIMATION_RAISE_TO_SCREEN,
+ ANIMATION_LOWER_BELOW_SCREEN,
+ ANIMATION_PARTIAL_FADE_IN,
+ ANIMATION_UNDO_PARTIAL_FADE_IN,
+ ANIMATION_FULL_FADE_IN,
+ ANIMATION_GRAYSCALE_BRIGHTNESS,
+ ANIMATION_UNDO_GRAYSCALE_BRIGHTNESS,
+ };
+
+ // Constants for determining animation speed.
+ enum AnimationSpeed {
+ // Immediately change state.
+ ANIMATION_SPEED_IMMEDIATE = 0,
+ // Speed for animations associated with user action that can be undone.
+ // Used for pre-lock and pre-shutdown animations.
+ ANIMATION_SPEED_UNDOABLE,
+ // Speed for animation that reverts undoable action. Used for aborting
+ // pre-lock and pre-shutdown animations.
+ ANIMATION_SPEED_REVERT,
+ // Speed for user action that can not be undone, Used for lock and shutdown
+ // animations requested via menus/shortcuts and for animating remaining
+ // parts of partial lock/shutdown animations.
+ ANIMATION_SPEED_FAST,
+ // Speed for lock screen appearance in "old" animation set.
+ ANIMATION_SPEED_SHOW_LOCK_SCREEN,
+ // Speed for workspace-like animations in "new" animation set.
+ ANIMATION_SPEED_MOVE_WINDOWS,
+ // Speed for undoing workspace-like animations in "new" animation set.
+ ANIMATION_SPEED_UNDO_MOVE_WINDOWS,
+ // Speed for shutdown in "new" animation set.
+ ANIMATION_SPEED_SHUTDOWN,
+ // Speed for reverting shutdown in "new" animation set.
+ ANIMATION_SPEED_REVERT_SHUTDOWN,
+ };
+
+ // Specific containers or groups of containers that can be animated.
+ enum Container {
+ DESKTOP_BACKGROUND = 1 << 0,
+ LAUNCHER = 1 << 1,
+
+ // All user session related containers including system background but
+ // not including desktop background (wallpaper).
+ NON_LOCK_SCREEN_CONTAINERS = 1 << 2,
+
+ // Desktop wallpaper is moved to this layer when screen is locked.
+ // This layer is excluded from lock animation so that wallpaper stays as is,
+ // user session windows are hidden and lock UI is shown on top of it.
+ // This layer is included in shutdown animation.
+ LOCK_SCREEN_BACKGROUND = 1 << 3,
+
+ // Lock screen and lock screen modal containers.
+ LOCK_SCREEN_CONTAINERS = 1 << 4,
+
+ // Multiple system layers belong here like status, menu, tooltip
+ // and overlay layers.
+ LOCK_SCREEN_RELATED_CONTAINERS = 1 << 5,
+ };
+
+ // Helper class used by tests to access internal state.
+ class ASH_EXPORT TestApi {
+ public:
+ explicit TestApi(SessionStateAnimator* animator)
+ : animator_(animator) {}
+
+ // Returns true if containers of a given |container_mask|
+ // were last animated with |type| (probably; the analysis is fairly ad-hoc).
+ // |container_mask| is a bitfield of a Container.
+ bool ContainersAreAnimated(int container_mask, AnimationType type) const;
+
+ // Returns true if root window was last animated with |type| (probably;
+ // the analysis is fairly ad-hoc).
+ bool RootWindowIsAnimated(AnimationType type) const;
+
+ private:
+ SessionStateAnimator* animator_; // not owned
+
+ DISALLOW_COPY_AND_ASSIGN(TestApi);
+ };
+
+ // A bitfield mask including LOCK_SCREEN_WALLPAPER,
+ // LOCK_SCREEN_CONTAINERS, and LOCK_SCREEN_RELATED_CONTAINERS.
+ const static int kAllLockScreenContainersMask;
+
+ // A bitfield mask of all containers.
+ const static int kAllContainersMask;
+
+ SessionStateAnimator();
+ virtual ~SessionStateAnimator();
+
+ // Reports animation duration for |speed|.
+ static base::TimeDelta GetDuration(AnimationSpeed speed);
+
+ // Fills |containers| with the containers included in |container_mask|.
+ static void GetContainers(int container_mask,
+ aura::Window::Windows* containers);
+
+ // Create |foreground_| layer if it doesn't already exist, but makes it
+ // completely transparent.
+ void CreateForeground();
+ // Destroy |foreground_| when it is not needed anymore.
+ void DropForeground();
+
+ // Apply animation |type| to all containers included in |container_mask| with
+ // specified |speed|.
+ void StartAnimation(int container_mask,
+ AnimationType type,
+ AnimationSpeed speed);
+
+ // Apply animation |type| to all containers included in |container_mask| with
+ // specified |speed| and call a |callback| at the end of the animation, if it
+ // is not null.
+ void StartAnimationWithCallback(int container_mask,
+ AnimationType type,
+ AnimationSpeed speed,
+ base::Callback<void(void)>& callback);
+
+// Apply animation |type| to all containers included in |container_mask| with
+// specified |speed| and add |observer| to all animations.
+ void StartAnimationWithObserver(int container_mask,
+ AnimationType type,
+ AnimationSpeed speed,
+ ui::LayerAnimationObserver* observer);
+
+ // Applies animation |type| whith specified |speed| to the root container.
+ void StartGlobalAnimation(AnimationType type,
+ AnimationSpeed speed);
+
+ // Apply animation |type| to window |window| with |speed| and add |observer|
+ // if it is not NULL to the last animation sequence.
+ void RunAnimationForWindow(aura::Window* window,
+ AnimationType type,
+ AnimationSpeed speed,
+ ui::LayerAnimationObserver* observer);
+
+ // White foreground that is used during shutdown animation to "fade
+ // everything into white".
+ scoped_ptr<ColoredWindowController> foreground_;
+
+ DISALLOW_COPY_AND_ASSIGN(SessionStateAnimator);
+};
+
+} // namespace internal
+} // namespace ash
+
+#endif // ASH_WM_SESSION_STATE_ANIMATOR_H_