Index: chrome/browser/chromeos/mobile/mobile_activator.cc |
diff --git a/chrome/browser/chromeos/mobile/mobile_activator.cc b/chrome/browser/chromeos/mobile/mobile_activator.cc |
index cd552ef649a813ed86d95d4dd9ab44eed3f0a440..0456eb76c51c8daf1f90b98eaa24b4b17c955294 100644 |
--- a/chrome/browser/chromeos/mobile/mobile_activator.cc |
+++ b/chrome/browser/chromeos/mobile/mobile_activator.cc |
@@ -189,9 +189,25 @@ void MobileActivator::TerminateActivation() { |
} |
void MobileActivator::OnNetworkManagerChanged(NetworkLibrary* cros) { |
- if (state_ == PLAN_ACTIVATION_PAGE_LOADING) |
+ if (state_ == PLAN_ACTIVATION_PAGE_LOADING || |
+ state_ == PLAN_ACTIVATION_DONE || |
+ state_ == PLAN_ACTIVATION_ERROR) { |
return; |
- EvaluateCellularNetwork(FindMatchingCellularNetwork(true)); |
+ } |
+ |
+ CellularNetwork* network = FindMatchingCellularNetwork(true); |
+ if (network->activate_over_non_cellular_network()) { |
+ bool waiting = (state_ == PLAN_ACTIVATION_WAITING_FOR_CONNECTION); |
+ bool is_online = |
+ cros->connected_network() && cros->connected_network()->online(); |
+ if (waiting && is_online) { |
+ ChangeState(network, post_reconnect_state_, ""); |
+ } else if (!waiting && !is_online) { |
+ ChangeState(network, PLAN_ACTIVATION_WAITING_FOR_CONNECTION, ""); |
+ } |
+ } |
+ |
+ EvaluateCellularNetwork(network); |
} |
void MobileActivator::OnNetworkChanged(NetworkLibrary* cros, |
@@ -238,6 +254,9 @@ void MobileActivator::InitiateActivation(const std::string& service_path) { |
meid_ = device->meid(); |
iccid_ = device->iccid(); |
service_path_ = service_path; |
+ |
+ ChangeState(network, PLAN_ACTIVATION_PAGE_LOADING, ""); |
+ |
BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE, |
base::Bind(&CellularConfigDocument::LoadCellularConfigFile, |
cellular_config_.get()), |
@@ -278,7 +297,6 @@ void MobileActivator::HandleSetTransactionStatus(bool success) { |
if (network && network->activate_over_non_cellular_network()) { |
state_ = PLAN_ACTIVATION_DONE; |
network->CompleteActivation(); |
- EvaluateCellularNetwork(network); |
} else { |
StartOTASP(); |
} |
@@ -306,6 +324,11 @@ void MobileActivator::HandlePortalLoaded(bool success) { |
payment_reconnect_count_ = 0; |
ChangeState(network, PLAN_ACTIVATION_SHOWING_PAYMENT, std::string()); |
} else { |
+ // There is no point in forcing reconnecting the cellular network if the |
+ // activation should not be done over it. |
+ if (network->activate_over_non_cellular_network()) |
+ return; |
+ |
payment_reconnect_count_++; |
if (payment_reconnect_count_ > kMaxPortalReconnectCount) { |
ChangeState(NULL, PLAN_ACTIVATION_ERROR, |
@@ -382,9 +405,14 @@ void MobileActivator::StartActivation() { |
PLAN_ACTIVATION_DONE : |
PLAN_ACTIVATION_PAYMENT_PORTAL_LOADING, |
""); |
- } else if (lib->HasRecentCellularPlanPayment() && |
- network->activation_state() == |
- ACTIVATION_STATE_PARTIALLY_ACTIVATED) { |
+ // Verify that there is no need to wait for the connection. This will also |
+ // evaluate the network. |
+ OnNetworkManagerChanged(lib); |
+ return; |
+ } |
+ |
+ if (lib->HasRecentCellularPlanPayment() && |
+ network->activation_state() == ACTIVATION_STATE_PARTIALLY_ACTIVATED) { |
// Try to start with OTASP immediately if we have received payment recently. |
state_ = PLAN_ACTIVATION_START_OTASP; |
} else { |
@@ -519,6 +547,11 @@ void MobileActivator::EvaluateCellularNetwork(CellularNetwork* network) { |
<< "\n setvice_path=" << network->service_path() |
<< "\n connected=" << network->connected(); |
+ // If the network is activated over non cellular network, the activator state |
+ // does not depend on the network's own state. |
+ if (network->activate_over_non_cellular_network()) |
+ return; |
+ |
std::string error_description; |
PlanActivationState new_state = PickNextState(network, &error_description); |
@@ -689,6 +722,7 @@ MobileActivator::PlanActivationState MobileActivator::PickNextOnlineState( |
// Just ignore all signals until the site confirms payment. |
case PLAN_ACTIVATION_PAYMENT_PORTAL_LOADING: |
case PLAN_ACTIVATION_SHOWING_PAYMENT: |
+ case PLAN_ACTIVATION_WAITING_FOR_CONNECTION: |
break; |
// Go where we decided earlier. |
case PLAN_ACTIVATION_RECONNECTING: |
@@ -732,6 +766,8 @@ const char* MobileActivator::GetStateDescription(PlanActivationState state) { |
return "ERROR"; |
case PLAN_ACTIVATION_RECONNECTING: |
return "RECONNECTING"; |
+ case PLAN_ACTIVATION_WAITING_FOR_CONNECTION: |
+ return "WAITING FOR CONNECTION"; |
} |
return "UNKNOWN"; |
} |
@@ -820,6 +856,9 @@ void MobileActivator::ChangeState(CellularNetwork* network, |
// Fix for fix SSL for the walled gardens where cert chain verification |
// might not work. |
break; |
+ case PLAN_ACTIVATION_WAITING_FOR_CONNECTION: |
+ post_reconnect_state_ = old_state; |
+ break; |
case PLAN_ACTIVATION_RECONNECTING: { |
PlanActivationState next_state = old_state; |
// Pick where we want to return to after we reconnect. |