Remove ObserverList from cloud delegate

Change-Id: Icc3e7c11c4b01b1b1105a2be6c48f0ec1b7b6d92
Reviewed-on: https://weave-review.googlesource.com/2832
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/src/privet/cloud_delegate.cc b/src/privet/cloud_delegate.cc
index 65e4b87..ef9c59e 100644
--- a/src/privet/cloud_delegate.cc
+++ b/src/privet/cloud_delegate.cc
@@ -49,18 +49,10 @@
     device_->AddGcdStateChangedCallback(base::Bind(
         &CloudDelegateImpl::OnRegistrationChanged, weak_factory_.GetWeakPtr()));
 
-    component_manager_->AddTraitDefChangedCallback(
-        base::Bind(&CloudDelegateImpl::NotifyOnTraitDefsChanged,
-                   weak_factory_.GetWeakPtr()));
     component_manager_->AddCommandAddedCallback(base::Bind(
         &CloudDelegateImpl::OnCommandAdded, weak_factory_.GetWeakPtr()));
     component_manager_->AddCommandRemovedCallback(base::Bind(
         &CloudDelegateImpl::OnCommandRemoved, weak_factory_.GetWeakPtr()));
-    component_manager_->AddStateChangedCallback(base::Bind(
-        &CloudDelegateImpl::NotifyOnStateChanged, weak_factory_.GetWeakPtr()));
-    component_manager_->AddComponentTreeChangedCallback(
-        base::Bind(&CloudDelegateImpl::NotifyOnComponentTreeChanged,
-                   weak_factory_.GetWeakPtr()));
   }
 
   ~CloudDelegateImpl() override = default;
@@ -232,6 +224,18 @@
     callback.Run(commands_json, nullptr);
   }
 
+  void AddOnTraitsChangedCallback(const base::Closure& callback) override {
+    component_manager_->AddTraitDefChangedCallback(callback);
+  }
+
+  void AddOnStateChangedCallback(const base::Closure& callback) override {
+    component_manager_->AddStateChangedCallback(callback);
+  }
+
+  void AddOnComponentsChangeCallback(const base::Closure& callback) override {
+    component_manager_->AddComponentTreeChangedCallback(callback);
+  }
+
  private:
   void OnCommandAdded(Command* command) {
     // Set to "" for any new unknown command.
@@ -373,17 +377,5 @@
       new CloudDelegateImpl{task_runner, device, component_manager}};
 }
 
-void CloudDelegate::NotifyOnTraitDefsChanged() {
-  FOR_EACH_OBSERVER(Observer, observer_list_, OnTraitDefsChanged());
-}
-
-void CloudDelegate::NotifyOnComponentTreeChanged() {
-  FOR_EACH_OBSERVER(Observer, observer_list_, OnComponentTreeChanged());
-}
-
-void CloudDelegate::NotifyOnStateChanged() {
-  FOR_EACH_OBSERVER(Observer, observer_list_, OnStateChanged());
-}
-
 }  // namespace privet
 }  // namespace weave
diff --git a/src/privet/cloud_delegate.h b/src/privet/cloud_delegate.h
index 4ded884..6d0ed48 100644
--- a/src/privet/cloud_delegate.h
+++ b/src/privet/cloud_delegate.h
@@ -11,7 +11,6 @@
 
 #include <base/callback.h>
 #include <base/memory/ref_counted.h>
-#include <base/observer_list.h>
 #include <weave/device.h>
 
 #include "src/privet/privet_types.h"
@@ -43,15 +42,6 @@
       base::Callback<void(const base::DictionaryValue& commands,
                           ErrorPtr error)>;
 
-  class Observer {
-   public:
-    virtual ~Observer() {}
-
-    virtual void OnTraitDefsChanged() {}
-    virtual void OnStateChanged() {}
-    virtual void OnComponentTreeChanged() {}
-  };
-
   // Returns the ID of the device.
   virtual std::string GetDeviceId() const = 0;
 
@@ -130,23 +120,15 @@
   virtual void ListCommands(const UserInfo& user_info,
                             const CommandDoneCallback& callback) = 0;
 
-  void AddObserver(Observer* observer) { observer_list_.AddObserver(observer); }
-  void RemoveObserver(Observer* observer) {
-    observer_list_.RemoveObserver(observer);
-  }
-
-  void NotifyOnTraitDefsChanged();
-  void NotifyOnStateChanged();
-  void NotifyOnComponentTreeChanged();
+  virtual void AddOnTraitsChangedCallback(const base::Closure& callback) = 0;
+  virtual void AddOnStateChangedCallback(const base::Closure& callback) = 0;
+  virtual void AddOnComponentsChangeCallback(const base::Closure& callback) = 0;
 
   // Create default instance.
   static std::unique_ptr<CloudDelegate> CreateDefault(
       provider::TaskRunner* task_runner,
       DeviceRegistrationInfo* device,
       ComponentManager* component_manager);
-
- private:
-  base::ObserverList<Observer> observer_list_;
 };
 
 }  // namespace privet
diff --git a/src/privet/mock_delegates.h b/src/privet/mock_delegates.h
index 3fab9d0..3742494 100644
--- a/src/privet/mock_delegates.h
+++ b/src/privet/mock_delegates.h
@@ -20,8 +20,10 @@
 #include "src/privet/wifi_delegate.h"
 
 using testing::_;
+using testing::AtLeast;
 using testing::Return;
 using testing::ReturnRef;
+using testing::SaveArg;
 using testing::SetArgPointee;
 
 namespace weave {
@@ -207,6 +209,9 @@
                     const UserInfo&,
                     const CommandDoneCallback&));
   MOCK_METHOD2(ListCommands, void(const UserInfo&, const CommandDoneCallback&));
+  MOCK_METHOD1(AddOnTraitsChangedCallback, void(const base::Closure&));
+  MOCK_METHOD1(AddOnStateChangedCallback, void(const base::Closure&));
+  MOCK_METHOD1(AddOnComponentsChangeCallback, void(const base::Closure&));
 
   MockCloudDelegate() {
     EXPECT_CALL(*this, GetDeviceId()).WillRepeatedly(Return("TestId"));
@@ -232,12 +237,29 @@
     EXPECT_CALL(*this, MockGetComponentsForUser(_))
         .WillRepeatedly(ReturnRef(test_dict_));
     EXPECT_CALL(*this, FindComponent(_, _)).Times(0);
+
+    EXPECT_CALL(*this, AddOnTraitsChangedCallback(_))
+        .WillRepeatedly(SaveArg<0>(&on_traits_changed_));
+    EXPECT_CALL(*this, AddOnStateChangedCallback(_))
+        .WillRepeatedly(SaveArg<0>(&on_state_changed_));
+    EXPECT_CALL(*this, AddOnComponentsChangeCallback(_))
+        .WillRepeatedly(SaveArg<0>(&on_components_changed_));
   }
 
+  void NotifyOnTraitDefsChanged() { on_traits_changed_.Run(); }
+
+  void NotifyOnComponentTreeChanged() { on_components_changed_.Run(); }
+
+  void NotifyOnStateChanged() { on_state_changed_.Run(); }
+
   ConnectionState connection_state_{ConnectionState::kOnline};
   SetupState setup_state_{SetupState::kNone};
   base::DictionaryValue test_dict_;
 
+  base::Closure on_traits_changed_;
+  base::Closure on_state_changed_;
+  base::Closure on_components_changed_;
+
  private:
   std::unique_ptr<base::DictionaryValue> GetComponentsForUser(
       const UserInfo& user_info) const override {
diff --git a/src/privet/privet_handler.cc b/src/privet/privet_handler.cc
index 3ee8211..7afeb3b 100644
--- a/src/privet/privet_handler.cc
+++ b/src/privet/privet_handler.cc
@@ -398,7 +398,13 @@
   CHECK(device_);
   CHECK(security_);
   CHECK(clock_);
-  cloud_observer_.Add(cloud_);
+
+  cloud_->AddOnTraitsChangedCallback(base::Bind(
+      &PrivetHandler::OnTraitDefsChanged, weak_ptr_factory_.GetWeakPtr()));
+  cloud_->AddOnStateChangedCallback(base::Bind(&PrivetHandler::OnStateChanged,
+                                               weak_ptr_factory_.GetWeakPtr()));
+  cloud_->AddOnComponentsChangeCallback(base::Bind(
+      &PrivetHandler::OnComponentTreeChanged, weak_ptr_factory_.GetWeakPtr()));
 
   AddHandler("/privet/info", &PrivetHandler::HandleInfo, AuthScope::kNone);
   AddHandler("/privet/v3/pairing/start", &PrivetHandler::HandlePairingStart,
diff --git a/src/privet/privet_handler.h b/src/privet/privet_handler.h
index 4eba329..7b212e4 100644
--- a/src/privet/privet_handler.h
+++ b/src/privet/privet_handler.h
@@ -11,7 +11,6 @@
 
 #include <base/macros.h>
 #include <base/memory/weak_ptr.h>
-#include <base/scoped_observer.h>
 #include <base/time/default_clock.h>
 
 #include "src/privet/cloud_delegate.h"
@@ -31,7 +30,7 @@
 
 // Privet V3 HTTP/HTTPS requests handler.
 // API details at https://developers.google.com/cloud-devices/
-class PrivetHandler : public CloudDelegate::Observer {
+class PrivetHandler {
  public:
   // Callback to handle requests asynchronously.
   // |status| is HTTP status code.
@@ -45,11 +44,7 @@
                 SecurityDelegate* pairing,
                 WifiDelegate* wifi,
                 base::Clock* clock = nullptr);
-  ~PrivetHandler() override;
-
-  void OnTraitDefsChanged() override;
-  void OnStateChanged() override;
-  void OnComponentTreeChanged() override;
+  ~PrivetHandler();
 
   std::vector<std::string> GetHttpPaths() const;
   std::vector<std::string> GetHttpsPaths() const;
@@ -138,6 +133,10 @@
   void ReplyToUpdateRequest(const RequestCallback& callback) const;
   void OnUpdateRequestTimeout(int update_request_id);
 
+  void OnTraitDefsChanged();
+  void OnStateChanged();
+  void OnComponentTreeChanged();
+
   CloudDelegate* cloud_{nullptr};
   DeviceDelegate* device_{nullptr};
   SecurityDelegate* security_{nullptr};
@@ -165,7 +164,6 @@
   uint64_t state_fingerprint_{1};
   uint64_t traits_fingerprint_{1};
   uint64_t components_fingerprint_{1};
-  ScopedObserver<CloudDelegate, CloudDelegate::Observer> cloud_observer_{this};
 
   base::WeakPtrFactory<PrivetHandler> weak_ptr_factory_{this};