bluez5 mod - support battery properties/iface for bt popup list

This commit is contained in:
Carsten Haitzler 2020-08-27 11:56:15 +01:00
parent caa18034ab
commit 2ff06deacc
2 changed files with 107 additions and 24 deletions

View File

@ -32,103 +32,103 @@ cb_obj_prop_entry(void *data, const void *key, Eldbus_Message_Iter *var)
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->paired = val;
}
if (!strcmp(skey, "Connected"))
else if (!strcmp(skey, "Connected"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->connected = val;
}
if (!strcmp(skey, "Trusted"))
else if (!strcmp(skey, "Trusted"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->trusted = val;
}
if (!strcmp(skey, "Blocked"))
else if (!strcmp(skey, "Blocked"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->blocked = val;
}
if (!strcmp(skey, "LegacyPairing"))
else if (!strcmp(skey, "LegacyPairing"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->legacy_pairing = val;
}
if (!strcmp(skey, "ServicesResolved"))
else if (!strcmp(skey, "ServicesResolved"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->services_resolved = val;
}
if (!strcmp(skey, "Address"))
else if (!strcmp(skey, "Address"))
{
const char *val = NULL;
if (eldbus_message_iter_arguments_get(var, "s", &val))
o->address = eina_stringshare_add(val);
}
if (!strcmp(skey, "AddressType"))
else if (!strcmp(skey, "AddressType"))
{
const char *val = NULL;
if (eldbus_message_iter_arguments_get(var, "s", &val))
o->address_type = eina_stringshare_add(val);
}
if (!strcmp(skey, "Name"))
else if (!strcmp(skey, "Name"))
{
const char *val = NULL;
if (eldbus_message_iter_arguments_get(var, "s", &val))
o->name = eina_stringshare_add(val);
}
if (!strcmp(skey, "Icon"))
else if (!strcmp(skey, "Icon"))
{
const char *val = NULL;
if (eldbus_message_iter_arguments_get(var, "s", &val))
o->icon = eina_stringshare_add(val);
}
if (!strcmp(skey, "Alias"))
else if (!strcmp(skey, "Alias"))
{
const char *val = NULL;
if (eldbus_message_iter_arguments_get(var, "s", &val))
o->alias = eina_stringshare_add(val);
}
if (!strcmp(skey, "Modalias"))
else if (!strcmp(skey, "Modalias"))
{
const char *val = NULL;
if (eldbus_message_iter_arguments_get(var, "s", &val))
o->modalias = eina_stringshare_add(val);
}
if (!strcmp(skey, "Adapter"))
else if (!strcmp(skey, "Adapter"))
{
const char *val = NULL;
if (eldbus_message_iter_arguments_get(var, "o", &val))
o->adapter = eina_stringshare_add(val);
}
if (!strcmp(skey, "Class"))
else if (!strcmp(skey, "Class"))
{
unsigned int val = 0;
if (eldbus_message_iter_arguments_get(var, "u", &val))
o->klass = val;
}
if (!strcmp(skey, "Appearance"))
else if (!strcmp(skey, "Appearance"))
{
unsigned short val = 0;
if (eldbus_message_iter_arguments_get(var, "q", &val))
o->appearance = val;
}
if (!strcmp(skey, "RSSI"))
else if (!strcmp(skey, "RSSI"))
{
short val = 0;
if (eldbus_message_iter_arguments_get(var, "n", &val))
o->rssi = val;
}
if (!strcmp(skey, "TxPower"))
else if (!strcmp(skey, "TxPower"))
{
unsigned short val = 0;
if (eldbus_message_iter_arguments_get(var, "n", &val))
o->txpower = val;
}
if (!strcmp(skey, "UUIDs"))
else if (!strcmp(skey, "UUIDs"))
{
Eldbus_Message_Iter *array = NULL;
@ -143,37 +143,37 @@ cb_obj_prop_entry(void *data, const void *key, Eldbus_Message_Iter *var)
}
}
}
if (!strcmp(skey, "Discoverable"))
else if (!strcmp(skey, "Discoverable"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->discoverable = val;
}
if (!strcmp(skey, "Discovering"))
else if (!strcmp(skey, "Discovering"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->discovering = val;
}
if (!strcmp(skey, "Pairable"))
else if (!strcmp(skey, "Pairable"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->pairable = val;
}
if (!strcmp(skey, "Powered"))
else if (!strcmp(skey, "Powered"))
{
Eina_Bool val = EINA_FALSE;
if (eldbus_message_iter_arguments_get(var, "b", &val))
o->powered = val;
}
if (!strcmp(skey, "DiscoverableTimeout"))
else if (!strcmp(skey, "DiscoverableTimeout"))
{
unsigned int val = 0;
if (eldbus_message_iter_arguments_get(var, "u", &val))
o->discoverable_timeout = val;
}
if (!strcmp(skey, "PairableTimeout"))
else if (!strcmp(skey, "PairableTimeout"))
{
unsigned int val = 0;
if (eldbus_message_iter_arguments_get(var, "u", &val))
@ -287,6 +287,42 @@ cb_obj_prop_changed(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSE
eldbus_proxy_property_get_all(o->proxy, cb_obj_prop, o);
}
static void
cb_obj_prop_bat_entry(void *data, const void *key, Eldbus_Message_Iter *var)
{
Obj *o = data;
const char *skey = key;
if (!strcmp(skey, "Percentage"))
{
char val;
if (eldbus_message_iter_arguments_get(var, "y", &val))
o->bat_percent = val;
}
}
static void
cb_obj_prop_bat(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
{
Obj *o = data;
Eldbus_Message_Iter *array;
if (eldbus_message_error_get(msg, NULL, NULL)) return;
if (eldbus_message_arguments_get(msg, "a{sv}", &array))
eldbus_message_iter_dict_iterate(array, "sv", cb_obj_prop_bat_entry, o);
bz_obj_ref(o);
if (o->fn_change) o->fn_change(o);
bz_obj_unref(o);
}
static void
cb_obj_prop_bat_changed(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED)
{
Obj *o = data;
if (!o->proxy_bat) return;
eldbus_proxy_property_get_all(o->proxy_bat, cb_obj_prop_bat, o);
}
//static void
//cb_obj_discovery_filter(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
//{
@ -302,6 +338,7 @@ bz_obj_add(const char *path)
o->obj = eldbus_object_get(bz_conn, "org.bluez", o->path);
o->type = BZ_OBJ_UNKNOWN;
o->in_table = EINA_TRUE;
o->bat_percent = -1;
eina_hash_add(obj_table, o->path, o);
if (!strcmp(o->path, "/org/bluez"))
{
@ -316,8 +353,9 @@ bz_obj_add(const char *path)
// all devices are /org/bluez/XXX/dev_XXX so look for /dev_
else if (strstr(o->path, "/dev_"))
{
o->proxy = eldbus_proxy_get(o->obj, "org.bluez.Device1");
o->type = BZ_OBJ_DEVICE;
// device properties
o->proxy = eldbus_proxy_get(o->obj, "org.bluez.Device1");
if (o->proxy)
{
eldbus_proxy_property_get_all(o->proxy, cb_obj_prop, o);
@ -328,6 +366,18 @@ bz_obj_add(const char *path)
"PropertiesChanged",
cb_obj_prop_changed, o);
}
// battery properties - if it supports it
o->proxy_bat = eldbus_proxy_get(o->obj, "org.bluez.Battery1");
if (o->proxy_bat)
{
eldbus_proxy_property_get_all(o->proxy_bat, cb_obj_prop_bat, o);
o->prop_proxy_bat = eldbus_proxy_get(o->obj,
"org.freedesktop.DBus.Properties");
if (o->prop_proxy_bat)
o->prop_sig_bat = eldbus_proxy_signal_handler_add(o->prop_proxy_bat,
"PropertiesChanged",
cb_obj_prop_bat_changed, o);
}
goto done;
}
// all dadapters begin with /org/bluez/
@ -766,6 +816,16 @@ bz_obj_unref(Obj *o)
eldbus_proxy_unref(o->prop_proxy);
o->prop_proxy = NULL;
}
if (o->proxy_bat)
{
eldbus_proxy_unref(o->proxy_bat);
o->proxy_bat = NULL;
}
if (o->prop_proxy_bat)
{
eldbus_proxy_unref(o->prop_proxy_bat);
o->prop_proxy_bat = NULL;
}
if (o->obj)
{
eldbus_object_unref(o->obj);

View File

@ -736,6 +736,29 @@ _cb_dev_content_get(void *data, Evas_Object *obj,
}
}
if (o->bat_percent >= 0)
{
Evas_Object *bat;
Edje_Message_Float msg;
double level = 0.0;
const int size = 24;
bat = edje_object_add(evas_object_evas_get(obj));
e_theme_edje_object_set(bat, "base/theme/modules/battery",
"e/modules/battery/main");
snprintf(buf, sizeof(buf), "%i", o->bat_percent);
edje_object_part_text_set(bat, "e.text.reading", buf);
level = (double)o->bat_percent / 100.0;
if (level > 1.0) level = 1.0;
msg.val = level;
edje_object_message_send(bat, EDJE_MESSAGE_FLOAT, 1, &msg);
evas_object_size_hint_min_set(bat,
ELM_SCALE_SIZE(size),
ELM_SCALE_SIZE(size));
elm_box_pack_end(bx, bat);
evas_object_show(bat);
}
bt = util_button_icon_add(obj, "view-more-horizontal",
_("Options for device like connect, pair etc."));
evas_object_data_set(bt, "genlist", obj);