Index: chromeos/components/tether/tether_connector.cc |
diff --git a/chromeos/components/tether/tether_connector.cc b/chromeos/components/tether/tether_connector.cc |
index ee34c45041305f63f17e5e79e9226f1312daf6b7..fe64790865dc7e95ad81a2fd7aa0c54ed86e0d35 100644 |
--- a/chromeos/components/tether/tether_connector.cc |
+++ b/chromeos/components/tether/tether_connector.cc |
@@ -7,6 +7,7 @@ |
#include "base/bind.h" |
#include "chromeos/components/tether/active_host.h" |
#include "chromeos/components/tether/device_id_tether_network_guid_map.h" |
+#include "chromeos/components/tether/host_connection_metrics_logger.h" |
#include "chromeos/components/tether/host_scan_cache.h" |
#include "chromeos/components/tether/notification_presenter.h" |
#include "chromeos/components/tether/tether_host_fetcher.h" |
@@ -29,7 +30,8 @@ TetherConnector::TetherConnector( |
TetherHostResponseRecorder* tether_host_response_recorder, |
DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map, |
HostScanCache* host_scan_cache, |
- NotificationPresenter* notification_presenter) |
+ NotificationPresenter* notification_presenter, |
+ HostConnectionMetricsLogger* host_connection_metrics_logger) |
: network_state_handler_(network_state_handler), |
wifi_hotspot_connector_(wifi_hotspot_connector), |
active_host_(active_host), |
@@ -39,6 +41,7 @@ TetherConnector::TetherConnector( |
device_id_tether_network_guid_map_(device_id_tether_network_guid_map), |
host_scan_cache_(host_scan_cache), |
notification_presenter_(notification_presenter), |
+ host_connection_metrics_logger_(host_connection_metrics_logger), |
weak_ptr_factory_(this) {} |
TetherConnector::~TetherConnector() { |
@@ -119,7 +122,10 @@ bool TetherConnector::CancelConnectionAttempt( |
connect_tethering_operation_.reset(); |
} |
- SetConnectionFailed(NetworkConnectionHandler::kErrorConnectCanceled); |
+ SetConnectionFailed( |
+ NetworkConnectionHandler::kErrorConnectCanceled, |
+ HostConnectionMetricsLogger::ConnectionToHostResult:: |
+ CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_CANCELED_BY_USER); |
return true; |
} |
@@ -161,7 +167,8 @@ void TetherConnector::OnSuccessfulConnectTetheringResponse( |
void TetherConnector::OnConnectTetheringFailure( |
const cryptauth::RemoteDevice& remote_device, |
ConnectTetheringResponse_ResponseCode error_code) { |
- if (device_id_pending_connection_ != remote_device.GetDeviceId()) { |
+ std::string device_id_copy = remote_device.GetDeviceId(); |
+ if (device_id_pending_connection_ != device_id_copy) { |
// If the failure was part of a previous attempt for a different device, |
// ignore it. |
PA_LOG(INFO) << "Received failed ConnectTetheringResponse from device with " |
@@ -176,7 +183,9 @@ void TetherConnector::OnConnectTetheringFailure( |
connect_tethering_operation_->RemoveObserver(this); |
connect_tethering_operation_.reset(); |
- SetConnectionFailed(NetworkConnectionHandler::kErrorConnectFailed); |
+ SetConnectionFailed( |
+ NetworkConnectionHandler::kErrorConnectFailed, |
+ GetConnectionToHostResultFromErrorCode(device_id_copy, error_code)); |
} |
void TetherConnector::OnTetherHostToConnectFetched( |
@@ -193,13 +202,16 @@ void TetherConnector::OnTetherHostToConnectFetched( |
PA_LOG(ERROR) << "Could not fetch tether host with device ID " |
<< cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id) |
<< ". Cannot connect."; |
- SetConnectionFailed(NetworkConnectionHandler::kErrorConnectFailed); |
+ SetConnectionFailed( |
+ NetworkConnectionHandler::kErrorConnectFailed, |
+ HostConnectionMetricsLogger::ConnectionToHostResult:: |
+ CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_INTERNAL_ERROR); |
return; |
} |
DCHECK(device_id == tether_host_to_connect->GetDeviceId()); |
- const std::string& tether_network_guid = |
+ const std::string tether_network_guid = |
device_id_tether_network_guid_map_->GetTetherNetworkGuidForDeviceId( |
device_id); |
connect_tethering_operation_ = |
@@ -211,7 +223,10 @@ void TetherConnector::OnTetherHostToConnectFetched( |
connect_tethering_operation_->Initialize(); |
} |
-void TetherConnector::SetConnectionFailed(const std::string& error_name) { |
+void TetherConnector::SetConnectionFailed( |
+ const std::string& error_name, |
+ HostConnectionMetricsLogger::ConnectionToHostResult |
+ connection_to_host_result) { |
DCHECK(!device_id_pending_connection_.empty()); |
DCHECK(!error_callback_.is_null()); |
@@ -226,6 +241,9 @@ void TetherConnector::SetConnectionFailed(const std::string& error_name) { |
error_callback.Run(error_name); |
active_host_->SetActiveHostDisconnected(); |
+ |
+ host_connection_metrics_logger_->RecordConnectionToHostResult( |
+ connection_to_host_result); |
} |
void TetherConnector::SetConnectionSucceeded( |
@@ -235,6 +253,10 @@ void TetherConnector::SetConnectionSucceeded( |
DCHECK(device_id_pending_connection_ == device_id); |
DCHECK(!success_callback_.is_null()); |
+ host_connection_metrics_logger_->RecordConnectionToHostResult( |
+ HostConnectionMetricsLogger::ConnectionToHostResult:: |
+ CONNECTION_RESULT_SUCCESS); |
+ |
notification_presenter_->RemoveSetupRequiredNotification(); |
// Save a copy of the callback before resetting it below. |
@@ -273,13 +295,46 @@ void TetherConnector::OnWifiConnection(const std::string& device_id, |
<< cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id) |
<< "."; |
- SetConnectionFailed(NetworkConnectionHandler::kErrorConnectFailed); |
+ SetConnectionFailed( |
+ NetworkConnectionHandler::kErrorConnectFailed, |
+ HostConnectionMetricsLogger::ConnectionToHostResult:: |
+ CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_TIMEOUT); |
return; |
} |
SetConnectionSucceeded(device_id, wifi_network_guid); |
} |
+HostConnectionMetricsLogger::ConnectionToHostResult |
+TetherConnector::GetConnectionToHostResultFromErrorCode( |
+ const std::string& device_id, |
+ ConnectTetheringResponse_ResponseCode error_code) { |
+ if (error_code == |
+ ConnectTetheringResponse_ResponseCode:: |
+ ConnectTetheringResponse_ResponseCode_PROVISIONING_FAILED) { |
+ return HostConnectionMetricsLogger::ConnectionToHostResult:: |
+ CONNECTION_RESULT_PROVISIONING_FAILED; |
+ } |
+ |
+ if (error_code == |
+ ConnectTetheringResponse_ResponseCode:: |
+ ConnectTetheringResponse_ResponseCode_TETHERING_TIMEOUT) { |
+ const std::string tether_network_guid = |
+ device_id_tether_network_guid_map_->GetTetherNetworkGuidForDeviceId( |
+ device_id); |
+ if (host_scan_cache_->DoesHostRequireSetup(tether_network_guid)) { |
+ return HostConnectionMetricsLogger::ConnectionToHostResult:: |
+ CONNECTION_RESULT_FAILURE_TETHERING_TIMED_OUT_FIRST_TIME_SETUP_WAS_REQUIRED; |
+ } |
+ |
+ return HostConnectionMetricsLogger::ConnectionToHostResult:: |
+ CONNECTION_RESULT_FAILURE_TETHERING_TIMED_OUT_FIRST_TIME_SETUP_WAS_NOT_REQUIRED; |
+ } |
+ |
+ return HostConnectionMetricsLogger::ConnectionToHostResult:: |
+ CONNECTION_RESULT_FAILURE_UNKNOWN_ERROR; |
+} |
+ |
} // namespace tether |
} // namespace chromeos |