- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / ui / idle_logout_dialog_view.cc
1 // Copyright (c) 2012 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 #include "chrome/browser/chromeos/ui/idle_logout_dialog_view.h"
6
7 #include "ash/shell.h"
8 #include "base/bind.h"
9 #include "base/bind_helpers.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/time/time.h"
13 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h"
14 #include "chrome/browser/ui/browser_list.h"
15 #include "chromeos/dbus/dbus_thread_manager.h"
16 #include "chromeos/dbus/session_manager_client.h"
17 #include "grit/browser_resources.h"
18 #include "grit/generated_resources.h"
19 #include "ui/aura/root_window.h"
20 #include "ui/base/l10n/l10n_util.h"
21 #include "ui/base/resource/resource_bundle.h"
22 #include "ui/views/controls/label.h"
23 #include "ui/views/layout/grid_layout.h"
24 #include "ui/views/layout/layout_constants.h"
25 #include "ui/views/widget/widget.h"
26
27 namespace {
28
29 // Global singleton instance of our dialog class.
30 chromeos::IdleLogoutDialogView* g_instance = NULL;
31
32 const int kIdleLogoutDialogMaxWidth = 300;
33 const int kCountdownUpdateIntervalMs = 1000;
34
35 }  // namespace
36
37 namespace chromeos {
38
39 IdleLogoutSettingsProvider* IdleLogoutDialogView::provider_ = NULL;
40
41 ////////////////////////////////////////////////////////////////////////////////
42 // IdleLogoutSettingsProvider public methods
43 IdleLogoutSettingsProvider::IdleLogoutSettingsProvider() {
44 }
45
46 IdleLogoutSettingsProvider::~IdleLogoutSettingsProvider() {
47 }
48
49 base::TimeDelta IdleLogoutSettingsProvider::GetCountdownUpdateInterval() {
50   return base::TimeDelta::FromMilliseconds(kCountdownUpdateIntervalMs);
51 }
52
53 KioskModeSettings* IdleLogoutSettingsProvider::GetKioskModeSettings() {
54   return KioskModeSettings::Get();
55 }
56
57 void IdleLogoutSettingsProvider::LogoutCurrentUser(IdleLogoutDialogView*) {
58   DBusThreadManager::Get()->GetSessionManagerClient()->StopSession();
59 }
60
61 ////////////////////////////////////////////////////////////////////////////////
62 // IdleLogoutDialogView public static methods
63 // static
64 void IdleLogoutDialogView::ShowDialog() {
65   // We only show the dialog if it is not already showing. We don't want two
66   // countdowns on the screen for any reason. If the dialog is closed by using
67   // CloseDialog, we reset g_instance so the next Show will work correctly; in
68   // case the dialog is closed by the system, DeleteDelegate is guaranteed to be
69   // called, in which case we reset g_instance there if not already reset.
70   if (!g_instance) {
71     g_instance = new IdleLogoutDialogView();
72     g_instance->InitAndShow();
73   }
74 }
75
76 // static
77 void IdleLogoutDialogView::CloseDialog() {
78   if (g_instance)
79     g_instance->GetWidget()->Close();
80 }
81
82 ////////////////////////////////////////////////////////////////////////////////
83 // Overridden from views::DialogDelegateView
84 int IdleLogoutDialogView::GetDialogButtons() const {
85   return ui::DIALOG_BUTTON_NONE;
86 }
87
88 ui::ModalType IdleLogoutDialogView::GetModalType() const {
89   return ui::MODAL_TYPE_WINDOW;
90 }
91
92 string16 IdleLogoutDialogView::GetWindowTitle() const {
93   return l10n_util::GetStringUTF16(IDS_IDLE_LOGOUT_TITLE);
94 }
95
96 bool IdleLogoutDialogView::Close() {
97   if (timer_.IsRunning())
98     timer_.Stop();
99
100   // We just closed our dialog. The global
101   // instance is invalid now, set it to null.
102   g_instance = NULL;
103
104   return true;
105 }
106
107 ////////////////////////////////////////////////////////////////////////////////
108 // IdleLogoutDialog private methods
109 IdleLogoutDialogView::IdleLogoutDialogView()
110     : restart_label_(NULL),
111       weak_ptr_factory_(this) {
112   if (!IdleLogoutDialogView::provider_)
113     IdleLogoutDialogView::provider_ = new IdleLogoutSettingsProvider();
114 }
115
116 IdleLogoutDialogView::~IdleLogoutDialogView() {
117   if (this == g_instance)
118     g_instance = NULL;
119 }
120
121 void IdleLogoutDialogView::InitAndShow() {
122   KioskModeSettings* settings =
123       IdleLogoutDialogView::provider_->GetKioskModeSettings();
124   if (!settings->is_initialized()) {
125     settings->Initialize(base::Bind(&IdleLogoutDialogView::InitAndShow,
126                                     weak_ptr_factory_.GetWeakPtr()));
127     return;
128   }
129
130   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
131
132   restart_label_ = new views::Label();
133   restart_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
134   restart_label_->SetMultiLine(true);
135   restart_label_->SetFont(rb.GetFont(ui::ResourceBundle::BaseFont));
136
137   views::GridLayout* layout = views::GridLayout::CreatePanel(this);
138   SetLayoutManager(layout);
139
140   views::ColumnSet* column_set = layout->AddColumnSet(0);
141   column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1,
142                         views::GridLayout::FIXED, kIdleLogoutDialogMaxWidth, 0);
143   layout->StartRow(0, 0);
144   layout->AddPaddingRow(0, views::kRelatedControlHorizontalSpacing);
145   layout->StartRow(0, 0);
146   layout->AddView(restart_label_);
147   layout->AddPaddingRow(0, views::kRelatedControlHorizontalSpacing);
148
149   // We're initialized, show the dialog.
150   Show();
151 }
152
153 void IdleLogoutDialogView::Show() {
154   KioskModeSettings* settings =
155         IdleLogoutDialogView::provider_->GetKioskModeSettings();
156
157   // Setup the countdown label before showing.
158   countdown_end_time_ = base::Time::Now() +
159       settings->GetIdleLogoutWarningDuration();
160
161   UpdateCountdown();
162
163   views::DialogDelegate::CreateDialogWidget(
164       this, ash::Shell::GetPrimaryRootWindow(), NULL);
165   GetWidget()->SetAlwaysOnTop(true);
166   GetWidget()->Show();
167
168   // Update countdown every 1 second.
169   timer_.Start(FROM_HERE,
170                IdleLogoutDialogView::provider_->GetCountdownUpdateInterval(),
171                this,
172                &IdleLogoutDialogView::UpdateCountdown);
173 }
174
175 void IdleLogoutDialogView::UpdateCountdown() {
176   base::TimeDelta logout_warning_time = countdown_end_time_ -
177                                         base::Time::Now();
178   int64 seconds_left = (logout_warning_time.InMillisecondsF() /
179                         base::Time::kMillisecondsPerSecond) + 0.5;
180
181   if (seconds_left > 1) {
182     restart_label_->SetText(l10n_util::GetStringFUTF16(
183         IDS_IDLE_LOGOUT_WARNING_RESTART,
184         base::Int64ToString16(seconds_left)));
185   } else if (seconds_left > 0) {
186     restart_label_->SetText(l10n_util::GetStringUTF16(
187         IDS_IDLE_LOGOUT_WARNING_RESTART_1S));
188   } else {
189     // Set the label - the logout probably won't be instant.
190     restart_label_->SetText(l10n_util::GetStringUTF16(
191         IDS_IDLE_LOGOUT_WARNING_RESTART_NOW));
192
193     // We're done; stop the timer and logout.
194     timer_.Stop();
195     IdleLogoutDialogView::provider_->LogoutCurrentUser(this);
196   }
197 }
198
199 // static
200 IdleLogoutDialogView* IdleLogoutDialogView::current_instance() {
201   return g_instance;
202 }
203
204 // static
205 void IdleLogoutDialogView::set_settings_provider(
206     IdleLogoutSettingsProvider* provider) {
207   provider_ = provider;
208 }
209
210 }  // namespace chromeos