1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef ASH_WM_LOCK_STATE_CONTROLLER_H_ 6 #define ASH_WM_LOCK_STATE_CONTROLLER_H_ 7 8 #include "ash/ash_export.h" 9 #include "ash/shell_observer.h" 10 #include "ash/wm/lock_state_observer.h" 11 #include "ash/wm/session_state_animator.h" 12 #include "base/basictypes.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/observer_list.h" 15 #include "base/time/time.h" 16 #include "base/timer/timer.h" 17 #include "ui/aura/root_window_observer.h" 18 19 namespace gfx { 20 class Rect; 21 class Size; 22 } 23 24 namespace ui { 25 class Layer; 26 } 27 28 namespace ash { 29 30 namespace test { 31 class LockStateControllerImpl2Test; 32 class PowerButtonControllerTest; 33 } 34 35 // Performs system-related functions on behalf of LockStateController. 36 class ASH_EXPORT LockStateControllerDelegate { 37 public: 38 LockStateControllerDelegate() {} 39 virtual ~LockStateControllerDelegate() {} 40 41 virtual void RequestLockScreen() = 0; 42 virtual void RequestShutdown() = 0; 43 44 private: 45 DISALLOW_COPY_AND_ASSIGN(LockStateControllerDelegate); 46 }; 47 48 // Displays onscreen animations and locks or suspends the system in response to 49 // the power button being pressed or released. 50 class ASH_EXPORT LockStateController : public aura::RootWindowObserver, 51 public ShellObserver { 52 public: 53 // Amount of time that the power button needs to be held before we lock the 54 // screen. 55 static const int kLockTimeoutMs; 56 57 // Amount of time that the power button needs to be held before we shut down. 58 static const int kShutdownTimeoutMs; 59 60 // Amount of time to wait for our lock requests to be honored before giving 61 // up. 62 static const int kLockFailTimeoutMs; 63 64 // When the button has been held continuously from the unlocked state, amount 65 // of time that we wait after the screen locker window is shown before 66 // starting the pre-shutdown animation. 67 static const int kLockToShutdownTimeoutMs; 68 69 // Additional time (beyond kFastCloseAnimMs) to wait after starting the 70 // fast-close shutdown animation before actually requesting shutdown, to give 71 // the animation time to finish. 72 static const int kShutdownRequestDelayMs; 73 74 LockStateController(); 75 virtual ~LockStateController(); 76 77 void SetDelegate(LockStateControllerDelegate* delegate); 78 79 // Starts locking (with slow animation) that can be cancelled. 80 // After locking and |kLockToShutdownTimeoutMs| StartShutdownAnimation() 81 // will be called unless CancelShutdownAnimation() is called, if 82 // |shutdown_after_lock| is true. 83 virtual void StartLockAnimation(bool shutdown_after_lock) = 0; 84 85 // Starts shutting down (with slow animation) that can be cancelled. 86 virtual void StartShutdownAnimation() = 0; 87 88 // Starts usual lock animation, but locks immediately. 89 // Unlike StartLockAnimation it does no lead to StartShutdownAnimation. 90 virtual void StartLockAnimationAndLockImmediately() = 0; 91 92 // Returns true if we have requested system to lock, but haven't received 93 // confirmation yet. 94 virtual bool LockRequested() = 0; 95 96 // Returns true if we are shutting down. 97 virtual bool ShutdownRequested() = 0; 98 99 // Returns true if we are within cancellable lock timeframe. 100 virtual bool CanCancelLockAnimation() = 0; 101 102 // Cancels locking and reverts lock animation. 103 virtual void CancelLockAnimation() = 0; 104 105 // Returns true if we are within cancellable shutdown timeframe. 106 virtual bool CanCancelShutdownAnimation() = 0; 107 108 // Cancels shutting down and reverts shutdown animation. 109 virtual void CancelShutdownAnimation() = 0; 110 111 // Called when Chrome gets a request to display the lock screen. 112 virtual void OnStartingLock() = 0; 113 114 // Displays the shutdown animation and requests shutdown when it's done. 115 virtual void RequestShutdown() = 0; 116 117 // Called when ScreenLocker is ready to close, but not yet destroyed. 118 // Can be used to display "hiding" animations on unlock. 119 // |callback| will be called when all animations are done. 120 virtual void OnLockScreenHide(base::Closure& callback) = 0; 121 122 // Sets up the callback that should be called once lock animation is finished. 123 // Callback is guaranteed to be called once and then discarded. 124 virtual void SetLockScreenDisplayedCallback(base::Closure& callback) = 0; 125 126 virtual void AddObserver(LockStateObserver* observer); 127 virtual void RemoveObserver(LockStateObserver* observer); 128 virtual bool HasObserver(LockStateObserver* observer); 129 130 protected: 131 friend class test::PowerButtonControllerTest; 132 friend class test::LockStateControllerImpl2Test; 133 134 scoped_ptr<internal::SessionStateAnimator> animator_; 135 136 scoped_ptr<LockStateControllerDelegate> delegate_; 137 138 ObserverList<LockStateObserver> observers_; 139 140 private: 141 DISALLOW_COPY_AND_ASSIGN(LockStateController); 142 }; 143 144 } // namespace ash 145 146 #endif // ASH_WM_LOCK_STATE_CONTROLLER_H_ 147