Index: chromeos/components/tether/active_host.cc |
diff --git a/chromeos/components/tether/active_host.cc b/chromeos/components/tether/active_host.cc |
index ddfa0fe86aefa2834ccb83484b7229d2c3302236..2e73898664cbd87ac88abe2921b2d930e1968d4e 100644 |
--- a/chromeos/components/tether/active_host.cc |
+++ b/chromeos/components/tether/active_host.cc |
@@ -5,6 +5,7 @@ |
#include "chromeos/components/tether/active_host.h" |
#include "base/bind.h" |
+#include "base/memory/ptr_util.h" |
#include "base/values.h" |
#include "chromeos/components/tether/pref_names.h" |
#include "chromeos/components/tether/tether_host_fetcher.h" |
@@ -80,22 +81,43 @@ ActiveHost::ActiveHostStatus ActiveHost::GetActiveHostStatus() const { |
pref_service_->GetInteger(prefs::kActiveHostStatus)); |
} |
-const std::string ActiveHost::GetActiveHostDeviceId() const { |
+std::string ActiveHost::GetActiveHostDeviceId() const { |
return pref_service_->GetString(prefs::kActiveHostDeviceId); |
} |
-const std::string ActiveHost::GetWifiNetworkId() const { |
+std::string ActiveHost::GetWifiNetworkId() const { |
return pref_service_->GetString(prefs::kWifiNetworkId); |
} |
+void ActiveHost::AddObserver(Observer* observer) { |
+ observer_list_.AddObserver(observer); |
+} |
+ |
+void ActiveHost::RemoveObserver(Observer* observer) { |
+ observer_list_.RemoveObserver(observer); |
+} |
+ |
void ActiveHost::SetActiveHost(ActiveHostStatus active_host_status, |
const std::string& active_host_device_id, |
const std::string& wifi_network_id) { |
+ bool status_changed = GetActiveHostStatus() != active_host_status; |
+ bool device_changed = GetActiveHostDeviceId() != active_host_device_id; |
+ bool network_id_changed = GetWifiNetworkId() != wifi_network_id; |
+ |
+ if (!status_changed && !device_changed && !network_id_changed) { |
+ // If nothing has changed, return early. |
+ return; |
+ } |
+ |
pref_service_->Set(prefs::kActiveHostStatus, |
base::Value(static_cast<int>(active_host_status))); |
pref_service_->Set(prefs::kActiveHostDeviceId, |
base::Value(active_host_device_id)); |
pref_service_->Set(prefs::kWifiNetworkId, base::Value(wifi_network_id)); |
+ |
+ // Now, send an active host changed update. |
+ GetActiveHost(base::Bind(&ActiveHost::SendActiveHostChangedUpdate, |
+ weak_ptr_factory_.GetWeakPtr())); |
} |
void ActiveHost::OnTetherHostFetched( |
@@ -134,6 +156,19 @@ void ActiveHost::OnTetherHostFetched( |
std::move(remote_device), GetWifiNetworkId()); |
} |
+void ActiveHost::SendActiveHostChangedUpdate( |
+ ActiveHostStatus active_host_status, |
+ std::unique_ptr<cryptauth::RemoteDevice> active_host, |
+ const std::string& wifi_network_id) { |
+ for (auto& observer : observer_list_) { |
+ std::unique_ptr<cryptauth::RemoteDevice> unique_remote_device = |
+ active_host ? base::MakeUnique<cryptauth::RemoteDevice>(*active_host) |
+ : nullptr; |
+ observer.OnActiveHostChanged( |
+ active_host_status, std::move(unique_remote_device), wifi_network_id); |
+ } |
+} |
+ |
} // namespace tether |
} // namespace chromeos |