// 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 "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 {
// 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);
// 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);
DISALLOW_COPY_AND_ASSIGN(SessionStateAnimator);
};
} // namespace ash
#endif // ASH_WM_SESSION_STATE_ANIMATOR_H_