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