background_view.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 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
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/helper.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/chromeos/login/login_utils.h"
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/oobe_progress_bar.h"
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/proxy_settings_dialog.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/shutdown_button.h"
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/login/wizard_controller.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/clock_menu_button.h"
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/chromeos/status/input_method_menu_button.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/network_menu_button.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/status_area_view.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_ipc.h"
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h"
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/dom_view.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/window.h"
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "googleurl/src/gurl.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/theme_resources.h"
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "third_party/cros/chromeos_wm_ipc_enums.h"
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/x/x11_util.h"
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/gtk_util.h"
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "views/controls/button/text_button.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/screen.h"
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget_gtk.h"
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/window/window.h"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// X Windows headers have "#define Status int". That interferes with
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetworkLibrary header which defines enum "Status".
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <X11/cursorfont.h>  // NOLINT
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <X11/Xcursor/Xcursor.h>  // NOLINT
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::WidgetGtk;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst SkColor kVersionColor = 0xff5c739f;
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Returns the corresponding step id for step constant.
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint GetStepId(size_t step) {
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  switch (step) {
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::SELECT_NETWORK:
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_SELECT_NETWORK;
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::EULA:
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_EULA;
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::SIGNIN:
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_SIGNIN;
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::REGISTRATION:
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_REGISTRATION;
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case chromeos::BackgroundView::PICTURE:
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return IDS_OOBE_PICTURE;
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    default:
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NOTREACHED();
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return 0;
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// The same as TextButton but switches cursor to hand cursor when mouse
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// is over the button.
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TextButtonWithHandCursorOver : public views::TextButton {
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TextButtonWithHandCursorOver(views::ButtonListener* listener,
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                               const std::wstring& text)
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : views::TextButton(listener, text) {
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~TextButtonWithHandCursorOver() {}
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual gfx::NativeCursor GetCursorForPoint(
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ui::EventType event_type,
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const gfx::Point& p) {
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!IsEnabled()) {
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return NULL;
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return gfx::GetCursor(GDK_HAND2);
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(TextButtonWithHandCursorOver);
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This gets rid of the ugly X default cursor.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void ResetXCursor() {
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(sky): nuke this once new window manager is in place.
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Display* display = ui::GetXDisplay();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Cursor cursor = XCreateFontCursor(display, XC_left_ptr);
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  XID root_window = ui::GetX11RootWindow();
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  XSetWindowAttributes attr;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  attr.cursor = cursor;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  XChangeWindowAttributes(display, root_window, CWCursor, &attr);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace chromeos {
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///////////////////////////////////////////////////////////////////////////////
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView public:
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickBackgroundView::BackgroundView()
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : status_area_(NULL),
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_version_label_(NULL),
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      boot_times_label_(NULL),
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      progress_bar_(NULL),
121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      shutdown_button_(NULL),
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      did_paint_(false),
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OFFICIAL_BUILD)
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_official_build_(true),
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#else
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_official_build_(false),
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      background_area_(NULL) {
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::Init(const GURL& background_url) {
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  views::Painter* painter = CreateBackgroundPainter();
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  set_background(views::Background::CreateBackgroundPainter(true, painter));
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InitStatusArea();
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InitInfoLabels();
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!background_url.is_empty()) {
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Profile* profile = ProfileManager::GetDefaultProfile();
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_ = new DOMView();
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    AddChildView(background_area_);
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_->Init(profile, NULL);
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_->SetVisible(false);
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    background_area_->LoadURL(background_url);
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BackgroundView::EnableShutdownButton(bool enable) {
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (enable) {
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (shutdown_button_)
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return;
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    shutdown_button_ = new ShutdownButton();
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    shutdown_button_->Init();
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    AddChildView(shutdown_button_);
153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (!shutdown_button_)
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return;
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    delete shutdown_button_;
157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    shutdown_button_ = NULL;
158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    SchedulePaint();
159201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::Widget* BackgroundView::CreateWindowContainingView(
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const gfx::Rect& bounds,
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& background_url,
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    BackgroundView** view) {
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResetXCursor();
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WidgetGtk* window = new WidgetGtk(WidgetGtk::TYPE_WINDOW);
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window->Init(NULL, bounds);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *view = new BackgroundView();
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  (*view)->Init(background_url);
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if ((*view)->ScreenSaverEnabled())
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    (*view)->ShowScreenSaver();
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window->SetContentsView(*view);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  (*view)->UpdateWindowType();
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This keeps the window from flashing at startup.
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkWindow* gdk_window = window->GetNativeView()->window;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gdk_window_set_back_pixmap(gdk_window, NULL, false);
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  LoginUtils::Get()->SetBackgroundView(*view);
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return window;
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BackgroundView::CreateModalPopup(views::WindowDelegate* view) {
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::Window* window = browser::CreateViewsWindow(
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GetNativeWindow(), gfx::Rect(), view);
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  window->SetIsAlwaysOnTop(true);
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  window->Show();
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsengfx::NativeWindow BackgroundView::GetNativeWindow() const {
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GTK_WINDOW(static_cast<const WidgetGtk*>(GetWidget())->GetNativeView());
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::SetStatusAreaVisible(bool visible) {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  status_area_->SetVisible(visible);
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid BackgroundView::SetStatusAreaEnabled(bool enable) {
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  status_area_->MakeButtonsActive(enable);
2084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
2094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::SetOobeProgressBarVisible(bool visible) {
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!progress_bar_ && visible)
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    InitProgressBar();
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (progress_bar_)
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    progress_bar_->SetVisible(visible);
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::IsOobeProgressBarVisible() {
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return progress_bar_ && progress_bar_->IsVisible();
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::SetOobeProgress(LoginStep step) {
223201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DCHECK(step < STEPS_COUNT);
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (progress_bar_)
225201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    progress_bar_->SetStep(GetStepId(step));
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::ShowScreenSaver() {
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(false);
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_area_->SetVisible(true);
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::HideScreenSaver() {
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SetStatusAreaVisible(true);
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(oshima): we need a way to suspend screen saver
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to save power when it's not visible.
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  background_area_->SetVisible(false);
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::IsScreenSaverVisible() {
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return ScreenSaverEnabled() && background_area_->IsVisible();
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BackgroundView::ScreenSaverEnabled() {
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return background_area_ != NULL;
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///////////////////////////////////////////////////////////////////////////////
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView protected:
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::Paint(gfx::Canvas* canvas) {
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::View::Paint(canvas);
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!did_paint_) {
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    did_paint_ = true;
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UpdateWindowType();
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::Layout() {
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kCornerPadding = 5;
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const int kInfoLeftPadding = 10;
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const int kInfoBottomPadding = 10;
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const int kInfoBetweenLinesPadding = 1;
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kProgressBarBottomPadding = 20;
2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kProgressBarWidth = 750;
2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int kProgressBarHeight = 70;
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size status_area_size = status_area_->GetPreferredSize();
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  status_area_->SetBounds(
2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      width() - status_area_size.width() - kCornerPadding,
2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      kCornerPadding,
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      status_area_size.width(),
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      status_area_size.height());
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Size version_size = os_version_label_->GetPreferredSize();
274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int os_version_y = height() - version_size.height() - kInfoBottomPadding;
275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_official_build_)
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    os_version_y -= (version_size.height() + kInfoBetweenLinesPadding);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetBounds(
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      kInfoLeftPadding,
279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      os_version_y,
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      width() - 2 * kInfoLeftPadding,
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      version_size.height());
282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_official_build_) {
283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_->SetBounds(
284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        kInfoLeftPadding,
285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        height() - (version_size.height() + kInfoBottomPadding),
286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        width() - 2 * kInfoLeftPadding,
287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        version_size.height());
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (progress_bar_) {
2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    progress_bar_->SetBounds(
2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        (width() - kProgressBarWidth) / 2,
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        (height() - kProgressBarBottomPadding - kProgressBarHeight),
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        kProgressBarWidth,
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        kProgressBarHeight);
2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
296513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (shutdown_button_) {
297513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    shutdown_button_->LayoutIn(this);
2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (background_area_)
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    background_area_->SetBoundsRect(this->bounds());
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::ChildPreferredSizeChanged(View* child) {
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Layout();
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SchedulePaint();
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BackgroundView::ShouldOpenButtonOptions(
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const views::View* button_view) const {
310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (button_view == status_area_->network_view()) {
311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return true;
312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (button_view == status_area_->clock_view() ||
314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      button_view == status_area_->input_method_view()) {
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BackgroundView::OpenButtonOptions(const views::View* button_view) {
321513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (button_view == status_area_->network_view()) {
322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (proxy_settings_dialog_.get() == NULL) {
323513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      proxy_settings_dialog_.reset(new ProxySettingsDialog(
324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          this, GetNativeWindow()));
325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    proxy_settings_dialog_->Show();
327513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenStatusAreaHost::ScreenMode BackgroundView::GetScreenMode() const {
33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return kLoginMode;
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Overridden from LoginHtmlDialog::Delegate:
335513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BackgroundView::OnLocaleChanged() {
336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Proxy settings dialog contains localized strings.
337513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  proxy_settings_dialog_.reset();
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick///////////////////////////////////////////////////////////////////////////////
3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// BackgroundView private:
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::InitStatusArea() {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(status_area_ == NULL);
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  status_area_ = new StatusAreaView(this);
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  status_area_->Init();
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddChildView(status_area_);
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::InitInfoLabels() {
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_ = new views::Label();
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetColor(kVersionColor);
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetFont(rb.GetFont(ResourceBundle::SmallFont));
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddChildView(os_version_label_);
358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!is_official_build_) {
359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_ = new views::Label();
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_->SetColor(kVersionColor);
362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    boot_times_label_->SetFont(rb.GetFont(ResourceBundle::SmallFont));
363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AddChildView(boot_times_label_);
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (CrosLibrary::Get()->EnsureLoaded()) {
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    version_loader_.GetVersion(
368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        &version_consumer_,
369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        NewCallback(this, &BackgroundView::OnVersion),
370201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        is_official_build_?
371201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            VersionLoader::VERSION_SHORT_WITH_DATE :
372201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            VersionLoader::VERSION_FULL);
373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!is_official_build_) {
374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      boot_times_loader_.GetBootTimes(
375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          &boot_times_consumer_,
376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          NewCallback(this, &BackgroundView::OnBootTimes));
377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    os_version_label_->SetText(
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ASCIIToWide(CrosLibrary::Get()->load_error_string()));
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundView::InitProgressBar() {
3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<int> steps;
386201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  steps.push_back(GetStepId(SELECT_NETWORK));
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
388201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  steps.push_back(GetStepId(EULA));
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
390201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  steps.push_back(GetStepId(SIGNIN));
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OFFICIAL_BUILD)
392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (WizardController::IsRegisterScreenDefined())
393201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    steps.push_back(GetStepId(REGISTRATION));
3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
395201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  steps.push_back(GetStepId(PICTURE));
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  progress_bar_ = new OobeProgressBar(steps);
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AddChildView(progress_bar_);
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::UpdateWindowType() {
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<int> params;
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  params.push_back(did_paint_ ? 1 : 0);
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WmIpc::instance()->SetWindowType(
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTK_WIDGET(GetNativeWindow()),
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WM_IPC_WINDOW_LOGIN_BACKGROUND,
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &params);
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::OnVersion(
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    VersionLoader::Handle handle, std::string version) {
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(jungshik): Is string concatenation OK here?
412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string version_text = l10n_util::GetStringUTF8(IDS_PRODUCT_OS_NAME);
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  version_text += ' ';
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  version_text += l10n_util::GetStringUTF8(IDS_VERSION_FIELD_PREFIX);
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  version_text += ' ';
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  version_text += version;
417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Workaround over incorrect width calculation in old fonts.
419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // TODO(glotov): remove the following line when new fonts are used.
420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  version_text += ' ';
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  os_version_label_->SetText(UTF8ToWide(version_text));
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundView::OnBootTimes(
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    BootTimesLoader::Handle handle, BootTimesLoader::BootTimes boot_times) {
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* kBootTimesNoChromeExec =
427201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      "Non-firmware boot took %.2f seconds (kernel %.2fs, system %.2fs)";
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* kBootTimesChromeExec =
429201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      "Non-firmware boot took %.2f seconds "
430201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      "(kernel %.2fs, system %.2fs, chrome %.2fs)";
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string boot_times_text;
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (boot_times.chrome > 0) {
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    boot_times_text =
4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::StringPrintf(
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            kBootTimesChromeExec,
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.total,
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.pre_startup,
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.system,
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.chrome);
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    boot_times_text =
4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::StringPrintf(
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            kBootTimesNoChromeExec,
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.total,
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.pre_startup,
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            boot_times.system);
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use UTF8ToWide once this string is localized.
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  boot_times_label_->SetText(ASCIIToWide(boot_times_text));
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
454