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_ |