1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/sync_setup_wizard.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <stddef.h> 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <ostream> 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/sync/sync_setup_flow.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSyncSetupWizard::SyncSetupWizard(ProfileSyncService* service) 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : service_(service), 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen flow_container_(new SyncSetupFlowContainer()) { 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSyncSetupWizard::~SyncSetupWizard() { 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete flow_container_; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupWizard::Step(State advance_state) { 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncSetupFlow* flow = flow_container_->get_flow(); 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (flow) { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A setup flow is in progress and dialog is currently showing. 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow->Advance(advance_state); 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if (!service_->HasSyncSetupCompleted()) { 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsTerminalState(advance_state)) 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // No flow is in progress, and we have never escorted the user all the 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // way through the wizard flow. 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow_container_->set_flow( 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlow::Run(service_, flow_container_, advance_state, DONE)); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // No flow in progress, but we've finished the wizard flow once before. 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is just a discrete run. 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsTerminalState(advance_state)) 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; // Nothing to do. 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow_container_->set_flow(SyncSetupFlow::Run(service_, flow_container_, 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen advance_state, GetEndStateForDiscreteRun(advance_state))); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool SyncSetupWizard::IsTerminalState(State advance_state) { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return advance_state == GAIA_SUCCESS || 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch advance_state == DONE || 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch advance_state == DONE_FIRST_TIME || 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch advance_state == FATAL_ERROR || 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch advance_state == SETUP_ABORTED_BY_PENDING_CLEAR; 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool SyncSetupWizard::IsVisible() const { 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return flow_container_->get_flow() != NULL; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SyncSetupWizard::Focus() { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SyncSetupFlow* flow = flow_container_->get_flow(); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (flow) { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flow->Focus(); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSyncSetupFlow* SyncSetupWizard::AttachSyncSetupHandler( 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlowHandler* handler) { 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SyncSetupFlow* flow = flow_container_->get_flow(); 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!flow) 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NULL; 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen flow->AttachSyncSetupHandler(handler); 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return flow; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSyncSetupWizard::State SyncSetupWizard::GetEndStateForDiscreteRun( 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch State start_state) { 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch State result = FATAL_ERROR; 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (start_state == GAIA_LOGIN) { 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result = GAIA_SUCCESS; 803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen } else if (start_state == ENTER_PASSPHRASE || 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen start_state == SYNC_EVERYTHING || 823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen start_state == CONFIGURE || 833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen start_state == PASSPHRASE_MIGRATION) { 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result = DONE; 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_NE(FATAL_ERROR, result) << 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Invalid start state for discrete run: " << start_state; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 90