Index: ash/shelf/shelf_locking_manager.cc |
diff --git a/ash/shelf/shelf_locking_manager.cc b/ash/shelf/shelf_locking_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d291da6dc270092eceab4b2af6524a0f66f4ddf7 |
--- /dev/null |
+++ b/ash/shelf/shelf_locking_manager.cc |
@@ -0,0 +1,62 @@ |
+// Copyright 2016 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. |
+ |
+#include "ash/shelf/shelf_locking_manager.h" |
+ |
+#include "ash/session/session_state_delegate.h" |
+#include "ash/shelf/shelf.h" |
+#include "ash/shell.h" |
+#include "ash/wm/lock_state_controller.h" |
+ |
+namespace ash { |
+ |
+ShelfLockingManager::ShelfLockingManager(Shelf* shelf) : shelf_(shelf) { |
+ Shell* shell = Shell::GetInstance(); |
+ shell->lock_state_controller()->AddObserver(this); |
+ SessionStateDelegate* delegate = shell->session_state_delegate(); |
+ session_locked_ = |
+ delegate->GetSessionState() != SessionStateDelegate::SESSION_STATE_ACTIVE; |
+ screen_locked_ = delegate->IsScreenLocked(); |
+ delegate->AddSessionStateObserver(this); |
+ shell->AddShellObserver(this); |
+} |
+ |
+ShelfLockingManager::~ShelfLockingManager() { |
+ Shell* shell = Shell::GetInstance(); |
+ shell->lock_state_controller()->RemoveObserver(this); |
+ shell->session_state_delegate()->RemoveSessionStateObserver(this); |
+ shell->RemoveShellObserver(this); |
+} |
+ |
+void ShelfLockingManager::OnLockStateChanged(bool locked) { |
+ screen_locked_ = locked; |
+ UpdateLockedState(); |
+} |
+ |
+void ShelfLockingManager::SessionStateChanged( |
+ SessionStateDelegate::SessionState state) { |
+ session_locked_ = state != SessionStateDelegate::SESSION_STATE_ACTIVE; |
+ UpdateLockedState(); |
+} |
+ |
+void ShelfLockingManager::OnLockStateEvent(EventType event) { |
+ // This is only called when locking the screen; there is no unlock event here. |
+ // It's also called when the screen lock animation begins and should help the |
+ // shelf appear locked much earlier than ShellObserver::OnLockStateChanged. |
+ screen_locked_ = true; |
+ UpdateLockedState(); |
+} |
+ |
+void ShelfLockingManager::UpdateLockedState() { |
+ const bool should_be_locked = screen_locked_ || session_locked_; |
+ const ShelfAlignment alignment = shelf_->alignment(); |
+ if (should_be_locked && alignment != SHELF_ALIGNMENT_BOTTOM_LOCKED) { |
+ stored_alignment_ = alignment; |
+ shelf_->SetAlignment(SHELF_ALIGNMENT_BOTTOM_LOCKED); |
+ } else if (!should_be_locked && alignment == SHELF_ALIGNMENT_BOTTOM_LOCKED) { |
+ shelf_->SetAlignment(stored_alignment_); |
+ } |
+} |
+ |
+} // namespace ash |