Remove notifications from WifiBootstrapManager

Manager can change Config directly.

BUG:24267885
Change-Id: I413479d4614eb84b4257be9f46ef3290693985f7
Reviewed-on: https://weave-review.googlesource.com/1176
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/include/weave/privet.h b/libweave/include/weave/privet.h
index 60acbeb..a50548a 100644
--- a/libweave/include/weave/privet.h
+++ b/libweave/include/weave/privet.h
@@ -36,10 +36,6 @@
   using OnPairingEndedCallback =
       base::Callback<void(const std::string& session_id)>;
 
-  // Sets callback which is called when WiFi state is changed.
-  virtual void AddOnWifiSetupChangedCallback(
-      const OnWifiSetupChangedCallback& callback) = 0;
-
   virtual void AddOnPairingChangedCallbacks(
       const OnPairingStartedCallback& on_start,
       const OnPairingEndedCallback& on_end) = 0;
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc
index f8c4ef6..1180488 100644
--- a/libweave/src/device_manager.cc
+++ b/libweave/src/device_manager.cc
@@ -97,19 +97,6 @@
   privet_->Start(options, task_runner, network, dns_sd, http_server, wifi,
                  device_info_.get(), command_manager_.get(),
                  state_manager_.get());
-
-  privet_->AddOnWifiSetupChangedCallback(
-      base::Bind(&DeviceManager::OnWiFiBootstrapStateChanged,
-                 weak_ptr_factory_.GetWeakPtr()));
-}
-
-void DeviceManager::OnWiFiBootstrapStateChanged(
-    weave::privet::WifiBootstrapManager::State state) {
-  const std::string& ssid = privet_->GetCurrentlyConnectedSsid();
-  if (ssid != device_info_->GetSettings().last_configured_ssid) {
-    weave::Config::Transaction change{device_info_->GetMutableConfig()};
-    change.set_last_configured_ssid(ssid);
-  }
 }
 
 std::unique_ptr<Device> Device::Create() {
diff --git a/libweave/src/device_manager.h b/libweave/src/device_manager.h
index 9a603fd..41d538e 100644
--- a/libweave/src/device_manager.h
+++ b/libweave/src/device_manager.h
@@ -52,8 +52,6 @@
                    provider::Wifi* wifi,
                    provider::Bluetooth* bluetooth);
 
-  void OnWiFiBootstrapStateChanged(weave::WifiSetupState state);
-
   std::shared_ptr<CommandManager> command_manager_;
   std::unique_ptr<StateChangeQueue> state_change_queue_;
   std::shared_ptr<StateManager> state_manager_;
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc
index 52a2657..5b72a2a 100644
--- a/libweave/src/privet/privet_manager.cc
+++ b/libweave/src/privet/privet_manager.cc
@@ -63,9 +63,8 @@
   if (wifi && device->GetSettings().wifi_auto_setup_enabled) {
     VLOG(1) << "Enabling WiFi bootstrapping.";
     wifi_bootstrap_manager_.reset(new WifiBootstrapManager(
-        device->GetSettings().last_configured_ssid, options.test_privet_ssid,
-        device->GetSettings().ble_setup_enabled, task_runner, network, wifi,
-        cloud_.get()));
+        options.test_privet_ssid, device->GetMutableConfig(), task_runner,
+        network, wifi, cloud_.get()));
     wifi_bootstrap_manager_->Init();
   }
 
@@ -94,14 +93,6 @@
              : "";
 }
 
-void Manager::AddOnWifiSetupChangedCallback(
-    const WifiBootstrapManager::StateListener& callback) {
-  if (wifi_bootstrap_manager_)
-    wifi_bootstrap_manager_->RegisterStateListener(callback);
-  else
-    callback.Run(WifiSetupState::kDisabled);
-}
-
 void Manager::AddOnPairingChangedCallbacks(
     const SecurityManager::PairingStartListener& on_start,
     const SecurityManager::PairingEndListener& on_end) {
diff --git a/libweave/src/privet/privet_manager.h b/libweave/src/privet/privet_manager.h
index 1c635da..5e3df3f 100644
--- a/libweave/src/privet/privet_manager.h
+++ b/libweave/src/privet/privet_manager.h
@@ -59,9 +59,6 @@
 
   std::string GetCurrentlyConnectedSsid() const;
 
-  void AddOnWifiSetupChangedCallback(
-      const OnWifiSetupChangedCallback& callback) override;
-
   void AddOnPairingChangedCallbacks(
       const OnPairingStartedCallback& on_start,
       const OnPairingEndedCallback& on_end) override;
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc
index 144fad6..924835a 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.cc
+++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -13,27 +13,25 @@
 
 #include "libweave/src/bind_lambda.h"
 #include "libweave/src/privet/constants.h"
+#include "libweave/src/config.h"
 
 namespace weave {
 namespace privet {
 
 using provider::Network;
 
-WifiBootstrapManager::WifiBootstrapManager(
-    const std::string& last_configured_ssid,
-    const std::string& test_privet_ssid,
-    bool ble_setup_enabled,
-    provider::TaskRunner* task_runner,
-    provider::Network* network,
-    provider::Wifi* wifi,
-    CloudDelegate* gcd)
-    : task_runner_{task_runner},
+WifiBootstrapManager::WifiBootstrapManager(const std::string& test_privet_ssid,
+                                           Config* config,
+                                           provider::TaskRunner* task_runner,
+                                           provider::Network* network,
+                                           provider::Wifi* wifi,
+                                           CloudDelegate* gcd)
+    : config_{config},
+      task_runner_{task_runner},
       network_{network},
       wifi_{wifi},
       ssid_generator_{gcd, this},
-      last_configured_ssid_{last_configured_ssid},
-      test_privet_ssid_{test_privet_ssid},
-      ble_setup_enabled_{ble_setup_enabled} {
+      test_privet_ssid_{test_privet_ssid} {
   CHECK(network_);
   CHECK(task_runner_);
   CHECK(wifi_);
@@ -44,20 +42,13 @@
   network_->AddConnectionChangedCallback(
       base::Bind(&WifiBootstrapManager::OnConnectivityChange,
                  lifetime_weak_factory_.GetWeakPtr()));
-  if (last_configured_ssid_.empty()) {
+  if (config_->GetSettings().last_configured_ssid.empty()) {
     StartBootstrapping();
   } else {
     StartMonitoring();
   }
 }
 
-void WifiBootstrapManager::RegisterStateListener(
-    const StateListener& listener) {
-  // Notify about current state.
-  listener.Run(state_);
-  state_listeners_.push_back(listener);
-}
-
 void WifiBootstrapManager::StartBootstrapping() {
   if (network_->GetConnectionState() == Network::State::kConnected) {
     // If one of the devices we monitor for connectivity is online, we need not
@@ -70,7 +61,7 @@
   }
 
   UpdateState(State::kBootstrapping);
-  if (!last_configured_ssid_.empty()) {
+  if (!config_->GetSettings().last_configured_ssid.empty()) {
     // If we have been configured before, we'd like to periodically take down
     // our AP and find out if we can connect again.  Many kinds of failures are
     // transient, and having an AP up prohibits us from connecting as a client.
@@ -83,11 +74,13 @@
   privet_ssid_ = GenerateSsid();
   CHECK(!privet_ssid_.empty());
   wifi_->StartAccessPoint(privet_ssid_);
-  LOG_IF(INFO, ble_setup_enabled_) << "BLE Bootstrap start: not implemented.";
+  LOG_IF(INFO, config_->GetSettings().ble_setup_enabled)
+      << "BLE Bootstrap start: not implemented.";
 }
 
 void WifiBootstrapManager::EndBootstrapping() {
-  LOG_IF(INFO, ble_setup_enabled_) << "BLE Bootstrap stop: not implemented.";
+  LOG_IF(INFO, config_->GetSettings().ble_setup_enabled)
+      << "BLE Bootstrap stop: not implemented.";
   wifi_->StopAccessPoint();
   privet_ssid_.clear();
 }
@@ -162,22 +155,7 @@
       break;
   }
 
-  if (new_state != state_) {
-    state_ = new_state;
-    // Post with weak ptr to avoid notification after this object destroyed.
-    task_runner_->PostDelayedTask(
-        FROM_HERE, base::Bind(&WifiBootstrapManager::NotifyStateListeners,
-                              lifetime_weak_factory_.GetWeakPtr(), new_state),
-        {});
-  } else {
-    VLOG(3) << "Not notifying listeners of state change, "
-            << "because the states are the same.";
-  }
-}
-
-void WifiBootstrapManager::NotifyStateListeners(State new_state) const {
-  for (const StateListener& listener : state_listeners_)
-    listener.Run(new_state);
+  state_ = new_state;
 }
 
 std::string WifiBootstrapManager::GenerateSsid() const {
@@ -209,7 +187,7 @@
 
 std::string WifiBootstrapManager::GetCurrentlyConnectedSsid() const {
   // TODO(vitalybuka): Get from shill, if possible.
-  return last_configured_ssid_;
+  return config_->GetSettings().last_configured_ssid;
 }
 
 std::string WifiBootstrapManager::GetHostedSsid() const {
@@ -223,7 +201,9 @@
 
 void WifiBootstrapManager::OnConnectSuccess(const std::string& ssid) {
   VLOG(1) << "Wifi was connected successfully";
-  last_configured_ssid_ = ssid;
+  Config::Transaction change{config_};
+  change.set_last_configured_ssid(ssid);
+  change.Commit();
   setup_state_ = SetupState{SetupState::kSuccess};
   StartMonitoring();
 }
@@ -253,7 +233,7 @@
 
 void WifiBootstrapManager::UpdateConnectionState() {
   connection_state_ = ConnectionState{ConnectionState::kUnconfigured};
-  if (last_configured_ssid_.empty())
+  if (config_->GetSettings().last_configured_ssid.empty())
     return;
 
   Network::State service_state{network_->GetConnectionState()};
diff --git a/libweave/src/privet/wifi_bootstrap_manager.h b/libweave/src/privet/wifi_bootstrap_manager.h
index 8174cac..fb6a517 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.h
+++ b/libweave/src/privet/wifi_bootstrap_manager.h
@@ -22,6 +22,8 @@
 
 namespace weave {
 
+class Config;
+
 namespace provider {
 class Network;
 class TaskRunner;
@@ -37,18 +39,14 @@
  public:
   using State = WifiSetupState;
 
-  using StateListener = base::Callback<void(State)>;
-
-  WifiBootstrapManager(const std::string& last_configured_ssid,
-                       const std::string& test_privet_ssid,
-                       bool wifi_setup_enabled,
+  WifiBootstrapManager(const std::string& test_privet_ssid,
+                       Config* config,
                        provider::TaskRunner* task_runner,
                        provider::Network* shill_client,
                        provider::Wifi* wifi,
                        CloudDelegate* gcd);
   ~WifiBootstrapManager() override = default;
   virtual void Init();
-  void RegisterStateListener(const StateListener& listener);
 
   // Overrides from WifiDelegate.
   const ConnectionState& GetConnectionState() const override;
@@ -78,7 +76,6 @@
   // Update the current state, post tasks to notify listeners accordingly to
   // the MessageLoop.
   void UpdateState(State new_state);
-  void NotifyStateListeners(State new_state) const;
 
   std::string GenerateSsid() const;
 
@@ -98,18 +95,16 @@
   // It is not persisted to disk.
   SetupState setup_state_{SetupState::kNone};
   ConnectionState connection_state_{ConnectionState::kDisabled};
+  Config* config_{nullptr};
   provider::TaskRunner* task_runner_{nullptr};
   provider::Network* network_{nullptr};
   provider::Wifi* wifi_{nullptr};
   WifiSsidGenerator ssid_generator_;
   base::Time monitor_until_;
 
-  std::vector<StateListener> state_listeners_;
   bool currently_online_{false};
-  std::string last_configured_ssid_;
   std::string test_privet_ssid_;
   std::string privet_ssid_;
-  bool ble_setup_enabled_{false};
 
   // Helps to reset irrelevant tasks switching state.
   base::WeakPtrFactory<WifiBootstrapManager> tasks_weak_factory_{this};