Index: ash/system/session/logout_confirmation_controller.cc |
diff --git a/ash/system/session/logout_confirmation_controller.cc b/ash/system/session/logout_confirmation_controller.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e6479cde92432d007a0e229462d14cb84914fd82 |
--- /dev/null |
+++ b/ash/system/session/logout_confirmation_controller.cc |
@@ -0,0 +1,87 @@ |
+// Copyright 2014 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/system/session/logout_confirmation_controller.h" |
+ |
+#include "ash/session_state_delegate.h" |
+#include "ash/shell.h" |
+#include "ash/system/session/logout_confirmation_dialog.h" |
+#include "base/location.h" |
+#include "base/time/default_tick_clock.h" |
+#include "base/time/tick_clock.h" |
+#include "ui/views/widget/widget.h" |
+ |
+namespace ash { |
+namespace internal { |
+ |
+LogoutConfirmationController::LogoutConfirmationController( |
+ const base::Closure& logout_closure) |
+ : clock_(reinterpret_cast<base::TickClock*>(new base::DefaultTickClock)), |
stevenjb
2014/03/05 18:57:20
reinterpret_cast shouldn't be necessary here.
bartfab (slow)
2014/03/05 22:24:56
Done.
|
+ logout_closure_(logout_closure), |
+ dialog_(NULL), |
+ logout_timer_(false, false) { |
+ if (Shell::HasInstance()) |
+ Shell::GetInstance()->AddShellObserver(this); |
+} |
+ |
+LogoutConfirmationController::~LogoutConfirmationController() { |
+ if (Shell::HasInstance()) |
+ Shell::GetInstance()->RemoveShellObserver(this); |
+ if (dialog_) |
+ dialog_->GetWidget()->Close(); |
+} |
+ |
+void LogoutConfirmationController::ConfirmLogout( |
+ base::TimeTicks logout_time) { |
+ if (!logout_time_.is_null() && logout_time >= logout_time_) { |
+ // If a confirmation dialog is already being shown and its countdown expires |
+ // no later than the |logout_time| requested now, keep the current dialog |
+ // open. |
+ return; |
+ } |
+ logout_time_ = logout_time; |
+ |
+ if (!dialog_) { |
+ // Show confirmation dialog unless this is a unit test without a Shell. |
+ if (Shell::HasInstance()) |
+ dialog_ = new LogoutConfirmationDialog(this, logout_time_); |
+ } else { |
+ dialog_->Update(logout_time_); |
+ } |
+ |
+ logout_timer_.Start(FROM_HERE, |
+ logout_time_ - clock_->NowTicks(), |
+ logout_closure_); |
+} |
+ |
+void LogoutConfirmationController::SetClockForTesting( |
+ scoped_ptr<base::TickClock> clock) { |
+ clock_ = clock.Pass(); |
+} |
+ |
+void LogoutConfirmationController::OnLockStateChanged(bool locked) { |
+ if (!locked || logout_time_.is_null()) |
+ return; |
+ |
+ // If the screen is locked while a confirmation dialog is being shown, close |
+ // the dialog. |
+ logout_time_ = base::TimeTicks(); |
+ if (dialog_) |
+ dialog_->GetWidget()->Close(); |
+ logout_timer_.Stop(); |
+} |
+ |
+void LogoutConfirmationController::OnLogoutConfirmed() { |
+ logout_timer_.Stop(); |
+ logout_closure_.Run(); |
+} |
+ |
+void LogoutConfirmationController::OnDialogClosed() { |
+ logout_time_ = base::TimeTicks(); |
+ dialog_ = NULL; |
+ logout_timer_.Stop(); |
+} |
+ |
+} // namespace internal |
+} // namespace ash |