Index: ash/wm/lock_state_controller.h |
diff --git a/ash/wm/lock_state_controller.h b/ash/wm/lock_state_controller.h |
index 10fce263f78087cbd5d71ffbffb47059bb7e9414..66c8ceb1e9b2261c425972313c225388c7676aad 100644 |
--- a/ash/wm/lock_state_controller.h |
+++ b/ash/wm/lock_state_controller.h |
@@ -28,7 +28,7 @@ class Layer; |
namespace ash { |
namespace test { |
-class LockStateControllerImpl2Test; |
+class LockStateControllerTest; |
class PowerButtonControllerTest; |
} |
@@ -47,6 +47,27 @@ class ASH_EXPORT LockStateControllerDelegate { |
// Displays onscreen animations and locks or suspends the system in response to |
// the power button being pressed or released. |
+// Lock workflow: |
+// Entry points: |
+// * StartLockAnimation (bool shutdown after lock) - starts lock that can be |
+// cancelled. |
+// * StartLockAnimationAndLockImmediately - starts uninterruptible lock |
+// animation. |
+// This leads to call of either StartImmediatePreLockAnimation or |
+// StartCancellablePreLockAnimation. Once they complete |
+// PreLockAnimationFinished is called, and system lock is requested. |
+// Once system locks and lock UI is created, OnLockStateChanged is called, and |
+// StartPostLockAnimation is called. In PostLockAnimationFinished two |
+// things happen : EVENT_LOCK_ANIMATION_FINISHED notification is sent (it |
+// triggers third part of animation within lock UI), and check for continuing to |
+// shutdown is made. |
+// |
+// Unlock workflow: |
+// WebUI does first part of animation, and calls OnLockScreenHide(callback) that |
+// triggers StartUnlockAnimationBeforeUIDestroyed(callback). Once callback is |
+// called at the end of the animation, lock UI is deleted, system unlocks, and |
+// OnLockStateChanged is called. It leads to |
+// StartUnlockAnimationAfterUIDestroyed. |
class ASH_EXPORT LockStateController : public aura::RootWindowObserver, |
public ShellObserver { |
public: |
@@ -71,65 +92,186 @@ class ASH_EXPORT LockStateController : public aura::RootWindowObserver, |
// the animation time to finish. |
static const int kShutdownRequestDelayMs; |
+ // Helper class used by tests to access internal state. |
+ class ASH_EXPORT TestApi { |
+ public: |
+ explicit TestApi(LockStateController* controller); |
+ |
+ virtual ~TestApi(); |
+ |
+ 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_->pre_shutdown_timer_.IsRunning(); |
+ } |
+ bool real_shutdown_timer_is_running() const { |
+ return controller_->real_shutdown_timer_.IsRunning(); |
+ } |
+ bool is_animating_lock() const { |
+ return controller_->animating_lock_; |
+ } |
+ bool is_lock_cancellable() const { |
+ return controller_->CanCancelLockAnimation(); |
+ } |
+ |
+ void trigger_lock_fail_timeout() { |
+ controller_->OnLockFailTimeout(); |
+ controller_->lock_fail_timer_.Stop(); |
+ } |
+ void trigger_lock_to_shutdown_timeout() { |
+ controller_->OnLockToShutdownTimeout(); |
+ controller_->lock_to_shutdown_timer_.Stop(); |
+ } |
+ void trigger_shutdown_timeout() { |
+ controller_->OnPreShutdownAnimationTimeout(); |
+ controller_->pre_shutdown_timer_.Stop(); |
+ } |
+ void trigger_real_shutdown_timeout() { |
+ controller_->OnRealShutdownTimeout(); |
+ controller_->real_shutdown_timer_.Stop(); |
+ } |
+ private: |
+ LockStateController* controller_; // not owned |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestApi); |
+ }; |
+ |
LockStateController(); |
virtual ~LockStateController(); |
+ // Takes ownership of |delegate|. |
void SetDelegate(LockStateControllerDelegate* delegate); |
+ void AddObserver(LockStateObserver* observer); |
+ void RemoveObserver(LockStateObserver* observer); |
+ bool HasObserver(LockStateObserver* observer); |
+ |
// Starts locking (with slow animation) that can be cancelled. |
// After locking and |kLockToShutdownTimeoutMs| StartShutdownAnimation() |
// will be called unless CancelShutdownAnimation() is called, if |
// |shutdown_after_lock| is true. |
- virtual void StartLockAnimation(bool shutdown_after_lock) = 0; |
+ void StartLockAnimation(bool shutdown_after_lock); |
// Starts shutting down (with slow animation) that can be cancelled. |
- virtual void StartShutdownAnimation() = 0; |
+ void StartShutdownAnimation(); |
// Starts usual lock animation, but locks immediately. |
// Unlike StartLockAnimation it does no lead to StartShutdownAnimation. |
- virtual void StartLockAnimationAndLockImmediately() = 0; |
+ void StartLockAnimationAndLockImmediately(); |
// Returns true if we have requested system to lock, but haven't received |
// confirmation yet. |
- virtual bool LockRequested() = 0; |
+ bool LockRequested(); |
// Returns true if we are shutting down. |
- virtual bool ShutdownRequested() = 0; |
+ bool ShutdownRequested(); |
// Returns true if we are within cancellable lock timeframe. |
- virtual bool CanCancelLockAnimation() = 0; |
+ bool CanCancelLockAnimation(); |
// Cancels locking and reverts lock animation. |
- virtual void CancelLockAnimation() = 0; |
+ void CancelLockAnimation(); |
// Returns true if we are within cancellable shutdown timeframe. |
- virtual bool CanCancelShutdownAnimation() = 0; |
+ bool CanCancelShutdownAnimation(); |
// Cancels shutting down and reverts shutdown animation. |
- virtual void CancelShutdownAnimation() = 0; |
+ void CancelShutdownAnimation(); |
// Called when Chrome gets a request to display the lock screen. |
- virtual void OnStartingLock() = 0; |
+ void OnStartingLock(); |
// Displays the shutdown animation and requests shutdown when it's done. |
- virtual void RequestShutdown() = 0; |
+ void RequestShutdown(); |
// Called when ScreenLocker is ready to close, but not yet destroyed. |
// Can be used to display "hiding" animations on unlock. |
// |callback| will be called when all animations are done. |
- virtual void OnLockScreenHide(base::Closure& callback) = 0; |
+ void OnLockScreenHide(base::Closure& callback); |
// Sets up the callback that should be called once lock animation is finished. |
// Callback is guaranteed to be called once and then discarded. |
- virtual void SetLockScreenDisplayedCallback(base::Closure& callback) = 0; |
+ void SetLockScreenDisplayedCallback(base::Closure& callback); |
- virtual void AddObserver(LockStateObserver* observer); |
- virtual void RemoveObserver(LockStateObserver* observer); |
- virtual bool HasObserver(LockStateObserver* observer); |
+ // RootWindowObserver override: |
+ virtual void OnRootWindowHostCloseRequested( |
+ const aura::RootWindow* root) OVERRIDE; |
- protected: |
+ // ShellObserver overrides: |
+ virtual void OnLoginStateChanged(user::LoginStatus status) OVERRIDE; |
+ virtual void OnAppTerminating() OVERRIDE; |
+ virtual void OnLockStateChanged(bool locked) OVERRIDE; |
+ |
+ private: |
friend class test::PowerButtonControllerTest; |
- friend class test::LockStateControllerImpl2Test; |
+ friend class test::LockStateControllerTest; |
+ |
+ struct UnlockedStateProperties { |
+ bool background_is_hidden; |
+ }; |
+ |
+ // Reverts the pre-lock animation, reports the error. |
+ void OnLockFailTimeout(); |
+ |
+ // Starts timer for gap between lock and shutdown. |
+ void StartLockToShutdownTimer(); |
+ |
+ // Calls StartShutdownAnimation(). |
+ void OnLockToShutdownTimeout(); |
+ |
+ // Starts timer for undoable shutdown animation. |
+ void StartPreShutdownAnimationTimer(); |
+ |
+ // Calls StartRealShutdownTimer(). |
+ void OnPreShutdownAnimationTimeout(); |
+ |
+ // Starts timer for final shutdown animation. |
+ // If |with_animation_time| is true, it will also include time of "fade to |
+ // white" shutdown animation. |
+ void StartRealShutdownTimer(bool with_animation_time); |
+ |
+ // Requests that the machine be shut down. |
+ void OnRealShutdownTimeout(); |
+ |
+ // Starts shutdown animation that can be cancelled and starts pre-shutdown |
+ // timer. |
+ void StartCancellableShutdownAnimation(); |
+ |
+ // If |request_lock_on_completion| is true, a lock request will be sent |
+ // after the pre-lock animation completes. (The pre-lock animation is |
+ // also displayed in response to already-in-progress lock requests; in |
+ // these cases an additional lock request is undesirable.) |
+ void StartImmediatePreLockAnimation(bool request_lock_on_completion); |
+ void StartCancellablePreLockAnimation(); |
+ void CancelPreLockAnimation(); |
+ void StartPostLockAnimation(); |
+ // This method calls |callback| when animation completes. |
+ void StartUnlockAnimationBeforeUIDestroyed(base::Closure &callback); |
+ void StartUnlockAnimationAfterUIDestroyed(); |
+ |
+ // These methods are called when corresponding animation completes. |
+ void LockAnimationCancelled(); |
+ void PreLockAnimationFinished(bool request_lock); |
+ void PostLockAnimationFinished(); |
+ void UnlockAnimationAfterUIDestroyedFinished(); |
+ |
+ // Stores properties of UI that have to be temporarily modified while locking. |
+ void StoreUnlockedProperties(); |
+ void RestoreUnlockedProperties(); |
+ |
+ // Fades in background layer with |speed| if it was hidden in unlocked state. |
+ void AnimateBackgroundAppearanceIfNecessary( |
+ ash::internal::SessionStateAnimator::AnimationSpeed speed, |
+ ui::LayerAnimationObserver* observer); |
+ |
+ // Fades out background layer with |speed| if it was hidden in unlocked state. |
+ void AnimateBackgroundHidingIfNecessary( |
+ ash::internal::SessionStateAnimator::AnimationSpeed speed, |
+ ui::LayerAnimationObserver* observer); |
scoped_ptr<internal::SessionStateAnimator> animator_; |
@@ -137,7 +279,47 @@ class ASH_EXPORT LockStateController : public aura::RootWindowObserver, |
ObserverList<LockStateObserver> observers_; |
- private: |
+ // The current login status, or original login status from before we locked. |
+ user::LoginStatus login_status_; |
+ |
+ // Current lock status. |
+ bool system_is_locked_; |
+ |
+ // Are we in the process of shutting the machine down? |
+ bool shutting_down_; |
+ |
+ // Indicates whether controller should proceed to (cancellable) shutdown after |
+ // locking. |
+ bool shutdown_after_lock_; |
+ |
+ // Indicates that controller displays lock animation. |
+ bool animating_lock_; |
+ |
+ // Indicates that lock animation can be undone. |
+ bool can_cancel_lock_animation_; |
+ |
+ scoped_ptr<UnlockedStateProperties> unlocked_properties_; |
+ |
+ // Started when we request that the screen be locked. When it fires, we |
+ // assume that our request got dropped. |
+ base::OneShotTimer<LockStateController> 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<LockStateController> 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<LockStateController> pre_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<LockStateController> real_shutdown_timer_; |
+ |
+ base::Closure lock_screen_displayed_callback_; |
+ |
DISALLOW_COPY_AND_ASSIGN(LockStateController); |
}; |