background_view.cc revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/background_view.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <string>
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <vector>
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/l10n_util.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/resource_bundle.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/x11_util.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/helper.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/oobe_progress_bar.h"
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/proxy_settings_dialog.h"
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/shutdown_button.h"
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/wizard_controller.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/clock_menu_button.h"
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/status/input_method_menu_button.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/network_menu_button.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/status_area_view.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_ipc.h"
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h"
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/views/dom_view.h"
30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "gfx/gtk_util.h"
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "googleurl/src/gurl.h"
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/theme_resources.h"
3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "third_party/cros/chromeos_wm_ipc_enums.h"
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/controls/button/text_button.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/screen.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget_gtk.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// X Windows headers have "#define Status int". That interferes with
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetworkLibrary header which defines enum "Status".
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <X11/cursorfont.h>  // NOLINT
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <X11/Xcursor/Xcursor.h>  // NOLINT
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::WidgetGtk;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst SkColor kVersionColor = 0xff5c739f;
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Returns the corresponding step id for step constant.
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint GetStepId(size_t step) {
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  switch (step) {
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::SELECT_NETWORK:
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_SELECT_NETWORK;
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::EULA:
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_EULA;
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::SIGNIN:
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_SIGNIN;
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::REGISTRATION:
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_REGISTRATION;
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::PICTURE:
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_PICTURE;
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    default:
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NOTREACHED();
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return 0;
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// The same as TextButton but switches cursor to hand cursor when mouse
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// is over the button.
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TextButtonWithHandCursorOver : public views::TextButton {
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TextButtonWithHandCursorOver(views::ButtonListener* listener,
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               const std::wstring& text)
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : views::TextButton(listener, text) {
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~TextButtonWithHandCursorOver() {}
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual gfx::NativeCursor GetCursorForPoint(
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      views::Event::EventType event_type,
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const gfx::Point& p) {
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!IsEnabled()) {
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return NULL;
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return gfx::GetCursor(GDK_HAND2);
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(TextButtonWithHandCursorOver);
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This gets rid of the ugly X default cursor.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void ResetXCursor() {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(sky): nuke this once new window manager is in place.
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Display* display = x11_util::GetXDisplay();
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Cursor cursor = XCreateFontCursor(display, XC_left_ptr);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  XID root_window = x11_util::GetX11RootWindow();
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  XSetWindowAttributes attr;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  attr.cursor = cursor;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  XChangeWindowAttributes(display, root_window, CWCursor, &attr);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace chromeos {
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///////////////////////////////////////////////////////////////////////////////
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView public:
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBackgroundView::BackgroundView()
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : status_area_(NULL),
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_version_label_(NULL),
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      boot_times_label_(NULL),
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      progress_bar_(NULL),
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      shutdown_button_(NULL),
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      did_paint_(false),
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OFFICIAL_BUILD)
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_official_build_(true),
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#else
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_official_build_(false),
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      background_area_(NULL) {
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::Init(const GURL& background_url) {
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Painter* painter = CreateBackgroundPainter();
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  set_background(views::Background::CreateBackgroundPainter(true, painter));
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InitStatusArea();
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InitInfoLabels();
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!background_url.is_empty()) {
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Profile* profile = ProfileManager::GetDefaultProfile();
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_ = new DOMView();
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AddChildView(background_area_);
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_->Init(profile, NULL);
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_->SetVisible(false);
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_->LoadURL(background_url);
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BackgroundView::EnableShutdownButton(bool enable) {
144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (enable) {
145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (shutdown_button_)
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return;
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    shutdown_button_ = new ShutdownButton();
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    shutdown_button_->Init();
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AddChildView(shutdown_button_);
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!shutdown_button_)
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return;
153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    delete shutdown_button_;
154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    shutdown_button_ = NULL;
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    SchedulePaint();
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::Widget* BackgroundView::CreateWindowContainingView(
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const gfx::Rect& bounds,
1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& background_url,
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    BackgroundView** view) {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResetXCursor();
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WidgetGtk* window = new WidgetGtk(WidgetGtk::TYPE_WINDOW);
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window->Init(NULL, bounds);
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *view = new BackgroundView();
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  (*view)->Init(background_url);
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if ((*view)->ScreenSaverEnabled())
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    (*view)->ShowScreenSaver();
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window->SetContentsView(*view);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  (*view)->UpdateWindowType();
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This keeps the window from flashing at startup.
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkWindow* gdk_window = window->GetNativeView()->window;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gdk_window_set_back_pixmap(gdk_window, NULL, false);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return window;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::SetStatusAreaVisible(bool visible) {
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  status_area_->SetVisible(visible);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid BackgroundView::SetStatusAreaEnabled(bool enable) {
1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  status_area_->EnableButtons(enable);
1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::SetOobeProgressBarVisible(bool visible) {
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!progress_bar_ && visible)
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    InitProgressBar();
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (progress_bar_)
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    progress_bar_->SetVisible(visible);
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::IsOobeProgressBarVisible() {
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return progress_bar_ && progress_bar_->IsVisible();
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::SetOobeProgress(LoginStep step) {
206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(step < STEPS_COUNT);
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (progress_bar_)
208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    progress_bar_->SetStep(GetStepId(step));
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::ShowScreenSaver() {
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(false);
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_area_->SetVisible(true);
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::HideScreenSaver() {
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(true);
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(oshima): we need a way to suspend screen saver
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to save power when it's not visible.
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_area_->SetVisible(false);
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::IsScreenSaverVisible() {
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return ScreenSaverEnabled() && background_area_->IsVisible();
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::ScreenSaverEnabled() {
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return background_area_ != NULL;
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///////////////////////////////////////////////////////////////////////////////
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView protected:
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::Paint(gfx::Canvas* canvas) {
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View::Paint(canvas);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!did_paint_) {
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    did_paint_ = true;
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UpdateWindowType();
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::Layout() {
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kCornerPadding = 5;
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const int kInfoLeftPadding = 15;
245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const int kInfoBottomPadding = 15;
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kInfoBetweenLinesPadding = 4;
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kProgressBarBottomPadding = 20;
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kProgressBarWidth = 750;
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kProgressBarHeight = 70;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size status_area_size = status_area_->GetPreferredSize();
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  status_area_->SetBounds(
2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      width() - status_area_size.width() - kCornerPadding,
2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      kCornerPadding,
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      status_area_size.width(),
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      status_area_size.height());
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size version_size = os_version_label_->GetPreferredSize();
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int os_version_y = height() - version_size.height() - kInfoBottomPadding;
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_official_build_)
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    os_version_y -= version_size.height() - kInfoBetweenLinesPadding;
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetBounds(
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      kInfoLeftPadding,
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      os_version_y,
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      width() - 2 * kInfoLeftPadding,
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      version_size.height());
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_official_build_) {
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_->SetBounds(
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        kInfoLeftPadding,
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        height() - (version_size.height() + kInfoBottomPadding),
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        width() - 2 * kInfoLeftPadding,
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        version_size.height());
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (progress_bar_) {
2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    progress_bar_->SetBounds(
2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        (width() - kProgressBarWidth) / 2,
2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        (height() - kProgressBarBottomPadding - kProgressBarHeight),
2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        kProgressBarWidth,
2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        kProgressBarHeight);
2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
279513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (shutdown_button_) {
280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    shutdown_button_->LayoutIn(this);
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (background_area_)
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_->SetBounds(this->bounds());
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::ChildPreferredSizeChanged(View* child) {
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Layout();
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SchedulePaint();
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgfx::NativeWindow BackgroundView::GetNativeWindow() const {
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTK_WINDOW(static_cast<WidgetGtk*>(GetWidget())->GetNativeView());
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BackgroundView::ShouldOpenButtonOptions(
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const views::View* button_view) const {
298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (button_view == status_area_->network_view()) {
299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return true;
300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (button_view == status_area_->clock_view() ||
302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      button_view == status_area_->input_method_view()) {
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BackgroundView::OpenButtonOptions(const views::View* button_view) {
309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (button_view == status_area_->network_view()) {
310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (proxy_settings_dialog_.get() == NULL) {
311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      proxy_settings_dialog_.reset(new ProxySettingsDialog(
312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          this, GetNativeWindow()));
313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    proxy_settings_dialog_->Show();
315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BackgroundView::IsBrowserMode() const {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BackgroundView::IsScreenLockerMode() const {
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Overridden from LoginHtmlDialog::Delegate:
327513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BackgroundView::OnLocaleChanged() {
328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Proxy settings dialog contains localized strings.
329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  proxy_settings_dialog_.reset();
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///////////////////////////////////////////////////////////////////////////////
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView private:
3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::InitStatusArea() {
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(status_area_ == NULL);
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  status_area_ = new StatusAreaView(this);
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  status_area_->Init();
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddChildView(status_area_);
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::InitInfoLabels() {
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_ = new views::Label();
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetColor(kVersionColor);
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetFont(rb.GetFont(ResourceBundle::SmallFont));
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddChildView(os_version_label_);
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_official_build_) {
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_ = new views::Label();
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_->SetColor(kVersionColor);
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_->SetFont(rb.GetFont(ResourceBundle::SmallFont));
355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AddChildView(boot_times_label_);
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (CrosLibrary::Get()->EnsureLoaded()) {
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    version_loader_.GetVersion(
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        &version_consumer_,
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        NewCallback(this, &BackgroundView::OnVersion),
362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        is_official_build_?
363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            VersionLoader::VERSION_SHORT_WITH_DATE :
364201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            VersionLoader::VERSION_FULL);
365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!is_official_build_) {
366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      boot_times_loader_.GetBootTimes(
367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          &boot_times_consumer_,
368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          NewCallback(this, &BackgroundView::OnBootTimes));
369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    os_version_label_->SetText(
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ASCIIToWide(CrosLibrary::Get()->load_error_string()));
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::InitProgressBar() {
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<int> steps;
378201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  steps.push_back(GetStepId(SELECT_NETWORK));
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  steps.push_back(GetStepId(EULA));
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  steps.push_back(GetStepId(SIGNIN));
3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (WizardController::IsRegisterScreenDefined())
385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    steps.push_back(GetStepId(REGISTRATION));
3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
387201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  steps.push_back(GetStepId(PICTURE));
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  progress_bar_ = new OobeProgressBar(steps);
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AddChildView(progress_bar_);
3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::UpdateWindowType() {
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<int> params;
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  params.push_back(did_paint_ ? 1 : 0);
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WmIpc::instance()->SetWindowType(
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTK_WIDGET(GetNativeWindow()),
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WM_IPC_WINDOW_LOGIN_BACKGROUND,
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &params);
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::OnVersion(
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    VersionLoader::Handle handle, std::string version) {
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(jungshik): Is string concatenation OK here?
404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string version_text = l10n_util::GetStringUTF8(IDS_PRODUCT_OS_NAME);
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  version_text += ' ';
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  version_text += l10n_util::GetStringUTF8(IDS_VERSION_FIELD_PREFIX);
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  version_text += ' ';
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  version_text += version;
409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Workaround over incorrect width calculation in old fonts.
411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // TODO(glotov): remove the following line when new fonts are used.
412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  version_text += ' ';
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetText(UTF8ToWide(version_text));
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::OnBootTimes(
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    BootTimesLoader::Handle handle, BootTimesLoader::BootTimes boot_times) {
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* kBootTimesNoChromeExec =
419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      "Non-firmware boot took %.2f seconds (kernel %.2fs, system %.2fs)";
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* kBootTimesChromeExec =
421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      "Non-firmware boot took %.2f seconds "
422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      "(kernel %.2fs, system %.2fs, chrome %.2fs)";
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string boot_times_text;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (boot_times.chrome > 0) {
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    boot_times_text =
4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::StringPrintf(
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            kBootTimesChromeExec,
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.total,
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.pre_startup,
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.system,
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.chrome);
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    boot_times_text =
4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::StringPrintf(
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            kBootTimesNoChromeExec,
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.total,
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.pre_startup,
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.system);
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use UTF8ToWide once this string is localized.
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  boot_times_label_->SetText(ASCIIToWide(boot_times_text));
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
446