diff --git a/src/modules/bluez5/bz.h b/src/modules/bluez5/bz.h index 252f20180..2d099977f 100644 --- a/src/modules/bluez5/bz.h +++ b/src/modules/bluez5/bz.h @@ -19,6 +19,10 @@ struct _Obj { unsigned int ref; Eina_Bool in_table : 1; Eina_Bool add_called : 1; + Eina_Bool ping_ok : 1; + Ecore_Timer *ping_timer; + Ecore_Exe *ping_exe; + Ecore_Event_Handler *ping_exe_handler; //// public data to read const char *path; Obj_Type type; @@ -196,9 +200,11 @@ void bz_obj_pair(Obj *o); void bz_obj_pair_cancel(Obj *o); void bz_obj_connect(Obj *o); void bz_obj_disconnect(Obj *o); +void bz_obj_ping_begin(Obj *o); +void bz_obj_ping_end(Obj *o); void bz_obj_remove(Obj *o); -void bz_obj_profile_connect(Obj *o, const char *uuid); -void bz_obj_profile_disconnect(Obj *o, const char *uuid); +//void bz_obj_profile_connect(Obj *o, const char *uuid); +//void bz_obj_profile_disconnect(Obj *o, const char *uuid); void bz_obj_ref(Obj *o); void bz_obj_unref(Obj *o); void bz_obj_discover_start(Obj *o); diff --git a/src/modules/bluez5/bz_obj.c b/src/modules/bluez5/bz_obj.c index a79d2a837..dc6aaf132 100644 --- a/src/modules/bluez5/bz_obj.c +++ b/src/modules/bluez5/bz_obj.c @@ -286,6 +286,12 @@ 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_discovery_filter(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + ERR_PRINT("Discovery Filter Clear"); +} + Obj * bz_obj_add(const char *path) { @@ -339,6 +345,9 @@ bz_obj_add(const char *path) o->prop_sig = eldbus_proxy_signal_handler_add(o->prop_proxy, "PropertiesChanged", cb_obj_prop_changed, o); + // disable the filter for discovery later + eldbus_proxy_call + (o->proxy, "SetDiscoveryFilter", cb_obj_discovery_filter, o, -1, ""); } goto done; } @@ -526,6 +535,157 @@ bz_obj_disconnect(Obj *o) eldbus_proxy_call (o->proxy, "Disconnect", cb_disconnect, o, -1, ""); } + +static Eina_Bool +cb_ping_exit(void *data, int type EINA_UNUSED, void *event) +{ + Obj *o = data; + Ecore_Exe_Event_Del *ev = event; + + printf("@@@EXE EXIT.. %p == %p\n", ev->exe, o->ping_exe); + if (ev->exe != o->ping_exe) return ECORE_CALLBACK_PASS_ON; + printf("@@@PING RESULT... %i\n", ev->exit_code); + o->ping_exe = NULL; + if (ev->exit_code == 0) + { + if (!o->ping_ok) + { + printf("@@@PING SUCCEED\n"); + o->ping_ok = EINA_TRUE; + if (o->fn_change) o->fn_change(o); + } + } + else + { + if (o->ping_ok) + { + printf("@@@PING FAIL\n"); + o->ping_ok = EINA_FALSE; + if (o->fn_change) o->fn_change(o); + } + } + return ECORE_CALLBACK_PASS_ON; +} + +static int +ping_powersave_timeout_get(void) +{ + int timeout = 10; + E_Powersave_Mode pm = e_powersave_mode_get(); + + if (pm <= E_POWERSAVE_MODE_LOW) timeout = 5; + else if (pm <= E_POWERSAVE_MODE_MEDIUM) timeout = 8; + else if (pm <= E_POWERSAVE_MODE_HIGH) timeout = 12; + else if (pm <= E_POWERSAVE_MODE_EXTREME) timeout = 30; + return timeout; +} + +static void +ping_do(Obj *o) +{ + Eina_Strbuf *buf; + + if (!o->ping_exe_handler) + o->ping_exe_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, + cb_ping_exit, o); + buf = eina_strbuf_new(); + if (buf) + { + int timeout = ping_powersave_timeout_get(); + + timeout *= 1000; + eina_strbuf_append_printf + (buf, "%s/enlightenment/utils/enlightenment_sys l2ping %s %i", + e_prefix_lib_get(), o->address, timeout); + o->ping_exe = ecore_exe_run(eina_strbuf_string_get(buf), NULL); + eina_strbuf_free(buf); + printf("@@@ run new ping %s %i = %p\n", o->address, timeout, o->ping_exe); + } +} + +static Eina_Bool cb_ping_timer(void *data); + +static void +ping_schedule(Obj *o) +{ + double timeout = ping_powersave_timeout_get() + 1.0; + + if (o->ping_timer) ecore_timer_del(o->ping_timer); + o->ping_timer = ecore_timer_add(timeout, cb_ping_timer, o); +} + +static Eina_Bool +cb_ping_timer(void *data) +{ + Obj *o = data; + + printf("@@@ ping timer %s\n", o->address); + if (o->ping_exe) + { + printf("@@@PING TIMEOUT\n"); + ecore_exe_free(o->ping_exe); + o->ping_exe = NULL; + if (o->ping_ok) + { + o->ping_ok = EINA_FALSE; + if (o->fn_change) o->fn_change(o); + } + } + ping_do(o); + ping_schedule(o); + return EINA_TRUE; +} + +void +bz_obj_ping_begin(Obj *o) +{ + if (o->ping_timer) return; + if (o->ping_exe_handler) + { + ecore_event_handler_del(o->ping_exe_handler); + o->ping_exe_handler = NULL; + } + if (o->ping_exe) + { + ecore_exe_free(o->ping_exe); + o->ping_exe = NULL; + } + ping_do(o); + ping_schedule(o); + } + +void +bz_obj_ping_end(Obj *o) +{ + if (o->ping_exe_handler) + { + ecore_event_handler_del(o->ping_exe_handler); + o->ping_exe_handler = NULL; + } + if (o->ping_timer) + { + ecore_timer_del(o->ping_timer); + o->ping_timer = NULL; + } + if (o->ping_exe) + { + ecore_exe_free(o->ping_exe); + o->ping_exe = NULL; + } + if (o->ping_ok) + { + printf("@@@PING END %s\n", o->address); + o->ping_ok = EINA_FALSE; + if (o->fn_change) o->fn_change(o); + } +} + +static void +cb_remove(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED) +{ + ERR_PRINT("Remove"); +} + /* void bz_obj_profile_connect(Obj *o, const char *uuid) @@ -541,11 +701,6 @@ bz_obj_profile_disconnect(Obj *o, const char *uuid) eldbus_proxy_call(o->proxy, "DisconnectProfile", NULL, NULL, -1, "s", uuid); } */ -static void -cb_remove(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED) -{ - ERR_PRINT("Remove"); -} void bz_obj_remove(Obj *o) @@ -615,6 +770,21 @@ bz_obj_unref(Obj *o) bz_agent_msg_drop(o->agent_msg_ok); o->agent_msg_ok = NULL; } + if (o->ping_exe_handler) + { + ecore_event_handler_del(o->ping_exe_handler); + o->ping_exe_handler = NULL; + } + if (o->ping_timer) + { + ecore_timer_del(o->ping_timer); + o->ping_timer = NULL; + } + if (o->ping_exe) + { + ecore_exe_free(o->ping_exe); + o->ping_exe = NULL; + } free(o); } diff --git a/src/modules/bluez5/e_mod_main.c b/src/modules/bluez5/e_mod_main.c index d0aad0a59..ad576bfba 100644 --- a/src/modules/bluez5/e_mod_main.c +++ b/src/modules/bluez5/e_mod_main.c @@ -5,6 +5,7 @@ static E_Module *mod = NULL; /* Local config */ static E_Config_DD *conf_adapter_edd = NULL; +static E_Config_DD *conf_device_edd = NULL; static E_Config_DD *conf_edd = NULL; Config *ebluez5_config = NULL; @@ -332,6 +333,88 @@ ebluez5_instances_update(void) } } +static void +_device_prop_clean(Config_Device *dev) +{ + if ((!dev->unlock) && (!dev->force_connect)) + { + ebluez5_config->devices = eina_list_remove(ebluez5_config->devices, dev); + eina_stringshare_del(dev->addr); + free(dev); + } +} + +static Config_Device * +_device_prop_new(const char *address) +{ + Config_Device *dev = calloc(1, sizeof(Config_Device)); + if (!dev) return NULL; + dev->addr = eina_stringshare_add(address); + if (!dev->addr) + { + free(dev); + return NULL; + } + ebluez5_config->devices = eina_list_append(ebluez5_config->devices, dev); + return dev; +} + +Config_Device * +ebluez5_device_prop_find(const char *address) +{ + Config_Device *dev; + Eina_List *l; + + if (!address) return NULL; + EINA_LIST_FOREACH(ebluez5_config->devices, l, dev) + { + if ((dev->addr) && (!strcmp(address, dev->addr))) + return dev; + } + return NULL; +} + + +void +ebluez5_device_prop_force_connect_set(const char *address, Eina_Bool enable) +{ + Config_Device *dev; + + if (!address) return; + dev = ebluez5_device_prop_find(address); + if (dev) + { + dev->force_connect = enable; + _device_prop_clean(dev); + return; + } + if (enable) + { + dev = _device_prop_new(address); + dev->force_connect = enable; + } +} + +void +ebluez5_device_prop_unlock_set(const char *address, Eina_Bool enable) +{ + Config_Device *dev; + + if (!address) return; + dev = ebluez5_device_prop_find(address); + if (dev) + { + dev->unlock = enable; + _device_prop_clean(dev); + return; + } + if (enable) + { + dev = _device_prop_new(address); + dev->unlock = enable; + } +} + ///////////////////////////////////////////////////////////////////////////// /* Module Functions */ @@ -349,12 +432,22 @@ e_modapi_init(E_Module *m) E_CONFIG_VAL(D, T, powered, UCHAR); E_CONFIG_VAL(D, T, pairable, UCHAR); + conf_device_edd = E_CONFIG_DD_NEW("Config_Device", Config_Device); +#undef T +#undef D +#define T Config_Device +#define D conf_device_edd + E_CONFIG_VAL(D, T, addr, STR); + E_CONFIG_VAL(D, T, force_connect, UCHAR); + E_CONFIG_VAL(D, T, unlock, UCHAR); + conf_edd = E_CONFIG_DD_NEW("Config", Config); #undef T #undef D #define T Config #define D conf_edd E_CONFIG_LIST(D, T, adapters, conf_adapter_edd); + E_CONFIG_LIST(D, T, devices, conf_device_edd); ebluez5_config = e_config_domain_load("module.ebluez5", conf_edd); if (!ebluez5_config) ebluez5_config = E_NEW(Config, 1); @@ -372,6 +465,7 @@ E_API int e_modapi_shutdown(E_Module *m EINA_UNUSED) { Config_Adapter *ad; + Config_Device *dev; E_CONFIG_DD_FREE(conf_edd); E_CONFIG_DD_FREE(conf_adapter_edd); @@ -381,6 +475,11 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) eina_stringshare_del(ad->addr); free(ad); } + EINA_LIST_FREE(ebluez5_config->devices, dev) + { + eina_stringshare_del(dev->addr); + free(dev); + } free(ebluez5_config); ebluez5_config = NULL; diff --git a/src/modules/bluez5/e_mod_main.h b/src/modules/bluez5/e_mod_main.h index 788db7a34..e0bef146e 100644 --- a/src/modules/bluez5/e_mod_main.h +++ b/src/modules/bluez5/e_mod_main.h @@ -23,6 +23,7 @@ typedef struct _Config Config; struct _Config { Eina_List *adapters; + Eina_List *devices; }; typedef struct _Config_Adapter Config_Adapter; struct _Config_Adapter @@ -31,6 +32,13 @@ struct _Config_Adapter Eina_Bool powered; Eina_Bool pairable; }; +typedef struct _Config_Device Config_Device; +struct _Config_Device +{ + const char *addr; + Eina_Bool force_connect; + Eina_Bool unlock; +}; extern Config *ebluez5_config; @@ -45,6 +53,10 @@ void ebluez5_popups_show(void); void ebluez5_rfkill_unblock(const char *name); void ebluez5_instances_update(void); +void ebluez5_device_prop_force_connect_set(const char *address, Eina_Bool enable); +void ebluez5_device_prop_unlock_set(const char *address, Eina_Bool enable); +Config_Device *ebluez5_device_prop_find(const char *address); + void ebluez5_popup_hide(Instance *inst); Evas_Object *ebluez5_popup_content_add(Evas_Object *base, Instance *inst); diff --git a/src/modules/bluez5/e_mod_popup.c b/src/modules/bluez5/e_mod_popup.c index d04bc4489..2eb0b1cab 100644 --- a/src/modules/bluez5/e_mod_popup.c +++ b/src/modules/bluez5/e_mod_popup.c @@ -7,12 +7,137 @@ static Eina_List *lists = NULL; static Eina_List *adapters = NULL; static Eina_List *devices = NULL; +static int unlock_count = 0; +static int unlock_do = 0; +static Eina_Bool unlock_block = EINA_FALSE; + +static Config_Device * +_devices_conifg_find(const char *address) +{ + Config_Device *dev; + Eina_List *l; + + if (!ebluez5_config) return NULL; + if (!address) return NULL; + EINA_LIST_FOREACH(ebluez5_config->devices, l, dev) + { + if ((dev->addr) && (!strcmp(address, dev->addr))) return dev; + } + return NULL; +} + +static void +_devices_eval(void) +{ + Obj *o; + Eina_List *l; + Config_Device *dev; + int unlock_count_prev = 0; + + unlock_count_prev = unlock_count; + unlock_count = 0; + unlock_do = 0; + printf("=== _devices_eval...\n"); + EINA_LIST_FOREACH(devices, l, o) + { + if (o->paired) + { + Eina_Bool need_ping = EINA_FALSE; + + dev = _devices_conifg_find(o->address); + if (dev) + { + printf("=== dev: %s|%s [%s]\n", dev->addr, o->address, o->name); + if ((dev->force_connect) && (!o->connected)) + { + printf("=== %s force con, not conn, ping ok=%i\n", o->address, o->ping_ok); + if (o->ping_ok) + { + printf("=== %s force con, not conn, ping ok=%i\n", o->address, o->ping_ok); + bz_obj_connect(o); + } + else need_ping = EINA_TRUE; + } + if (dev->unlock) + { + printf("=== unlock...\n"); + // if a device on our list needs an unlock, then + // add to our possible unlock counts needed + unlock_count++; +#if 0 + // if the device is connected then assume it unlocks + if (o->connected) + { + printf("=== don't need ping1\n"); + unlock_do++; + } + else +#endif + { + printf("=== need ping2\n"); + need_ping = EINA_TRUE; + if (o->ping_ok) unlock_do++; + } + } + } + printf("=== %s need_ping=%i conn=%i ping_ok=%i\n", o->address, need_ping, o->connected, o->ping_ok); + if (need_ping) bz_obj_ping_begin(o); + else bz_obj_ping_end(o); + } + } + printf("=================== unlock: %i/%i\n", unlock_do, unlock_count); + if (unlock_count > 0) + { + if (unlock_do == 0) + { + if (unlock_block) + { + unlock_block = EINA_FALSE; + printf("=== DESKLOCK UNBLOCK\n"); + e_desklock_unblock(); + printf("=== DESLOCK SHOW\n"); + e_desklock_show(EINA_FALSE); + } + } + else + { + if (!unlock_block) + { + unlock_block = EINA_TRUE; + printf("=== DESKLOCK BLOCK\n"); + e_desklock_block(); + } + } + } + else + { + if (unlock_count_prev != unlock_count) + { + if (!e_desklock_manual_get()) + { + if (e_desklock_state_get()) + { + printf("=== DESKLOCK HIDE\n"); + e_desklock_hide(); + } + } + } + if (unlock_block) + { + unlock_block = EINA_FALSE; + printf("=== DESKLOCK UNBLOCK\n"); + e_desklock_unblock(); + } + } +} + static void _adapter_add(Evas_Object *gl, Obj *o) { Elm_Object_Item *it = evas_object_data_get(gl, "adapters_item");; + elm_genlist_item_append(gl, adapt_itc, o, it, ELM_GENLIST_ITEM_NONE, - NULL, NULL); + NULL, NULL); } static int @@ -44,7 +169,8 @@ _device_add(Evas_Object *gl, Obj *o) { Elm_Object_Item *it = evas_object_data_get(gl, "devices_item");; - elm_genlist_item_sorted_insert(gl, dev_itc, o, it, ELM_GENLIST_ITEM_NONE, + elm_genlist_item_sorted_insert(gl, dev_itc, o, it, + ELM_GENLIST_ITEM_NONE, _cb_insert_cmp, NULL, NULL); } @@ -131,6 +257,61 @@ _cb_unpair(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSE bz_obj_remove(o); } +static void +_cb_unlock_start(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Obj *o = data; + printf("unlock start %s\n", o->address); + ebluez5_device_prop_unlock_set(o->address, EINA_TRUE); + ebluez5_popup_device_change(o); +} + +static void +_cb_unlock_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Obj *o = data; + printf("unlock stop %s\n", o->address); + ebluez5_device_prop_unlock_set(o->address, EINA_FALSE); + ebluez5_popup_device_change(o); +} + +static void +_cb_force_connect_start(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Obj *o = data; + ebluez5_device_prop_force_connect_set(o->address, EINA_TRUE); + ebluez5_popup_adapter_change(o); +} + +static void +_cb_force_connect_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Obj *o = data; + ebluez5_device_prop_force_connect_set(o->address, EINA_FALSE); + ebluez5_popup_adapter_change(o); +} + +static void +_cb_flip(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Obj *o = data; + Evas_Object *gl = evas_object_data_get(obj, "genlist"); + Elm_Object_Item *it; + + for (it = elm_genlist_first_item_get(gl); it; + it = elm_genlist_item_next_get(it)) + { + if (o == elm_object_item_data_get(it)) + { + if (elm_genlist_item_flip_get(it)) + elm_genlist_item_flip_set(it, EINA_FALSE); + else + elm_genlist_item_flip_set(it, EINA_TRUE); + break; + } + } +} + static void _agent_done(Obj *o) { @@ -305,7 +486,7 @@ _cb_dev_text_get(void *data, Evas_Object *obj EINA_UNUSED, static Evas_Object * _cb_dev_content_get(void *data EINA_UNUSED, Evas_Object *obj, - const char *part EINA_UNUSED) + const char *part) { Obj *o = data; char buf[512]; @@ -342,14 +523,49 @@ _cb_dev_content_get(void *data EINA_UNUSED, Evas_Object *obj, evas_object_show(ic); return bx; } - else if (!strcmp(part, "elm.swallow.end")) + else if (!strcmp(part, "elm.text.flip")) { - Evas_Object *bx, *ic, *bt, *lb, *tb, *en, *rec; + Evas_Object *bx, *bt, *ic; bx = elm_box_add(obj); elm_box_horizontal_set(bx, EINA_TRUE); + elm_box_align_set(bx, 1.0, 0.5); if (o->paired) { + if (o->paired) + { + Config_Device *dev = ebluez5_device_prop_find(o->address); + + if ((dev) && (dev->unlock)) + { + bt = util_button_icon_add(obj, "changes-allow-symbolic", + _("Stop this from being an unlock device")); + evas_object_smart_callback_add(bt, "clicked", _cb_unlock_stop, o); + } + else + { + bt = util_button_icon_add(obj, "channel-insecure-symbolic", + _("Make this auto unlock when detected (and lock when not)")); + evas_object_smart_callback_add(bt, "clicked", _cb_unlock_start, o); + } + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + if ((dev) && (dev->force_connect)) + { + bt = util_button_icon_add(obj, "checkbox-symbolic", + _("Stop this device from being forcefullty connected")); + evas_object_smart_callback_add(bt, "clicked", _cb_force_connect_stop, o); + } + else + { + bt = util_button_icon_add(obj, "checkbox-checked-symbolic", + _("Force this device to be connected when detected")); + evas_object_smart_callback_add(bt, "clicked", _cb_force_connect_start, o); + } + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } if (o->connected) { bt = util_button_icon_add(obj, "network-offline", @@ -382,64 +598,7 @@ _cb_dev_content_get(void *data EINA_UNUSED, Evas_Object *obj, } if (!o->paired) { - if (o->agent_request) - { - if (o->agent_entry_fn) - { - tb = elm_table_add(obj); - - rec = evas_object_rectangle_add(evas_object_evas_get(obj)); - evas_object_size_hint_min_set(rec, ELM_SCALE_SIZE(80), ELM_SCALE_SIZE(1)); - elm_table_pack(tb, rec, 0, 0, 1, 1); - - en = elm_entry_add(obj); - elm_entry_single_line_set(en, EINA_TRUE); - elm_entry_scrollable_set(en, EINA_TRUE); - elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - elm_object_part_text_set(en, "guide", o->agent_request); -// elm_entry_password_set(en, EINA_TRUE); - evas_object_smart_callback_add(en, "activated", _cb_agent_ok, o); - evas_object_smart_callback_add(en, "aborted", _cb_agent_cancel, o); - elm_table_pack(tb, en, 0, 0, 1, 1); - evas_object_show(en); - - elm_box_pack_end(bx, tb); - evas_object_show(tb); - - bt = util_button_icon_add(obj, "list-add", - _("Pair with this device")); - evas_object_data_set(bt, "entry", en); - evas_object_smart_callback_add(bt, "clicked", _cb_agent_ok, o); - elm_box_pack_end(bx, bt); - evas_object_show(bt); - - bt = util_button_icon_add(obj, "list-remove", - _("Reject pairing")); - evas_object_smart_callback_add(bt, "clicked", _cb_agent_cancel, o); - elm_box_pack_end(bx, bt); - evas_object_show(bt); - } - else - { - lb = elm_label_add(obj); - elm_layout_text_set(lb, NULL, o->agent_request); - elm_box_pack_end(bx, lb); - evas_object_show(lb); - - bt = util_button_icon_add(obj, "list-add", - _("Pair with this device")); - evas_object_smart_callback_add(bt, "clicked", _cb_agent_ok, o); - elm_box_pack_end(bx, bt); - evas_object_show(bt); - - bt = util_button_icon_add(obj, "list-remove", - _("Reject pairing")); - evas_object_smart_callback_add(bt, "clicked", _cb_agent_cancel, o); - elm_box_pack_end(bx, bt); - evas_object_show(bt); - } - } - else + if (!o->agent_request) { bt = util_button_icon_add(obj, "list-add", _("Pair with this device")); @@ -457,6 +616,90 @@ _cb_dev_content_get(void *data EINA_UNUSED, Evas_Object *obj, evas_object_show(bt); } + bt = util_button_icon_add(obj, "view-more-horizontal", + _("Cancel")); + evas_object_data_set(bt, "genlist", obj); + evas_object_smart_callback_add(bt, "clicked", _cb_flip, o); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = util_obj_icon_rssi_add(obj, o, 24); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + return bx; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *bx, *ic, *bt, *lb, *tb, *en, *rec; + + bx = elm_box_add(obj); + elm_box_horizontal_set(bx, EINA_TRUE); + + if (o->agent_request) + { + if (o->agent_entry_fn) + { + tb = elm_table_add(obj); + + rec = evas_object_rectangle_add(evas_object_evas_get(obj)); + evas_object_size_hint_min_set(rec, ELM_SCALE_SIZE(80), ELM_SCALE_SIZE(1)); + elm_table_pack(tb, rec, 0, 0, 1, 1); + + en = elm_entry_add(obj); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_part_text_set(en, "guide", o->agent_request); +// elm_entry_password_set(en, EINA_TRUE); + evas_object_smart_callback_add(en, "activated", _cb_agent_ok, o); + evas_object_smart_callback_add(en, "aborted", _cb_agent_cancel, o); + elm_table_pack(tb, en, 0, 0, 1, 1); + evas_object_show(en); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + bt = util_button_icon_add(obj, "list-add", + _("Pair with this device")); + evas_object_data_set(bt, "entry", en); + evas_object_smart_callback_add(bt, "clicked", _cb_agent_ok, o); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = util_button_icon_add(obj, "list-remove", + _("Reject pairing")); + evas_object_smart_callback_add(bt, "clicked", _cb_agent_cancel, o); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + else + { + lb = elm_label_add(obj); + elm_layout_text_set(lb, NULL, o->agent_request); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = util_button_icon_add(obj, "list-add", + _("Pair with this device")); + evas_object_smart_callback_add(bt, "clicked", _cb_agent_ok, o); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = util_button_icon_add(obj, "list-remove", + _("Reject pairing")); + evas_object_smart_callback_add(bt, "clicked", _cb_agent_cancel, o); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + } + + bt = util_button_icon_add(obj, "view-more-horizontal", + _("Options for device like conneect, pair etc.")); + evas_object_data_set(bt, "genlist", obj); + evas_object_smart_callback_add(bt, "clicked", _cb_flip, o); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + ic = util_obj_icon_rssi_add(obj, o, 24); elm_box_pack_end(bx, ic); evas_object_show(ic); @@ -581,6 +824,11 @@ ebluze5_popup_init(void) void ebluze5_popup_shutdown(void) { + if (unlock_block) + { + unlock_block = EINA_FALSE; + e_desklock_unblock(); + } ebluze5_popup_clear(); elm_genlist_item_class_free(group_itc); elm_genlist_item_class_free(dev_itc); @@ -717,6 +965,7 @@ ebluez5_popup_device_add(Obj *o) { _device_add(gl, o); } + _devices_eval(); } void @@ -739,6 +988,7 @@ ebluez5_popup_device_del(Obj *o) } } devices = eina_list_remove(devices, o); + _devices_eval(); } void @@ -779,6 +1029,7 @@ ebluez5_popup_device_change(Obj *o) } } } + _devices_eval(); } const Eina_List *