Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1273)

Unified Diff: ash/system/logout_button/logout_confirmation_dialog_view.cc

Issue 40053002: Implements the dialog view for logout button tray in public sessions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase; remove scoped_ptr; remove GetUpdateInterval() Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/system/logout_button/logout_confirmation_dialog_view.cc
diff --git a/ash/system/logout_button/logout_confirmation_dialog_view.cc b/ash/system/logout_button/logout_confirmation_dialog_view.cc
new file mode 100644
index 0000000000000000000000000000000000000000..aed329bf34ead00e4a37687450d50e84c3a565eb
--- /dev/null
+++ b/ash/system/logout_button/logout_confirmation_dialog_view.cc
@@ -0,0 +1,159 @@
+// Copyright (c) 2013 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/logout_button/logout_confirmation_dialog_view.h"
+
+#include <cmath>
+
+#include "ash/shell.h"
+#include "ash/system/logout_button/logout_button_tray.h"
+#include "ash/system/tray/system_tray_delegate.h"
+#include "ash/system/tray/tray_constants.h"
+#include "base/location.h"
+#include "grit/ash_strings.h"
+#include "ui/aura/root_window.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
+#include "ui/base/ui_base_types.h"
+#include "ui/gfx/text_constants.h"
+#include "ui/views/border.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/fill_layout.h"
+#include "ui/views/widget/widget.h"
+
+namespace ash {
+namespace internal {
+
+namespace {
+ const int kCountdownUpdateIntervalMs = 1000; // 1 second.
bartfab (slow) 2013/12/18 18:26:49 Nit: Style guide: Constants like this one should n
binjin 2013/12/18 18:42:14 Done.
+} // namespace
+
+LogoutConfirmationDialogView::Delegate::Delegate() {
+}
+
+LogoutConfirmationDialogView::Delegate::~Delegate() {
+}
+
+void LogoutConfirmationDialogView::Delegate::LogoutCurrentUser() {
+ DCHECK(Shell::GetInstance() != NULL);
bartfab (slow) 2013/12/18 18:26:49 Nit 1: No need for != NULL. DCHECK(Shell::GetInsta
binjin 2013/12/18 18:42:14 Done.
+ Shell::GetInstance()->system_tray_delegate()->SignOut();
+}
+
+base::TimeTicks LogoutConfirmationDialogView::Delegate::GetCurrentTime() const {
+ return base::TimeTicks::Now();
+}
+
+LogoutConfirmationDialogView::LogoutConfirmationDialogView(
+ LogoutButtonTray* owner, Delegate* delegate) : owner_(owner),
+ delegate_(delegate) {
+ text_label_ = new views::Label;
+ text_label_->set_border(
+ views::Border::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal,
+ 0, kTrayPopupPaddingHorizontal));
+ text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+ text_label_->SetMultiLine(true);
+
+ SetLayoutManager(new views::FillLayout());
+
+ AddChildView(text_label_);
+}
+
+LogoutConfirmationDialogView::~LogoutConfirmationDialogView() {
+}
+
+bool LogoutConfirmationDialogView::Accept() {
+ LogoutCurrentUser();
+ return true;
+}
+
+ui::ModalType LogoutConfirmationDialogView::GetModalType() const {
+ return ui::MODAL_TYPE_SYSTEM;
+}
+
+string16 LogoutConfirmationDialogView::GetWindowTitle() const {
+ return l10n_util::GetStringUTF16(IDS_ASH_LOGOUT_CONFIRMATION_TITLE);
+}
+
+string16 LogoutConfirmationDialogView::GetDialogButtonLabel(
+ ui::DialogButton button) const {
+ if (button == ui::DIALOG_BUTTON_OK)
+ return l10n_util::GetStringUTF16(IDS_ASH_LOGOUT_CONFIRMATION_BUTTON);
+ return views::DialogDelegateView::GetDialogButtonLabel(button);
+}
+
+void LogoutConfirmationDialogView::OnClosed() {
+ DCHECK(owner_ != NULL);
bartfab (slow) 2013/12/18 18:26:49 Nit 1: No need for != NULL. DCHECK(owner_) will do
binjin 2013/12/18 18:42:14 Done.
+ owner_->ReleaseConfirmationDialog();
+ owner_ = NULL;
+ timer_.Stop();
+ // Nullify the delegate to prevent future activities of the dialog.
+ delegate_ = NULL;
+}
+
+void LogoutConfirmationDialogView::DeleteDelegate() {
+ if (owner_)
+ owner_->ReleaseConfirmationDialog();
+ delete this;
+}
+
+void LogoutConfirmationDialogView::Show(base::TimeDelta duration) {
+ if (!delegate_)
+ return;
+ countdown_start_time_ = delegate_->GetCurrentTime();
+ duration_ = duration;
+
+ UpdateCountdown();
+
+ // For testing purpose, only actually display the dialog if an existing
+ // ash::Shell is available.
+ if (ash::Shell::HasInstance()) {
+ views::DialogDelegate::CreateDialogWidget(
+ this, ash::Shell::GetPrimaryRootWindow(), NULL);
+ GetWidget()->Show();
+ }
+
+ timer_.Start(FROM_HERE,
+ base::TimeDelta::FromMicroseconds(kCountdownUpdateIntervalMs),
bartfab (slow) 2013/12/18 18:26:49 FromMilliseconds, not FromMicroseconds.
binjin 2013/12/18 18:42:14 Done.
+ this,
+ &LogoutConfirmationDialogView::UpdateCountdown);
+}
+
+void LogoutConfirmationDialogView::UpdateDialogDuration(
+ base::TimeDelta duration) {
+ duration_ = duration;
+ UpdateCountdown();
+}
+
+void LogoutConfirmationDialogView::LogoutCurrentUser() {
+ if (!delegate_)
+ return;
+ delegate_->LogoutCurrentUser();
+ // For testing purpose, simulate closing of all windows during session logout.
+ if (!ash::Shell::HasInstance())
bartfab (slow) 2013/12/18 18:26:49 This should be done in the testing code (in the Mo
binjin 2013/12/18 18:42:14 Done.
+ OnClosed();
+}
+
+void LogoutConfirmationDialogView::UpdateCountdown() {
+ if (!delegate_)
+ return;
+ const base::TimeDelta time_remaining = countdown_start_time_ +
+ duration_ - delegate_->GetCurrentTime();
+ // Round the remaining time to nearest second, and use this value for
+ // the countdown display and actual enforcement.
+ int seconds_remaining = round(time_remaining.InSecondsF());
+ if (seconds_remaining > 0) {
+ text_label_->SetText(l10n_util::GetStringFUTF16(
+ IDS_ASH_LOGOUT_CONFIRMATION_WARNING,
+ ui::TimeFormat::TimeDurationLong(base::TimeDelta::FromSeconds(
+ seconds_remaining))));
+ } else {
+ text_label_->SetText(l10n_util::GetStringUTF16(
+ IDS_ASH_LOGOUT_CONFIRMATION_WARNING_NOW));
+ timer_.Stop();
+ LogoutCurrentUser();
+ }
+}
+
+} // namespace internal
+} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698