#ifndef DEVICE_BLUETOOTH_FLOSS_FLOSS_BATTERY_MANAGER_CLIENT_H_
#define DEVICE_BLUETOOTH_FLOSS_FLOSS_BATTERY_MANAGER_CLIENT_H_
#include <string>
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "dbus/exported_object.h"
#include "dbus/object_path.h"
#include "device/bluetooth/bluetooth_device.h"
#include "device/bluetooth/bluetooth_export.h"
#include "device/bluetooth/floss/exported_callback_manager.h"
#include "device/bluetooth/floss/floss_dbus_client.h"
namespace floss {
struct DEVICE_BLUETOOTH_EXPORT Battery {
uint32_t percentage;
std::string variant;
Battery();
~Battery();
};
struct DEVICE_BLUETOOTH_EXPORT BatterySet {
std::string address;
std::string source_uuid;
std::string source_info;
std::vector<Battery> batteries;
BatterySet();
BatterySet(const BatterySet&);
~BatterySet();
};
class DEVICE_BLUETOOTH_EXPORT FlossBatteryManagerClientObserver
: public base::CheckedObserver {
public:
FlossBatteryManagerClientObserver(const FlossBatteryManagerClientObserver&) =
delete;
FlossBatteryManagerClientObserver& operator=(
const FlossBatteryManagerClientObserver&) = delete;
FlossBatteryManagerClientObserver() = default;
~FlossBatteryManagerClientObserver() override = default;
virtual void BatteryInfoUpdated(std::string remote_address,
BatterySet battery_set) {}
};
class DEVICE_BLUETOOTH_EXPORT FlossBatteryManagerClient
: public FlossDBusClient,
public FlossBatteryManagerClientObserver {
public:
static const char kExportedCallbacksPath[];
static std::unique_ptr<FlossBatteryManagerClient> Create();
FlossBatteryManagerClient(const FlossBatteryManagerClient&) = delete;
FlossBatteryManagerClient& operator=(const FlossBatteryManagerClient&) =
delete;
FlossBatteryManagerClient();
~FlossBatteryManagerClient() override;
virtual void AddObserver(FlossBatteryManagerClientObserver* observer);
void RemoveObserver(FlossBatteryManagerClientObserver* observer);
virtual void GetBatteryInformation(
ResponseCallback<std::optional<BatterySet>> callback,
const FlossDeviceId& device);
void Init(dbus::Bus* bus,
const std::string& service_name,
const int adapter_index,
base::Version version,
base::OnceClosure on_ready) override;
protected:
friend class FlossBatteryManagerClientTest;
void BatteryInfoUpdated(std::string remote_address,
BatterySet battery_set) override;
void OnMethodsExported();
void BatteryCallbackRegistered(DBusResult<uint32_t> result);
void BatteryCallbackUnregistered(DBusResult<bool> result);
raw_ptr<dbus::Bus> bus_ = nullptr;
dbus::ObjectPath battery_manager_adapter_path_;
std::string service_name_;
base::ObserverList<FlossBatteryManagerClientObserver> observers_;
private:
friend class FlossBatteryManagerClientTest;
void CompleteInit();
template <typename R, typename... Args>
void CallBatteryManagerMethod(ResponseCallback<R> callback,
const char* member,
Args... args) {
CallMethod(std::move(callback), bus_, service_name_,
kBatteryManagerInterface, battery_manager_adapter_path_, member,
args...);
}
ExportedCallbackManager<FlossBatteryManagerClientObserver>
exported_callback_manager_{battery_manager::kCallbackInterface};
std::optional<uint32_t> battery_manager_callback_id_;
base::OnceClosure on_ready_;
base::WeakPtrFactory<FlossBatteryManagerClient> weak_ptr_factory_{this};
};
}
#endif