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