namespace bluetooth {
namespace activity_attribution {
-const ModuleFactory ActivityAttribution::Factory = ModuleFactory([]() {
- return new ActivityAttribution();
-});
+const ModuleFactory ActivityAttribution::Factory = ModuleFactory([]() { return new ActivityAttribution(); });
static const std::string kBtWakelockName("hal_bluetooth_lock");
bool is_registered = false;
auto control_service =
- ISuspendControlService::fromBinder(SpAIBinder(
- AServiceManager_getService("suspend_control")));
+ ISuspendControlService::fromBinder(SpAIBinder(AServiceManager_getService("suspend_control")));
if (!control_service) {
LOG_ERROR("Fail to obtain suspend_control");
return;
}
Status register_callback_status =
- control_service->registerCallback(SharedRefBase::make<wakeup_callback>(module),
- &is_registered);
+ control_service->registerCallback(SharedRefBase::make<wakeup_callback>(module), &is_registered);
if (!is_registered || !register_callback_status.isOk()) {
LOG_ERROR("Fail to register wakeup callback");
return;
}
}
+ void on_hci_packet(hal::HciPacket packet, hal::SnoopLogger::PacketType type, uint16_t length) {}
+
void register_callback(ActivityAttributionCallback* callback) {
callback_ = callback;
}
ActivityAttributionCallback* callback_;
};
-void ActivityAttribution::RegisterActivityAttributionCallback(
- ActivityAttributionCallback* callback) {
+void ActivityAttribution::Capture(const hal::HciPacket& packet, hal::SnoopLogger::PacketType type) {
+ uint16_t original_length = packet.size();
+ uint16_t truncate_length;
+
+ switch (type) {
+ case hal::SnoopLogger::PacketType::CMD:
+ case hal::SnoopLogger::PacketType::EVT:
+ truncate_length = packet.size();
+ break;
+ case hal::SnoopLogger::PacketType::ACL:
+ case hal::SnoopLogger::PacketType::SCO:
+ case hal::SnoopLogger::PacketType::ISO:
+ truncate_length = 0;
+ break;
+ }
+
+ if (!truncate_length) {
+ return;
+ }
+
+ hal::HciPacket truncate_packet(packet.begin(), packet.begin() + truncate_length);
+ CallOn(pimpl_.get(), &impl::on_hci_packet, truncate_packet, type, original_length);
+}
+
+void ActivityAttribution::RegisterActivityAttributionCallback(ActivityAttributionCallback* callback) {
CallOn(pimpl_.get(), &impl::register_callback, callback);
}
#include <future>
#include <vector>
+#include "btaa/activity_attribution.h"
#include "common/stop_watch.h"
#include "common/strings.h"
#include "hal/hci_hal.h"
class InternalHciCallbacks : public IBluetoothHciCallbacks {
public:
- InternalHciCallbacks(SnoopLogger* btsnoop_logger) : btsnoop_logger_(btsnoop_logger) {
+ InternalHciCallbacks(activity_attribution::ActivityAttribution* btaa_logger_, SnoopLogger* btsnoop_logger)
+ : btaa_logger_(btaa_logger_), btsnoop_logger_(btsnoop_logger) {
init_promise_ = new std::promise<void>();
}
common::StopWatch(GetTimerText(__func__, event));
std::vector<uint8_t> received_hci_packet(event.begin(), event.end());
btsnoop_logger_->Capture(received_hci_packet, SnoopLogger::Direction::INCOMING, SnoopLogger::PacketType::EVT);
+ btaa_logger_->Capture(received_hci_packet, SnoopLogger::PacketType::EVT);
if (callback_ != nullptr) {
callback_->hciEventReceived(std::move(received_hci_packet));
}
common::StopWatch(GetTimerText(__func__, data));
std::vector<uint8_t> received_hci_packet(data.begin(), data.end());
btsnoop_logger_->Capture(received_hci_packet, SnoopLogger::Direction::INCOMING, SnoopLogger::PacketType::ACL);
+ btaa_logger_->Capture(received_hci_packet, SnoopLogger::PacketType::ACL);
if (callback_ != nullptr) {
callback_->aclDataReceived(std::move(received_hci_packet));
}
common::StopWatch(GetTimerText(__func__, data));
std::vector<uint8_t> received_hci_packet(data.begin(), data.end());
btsnoop_logger_->Capture(received_hci_packet, SnoopLogger::Direction::INCOMING, SnoopLogger::PacketType::SCO);
+ btaa_logger_->Capture(received_hci_packet, SnoopLogger::PacketType::SCO);
if (callback_ != nullptr) {
callback_->scoDataReceived(std::move(received_hci_packet));
}
private:
std::promise<void>* init_promise_ = nullptr;
HciHalCallbacks* callback_ = nullptr;
+ activity_attribution::ActivityAttribution* btaa_logger_ = nullptr;
SnoopLogger* btsnoop_logger_ = nullptr;
};
void sendHciCommand(HciPacket command) override {
common::StopWatch(GetTimerText(__func__, command));
btsnoop_logger_->Capture(command, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::CMD);
+ btaa_logger_->Capture(command, SnoopLogger::PacketType::CMD);
bt_hci_->sendHciCommand(command);
}
void sendAclData(HciPacket packet) override {
common::StopWatch(GetTimerText(__func__, packet));
btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::ACL);
+ btaa_logger_->Capture(packet, SnoopLogger::PacketType::ACL);
bt_hci_->sendAclData(packet);
}
void sendScoData(HciPacket packet) override {
common::StopWatch(GetTimerText(__func__, packet));
btsnoop_logger_->Capture(packet, SnoopLogger::Direction::OUTGOING, SnoopLogger::PacketType::SCO);
+ btaa_logger_->Capture(packet, SnoopLogger::PacketType::SCO);
bt_hci_->sendScoData(packet);
}
protected:
void ListDependencies(ModuleList* list) override {
list->add<SnoopLogger>();
+ list->add<activity_attribution::ActivityAttribution>();
}
void Start() override {
+ btaa_logger_ = GetDependency<activity_attribution::ActivityAttribution>();
btsnoop_logger_ = GetDependency<SnoopLogger>();
bt_hci_1_1_ = IBluetoothHci::getService();
ASSERT_LOG(death_link.isOk(), "Unable to set the death recipient for the Bluetooth HAL");
// Block allows allocation of a variable that might be bypassed by goto.
{
- callbacks_ = new InternalHciCallbacks(btsnoop_logger_);
+ callbacks_ = new InternalHciCallbacks(btaa_logger_, btsnoop_logger_);
if (bt_hci_1_1_ != nullptr) {
bt_hci_1_1_->initialize_1_1(callbacks_);
} else {
android::sp<InternalHciCallbacks> callbacks_;
android::sp<IBluetoothHci_1_0> bt_hci_;
android::sp<IBluetoothHci> bt_hci_1_1_;
+ activity_attribution::ActivityAttribution* btaa_logger_;
SnoopLogger* btsnoop_logger_;
};