| Index: ash/wm/power_button_controller.h
|
| diff --git a/ash/wm/power_button_controller.h b/ash/wm/power_button_controller.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..98ba1f81bad61ac32e02936e813bcb50bee7ccf3
|
| --- /dev/null
|
| +++ b/ash/wm/power_button_controller.h
|
| @@ -0,0 +1,224 @@
|
| +// 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_POWER_BUTTON_CONTROLLER_H_
|
| +#define ASH_WM_POWER_BUTTON_CONTROLLER_H_
|
| +#pragma once
|
| +
|
| +#include "ash/ash_export.h"
|
| +#include "base/basictypes.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/time.h"
|
| +#include "base/timer.h"
|
| +#include "ui/aura/root_window_observer.h"
|
| +
|
| +namespace gfx {
|
| +class Size;
|
| +}
|
| +
|
| +namespace ui {
|
| +class Layer;
|
| +class LayerDelegate;
|
| +}
|
| +
|
| +namespace ash {
|
| +
|
| +// Performs system-related functions on behalf of PowerButtonController.
|
| +class ASH_EXPORT PowerButtonControllerDelegate {
|
| + public:
|
| + PowerButtonControllerDelegate() {}
|
| + virtual ~PowerButtonControllerDelegate() {}
|
| +
|
| + virtual void RequestLockScreen() = 0;
|
| + virtual void RequestShutdown() = 0;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(PowerButtonControllerDelegate);
|
| +};
|
| +
|
| +// Displays onscreen animations and locks or suspends the system in response to
|
| +// the power button being pressed or released.
|
| +class ASH_EXPORT PowerButtonController : public aura::RootWindowObserver {
|
| + public:
|
| + // Animations that can be applied to groups of containers.
|
| + // Exposed here for TestApi::ContainerGroupIsAnimated().
|
| + enum AnimationType {
|
| + ANIMATION_SLOW_CLOSE = 0,
|
| + ANIMATION_UNDO_SLOW_CLOSE,
|
| + ANIMATION_FAST_CLOSE,
|
| + ANIMATION_FADE_IN,
|
| + ANIMATION_HIDE,
|
| + ANIMATION_RESTORE,
|
| + };
|
| +
|
| + // Groups of containers that can be animated.
|
| + // Exposed here for TestApi::ContainerGroupIsAnimated().
|
| + enum ContainerGroup {
|
| + ALL_CONTAINERS = 0,
|
| + SCREEN_LOCKER_CONTAINERS,
|
| + SCREEN_LOCKER_AND_RELATED_CONTAINERS,
|
| + ALL_BUT_SCREEN_LOCKER_AND_RELATED_CONTAINERS,
|
| + };
|
| +
|
| + // Helper class used by tests to access internal state.
|
| + class TestApi {
|
| + public:
|
| + TestApi(PowerButtonController* controller) : controller_(controller) {}
|
| +
|
| + bool lock_timer_is_running() const {
|
| + return controller_->lock_timer_.IsRunning();
|
| + }
|
| + bool lock_fail_timer_is_running() const {
|
| + return controller_->lock_fail_timer_.IsRunning();
|
| + }
|
| + bool lock_to_shutdown_timer_is_running() const {
|
| + return controller_->lock_to_shutdown_timer_.IsRunning();
|
| + }
|
| + bool shutdown_timer_is_running() const {
|
| + return controller_->shutdown_timer_.IsRunning();
|
| + }
|
| + bool real_shutdown_timer_is_running() const {
|
| + return controller_->real_shutdown_timer_.IsRunning();
|
| + }
|
| + bool hide_background_layer_timer_is_running() const {
|
| + return controller_->hide_background_layer_timer_.IsRunning();
|
| + }
|
| +
|
| + void trigger_lock_timeout() { controller_->OnLockTimeout(); }
|
| + void trigger_lock_fail_timeout() { controller_->OnLockFailTimeout(); }
|
| + void trigger_lock_to_shutdown_timeout() {
|
| + controller_->OnLockToShutdownTimeout();
|
| + }
|
| + void trigger_shutdown_timeout() { controller_->OnShutdownTimeout(); }
|
| + void trigger_real_shutdown_timeout() {
|
| + controller_->OnRealShutdownTimeout();
|
| + }
|
| + void trigger_hide_background_layer_timeout() {
|
| + controller_->HideBackgroundLayer();
|
| + }
|
| +
|
| + // Returns true if the given set of containers was last animated with
|
| + // |type| (probably; the analysis is fairly ad-hoc).
|
| + bool ContainerGroupIsAnimated(ContainerGroup group,
|
| + AnimationType type) const;
|
| +
|
| + // Returns true if |background_layer_| is non-NULL and visible.
|
| + bool BackgroundLayerIsVisible() const;
|
| +
|
| + private:
|
| + PowerButtonController* controller_; // not owned
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestApi);
|
| + };
|
| +
|
| + PowerButtonController();
|
| + ~PowerButtonController();
|
| +
|
| + void set_delegate(PowerButtonControllerDelegate* delegate) {
|
| + delegate_.reset(delegate);
|
| + }
|
| +
|
| + // Called when the user logs in.
|
| + void OnLoginStateChange(bool logged_in, bool is_guest);
|
| +
|
| + // Called when the screen is locked (after the lock window is visible) or
|
| + // unlocked.
|
| + void OnLockStateChange(bool locked);
|
| +
|
| + // Called when Chrome gets a request to display the lock screen.
|
| + void OnStartingLock();
|
| +
|
| + // Called when the power or lock buttons are pressed or released.
|
| + void OnPowerButtonEvent(bool down, const base::TimeTicks& timestamp);
|
| + void OnLockButtonEvent(bool down, const base::TimeTicks& timestamp);
|
| +
|
| + // aura::RootWindowObserver overrides:
|
| + virtual void OnRootWindowResized(const gfx::Size& new_size) OVERRIDE;
|
| +
|
| + private:
|
| + class BackgroundLayerDelegate;
|
| +
|
| + // Requests that the screen be locked and starts |lock_fail_timer_|.
|
| + void OnLockTimeout();
|
| +
|
| + // Aborts the pre-lock animation.
|
| + void OnLockFailTimeout();
|
| +
|
| + // Displays the pre-shutdown animation and starts |shutdown_timer_|.
|
| + void OnLockToShutdownTimeout();
|
| +
|
| + // Displays the shutdown animation and starts |real_shutdown_timer_|.
|
| + void OnShutdownTimeout();
|
| +
|
| + // Requests that the machine be shut down.
|
| + void OnRealShutdownTimeout();
|
| +
|
| + // Puts us into the pre-shutdown state.
|
| + void StartShutdownTimer();
|
| +
|
| + // Shows or hides |background_layer_|. The show method creates and
|
| + // initializes the layer if it doesn't already exist.
|
| + void ShowBackgroundLayer();
|
| + void HideBackgroundLayer();
|
| +
|
| + scoped_ptr<PowerButtonControllerDelegate> delegate_;
|
| +
|
| + // True if a non-guest user is currently logged in.
|
| + bool logged_in_as_non_guest_;
|
| +
|
| + // True if the screen is currently locked.
|
| + bool locked_;
|
| +
|
| + // Are the power or lock buttons currently held?
|
| + bool power_button_down_;
|
| + bool lock_button_down_;
|
| +
|
| + // Are we in the process of shutting the machine down?
|
| + bool shutting_down_;
|
| +
|
| + // Should we start |shutdown_timer_| when we receive notification that the
|
| + // screen has been locked?
|
| + bool should_start_shutdown_timer_after_lock_;
|
| +
|
| + // Responsible for painting |background_layer_|.
|
| + scoped_ptr<BackgroundLayerDelegate> background_layer_delegate_;
|
| +
|
| + // Layer that's stacked under all of the root window's children to provide a
|
| + // black background when we're scaling all of the other windows down.
|
| + scoped_ptr<ui::Layer> background_layer_;
|
| +
|
| + // Started when the user first presses the power button while in a
|
| + // logged-in-as-a-non-guest-user, unlocked state. When it fires, we lock the
|
| + // screen.
|
| + base::OneShotTimer<PowerButtonController> lock_timer_;
|
| +
|
| + // Started when we request that the screen be locked. When it fires, we
|
| + // assume that our request got dropped.
|
| + base::OneShotTimer<PowerButtonController> lock_fail_timer_;
|
| +
|
| + // Started when the screen is locked while the power button is held. Adds a
|
| + // delay between the appearance of the lock screen and the beginning of the
|
| + // pre-shutdown animation.
|
| + base::OneShotTimer<PowerButtonController> lock_to_shutdown_timer_;
|
| +
|
| + // Started when we begin displaying the pre-shutdown animation. When it
|
| + // fires, we start the shutdown animation and get ready to request shutdown.
|
| + base::OneShotTimer<PowerButtonController> shutdown_timer_;
|
| +
|
| + // Started when we display the shutdown animation. When it fires, we actually
|
| + // request shutdown. Gives the animation time to complete before Chrome, X,
|
| + // etc. are shut down.
|
| + base::OneShotTimer<PowerButtonController> real_shutdown_timer_;
|
| +
|
| + // Started when we abort the pre-lock state. When it fires, we hide
|
| + // |background_layer_|, as the desktop background is now covering the whole
|
| + // screen.
|
| + base::OneShotTimer<PowerButtonController> hide_background_layer_timer_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PowerButtonController);
|
| +};
|
| +
|
| +} // namespace ash
|
| +
|
| +#endif // ASH_WM_POWER_BUTTON_CONTROLLER_H_
|
|
|