| Index: chrome/browser/chromeos/dom_ui/mobile_setup_ui.cc
|
| ===================================================================
|
| --- chrome/browser/chromeos/dom_ui/mobile_setup_ui.cc (revision 66030)
|
| +++ chrome/browser/chromeos/dom_ui/mobile_setup_ui.cc (working copy)
|
| @@ -15,6 +15,7 @@
|
| #include "base/json/json_reader.h"
|
| #include "base/json/json_writer.h"
|
| #include "base/logging.h"
|
| +#include "base/metrics/histogram.h"
|
| #include "base/string_piece.h"
|
| #include "base/string_util.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -44,7 +45,6 @@
|
|
|
| // Host page JS API function names.
|
| const char kJsApiStartActivation[] = "startActivation";
|
| -const char kJsApiCloseTab[] = "closeTab";
|
| const char kJsApiSetTransactionStatus[] = "setTransactionStatus";
|
|
|
| const wchar_t kJsDeviceStatusChangedHandler[] =
|
| @@ -182,7 +182,6 @@
|
| };
|
|
|
| // Handlers for JS DOMUI messages.
|
| - void HandleCloseTab(const ListValue* args);
|
| void HandleSetTransactionStatus(const ListValue* args);
|
| void HandleStartActivation(const ListValue* args);
|
| void SetTransactionStatus(const std::string& status);
|
| @@ -196,6 +195,10 @@
|
| // Check the current cellular network for error conditions.
|
| bool GotActivationError(const chromeos::CellularNetwork* network,
|
| std::string* error);
|
| + // Sends status updates to DOMUI page.
|
| + void UpdatePage(chromeos::CellularNetwork* network,
|
| + const std::string& error_description);
|
| + // Changes internal state.
|
| void ChangeState(chromeos::CellularNetwork* network,
|
| PlanActivationState new_state,
|
| const std::string& error_description);
|
| @@ -239,6 +242,7 @@
|
| bool reenable_cert_check_;
|
| bool transaction_complete_signalled_;
|
| bool activation_status_test_;
|
| + bool evaluating_;
|
| DISALLOW_COPY_AND_ASSIGN(MobileSetupHandler);
|
| };
|
|
|
| @@ -352,7 +356,8 @@
|
| reenable_ethernet_(false),
|
| reenable_cert_check_(false),
|
| transaction_complete_signalled_(false),
|
| - activation_status_test_(false) {
|
| + activation_status_test_(false),
|
| + evaluating_(false) {
|
| }
|
|
|
| MobileSetupHandler::~MobileSetupHandler() {
|
| @@ -376,8 +381,6 @@
|
| void MobileSetupHandler::RegisterMessages() {
|
| dom_ui_->RegisterMessageCallback(kJsApiStartActivation,
|
| NewCallback(this, &MobileSetupHandler::HandleStartActivation));
|
| - dom_ui_->RegisterMessageCallback(kJsApiCloseTab,
|
| - NewCallback(this, &MobileSetupHandler::HandleCloseTab));
|
| dom_ui_->RegisterMessageCallback(kJsApiSetTransactionStatus,
|
| NewCallback(this, &MobileSetupHandler::HandleSetTransactionStatus));
|
| }
|
| @@ -403,19 +406,11 @@
|
| const_cast<chromeos::Network*>(network)));
|
| }
|
|
|
| -void MobileSetupHandler::HandleCloseTab(const ListValue* args) {
|
| - if (!dom_ui_)
|
| - return;
|
| - Browser* browser = BrowserList::FindBrowserWithFeature(
|
| - dom_ui_->GetProfile(), Browser::FEATURE_TABSTRIP);
|
| - if (browser)
|
| - browser->CloseTabContents(tab_contents_);
|
| -}
|
| -
|
| void MobileSetupHandler::HandleStartActivation(const ListValue* args) {
|
| scoped_refptr<TaskProxy> task = new TaskProxy(AsWeakPtr());
|
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| NewRunnableMethod(task.get(), &TaskProxy::HandleStartActivation));
|
| + UMA_HISTOGRAM_COUNTS("Cellular.MobileSetupStart", 1);
|
| }
|
|
|
| void MobileSetupHandler::HandleSetTransactionStatus(const ListValue* args) {
|
| @@ -454,6 +449,7 @@
|
| // again.
|
| if (LowerCaseEqualsASCII(status, "ok") &&
|
| state_ == PLAN_ACTIVATION_SHOWING_PAYMENT) {
|
| + UMA_HISTOGRAM_COUNTS("Cellular.PaymentReceived", 1);
|
| if (transaction_complete_signalled_) {
|
| LOG(WARNING) << "Transaction completion signaled more than once!?";
|
| return;
|
| @@ -469,6 +465,8 @@
|
| } else {
|
| EvaluateCellularNetwork(network);
|
| }
|
| + } else {
|
| + UMA_HISTOGRAM_COUNTS("Cellular.PaymentFailed", 1);
|
| }
|
| }
|
|
|
| @@ -483,6 +481,12 @@
|
| return;
|
| }
|
|
|
| + // Prevent this method from being called if it is already on the stack.
|
| + // This might happen on some state transitions (ie. connect, disconnect).
|
| + if (evaluating_)
|
| + return;
|
| + evaluating_ = true;
|
| +
|
| LOG(INFO) << "Cellular:\n service=" << network->GetStateString().c_str()
|
| << "\n ui=" << GetStateDescription(state_)
|
| << "\n activation=" << network->GetActivationStateString().c_str()
|
| @@ -495,7 +499,7 @@
|
| case chromeos::ACTIVATION_STATE_ACTIVATED: {
|
| if (network->failed_or_disconnected()) {
|
| new_state = PLAN_ACTIVATION_RECONNECTING;
|
| - } else if (network->connection_state() == chromeos::STATE_READY) {
|
| + } else if (network->connected()) {
|
| if (network->restricted_pool()) {
|
| new_state = PLAN_ACTIVATION_SHOWING_PAYMENT;
|
| } else {
|
| @@ -516,13 +520,16 @@
|
| DisconnectFromWirelessNetwork(network);
|
| // Disconnect will force networks to be reevaluated, so
|
| // we don't want to continue processing on this path anymore.
|
| + evaluating_ = false;
|
| return;
|
| }
|
| } else {
|
| - if (network->connected())
|
| - new_state = PLAN_ACTIVATION_SHOWING_PAYMENT;
|
| - else
|
| + if (network->connected()) {
|
| + if (network->restricted_pool())
|
| + new_state = PLAN_ACTIVATION_SHOWING_PAYMENT;
|
| + } else {
|
| new_state = PLAN_ACTIVATION_RECONNECTING;
|
| + }
|
| break;
|
| }
|
| break;
|
| @@ -538,14 +545,13 @@
|
| DisconnectFromWirelessNetwork(network);
|
| // Disconnect will force networks to be reevaluated, so
|
| // we don't want to continue processing on this path anymore.
|
| + evaluating_ = false;
|
| return;
|
| }
|
| break;
|
| }
|
| - default: {
|
| - new_state = PLAN_ACTIVATION_INITIATING_ACTIVATION;
|
| + default:
|
| break;
|
| - }
|
| }
|
| break;
|
| }
|
| @@ -554,7 +560,7 @@
|
| case chromeos::ACTIVATION_STATE_ACTIVATED:
|
| if (network->failed_or_disconnected()) {
|
| new_state = PLAN_ACTIVATION_RECONNECTING;
|
| - } else if (network->connection_state() == chromeos::STATE_READY) {
|
| + } else if (network->connected()) {
|
| if (network->restricted_pool()) {
|
| new_state = PLAN_ACTIVATION_SHOWING_PAYMENT;
|
| } else {
|
| @@ -563,10 +569,12 @@
|
| }
|
| break;
|
| case chromeos::ACTIVATION_STATE_PARTIALLY_ACTIVATED:
|
| - if (network->connected())
|
| - new_state = PLAN_ACTIVATION_SHOWING_PAYMENT;
|
| - else
|
| + if (network->connected()) {
|
| + if (network->restricted_pool())
|
| + new_state = PLAN_ACTIVATION_SHOWING_PAYMENT;
|
| + } else {
|
| new_state = PLAN_ACTIVATION_RECONNECTING;
|
| + }
|
| break;
|
| case chromeos::ACTIVATION_STATE_NOT_ACTIVATED:
|
| // Wait in this state until activation state changes.
|
| @@ -582,12 +590,17 @@
|
| // Wait until the service shows up and gets activated.
|
| switch (network->activation_state()) {
|
| case chromeos::ACTIVATION_STATE_ACTIVATED:
|
| - if (network->connection_state() == chromeos::STATE_READY) {
|
| + if (network->connected()) {
|
| if (network->restricted_pool()) {
|
| new_state = PLAN_ACTIVATION_SHOWING_PAYMENT;
|
| } else {
|
| new_state = PLAN_ACTIVATION_DONE;
|
| }
|
| + } else if (network->failed()) {
|
| + chromeos::CrosLibrary::Get()->GetNetworkLibrary()->
|
| + ConnectToCellularNetwork(network);
|
| + evaluating_ = false;
|
| + return;
|
| }
|
| break;
|
| case chromeos::ACTIVATION_STATE_PARTIALLY_ACTIVATED:
|
| @@ -619,7 +632,8 @@
|
| if ((network->activation_state() ==
|
| chromeos::ACTIVATION_STATE_PARTIALLY_ACTIVATED ||
|
| network->activation_state() == chromeos::ACTIVATION_STATE_ACTIVATING) &&
|
| - network->error() == chromeos::ERROR_UNKNOWN &&
|
| + (network->error() == chromeos::ERROR_UNKNOWN ||
|
| + network->error() == chromeos::ERROR_OTASP_FAILED)&&
|
| (state_ == PLAN_ACTIVATION_INITIATING_ACTIVATION ||
|
| state_ == PLAN_ACTIVATION_RECONNECTING) &&
|
| activation_status_test_ &&
|
| @@ -630,6 +644,7 @@
|
| }
|
| }
|
| ChangeState(network, new_state, error_description);
|
| + evaluating_ = false;
|
| }
|
|
|
| // Debugging helper function, will take it out at the end.
|
| @@ -672,6 +687,17 @@
|
| ReEnableOtherConnections();
|
| }
|
|
|
| +void MobileSetupHandler::UpdatePage(chromeos::CellularNetwork* network,
|
| + const std::string& error_description) {
|
| + DictionaryValue device_dict;
|
| + if (network)
|
| + GetDeviceInfo(network, &device_dict);
|
| + device_dict.SetInteger("state", state_);
|
| + if (error_description.length())
|
| + device_dict.SetString("error", error_description);
|
| + dom_ui_->CallJavascriptFunction(
|
| + kJsDeviceStatusChangedHandler, device_dict);
|
| +}
|
|
|
| void MobileSetupHandler::ChangeState(chromeos::CellularNetwork* network,
|
| PlanActivationState new_state,
|
| @@ -684,16 +710,9 @@
|
| GetStateDescription(new_state);
|
| first_time = false;
|
| state_ = new_state;
|
| - DictionaryValue device_dict;
|
|
|
| // Signal to JS layer that the state is changing.
|
| - if (network)
|
| - GetDeviceInfo(network, &device_dict);
|
| - device_dict.SetInteger("state", new_state);
|
| - if (error_description.length())
|
| - device_dict.SetString("error", error_description);
|
| - dom_ui_->CallJavascriptFunction(
|
| - kJsDeviceStatusChangedHandler, device_dict);
|
| + UpdatePage(network, error_description);
|
|
|
| // Decide what to do with network object as a result of the new state.
|
| switch (new_state) {
|
| @@ -702,8 +721,11 @@
|
| case PLAN_ACTIVATION_INITIATING_ACTIVATION:
|
| DCHECK(network);
|
| LOG(INFO) << "Activating service " << network->service_path().c_str();
|
| - if (!network->StartActivation())
|
| - new_state = PLAN_ACTIVATION_ERROR;
|
| + UMA_HISTOGRAM_COUNTS("Cellular.ActivationTry", 1);
|
| + if (!network->StartActivation()) {
|
| + UMA_HISTOGRAM_COUNTS("Cellular.ActivationFailure", 1);
|
| + ChangeState(network, PLAN_ACTIVATION_ERROR, std::string());
|
| + }
|
| break;
|
| case PLAN_ACTIVATION_RECONNECTING: {
|
| DCHECK(network);
|
| @@ -722,9 +744,11 @@
|
| case PLAN_ACTIVATION_DONE:
|
| DCHECK(network);
|
| CompleteActivation(network);
|
| + UMA_HISTOGRAM_COUNTS("Cellular.MobileSetupSucceeded", 1);
|
| break;
|
| case PLAN_ACTIVATION_ERROR: {
|
| CompleteActivation(NULL);
|
| + UMA_HISTOGRAM_COUNTS("Cellular.PlanFailed", 1);
|
| break;
|
| }
|
| default:
|
|
|