raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=2ff06deaccae22745663c3a01b9a7e1444c7eb04

commit 2ff06deaccae22745663c3a01b9a7e1444c7eb04
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Thu Aug 27 11:56:15 2020 +0100

    bluez5 mod - support battery properties/iface for bt popup list
---
 src/modules/bluez5/bz_obj.c      | 108 ++++++++++++++++++++++++++++++---------
 src/modules/bluez5/e_mod_popup.c |  23 +++++++++
 2 files changed, 107 insertions(+), 24 deletions(-)

diff --git a/src/modules/bluez5/bz_obj.c b/src/modules/bluez5/bz_obj.c
index 867181c7d..0b2cee3a0 100644
--- a/src/modules/bluez5/bz_obj.c
+++ b/src/modules/bluez5/bz_obj.c
@@ -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);
diff --git a/src/modules/bluez5/e_mod_popup.c b/src/modules/bluez5/e_mod_popup.c
index b0fddd3d7..21d8eb41e 100644
--- a/src/modules/bluez5/e_mod_popup.c
+++ b/src/modules/bluez5/e_mod_popup.c
@@ -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);

-- 


Reply via email to