Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Unified Diff: chromeos/components/tether/tether_disconnector.cc

Issue 2975483002: [CrOS Tether] Disconnect cleanly from active Tether networks when the user logs out or the Tether c… (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/components/tether/tether_disconnector.cc
diff --git a/chromeos/components/tether/tether_disconnector.cc b/chromeos/components/tether/tether_disconnector.cc
index 65f8cefd30a4d279446dc606df642850dbfc7646..921ce8fb5c53cdd74c978da24c9bc1940fe38c20 100644
--- a/chromeos/components/tether/tether_disconnector.cc
+++ b/chromeos/components/tether/tether_disconnector.cc
@@ -4,206 +4,16 @@
#include "chromeos/components/tether/tether_disconnector.h"
-#include "base/values.h"
-#include "chromeos/components/tether/active_host.h"
-#include "chromeos/components/tether/device_id_tether_network_guid_map.h"
-#include "chromeos/components/tether/network_configuration_remover.h"
-#include "chromeos/components/tether/tether_connector.h"
-#include "chromeos/components/tether/tether_host_fetcher.h"
-#include "chromeos/network/network_connection_handler.h"
-#include "chromeos/network/network_state.h"
-#include "chromeos/network/network_state_handler.h"
-#include "components/proximity_auth/logging/logging.h"
+#include "chromeos/components/tether/pref_names.h"
+#include "components/prefs/pref_registry_simple.h"
namespace chromeos {
namespace tether {
-TetherDisconnector::TetherDisconnector(
- NetworkConnectionHandler* network_connection_handler,
- NetworkStateHandler* network_state_handler,
- ActiveHost* active_host,
- BleConnectionManager* ble_connection_manager,
- NetworkConfigurationRemover* network_configuration_remover,
- TetherConnector* tether_connector,
- DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map,
- TetherHostFetcher* tether_host_fetcher)
- : network_connection_handler_(network_connection_handler),
- network_state_handler_(network_state_handler),
- active_host_(active_host),
- ble_connection_manager_(ble_connection_manager),
- network_configuration_remover_(network_configuration_remover),
- tether_connector_(tether_connector),
- device_id_tether_network_guid_map_(device_id_tether_network_guid_map),
- tether_host_fetcher_(tether_host_fetcher),
- weak_ptr_factory_(this) {}
-
-TetherDisconnector::~TetherDisconnector() {
- if (disconnect_tethering_operation_)
- disconnect_tethering_operation_->RemoveObserver(this);
-}
-
-void TetherDisconnector::DisconnectFromNetwork(
- const std::string& tether_network_guid,
- const base::Closure& success_callback,
- const network_handler::StringResultCallback& error_callback) {
- DCHECK(!tether_network_guid.empty());
-
- ActiveHost::ActiveHostStatus status = active_host_->GetActiveHostStatus();
- std::string active_tether_network_guid = active_host_->GetTetherNetworkGuid();
- std::string active_wifi_network_guid = active_host_->GetWifiNetworkGuid();
-
- if (status == ActiveHost::ActiveHostStatus::DISCONNECTED) {
- PA_LOG(ERROR) << "Disconnect requested for Tether network with GUID "
- << tether_network_guid << ", but no device is connected.";
- error_callback.Run(NetworkConnectionHandler::kErrorNotConnected);
- return;
- }
-
- if (tether_network_guid != active_tether_network_guid) {
- PA_LOG(ERROR) << "Disconnect requested for Tether network with GUID "
- << tether_network_guid << ", but that device is not the "
- << "active host.";
- error_callback.Run(NetworkConnectionHandler::kErrorNotConnected);
- return;
- }
-
- if (status == ActiveHost::ActiveHostStatus::CONNECTING) {
- // Note: CancelConnectionAttempt() internally sets the active host to be
- // disconnected.
- if (tether_connector_->CancelConnectionAttempt(tether_network_guid)) {
- PA_LOG(INFO) << "Disconnect requested for Tether network with GUID "
- << tether_network_guid << ", which had not yet connected. "
- << "Canceled in-progress connection attempt.";
- success_callback.Run();
- return;
- }
-
- PA_LOG(ERROR) << "Disconnect requested for Tether network with GUID "
- << tether_network_guid << " (not yet connected), but "
- << "canceling connection attempt failed.";
- error_callback.Run(NetworkConnectionHandler::kErrorDisconnectFailed);
- return;
- }
-
- DCHECK(!active_wifi_network_guid.empty());
- DCHECK(!disconnect_tethering_operation_);
- DisconnectActiveWifiConnection(tether_network_guid, active_wifi_network_guid,
- success_callback, error_callback);
-}
-
-void TetherDisconnector::DisconnectActiveWifiConnection(
- const std::string& tether_network_guid,
- const std::string& wifi_network_guid,
- const base::Closure& success_callback,
- const network_handler::StringResultCallback& error_callback) {
- // First, disconnect the active host so that the user gets visual indication
- // that the disconnection is in progress as quickly as possible.
- // TODO(hansberry): This will result in the Tether network becoming
- // disconnected, but the Wi-Fi network will still be connected until the
- // DisconnectNetwork() call below completes. This will result in a jarring UI
- // transition which needs to be fixed.
- active_host_->SetActiveHostDisconnected();
-
- const NetworkState* wifi_network_state =
- network_state_handler_->GetNetworkStateFromGuid(wifi_network_guid);
- if (wifi_network_state) {
- network_connection_handler_->DisconnectNetwork(
- wifi_network_state->path(),
- base::Bind(&TetherDisconnector::OnSuccessfulWifiDisconnect,
- weak_ptr_factory_.GetWeakPtr(), wifi_network_guid,
- success_callback, error_callback),
- base::Bind(&TetherDisconnector::OnFailedWifiDisconnect,
- weak_ptr_factory_.GetWeakPtr(), wifi_network_guid,
- success_callback, error_callback));
- } else {
- PA_LOG(ERROR) << "Wi-Fi NetworkState for GUID " << wifi_network_guid << " "
- << "was not registered. Cannot disconnect.";
- error_callback.Run(NetworkConnectionHandler::kErrorDisconnectFailed);
- }
-
- // In addition to disconnecting from the Wi-Fi network, this device must also
- // send a DisconnectTetheringRequest to the tether host so that it can shut
- // down its Wi-Fi hotspot if it is no longer in use.
- const std::string device_id =
- device_id_tether_network_guid_map_->GetDeviceIdForTetherNetworkGuid(
- tether_network_guid);
- tether_host_fetcher_->FetchTetherHost(
- device_id, base::Bind(&TetherDisconnector::OnTetherHostFetched,
- weak_ptr_factory_.GetWeakPtr(), device_id));
-}
-
-void TetherDisconnector::OnOperationFinished(const std::string& device_id,
- bool success) {
- if (success) {
- PA_LOG(INFO) << "Successfully sent DisconnectTetheringRequest to device "
- << "with ID "
- << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id);
- } else {
- PA_LOG(ERROR) << "Failed to send DisconnectTetheringRequest to device "
- << "with ID "
- << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(
- device_id);
- }
-
- // Regardless of success/failure, unregister as a listener and delete the
- // operation.
- disconnect_tethering_operation_->RemoveObserver(this);
- disconnect_tethering_operation_.reset();
-}
-
-void TetherDisconnector::OnSuccessfulWifiDisconnect(
- const std::string& wifi_network_guid,
- const base::Closure& success_callback,
- const network_handler::StringResultCallback& error_callback) {
- PA_LOG(INFO) << "Successfully disconnected from Wi-Fi network with GUID "
- << wifi_network_guid << ".";
- CleanUpAfterWifiDisconnection(true /* success */, wifi_network_guid,
- success_callback, error_callback);
-}
-
-void TetherDisconnector::OnFailedWifiDisconnect(
- const std::string& wifi_network_guid,
- const base::Closure& success_callback,
- const network_handler::StringResultCallback& error_callback,
- const std::string& error_name,
- std::unique_ptr<base::DictionaryValue> error_data) {
- PA_LOG(ERROR) << "Failed to disconnect from Wi-Fi network with GUID "
- << wifi_network_guid << ". Error name: " << error_name;
- CleanUpAfterWifiDisconnection(false /* success */, wifi_network_guid,
- success_callback, error_callback);
-}
-
-void TetherDisconnector::CleanUpAfterWifiDisconnection(
- bool success,
- const std::string& wifi_network_guid,
- const base::Closure& success_callback,
- const network_handler::StringResultCallback& error_callback) {
- if (success)
- success_callback.Run();
- else
- error_callback.Run(NetworkConnectionHandler::kErrorDisconnectFailed);
-
- network_configuration_remover_->RemoveNetworkConfiguration(wifi_network_guid);
-}
-
-void TetherDisconnector::OnTetherHostFetched(
- const std::string& device_id,
- std::unique_ptr<cryptauth::RemoteDevice> tether_host) {
- if (!tether_host) {
- PA_LOG(ERROR) << "Could not fetch device with ID "
- << cryptauth::RemoteDevice::TruncateDeviceIdForLogs(device_id)
- << ". Unable to send DisconnectTetheringRequest.";
- return;
- }
-
- disconnect_tethering_operation_ =
- DisconnectTetheringOperation::Factory::NewInstance(
- *tether_host, ble_connection_manager_);
-
- // Start the operation; OnOperationFinished() will be called when finished.
- disconnect_tethering_operation_->AddObserver(this);
- disconnect_tethering_operation_->Initialize();
+// static
+void TetherDisconnector::RegisterPrefs(PrefRegistrySimple* registry) {
Ryan Hansberry 2017/07/11 22:23:56 You need to call this from Initializer.
Kyle Horimoto 2017/07/12 01:42:59 That's already done.
Ryan Hansberry 2017/07/12 17:10:10 Oops, also did not see that on first glance.
+ registry->RegisterStringPref(prefs::kDisconnectingWifiNetworkGuid, "");
}
} // namespace tether

Powered by Google App Engine
This is Rietveld 408576698