1 // Copyright (c) 2010 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/login/update_view.h"
6
7 #include <string>
8
9 #include "base/utf_string_conversions.h"
10 #include "chrome/browser/chromeos/login/helper.h"
11 #include "chrome/browser/chromeos/login/rounded_rect_painter.h"
12 #include "chrome/browser/chromeos/login/update_screen.h"
13 #include "chrome/browser/chromeos/login/wizard_accessibility_helper.h"
14 #include "grit/chromium_strings.h"
15 #include "grit/generated_resources.h"
16 #include "ui/base/l10n/l10n_util.h"
17 #include "ui/base/resource/resource_bundle.h"
18 #include "views/border.h"
19 #include "views/controls/label.h"
20 #include "views/controls/progress_bar.h"
21 #include "views/controls/throbber.h"
22 #include "views/focus/focus_manager.h"
23 #include "views/widget/widget.h"
24
25 using views::Background;
26 using views::Label;
27 using views::View;
28 using views::Widget;
29
30 namespace {
31
32 // TODO(nkostylev): Switch to GridLayout.
33
34 // Y offset for the 'installing updates' label.
35 const int kInstallingUpdatesLabelYBottomFromProgressBar = 18;
36 // Y offset for the progress bar.
37 const int kProgressBarY = 130;
38 // Y offset for the 'computer will restart' label.
39 const int kRebootLabelYFromProgressBar = 55;
40 // Y offset for the 'ESCAPE to skip' label.
41 const int kEscapeToSkipLabelY = 48;
42 // Progress bar width.
43 const int kProgressBarWidth = 420;
44 // Progress bar height.
45 const int kProgressBarHeight = 18;
46 // Horizontal spacing (ex. min left and right margins for label on the screen).
47 const int kHorizontalSpacing = 65;
48 // Horizontal spacing between spinner and label on the curtain screen.
49 const int kBetweenSpacing = 25;
50
51 // Label color.
52 const SkColor kLabelColor = 0xFF000000;
53 const SkColor kSkipLabelColor = 0xFFAA0000;
54 const SkColor kManualRebootLabelColor = 0xFFAA0000;
55
56 } // namespace
57
58 namespace chromeos {
59
UpdateView(chromeos::ScreenObserver * observer)60 UpdateView::UpdateView(chromeos::ScreenObserver* observer)
61 : installing_updates_label_(NULL),
62 preparing_updates_label_(NULL),
63 reboot_label_(NULL),
64 manual_reboot_label_(NULL),
65 progress_bar_(NULL),
66 show_curtain_(true),
67 show_manual_reboot_label_(false),
68 show_preparing_updates_label_(false),
69 observer_(observer) {
70 }
71
~UpdateView()72 UpdateView::~UpdateView() {
73 }
74
Init()75 void UpdateView::Init() {
76 // Use rounded-rect background.
77 views::Painter* painter = chromeos::CreateWizardPainter(
78 &chromeos::BorderDefinition::kScreenBorder);
79 set_background(views::Background::CreateBackgroundPainter(true, painter));
80
81 InitLabel(&installing_updates_label_);
82 InitLabel(&preparing_updates_label_);
83 InitLabel(&reboot_label_);
84 InitLabel(&manual_reboot_label_);
85 preparing_updates_label_->SetVisible(false);
86 manual_reboot_label_->SetVisible(false);
87 manual_reboot_label_->SetColor(kManualRebootLabelColor);
88
89 progress_bar_ = new views::ProgressBar();
90 AddChildView(progress_bar_);
91
92 // Curtain view.
93 InitLabel(&checking_label_);
94 throbber_ = CreateDefaultThrobber();
95 AddChildView(throbber_);
96
97 #if !defined(OFFICIAL_BUILD)
98 InitLabel(&escape_to_skip_label_);
99 escape_to_skip_label_->SetColor(kSkipLabelColor);
100 escape_to_skip_label_->SetText(
101 L"Press ESCAPE to skip (Non-official builds only)");
102 #endif
103
104 UpdateLocalizedStrings();
105 UpdateVisibility();
106 }
107
Reset()108 void UpdateView::Reset() {
109 progress_bar_->SetProgress(0);
110 }
111
UpdateLocalizedStrings()112 void UpdateView::UpdateLocalizedStrings() {
113 installing_updates_label_->SetText(UTF16ToWide(l10n_util::GetStringFUTF16(
114 IDS_INSTALLING_UPDATE,
115 l10n_util::GetStringUTF16(IDS_PRODUCT_OS_NAME))));
116 preparing_updates_label_->SetText(
117 UTF16ToWide(l10n_util::GetStringUTF16(IDS_UPDATE_AVAILABLE)));
118 reboot_label_->SetText(
119 UTF16ToWide(l10n_util::GetStringUTF16(IDS_INSTALLING_UPDATE_DESC)));
120 manual_reboot_label_->SetText(
121 UTF16ToWide(l10n_util::GetStringUTF16(IDS_UPDATE_COMPLETED)));
122 checking_label_->SetText(
123 UTF16ToWide(l10n_util::GetStringUTF16(IDS_CHECKING_FOR_UPDATES)));
124 }
125
AddProgress(int ticks)126 void UpdateView::AddProgress(int ticks) {
127 progress_bar_->AddProgress(ticks);
128 }
129
SetProgress(int progress)130 void UpdateView::SetProgress(int progress) {
131 progress_bar_->SetProgress(progress);
132 }
133
ShowManualRebootInfo()134 void UpdateView::ShowManualRebootInfo() {
135 show_manual_reboot_label_ = true;
136 UpdateVisibility();
137 }
138
ShowPreparingUpdatesInfo(bool visible)139 void UpdateView::ShowPreparingUpdatesInfo(bool visible) {
140 show_preparing_updates_label_ = visible;
141 UpdateVisibility();
142 }
143
ShowCurtain(bool show_curtain)144 void UpdateView::ShowCurtain(bool show_curtain) {
145 if (show_curtain_ != show_curtain) {
146 show_curtain_ = show_curtain;
147 UpdateVisibility();
148 }
149 }
150
151 // Sets the bounds of the view, placing center of the view at the given
152 // coordinates (|x| and |y|).
setViewBounds(views::View * view,int x,int y)153 static void setViewBounds(views::View* view, int x, int y) {
154 int preferred_width = view->GetPreferredSize().width();
155 int preferred_height = view->GetPreferredSize().height();
156 view->SetBounds(
157 x - preferred_width / 2,
158 y - preferred_height / 2,
159 preferred_width,
160 preferred_height);
161 }
162
Layout()163 void UpdateView::Layout() {
164 int max_width = width() - GetInsets().width() - 2 * kHorizontalSpacing;
165 int right_margin = GetInsets().right() + kHorizontalSpacing;
166 int max_height = height() - GetInsets().height();
167 int vertical_center = GetInsets().top() + max_height / 2;
168
169 installing_updates_label_->SizeToFit(max_width);
170 preparing_updates_label_->SizeToFit(max_width);
171 reboot_label_->SizeToFit(max_width);
172 manual_reboot_label_->SizeToFit(max_width);
173
174 progress_bar_->SetBounds(right_margin,
175 vertical_center - kProgressBarHeight / 2,
176 max_width,
177 kProgressBarHeight);
178
179 installing_updates_label_->SetX(right_margin);
180 installing_updates_label_->SetY(
181 progress_bar_->y() -
182 kInstallingUpdatesLabelYBottomFromProgressBar -
183 installing_updates_label_->height());
184 preparing_updates_label_->SetX(installing_updates_label_->x());
185 preparing_updates_label_->SetY(installing_updates_label_->y());
186 reboot_label_->SetX(right_margin);
187 reboot_label_->SetY(
188 progress_bar_->y() +
189 progress_bar_->height() +
190 kRebootLabelYFromProgressBar);
191 manual_reboot_label_->SetX(reboot_label_->x());
192 manual_reboot_label_->SetY(reboot_label_->y());
193 // Curtain layout is independed.
194 int x_center = width() / 2;
195 int throbber_width = throbber_->GetPreferredSize().width();
196 checking_label_->SizeToFit(max_width - throbber_width - kBetweenSpacing);
197 int checking_label_width = checking_label_->GetPreferredSize().width();
198 int space_half = (kBetweenSpacing + 1) / 2;
199 setViewBounds(
200 throbber_, x_center - checking_label_width / 2 - space_half,
201 vertical_center);
202 setViewBounds(
203 checking_label_, x_center + (throbber_width + 1) / 2 + space_half,
204 vertical_center);
205 #if !defined(OFFICIAL_BUILD)
206 escape_to_skip_label_->SizeToFit(max_width);
207 escape_to_skip_label_->SetX(right_margin);
208 escape_to_skip_label_->SetY(kEscapeToSkipLabelY);
209 #endif
210 SchedulePaint();
211 }
212
InitLabel(views::Label ** label)213 void UpdateView::InitLabel(views::Label** label) {
214 *label = new views::Label();
215 (*label)->SetColor(kLabelColor);
216 (*label)->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
217 (*label)->SetMultiLine(true);
218
219 ResourceBundle& res_bundle = ResourceBundle::GetSharedInstance();
220 gfx::Font label_font = res_bundle.GetFont(ResourceBundle::MediumFont);
221 (*label)->SetFont(label_font);
222
223 AddChildView(*label);
224 }
225
UpdateVisibility()226 void UpdateView::UpdateVisibility() {
227 installing_updates_label_->SetVisible(!show_curtain_ &&
228 !show_manual_reboot_label_ &&
229 !show_preparing_updates_label_);
230 preparing_updates_label_->SetVisible(!show_curtain_ &&
231 !show_manual_reboot_label_ &&
232 show_preparing_updates_label_);
233 reboot_label_->SetVisible(!show_curtain_&& !show_manual_reboot_label_);
234 manual_reboot_label_->SetVisible(!show_curtain_ && show_manual_reboot_label_);
235 progress_bar_->SetVisible(!show_curtain_);
236
237 checking_label_->SetVisible(show_curtain_);
238 throbber_->SetVisible(show_curtain_);
239 if (show_curtain_) {
240 throbber_->Start();
241 } else {
242 throbber_->Stop();
243 }
244 }
245
246 } // namespace chromeos
247