Store pointer to handle outside of ISecurityManagerListener

ISecurityManagerListener does not need to be aware of the handler

Bug: 142341141
Change-Id: Iff4ad3eef3cf3925509808bf84d4c403d62c618e
diff --git a/gd/security/internal/security_manager_impl.cc b/gd/security/internal/security_manager_impl.cc
index 7b886f5..2ab002f 100644
--- a/gd/security/internal/security_manager_impl.cc
+++ b/gd/security/internal/security_manager_impl.cc
@@ -100,20 +100,20 @@
   // Signal Remove from database
 }
 
-void SecurityManagerImpl::RegisterCallbackListener(ISecurityManagerListener* listener) {
+void SecurityManagerImpl::RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler) {
   if (listeners_.size() < 1) {
-    listeners_.push_back(listener);
+    listeners_.push_back({listener, handler});
   } else {
     bool found = false;
     for (auto it = listeners_.begin(); it != listeners_.end(); ++it) {
-      found = *it == listener;
+      found = it->first == listener;
       if (found) break;
     }
 
     if (found) {
       LOG_ERROR("Listener has already been registered!");
     } else {
-      listeners_.push_back(listener);
+      listeners_.push_back({listener, handler});
     }
   }
 }
@@ -125,7 +125,7 @@
     bool found = false;
     auto it = listeners_.begin();
     while (it != listeners_.end()) {
-      found = *it == listener;
+      found = it->first == listener;
       if (found) break;
       ++it;
     }
@@ -137,18 +137,20 @@
 
 void SecurityManagerImpl::FireDeviceBondedCallbacks(std::shared_ptr<Device> device) {
   for (auto& iter : listeners_) {
-    iter->handler_->Post(common::Bind(&ISecurityManagerListener::OnDeviceBonded, common::Unretained(iter), device));
+    iter.second->Post(common::Bind(&ISecurityManagerListener::OnDeviceBonded, common::Unretained(iter.first), device));
   }
 }
 
 void SecurityManagerImpl::FireBondFailedCallbacks(std::shared_ptr<Device> device) {
   for (auto& iter : listeners_) {
-    iter->handler_->Post(common::Bind(&ISecurityManagerListener::OnDeviceBondFailed, common::Unretained(iter), device));
+    iter.second->Post(
+        common::Bind(&ISecurityManagerListener::OnDeviceBondFailed, common::Unretained(iter.first), device));
   }
 }
 
 void SecurityManagerImpl::FireUnbondCallbacks(std::shared_ptr<Device> device) {
   for (auto& iter : listeners_) {
-    iter->handler_->Post(common::Bind(&ISecurityManagerListener::OnDeviceUnbonded, common::Unretained(iter), device));
+    iter.second->Post(
+        common::Bind(&ISecurityManagerListener::OnDeviceUnbonded, common::Unretained(iter.first), device));
   }
 }
diff --git a/gd/security/internal/security_manager_impl.h b/gd/security/internal/security_manager_impl.h
index 1e17770..e1aca59 100644
--- a/gd/security/internal/security_manager_impl.h
+++ b/gd/security/internal/security_manager_impl.h
@@ -22,6 +22,8 @@
 #include "os/handler.h"
 #include "security/channel/security_manager_channel.h"
 
+#include <utility>
+
 namespace bluetooth {
 namespace security {
 
@@ -80,7 +82,7 @@
    *
    * @param listener ISecurityManagerListener instance to handle callbacks
    */
-  void RegisterCallbackListener(ISecurityManagerListener* listener);
+  void RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler);
 
   /**
    * Unregister listener for callback events from SecurityManager
@@ -90,7 +92,7 @@
   void UnregisterCallbackListener(ISecurityManagerListener* listener);
 
  protected:
-  std::vector<ISecurityManagerListener*> listeners_;
+  std::vector<std::pair<ISecurityManagerListener*, os::Handler*>> listeners_;
   void FireDeviceBondedCallbacks(std::shared_ptr<bluetooth::hci::Device> device);
   void FireBondFailedCallbacks(std::shared_ptr<bluetooth::hci::Device> device);
   void FireUnbondCallbacks(std::shared_ptr<bluetooth::hci::Device> device);
diff --git a/gd/security/security_manager.cc b/gd/security/security_manager.cc
index 239f388..40858a9 100644
--- a/gd/security/security_manager.cc
+++ b/gd/security/security_manager.cc
@@ -47,14 +47,12 @@
                                            std::forward<std::shared_ptr<hci::ClassicDevice>>(device)));
 }
 
-void SecurityManager::RegisterCallbackListener(ISecurityManagerListener* listener) {
+void SecurityManager::RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler) {
   security_handler_->Post(common::BindOnce(&internal::SecurityManagerImpl::RegisterCallbackListener,
-                                           common::Unretained(security_manager_impl_),
-                                           std::forward<ISecurityManagerListener*>(listener)));
+                                           common::Unretained(security_manager_impl_), listener, handler));
 }
 
 void SecurityManager::UnregisterCallbackListener(ISecurityManagerListener* listener) {
   security_handler_->Post(common::BindOnce(&internal::SecurityManagerImpl::UnregisterCallbackListener,
-                                           common::Unretained(security_manager_impl_),
-                                           std::forward<ISecurityManagerListener*>(listener)));
+                                           common::Unretained(security_manager_impl_), listener));
 }
diff --git a/gd/security/security_manager.h b/gd/security/security_manager.h
index 9f52452..deb2788 100644
--- a/gd/security/security_manager.h
+++ b/gd/security/security_manager.h
@@ -33,7 +33,6 @@
  */
 class ISecurityManagerListener {
  public:
-  ISecurityManagerListener(os::Handler* handler) : handler_(handler) {}
   virtual ~ISecurityManagerListener() = 0;
 
   /**
@@ -56,8 +55,6 @@
    * @param device pointer to the device that is no longer bonded
    */
   virtual void OnDeviceBondFailed(std::shared_ptr<bluetooth::hci::Device> device) = 0;
-
-  os::Handler* handler_ = nullptr;
 };
 
 /**
@@ -99,7 +96,7 @@
    *
    * @param listener ISecurityManagerListener instance to handle callbacks
    */
-  void RegisterCallbackListener(ISecurityManagerListener* listener);
+  void RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler);
 
   /**
    * Unregister listener for callback events from SecurityManager