1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian 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#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_BACKGROUND_VIEW_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_LOGIN_BACKGROUND_VIEW_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/boot_times_loader.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/cros_library.h"
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/login/login_html_dialog.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/status/status_area_host.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/chromeos/version_loader.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/cloud_policy_subsystem.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/view.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace views {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Label;
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TextButton;
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass Widget;
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass WindowDelegate;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass DOMView;
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass GURL;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass OobeProgressBar;
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ShutdownButton;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass StatusAreaView;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// View used to render the background during login. BackgroundView contains
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// StatusAreaView.
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass BackgroundView : public views::View,
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       public StatusAreaHost,
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       public chromeos::LoginHtmlDialog::Delegate,
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       public policy::CloudPolicySubsystem::Observer {
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  enum LoginStep {
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SELECT_NETWORK,
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EULA,
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    SIGNIN,
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    REGISTRATION,
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    PICTURE,
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Steps count, must be the last in the enum.
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    STEPS_COUNT
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackgroundView();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Initializes the background view. It backgroun_url is given (non empty),
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // it creates a DOMView background area that renders a webpage.
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void Init(const GURL& background_url);
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Enable/disable shutdown button.
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void EnableShutdownButton(bool enable);
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a window containing an instance of WizardContentsView as the root
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // view. The caller is responsible for showing (and closing) the returned
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // widget. The BackgroundView is set in |view|. If background_url is non
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // empty, the content page of the url is displayed as a background.
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static views::Widget* CreateWindowContainingView(
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const gfx::Rect& bounds,
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const GURL& background_url,
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      BackgroundView** view);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Create a modal popup view.
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void CreateModalPopup(views::WindowDelegate* view);
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Overridden from StatusAreaHost:
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual gfx::NativeWindow GetNativeWindow() const;
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Toggles status area visibility.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetStatusAreaVisible(bool visible);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Toggles whether status area is enabled.
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetStatusAreaEnabled(bool enable);
814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Toggles OOBE progress bar visibility, the bar is hidden by default.
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetOobeProgressBarVisible(bool visible);
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Gets progress bar visibility.
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool IsOobeProgressBarVisible();
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Sets current step on OOBE progress bar.
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetOobeProgress(LoginStep step);
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Shows screen saver.
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void ShowScreenSaver();
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Hides screen saver.
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void HideScreenSaver();
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Tells if screen saver is visible.
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool IsScreenSaverVisible();
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Tells if screen saver is enabled.
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool ScreenSaverEnabled();
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overridden from views::View:
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Layout() OVERRIDE;
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChildPreferredSizeChanged(View* child) OVERRIDE;
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnLocaleChanged() OVERRIDE;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overridden from StatusAreaHost:
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Profile* GetProfile() const OVERRIDE { return NULL; }
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ExecuteBrowserCommand(int id) const OVERRIDE {}
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ShouldOpenButtonOptions(
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const views::View* button_view) const OVERRIDE;
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OpenButtonOptions(const views::View* button_view) OVERRIDE;
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ScreenMode GetScreenMode() const OVERRIDE;
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual TextStyle GetTextStyle() const OVERRIDE;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Overridden from LoginHtmlDialog::Delegate:
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnDialogClosed() OVERRIDE {}
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates and adds the status_area.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitStatusArea();
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates and adds the labels for version and boot time.
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InitInfoLabels();
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Creates and add OOBE progress bar.
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void InitProgressBar();
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invokes SetWindowType for the window. This is invoked during startup and
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // after we've painted.
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateWindowType();
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Update the version label.
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void UpdateVersionLabel();
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Check and update enterprise domain.
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void UpdateEnterpriseInfo();
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set enterprise domain name.
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEnterpriseInfo(const std::string& domain_name,
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         const std::string& status_text);
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback from chromeos::VersionLoader giving the version.
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnVersion(VersionLoader::Handle handle, std::string version);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback from chromeos::InfoLoader giving the boot times.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnBootTimes(
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      BootTimesLoader::Handle handle, BootTimesLoader::BootTimes boot_times);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // policy::CloudPolicySubsystem::Observer methods:
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnPolicyStateChanged(
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      policy::CloudPolicySubsystem::PolicySubsystemState state,
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      policy::CloudPolicySubsystem::ErrorDetails error_details);
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // All of these variables could be NULL.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StatusAreaView* status_area_;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Label* os_version_label_;
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Label* boot_times_label_;
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  OobeProgressBar* progress_bar_;
160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ShutdownButton* shutdown_button_;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles asynchronously loading the version.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VersionLoader version_loader_;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to request the version.
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CancelableRequestConsumer version_consumer_;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles asynchronously loading the boot times.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BootTimesLoader boot_times_loader_;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to request the boot times.
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CancelableRequestConsumer boot_times_consumer_;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Has Paint been invoked once? The value of this is passed to the window
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // manager.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(sky): nuke this when the wm knows when chrome has painted.
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool did_paint_;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // True if running official BUILD.
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool is_official_build_;
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // DOMView for rendering a webpage as a background.
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DOMView* background_area_;
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Information pieces for version label.
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string version_text_;
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string enterprise_domain_text_;
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string enterprise_status_text_;
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Proxy settings dialog that can be invoked from network menu.
189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<LoginHtmlDialog> proxy_settings_dialog_;
190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // CloudPolicySubsysterm observer registrar
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<policy::CloudPolicySubsystem::ObserverRegistrar>
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      cloud_policy_registrar_;
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BackgroundView);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_BACKGROUND_VIEW_H_
201