15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <signal.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback_helpers.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/strings/utf_string_conversions.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/customization_document.h"
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/geolocation/simple_geolocation_provider.h"
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/existing_user_controller.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/helper.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/hwid_checker.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/login_utils.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.h"
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/error_screen.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/eula_screen.h"
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/chromeos/login/screens/hid_detection_screen.h"
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/login/screens/kiosk_autolaunch_screen.h"
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/chromeos/login/screens/kiosk_enable_screen.h"
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/network_screen.h"
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/reset_screen.h"
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/terms_of_service_screen.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/update_screen.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/user_image_screen.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/wrong_hwid_screen.h"
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h"
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host.h"
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/oobe_display.h"
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user_manager.h"
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/net/delay_network_call.h"
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/net/network_portal_detector.h"
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/timezone/timezone_provider.h"
578f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu#include "chrome/browser/lifetime/application_lifetime.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/options/options_util.h"
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/chrome_constants.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/audio/cras_audio_handler.h"
65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chromeos/chromeos_constants.h"
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/session_manager_client.h"
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/network/network_state.h"
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chromeos/settings/timezone_settings.h"
738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/breakpad/app/breakpad_linux.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/notification_types.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If reboot didn't happen, ask user to reboot device manually.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kWaitForRebootTimeSec = 3;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Interval in ms which is used for smooth screen showing.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int kShowDelayMs = 400;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Total timezone resolving process timeout.
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst unsigned int kResolveTimeZoneTimeoutSeconds = 60;
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Stores the list of all screens that should be shown when resuming OOBE.
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char *kResumableScreens[] = {
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chromeos::WizardController::kNetworkScreenName,
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chromeos::WizardController::kUpdateScreenName,
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chromeos::WizardController::kEulaScreenName,
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chromeos::WizardController::kEnrollmentScreenName,
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chromeos::WizardController::kTermsOfServiceScreenName,
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chromeos::WizardController::kAutoEnrollmentCheckScreenName
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Checks flag for HID-detection screen show.
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool CanShowHIDDetectionScreen() {
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return !CommandLine::ForCurrentProcess()->HasSwitch(
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        chromeos::switches::kDisableHIDDetectionOnOOBE);
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsResumableScreen(const std::string& screen) {
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kResumableScreens); ++i) {
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (screen == kResumableScreens[i])
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WizardController::kNetworkScreenName[] = "network";
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WizardController::kLoginScreenName[] = "login";
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WizardController::kUpdateScreenName[] = "update";
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WizardController::kUserImageScreenName[] = "image";
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WizardController::kEulaScreenName[] = "eula";
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char WizardController::kEnrollmentScreenName[] = "enroll";
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WizardController::kResetScreenName[] = "reset";
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char WizardController::kKioskEnableScreenName[] = "kiosk-enable";
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char WizardController::kKioskAutolaunchScreenName[] = "autolaunch";
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char WizardController::kErrorScreenName[] = "error-message";
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char WizardController::kTermsOfServiceScreenName[] = "tos";
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char WizardController::kAutoEnrollmentCheckScreenName[] =
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  "auto-enrollment-check";
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char WizardController::kWrongHWIDScreenName[] = "wrong-hwid";
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char WizardController::kLocallyManagedUserCreationScreenName[] =
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "locally-managed-user-creation-flow";
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char WizardController::kAppLaunchSplashScreenName[] =
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  "app-launch-splash";
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char WizardController::kHIDDetectionScreenName[] = "hid-detection";
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int WizardController::kMinAudibleOutputVolumePercent = 10;
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Passing this parameter as a "first screen" initiates full OOBE flow.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WizardController::kOutOfBoxScreenName[] = "oobe";
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Special test value that commands not to create any window yet.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WizardController::kTestNoScreenName[] = "test:nowindow";
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize default controller.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WizardController* WizardController::default_controller_ = NULL;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WizardController::skip_post_login_screens_ = false;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WizardController::zero_delay_enabled_ = false;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WizardController, public:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PrefService* WizardController::local_state_for_testing_ = NULL;
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WizardController::WizardController(chromeos::LoginDisplayHost* host,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   chromeos::OobeDisplay* oobe_display)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : current_screen_(NULL),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      previous_screen_(NULL),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_official_build_(true),
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_official_build_(false),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_out_of_box_(false),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host_(host),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      oobe_display_(oobe_display),
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      usage_statistics_reporting_(true),
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      skip_update_enroll_after_eula_(false),
1778f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu      enrollment_recovery_(ShouldRecoverEnrollment()),
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      login_screen_started_(false),
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      user_image_screen_return_to_previous_hack_(false),
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      timezone_resolved_(false),
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      weak_factory_(this) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(default_controller_ == NULL);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_controller_ = this;
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AccessibilityManager* accessibility_manager = AccessibilityManager::Get();
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHECK(accessibility_manager);
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  accessibility_subscription_ = accessibility_manager->RegisterCallback(
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::Bind(&WizardController::OnAccessibilityStatusChanged,
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 base::Unretained(this)));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WizardController::~WizardController() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (default_controller_ == this) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_controller_ = NULL;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "More than one controller are alive.";
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WizardController::Init(
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& first_screen_name,
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> screen_parameters) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Starting OOBE wizard with screen: " << first_screen_name;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  first_screen_name_ = first_screen_name;
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  screen_parameters_ = screen_parameters.Pass();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool oobe_complete = StartupUtils::IsOobeCompleted();
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!oobe_complete || first_screen_name == kOutOfBoxScreenName)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_out_of_box_ = true;
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is a hacky way to check for local state corruption, because
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // it depends on the fact that the local state is loaded
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // synchroniously and at the first demand. IsEnterpriseManaged()
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // check is required because currently powerwash is disabled for
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // enterprise-entrolled devices.
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO (ygorshenin@): implement handling of the local state
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // corruption in the case of asynchronious loading.
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  //
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO (ygorshenin@): remove IsEnterpriseManaged() check once
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // crbug.com/241313 will be fixed.
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!connector->IsEnterpriseManaged()) {
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const PrefService::PrefInitializationStatus status =
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        GetLocalState()->GetInitializationStatus();
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (status == PrefService::INITIALIZATION_STATUS_ERROR) {
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      OnLocalStateInitialized(false);
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return;
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else if (status == PrefService::INITIALIZATION_STATUS_WAITING) {
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetLocalState()->AddPrefInitObserver(
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          base::Bind(&WizardController::OnLocalStateInitialized,
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                     weak_factory_.GetWeakPtr()));
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string screen_pref =
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetLocalState()->GetString(prefs::kOobeScreenPending);
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_out_of_box_ && !screen_pref.empty() && (first_screen_name.empty() ||
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      first_screen_name == WizardController::kTestNoScreenName)) {
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    first_screen_name_ = screen_pref;
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AdvanceToScreen(first_screen_name_);
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsMachineHWIDCorrect() && !StartupUtils::IsDeviceRegistered() &&
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      first_screen_name_.empty())
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShowWrongHWIDScreen();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::NetworkScreen* WizardController::GetNetworkScreen() {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!network_screen_.get())
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_screen_.reset(new chromeos::NetworkScreen(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, oobe_display_->GetNetworkScreenActor()));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return network_screen_.get();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::UpdateScreen* WizardController::GetUpdateScreen() {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!update_screen_.get()) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_screen_.reset(new chromeos::UpdateScreen(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, oobe_display_->GetUpdateScreenActor()));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_screen_->SetRebootCheckDelay(kWaitForRebootTimeSec);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return update_screen_.get();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::UserImageScreen* WizardController::GetUserImageScreen() {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!user_image_screen_.get())
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_image_screen_.reset(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new chromeos::UserImageScreen(
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            this, oobe_display_->GetUserImageScreenActor()));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return user_image_screen_.get();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::EulaScreen* WizardController::GetEulaScreen() {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!eula_screen_.get())
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    eula_screen_.reset(new chromeos::EulaScreen(
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this, oobe_display_->GetEulaScreenActor()));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return eula_screen_.get();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chromeos::EnrollmentScreen*
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WizardController::GetEnrollmentScreen() {
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!enrollment_screen_.get()) {
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    enrollment_screen_.reset(
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new chromeos::EnrollmentScreen(
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            this, oobe_display_->GetEnrollmentScreenActor()));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return enrollment_screen_.get();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos::ResetScreen* WizardController::GetResetScreen() {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reset_screen_.get()) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reset_screen_.reset(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new chromeos::ResetScreen(this, oobe_display_->GetResetScreenActor()));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reset_screen_.get();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)chromeos::KioskEnableScreen* WizardController::GetKioskEnableScreen() {
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!kiosk_enable_screen_.get()) {
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    kiosk_enable_screen_.reset(
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        new chromeos::KioskEnableScreen(
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            this,
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            oobe_display_->GetKioskEnableScreenActor()));
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return kiosk_enable_screen_.get();
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)chromeos::KioskAutolaunchScreen* WizardController::GetKioskAutolaunchScreen() {
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!autolaunch_screen_.get()) {
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    autolaunch_screen_.reset(
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new chromeos::KioskAutolaunchScreen(
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            this, oobe_display_->GetKioskAutolaunchScreenActor()));
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return autolaunch_screen_.get();
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)chromeos::TermsOfServiceScreen* WizardController::GetTermsOfServiceScreen() {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!terms_of_service_screen_.get()) {
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    terms_of_service_screen_.reset(
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new chromeos::TermsOfServiceScreen(
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this, oobe_display_->GetTermsOfServiceScreenActor()));
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return terms_of_service_screen_.get();
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)chromeos::WrongHWIDScreen* WizardController::GetWrongHWIDScreen() {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!wrong_hwid_screen_.get()) {
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wrong_hwid_screen_.reset(
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new chromeos::WrongHWIDScreen(
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this, oobe_display_->GetWrongHWIDScreenActor()));
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return wrong_hwid_screen_.get();
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)chromeos::AutoEnrollmentCheckScreen*
33646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    WizardController::GetAutoEnrollmentCheckScreen() {
33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!auto_enrollment_check_screen_.get()) {
33846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    auto_enrollment_check_screen_.reset(
33946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new chromeos::AutoEnrollmentCheckScreen(
34046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            this,
34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            oobe_display_->GetAutoEnrollmentCheckScreenActor()));
34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return auto_enrollment_check_screen_.get();
34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)chromeos::LocallyManagedUserCreationScreen*
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WizardController::GetLocallyManagedUserCreationScreen() {
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!locally_managed_user_creation_screen_.get()) {
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    locally_managed_user_creation_screen_.reset(
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new chromeos::LocallyManagedUserCreationScreen(
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            this, oobe_display_->GetLocallyManagedUserCreationScreenActor()));
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return locally_managed_user_creation_screen_.get();
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
356a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochchromeos::HIDDetectionScreen* WizardController::GetHIDDetectionScreen() {
357a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!hid_detection_screen_.get()) {
358a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    hid_detection_screen_.reset(
359a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        new chromeos::HIDDetectionScreen(
360a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            this, oobe_display_->GetHIDDetectionScreenActor()));
361a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
362a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return hid_detection_screen_.get();
363a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
364a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::ShowNetworkScreen() {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Showing network screen.";
3670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Hide the status area initially; it only appears after OOBE first animates
3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // in. Keep it visible if the user goes back to the existing network screen.
3690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetStatusAreaVisible(network_screen_.get());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCurrentScreen(GetNetworkScreen());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WizardController::ShowLoginScreen(const LoginScreenContext& context) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!time_eula_accepted_.is_null()) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta delta = base::Time::Now() - time_eula_accepted_;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UMA_HISTOGRAM_MEDIUM_TIMES("OOBE.EULAToSignInTime", delta);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Showing login screen.";
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStatusAreaVisible(true);
380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->StartSignInScreen(context);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  smooth_show_timer_.Stop();
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oobe_display_ = NULL;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  login_screen_started_ = true;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::ResumeLoginScreen() {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Resuming login screen.";
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStatusAreaVisible(true);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->ResumeSignInScreen();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  smooth_show_timer_.Stop();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oobe_display_ = NULL;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::ShowUpdateScreen() {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Showing update screen.";
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStatusAreaVisible(true);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCurrentScreen(GetUpdateScreen());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::ShowUserImageScreen() {
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const chromeos::UserManager* user_manager = chromeos::UserManager::Get();
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Skip user image selection for public sessions and ephemeral logins.
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (user_manager->IsLoggedInAsPublicAccount() ||
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_manager->IsCurrentUserNonCryptohomeDataEphemeral()) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnUserImageSkipped();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Showing user image screen.";
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool profile_picture_enabled = true;
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string user_id;
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (screen_parameters_.get()) {
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_parameters_->GetBoolean("profile_picture_enabled",
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &profile_picture_enabled);
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen_parameters_->GetString("user_id", &user_id);
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Status area has been already shown at sign in screen so it
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't make sense to hide it here and then show again at user session as
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this produces undesired UX transitions.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStatusAreaVisible(true);
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UserImageScreen* screen = GetUserImageScreen();
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!user_id.empty())
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screen->SetUserID(user_id);
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  screen->SetProfilePictureEnabled(profile_picture_enabled);
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCurrentScreen(screen);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::ShowEulaScreen() {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Showing EULA screen.";
4330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SetStatusAreaVisible(true);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCurrentScreen(GetEulaScreen());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WizardController::ShowEnrollmentScreen() {
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VLOG(1) << "Showing enrollment screen.";
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStatusAreaVisible(true);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_auto_enrollment = false;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string user;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (screen_parameters_.get()) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screen_parameters_->GetBoolean("is_auto_enrollment", &is_auto_enrollment);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screen_parameters_->GetString("user", &user);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
449effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EnrollmentScreenActor::EnrollmentMode mode =
450effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL;
4518f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  EnrollmentScreen* screen = GetEnrollmentScreen();
4528f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  std::string enrollment_domain = GetForcedEnrollmentDomain();
4538f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  if (is_auto_enrollment) {
454effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    mode = EnrollmentScreenActor::ENROLLMENT_MODE_AUTO;
4558f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  } else if (enrollment_recovery_) {
4568f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu    mode = EnrollmentScreenActor::ENROLLMENT_MODE_RECOVERY;
4578f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu    enrollment_domain = GetEnrollmentRecoveryDomain();
4588f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  } else if (ShouldAutoStartEnrollment() && !CanExitEnrollment()) {
459bee9932bab44713b74b422b4b759b49f5a222977Bo Liu    mode = EnrollmentScreenActor::ENROLLMENT_MODE_FORCED;
4608f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  }
461effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
4628f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  screen->SetParameters(mode, enrollment_domain, user);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCurrentScreen(screen);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::ShowResetScreen() {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Showing reset screen.";
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStatusAreaVisible(false);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCurrentScreen(GetResetScreen());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WizardController::ShowKioskEnableScreen() {
4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  VLOG(1) << "Showing kiosk enable screen.";
4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetStatusAreaVisible(false);
4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetCurrentScreen(GetKioskEnableScreen());
4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WizardController::ShowKioskAutolaunchScreen() {
479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VLOG(1) << "Showing kiosk autolaunch screen.";
480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetStatusAreaVisible(false);
481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetCurrentScreen(GetKioskAutolaunchScreen());
482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WizardController::ShowTermsOfServiceScreen() {
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only show the Terms of Service when logging into a public account and Terms
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of Service have been specified through policy. In all other cases, advance
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to the user image screen immediately.
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!chromeos::UserManager::Get()->IsLoggedInAsPublicAccount() ||
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !ProfileManager::GetActiveUserProfile()->GetPrefs()->
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          IsManagedPreference(prefs::kTermsOfServiceURL)) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShowUserImageScreen();
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "Showing Terms of Service screen.";
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetStatusAreaVisible(true);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCurrentScreen(GetTermsOfServiceScreen());
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WizardController::ShowWrongHWIDScreen() {
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "Showing wrong HWID screen.";
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetStatusAreaVisible(false);
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCurrentScreen(GetWrongHWIDScreen());
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void WizardController::ShowAutoEnrollmentCheckScreen() {
50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  VLOG(1) << "Showing Auto-enrollment check screen.";
50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetStatusAreaVisible(true);
50946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  AutoEnrollmentCheckScreen* screen = GetAutoEnrollmentCheckScreen();
51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  screen->set_auto_enrollment_controller(host_->GetAutoEnrollmentController());
51146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetCurrentScreen(screen);
51246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
51346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WizardController::ShowLocallyManagedUserCreationScreen() {
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VLOG(1) << "Showing Locally managed user creation screen screen.";
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetStatusAreaVisible(true);
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LocallyManagedUserCreationScreen* screen =
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetLocallyManagedUserCreationScreen();
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCurrentScreen(screen);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid WizardController::ShowHIDDetectionScreen() {
523a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  VLOG(1) << "Showing HID discovery screen.";
524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetStatusAreaVisible(true);
525a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  SetCurrentScreen(GetHIDDetectionScreen());
526a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
527a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WizardController::SkipToLoginForTesting(
529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const LoginScreenContext& context) {
530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VLOG(1) << "SkipToLoginForTesting.";
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StartupUtils::MarkEulaAccepted();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PerformPostEulaActions();
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OnOOBECompleted();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::AddObserver(Observer* observer) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.AddObserver(observer);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::RemoveObserver(Observer* observer) {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.RemoveObserver(observer);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnSessionStart() {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observer_list_, OnSessionStart());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void WizardController::SkipUpdateEnrollAfterEula() {
54946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  skip_update_enroll_after_eula_ = true;
55046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
55146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WizardController, ExitHandlers:
554a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid WizardController::OnHIDDetectionCompleted() {
555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Check for tests configuration.
556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!StartupUtils::IsOobeCompleted())
557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ShowNetworkScreen();
558a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
559a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnNetworkConnected() {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_official_build_) {
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!StartupUtils::IsEulaAccepted()) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowEulaScreen();
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Possible cases:
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // 1. EULA was accepted, forced shutdown/reboot during update.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // 2. EULA was accepted, planned reboot after update.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Make sure that device is up-to-date.
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InitiateOOBEUpdate();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitiateOOBEUpdate();
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnNetworkOffline() {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(dpolukhin): if(is_out_of_box_) we cannot work offline and
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should report some error message here and stay on the same screen.
579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ShowLoginScreen(LoginScreenContext());
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnConnectionFailed() {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(dpolukhin): show error message after login screen is displayed.
584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ShowLoginScreen(LoginScreenContext());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnUpdateCompleted() {
58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ShowAutoEnrollmentCheckScreen();
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnEulaAccepted() {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  time_eula_accepted_ = base::Time::Now();
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StartupUtils::MarkEulaAccepted();
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool uma_enabled =
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OptionsUtil::ResolveMetricsReportingEnabled(usage_statistics_reporting_);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrosSettings::Get()->SetBoolean(kStatsReportingPref, uma_enabled);
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (uma_enabled) {
5997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(GOOGLE_CHROME_BUILD)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The crash reporter initialization needs IO to complete.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ThreadRestrictions::ScopedAllowIO allow_io;
602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    breakpad::InitCrashReporter(std::string());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (skip_update_enroll_after_eula_) {
60746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    PerformPostEulaActions();
608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ShowAutoEnrollmentCheckScreen();
60946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
61046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    InitiateOOBEUpdate();
61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnUpdateErrorCheckingForUpdate() {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(nkostylev): Update should be required during OOBE.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do not want to block users from being able to proceed to the login
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // screen if there is any error checking for an update.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // They could use "browse without sign-in" feature to set up the network to be
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // able to perform the update later.
620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnUpdateCompleted();
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnUpdateErrorUpdating() {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there was an error while getting or applying the update,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return to network selection screen.
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(nkostylev): Show message to the user explaining update error.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(nkostylev): Update should be required during OOBE.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary fix, need to migrate to new API. http://crosbug.com/4321
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OnUpdateCompleted();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WizardController::EnableUserImageScreenReturnToPreviousHack() {
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  user_image_screen_return_to_previous_hack_ = true;
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnUserImageSelected() {
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (user_image_screen_return_to_previous_hack_) {
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_image_screen_return_to_previous_hack_ = false;
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(previous_screen_);
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (previous_screen_) {
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SetCurrentScreen(previous_screen_);
642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch browser and delete login host controller.
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI,
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&chromeos::LoginUtils::DoBrowserLaunch,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(chromeos::LoginUtils::Get()),
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 ProfileManager::GetActiveUserProfile(), host_));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_ = NULL;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnUserImageSkipped() {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnUserImageSelected();
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WizardController::OnEnrollmentDone() {
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Mark OOBE as completed only if enterprise enrollment was part of the
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // forced flow (i.e. app kiosk).
6628f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  if (ShouldAutoStartEnrollment() || enrollment_recovery_)
663effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PerformOOBECompletedActions();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(mnissler): Unify the logic for auto-login for Public Sessions and
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Kiosk Apps and make this code cover both cases: http://crbug.com/234694.
667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (KioskAppManager::Get()->IsAutoLaunchEnabled())
668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    AutoLaunchKioskApp();
669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else
670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ShowLoginScreen(LoginScreenContext());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnResetCanceled() {
6740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (previous_screen_) {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetCurrentScreen(previous_screen_);
6760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  } else {
677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ShowLoginScreen(LoginScreenContext());
6780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WizardController::OnKioskAutolaunchCanceled() {
682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ShowLoginScreen(LoginScreenContext());
683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
684868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WizardController::OnKioskAutolaunchConfirmed() {
686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(KioskAppManager::Get()->IsAutoLaunchEnabled());
687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AutoLaunchKioskApp();
688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WizardController::OnKioskEnableCompleted() {
691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ShowLoginScreen(LoginScreenContext());
6927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WizardController::OnWrongHWIDWarningSkipped() {
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (previous_screen_)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetCurrentScreen(previous_screen_);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ShowLoginScreen(LoginScreenContext());
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WizardController::OnAutoEnrollmentDone() {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Automagic enrollment done, resuming previous signin";
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResumeLoginScreen();
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnOOBECompleted() {
7078f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  if (ShouldAutoStartEnrollment() || enrollment_recovery_) {
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ShowEnrollmentScreen();
709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
710effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PerformOOBECompletedActions();
711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ShowLoginScreen(LoginScreenContext());
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WizardController::OnTermsOfServiceDeclined() {
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the user declines the Terms of Service, end the session and return to
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the login screen.
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DBusThreadManager::Get()->GetSessionManagerClient()->StopSession();
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WizardController::OnTermsOfServiceAccepted() {
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the user accepts the Terms of Service, advance to the user image screen.
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowUserImageScreen();
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::InitiateOOBEUpdate() {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PerformPostEulaActions();
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCurrentScreenSmooth(GetUpdateScreen(), true);
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetUpdateScreen()->StartNetworkCheck();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid WizardController::StartTimezoneResolve() {
7330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  geolocation_provider_.reset(new SimpleGeolocationProvider(
7340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      g_browser_process->system_request_context(),
7350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      SimpleGeolocationProvider::DefaultGeolocationProviderURL()));
7360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  geolocation_provider_->RequestGeolocation(
7370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::TimeDelta::FromSeconds(kResolveTimeZoneTimeoutSeconds),
7380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::Bind(&WizardController::OnLocationResolved,
7390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 weak_factory_.GetWeakPtr()));
740effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
741effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::PerformPostEulaActions() {
743effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DelayNetworkCall(
744effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&WizardController::StartTimezoneResolve,
745effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 weak_factory_.GetWeakPtr()),
746effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::TimeDelta::FromMilliseconds(kDefaultNetworkRetryDelayMS));
7470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DelayNetworkCall(
7480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ServicesCustomizationDocument::GetInstance()
7490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          ->EnsureCustomizationAppliedClosure(),
7500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::TimeDelta::FromMilliseconds(kDefaultNetworkRetryDelayMS));
751effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that EULA has been accepted (for official builds), enable portal check.
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChromiumOS builds would go though this code path too.
754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NetworkHandler::Get()->network_state_handler()->SetCheckPortalList(
755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      NetworkStateHandler::kDefaultCheckPortalList);
756effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  host_->GetAutoEnrollmentController()->Start();
7577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  host_->PrewarmAuthentication();
7588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  NetworkPortalDetector::Get()->Enable(true);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WizardController::PerformOOBECompletedActions() {
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StartupUtils::MarkOobeCompleted();
763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS_100(
764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "HIDDetection.TimesDialogShownPerOOBECompleted",
765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetLocalState()->GetInteger(prefs::kTimesHIDDialogShown));
766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetLocalState()->ClearPref(prefs::kTimesHIDDialogShown);
7678f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu
7688f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  if (enrollment_recovery_)
7698f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu    chrome::AttemptRestart();
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::SetCurrentScreen(WizardScreen* new_current) {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCurrentScreenSmooth(new_current, false);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::ShowCurrentScreen() {
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShowCurrentScreen may get called by smooth_show_timer_ even after
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flow has been switched to sign in screen (ExistingUserController).
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!oobe_display_)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // First remember how far have we reached so that we can resume if needed.
783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_out_of_box_ && IsResumableScreen(current_screen_->GetName()))
784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    StartupUtils::SaveOobePendingScreen(current_screen_->GetName());
785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  smooth_show_timer_.Stop();
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observer_list_, OnScreenChanged(current_screen_));
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oobe_display_->ShowScreen(current_screen_);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::SetCurrentScreenSmooth(WizardScreen* new_current,
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              bool use_smoothing) {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_screen_ == new_current ||
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_current == NULL ||
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      oobe_display_ == NULL) {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  smooth_show_timer_.Stop();
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_screen_)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    oobe_display_->HideScreen(current_screen_);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  previous_screen_ = current_screen_;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_screen_ = new_current;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_smoothing) {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    smooth_show_timer_.Start(
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(kShowDelayMs),
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this,
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &WizardController::ShowCurrentScreen);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowCurrentScreen();
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::SetStatusAreaVisible(bool visible) {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetStatusAreaVisible(visible);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::AdvanceToScreen(const std::string& screen_name) {
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (screen_name == kNetworkScreenName) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowNetworkScreen();
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (screen_name == kLoginScreenName) {
828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ShowLoginScreen(LoginScreenContext());
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (screen_name == kUpdateScreenName) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitiateOOBEUpdate();
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (screen_name == kUserImageScreenName) {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowUserImageScreen();
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (screen_name == kEulaScreenName) {
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowEulaScreen();
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (screen_name == kResetScreenName) {
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowResetScreen();
8377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  } else if (screen_name == kKioskEnableScreenName) {
8387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ShowKioskEnableScreen();
839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (screen_name == kKioskAutolaunchScreenName) {
840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ShowKioskAutolaunchScreen();
841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (screen_name == kEnrollmentScreenName) {
842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ShowEnrollmentScreen();
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (screen_name == kTermsOfServiceScreenName) {
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShowTermsOfServiceScreen();
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (screen_name == kWrongHWIDScreenName) {
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShowWrongHWIDScreen();
84746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else if (screen_name == kAutoEnrollmentCheckScreenName) {
84846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ShowAutoEnrollmentCheckScreen();
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (screen_name == kLocallyManagedUserCreationScreenName) {
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShowLocallyManagedUserCreationScreen();
8513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (screen_name == kAppLaunchSplashScreenName) {
8523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    AutoLaunchKioskApp();
853a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } else if (screen_name == kHIDDetectionScreenName) {
854a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ShowHIDDetectionScreen();
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (screen_name != kTestNoScreenName) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_out_of_box_) {
857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (CanShowHIDDetectionScreen())
858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ShowHIDDetectionScreen();
859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      else
860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        ShowNetworkScreen();
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ShowLoginScreen(LoginScreenContext());
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WizardController, chromeos::ScreenObserver overrides:
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnExit(ExitCodes exit_code) {
870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  VLOG(1) << "Wizard screen exit code: " << exit_code;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (exit_code) {
872a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case HID_DETECTION_COMPLETED:
873a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      OnHIDDetectionCompleted();
874a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      break;
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case NETWORK_CONNECTED:
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnNetworkConnected();
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CONNECTION_FAILED:
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnConnectionFailed();
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UPDATE_INSTALLED:
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UPDATE_NOUPDATE:
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnUpdateCompleted();
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UPDATE_ERROR_CHECKING_FOR_UPDATE:
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnUpdateErrorCheckingForUpdate();
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UPDATE_ERROR_UPDATING:
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnUpdateErrorUpdating();
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case USER_IMAGE_SELECTED:
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnUserImageSelected();
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EULA_ACCEPTED:
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnEulaAccepted();
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EULA_BACK:
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowNetworkScreen();
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
900effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case ENTERPRISE_AUTO_ENROLLMENT_CHECK_COMPLETED:
901f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (skip_update_enroll_after_eula_)
902f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        ShowEnrollmentScreen();
903f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      else
904f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        OnOOBECompleted();
905effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      break;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ENTERPRISE_ENROLLMENT_COMPLETED:
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OnEnrollmentDone();
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case ENTERPRISE_ENROLLMENT_BACK:
910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ShowNetworkScreen();
911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      break;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case RESET_CANCELED:
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnResetCanceled();
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case KIOSK_AUTOLAUNCH_CANCELED:
916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      OnKioskAutolaunchCanceled();
917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case KIOSK_AUTOLAUNCH_CONFIRMED:
919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      OnKioskAutolaunchConfirmed();
920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
9217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case KIOSK_ENABLE_COMPLETED:
9227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      OnKioskEnableCompleted();
9237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ENTERPRISE_AUTO_MAGIC_ENROLLMENT_COMPLETED:
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OnAutoEnrollmentDone();
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case TERMS_OF_SERVICE_DECLINED:
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnTermsOfServiceDeclined();
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case TERMS_OF_SERVICE_ACCEPTED:
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnTermsOfServiceAccepted();
932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WRONG_HWID_WARNING_SKIPPED:
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnWrongHWIDWarningSkipped();
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::OnSetUserNamePassword(const std::string& username,
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const std::string& password) {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  username_ = username;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_ = password;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WizardController::SetUsageStatisticsReporting(bool val) {
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  usage_statistics_reporting_ = val;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WizardController::GetUsageStatisticsReporting() const {
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return usage_statistics_reporting_;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)chromeos::ErrorScreen* WizardController::GetErrorScreen() {
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!error_screen_.get()) {
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_.reset(
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new chromeos::ErrorScreen(this, oobe_display_->GetErrorScreenActor()));
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return error_screen_.get();
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WizardController::ShowErrorScreen() {
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(1) << "Showing error screen.";
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCurrentScreen(GetErrorScreen());
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WizardController::HideErrorScreen(WizardScreen* parent_screen) {
969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(parent_screen);
970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(1) << "Hiding error screen.";
971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetCurrentScreen(parent_screen);
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
974a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WizardController::OnAccessibilityStatusChanged(
975a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const AccessibilityStatusEventDetails& details) {
976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  enum AccessibilityNotificationType type = details.notification_type;
977a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (type == ACCESSIBILITY_MANAGER_SHUTDOWN) {
978a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    accessibility_subscription_.reset();
979a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
980a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else if (type != ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK || !details.enabled) {
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CrasAudioHandler* cras = CrasAudioHandler::Get();
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (cras->IsOutputMuted()) {
9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cras->SetOutputMute(false);
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cras->SetOutputVolumePercent(kMinAudibleOutputVolumePercent);
9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (cras->GetOutputVolumePercent() < kMinAudibleOutputVolumePercent) {
9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cras->SetOutputVolumePercent(kMinAudibleOutputVolumePercent);
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WizardController::AutoLaunchKioskApp() {
994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  KioskAppManager::App app_data;
995868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string app_id = KioskAppManager::Get()->GetAutoLaunchApp();
996868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK(KioskAppManager::Get()->GetApp(app_id, &app_data));
997ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  host_->StartAppLaunch(app_id, false /* diagnostic_mode */);
999868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1000868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WizardController::SetZeroDelays() {
1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  kShowDelayMs = 0;
1004a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  zero_delay_enabled_ = true;
1005a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1006a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WizardController::IsZeroDelayEnabled() {
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return zero_delay_enabled_;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WizardController::SkipPostLoginScreensForTesting() {
1014a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  skip_post_login_screens_ = true;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1017a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
1018a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool WizardController::ShouldAutoStartEnrollment() {
10195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return connector->GetDeviceCloudPolicyManager()->ShouldAutoStartEnrollment();
1022868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1023868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1024effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static
1025bee9932bab44713b74b422b4b759b49f5a222977Bo Liubool WizardController::ShouldRecoverEnrollment() {
1026bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  policy::BrowserPolicyConnectorChromeOS* connector =
1027bee9932bab44713b74b422b4b759b49f5a222977Bo Liu      g_browser_process->platform_part()->browser_policy_connector_chromeos();
1028bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  return connector->GetDeviceCloudPolicyManager()->ShouldRecoverEnrollment();
1029bee9932bab44713b74b422b4b759b49f5a222977Bo Liu}
1030bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
1031bee9932bab44713b74b422b4b759b49f5a222977Bo Liu// static
10328f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liustd::string WizardController::GetEnrollmentRecoveryDomain() {
10338f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  policy::BrowserPolicyConnectorChromeOS* connector =
10348f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu      g_browser_process->platform_part()->browser_policy_connector_chromeos();
10358f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu  return
10368f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu      connector->GetDeviceCloudPolicyManager()->GetEnrollmentRecoveryDomain();
10378f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu}
10388f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu
10398f6e4bda48b1f7e913c8b2f770559183fd98092bBo Liu// static
1040effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool WizardController::CanExitEnrollment() {
10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
10435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return connector->GetDeviceCloudPolicyManager()->CanExitEnrollment();
1044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1046effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static
1047effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstd::string WizardController::GetForcedEnrollmentDomain() {
1048effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  policy::BrowserPolicyConnectorChromeOS* connector =
1049effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      g_browser_process->platform_part()->browser_policy_connector_chromeos();
1050effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return connector->GetDeviceCloudPolicyManager()->GetForcedEnrollmentDomain();
1051effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1052effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
105358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void WizardController::OnLocalStateInitialized(bool /* succeeded */) {
105458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (GetLocalState()->GetInitializationStatus() !=
105558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      PrefService::INITIALIZATION_STATUS_ERROR) {
105658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
105758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
105858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetErrorScreen()->SetUIState(ErrorScreen::UI_STATE_LOCAL_STATE_ERROR);
105958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetStatusAreaVisible(false);
106058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowErrorScreen();
106158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
106258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1063effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPrefService* WizardController::GetLocalState() {
1064effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (local_state_for_testing_)
1065effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return local_state_for_testing_;
1066effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return g_browser_process->local_state();
1067effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1068effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1069effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WizardController::OnTimezoneResolved(
1070effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<TimeZoneResponseData> timezone,
1071effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool server_error) {
1072effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1073effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(timezone.get());
1074effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // To check that "this" is not destroyed try to access some member
1075effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // (timezone_provider_) in this case. Expect crash here.
1076effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(timezone_provider_.get());
1077effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timezone_resolved_ = true;
1079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedClosureRunner inform_test(on_timezone_resolved_for_testing_);
1080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  on_timezone_resolved_for_testing_.Reset();
1081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1082effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  VLOG(1) << "Resolved local timezone={" << timezone->ToStringForDebug()
1083effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          << "}.";
1084effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1085effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (timezone->status != TimeZoneResponseData::OK) {
1086effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    LOG(WARNING) << "Resolve TimeZone: failed to resolve timezone.";
1087effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
1088effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1089effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1090effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  policy::BrowserPolicyConnectorChromeOS* connector =
1091effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      g_browser_process->platform_part()->browser_policy_connector_chromeos();
1092effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (connector->IsEnterpriseManaged()) {
1093effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string policy_timezone;
1094effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (chromeos::CrosSettings::Get()->GetString(
1095effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            chromeos::kSystemTimezonePolicy, &policy_timezone) &&
1096effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        !policy_timezone.empty()) {
1097effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      VLOG(1) << "Resolve TimeZone: TimeZone settings are overridden"
1098effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              << " by DevicePolicy.";
1099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
1100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
1101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!timezone->timeZoneId.empty()) {
1104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VLOG(1) << "Resolve TimeZone: setting timezone to '" << timezone->timeZoneId
1105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            << "'";
1106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    chromeos::system::TimezoneSettings::GetInstance()->SetTimezoneFromID(
1108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::UTF8ToUTF16(timezone->timeZoneId));
1109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1112effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTimeZoneProvider* WizardController::GetTimezoneProvider() {
1113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!timezone_provider_) {
1114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    timezone_provider_.reset(
1115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        new TimeZoneProvider(g_browser_process->system_request_context(),
1116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             DefaultTimezoneProviderURL()));
1117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return timezone_provider_.get();
111958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
112058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid WizardController::OnLocationResolved(const Geoposition& position,
11220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                          bool server_error,
11230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                          const base::TimeDelta elapsed) {
11240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
11250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
11260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const base::TimeDelta timeout =
11270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::TimeDelta::FromSeconds(kResolveTimeZoneTimeoutSeconds);
11280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Ignore invalid position.
11290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!position.Valid())
11300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
11310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
11320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (elapsed >= timeout) {
11330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    LOG(WARNING) << "Resolve TimeZone: got location after timeout ("
11340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 << elapsed.InSecondsF() << " seconds elapsed). Ignored.";
11350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
11360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
11370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
11380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // WizardController owns TimezoneProvider, so timezone request is silently
11390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // cancelled on destruction.
11400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GetTimezoneProvider()->RequestTimezone(
11410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      position,
11420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false,  // sensor
11430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      timeout - elapsed,
11440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::Bind(&WizardController::OnTimezoneResolved,
11450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 base::Unretained(this)));
11460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
11470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WizardController::SetOnTimeZoneResolvedForTesting(
1149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::Closure& callback) {
1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (timezone_resolved_)
1151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  on_timezone_resolved_for_testing_ = callback;
1154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return true;
1155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1158