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