2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing,
11 * software distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <eina_list.h>
20 #include <bluetooth.h>
21 #include <syspopup_caller.h>
22 #include <dbus/dbus.h>
25 #include "bt-main-ug.h"
26 #include "bt-string-define.h"
27 #include "bt-main-view.h"
28 #include "bt-profile-view.h"
29 #include "bt-ipc-handler.h"
32 #include "bt-callback.h"
33 #include "bt-widget.h"
34 #include "bt-resource.h"
35 #include "bt-dbus-method.h"
36 #include "bt-net-connection.h"
38 /**********************************************************************
39 * Static Functions declaration
40 ***********************************************************************/
42 static void __bt_main_onoff_btn_cb(void *data, Evas_Object *obj,
45 static void __bt_main_set_controlbar_mode(void *data, int enable_mode);
47 static service_h __bt_main_get_visibility_result(bt_ug_data *ugd,
50 static service_h __bt_main_get_pick_result(bt_ug_data *ugd,
53 /**********************************************************************
55 ***********************************************************************/
57 static char *__bt_main_status_label_get(void *data, Evas_Object *obj,
62 bt_ug_data *ugd = NULL;
63 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
64 char *dev_name = NULL;
67 retv_if(data == NULL, NULL);
69 ugd = (bt_ug_data *)data;
71 if (!strcmp(part, "elm.text.1")) {
72 switch (ugd->op_status) {
74 g_strlcpy(buf, BT_STR_ACTIVATING_ING,
75 BT_GLOBALIZATION_STR_LENGTH);
79 g_strlcpy(buf, BT_STR_DEACTIVATING_ING,
80 BT_GLOBALIZATION_STR_LENGTH);
84 g_strlcpy(buf, BT_STR_BLUETOOTH,
85 BT_GLOBALIZATION_STR_LENGTH);
88 } else if (strcmp(part, "elm.text.2") == 0) {
89 memset(ugd->phone_name, 0x00, BT_DEVICE_NAME_LENGTH_MAX + 1);
91 if (bt_adapter_get_name(&dev_name) ==
93 g_strlcpy(ugd->phone_name, dev_name,
94 BT_DEVICE_NAME_LENGTH_MAX);
97 _bt_util_get_phone_name(ugd->phone_name,
98 sizeof(ugd->phone_name)-1);
101 /* Check the utf8 valitation & Fill the NULL in the invalid location*/
102 if (!g_utf8_validate(ugd->phone_name, -1, (const char **)&ptr))
105 g_strlcpy(buf, ugd->phone_name, BT_GLOBALIZATION_STR_LENGTH);
108 BT_DBG("empty text for label. \n");
117 static Evas_Object *__bt_main_status_icon_get(void *data, Evas_Object *obj,
122 bt_ug_data *ugd = NULL;
123 Evas_Object *btn = NULL;
124 bool activated = FALSE;
126 retv_if(data == NULL, NULL);
128 ugd = (bt_ug_data *)data;
130 if (ugd->op_status == BT_ACTIVATING ||
131 ugd->op_status == BT_DEACTIVATING ||
132 ugd->op_status == BT_SEARCHING) {
133 __bt_main_set_controlbar_mode(ugd, BT_CONTROL_BAR_DISABLE);
135 if (ugd->op_status != BT_SEARCHING)
139 if (!strcmp(part, "elm.icon")) {
140 activated = (ugd->op_status == BT_DEACTIVATED) ? FALSE : TRUE;
142 if (activated == TRUE)
143 __bt_main_set_controlbar_mode(ugd,
144 BT_CONTROL_BAR_ENABLE);
146 __bt_main_set_controlbar_mode(ugd,
147 BT_CONTROL_BAR_DISABLE);
149 btn = elm_check_add(obj);
150 elm_object_style_set(btn, "on&off");
151 evas_object_show(btn);
152 evas_object_pass_events_set(btn, EINA_TRUE);
153 evas_object_propagate_events_set(btn, EINA_FALSE);
154 elm_check_state_set(btn, activated); /* set on or off */
156 /* add smart callback */
157 evas_object_smart_callback_add(btn, "changed",
158 __bt_main_onoff_btn_cb, ugd);
159 ugd->onoff_btn = btn;
166 static char *__bt_main_visible_label_get(void *data, Evas_Object *obj,
171 char buf[BT_GLOBALIZATION_STR_LENGTH+BT_EXTRA_STR_LEN] = { 0 };
172 char remain_time[BT_EXTRA_STR_LEN] = { 0 };
173 bt_ug_data *ugd = NULL;
178 ugd = (bt_ug_data *)data;
180 if (!strcmp(part, "elm.text.1")) {
181 g_strlcpy(buf, BT_STR_VISIBLE, BT_GLOBALIZATION_STR_LENGTH);
182 } else if (strcmp(part, "elm.text.2") == 0) {
183 if (ugd->visibility_timeout <= 0) {
184 _bt_util_get_timeout_string(ugd->visibility_timeout,
187 /* Display remain timeout */
188 _bt_util_convert_time_to_string(ugd->remain_time,
190 sizeof(remain_time));
192 snprintf(buf, sizeof(buf), BT_STR_PS_REMAINING, remain_time);
195 BT_DBG("empty text for label. \n");
203 static char *__bt_main_timeout_value_label_get(void *data, Evas_Object *obj,
208 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0 };
210 bt_ug_data *ugd = NULL;
211 bt_radio_item *item = NULL;
213 retv_if(data == NULL, NULL);
215 item = (bt_radio_item *)data;
216 retv_if(item->ugd == NULL, NULL);
218 ugd = (bt_ug_data *)item->ugd;
220 if (!strcmp(part, "elm.text")) {
221 timeout = _bt_util_get_timeout_value(item->index);
222 _bt_util_get_timeout_string(timeout, buf, sizeof(buf));
224 BT_DBG("empty text for label. \n");
232 static Evas_Object *__bt_main_timeout_value_icon_get(void *data, Evas_Object *obj,
237 bt_ug_data *ugd = NULL;
238 bt_radio_item *item = NULL;
239 Evas_Object *btn = NULL;
241 retv_if(data == NULL, NULL);
243 item = (bt_radio_item *)data;
244 retv_if(item->ugd == NULL, NULL);
246 ugd = (bt_ug_data *)item->ugd;
248 if (!strcmp(part, "elm.icon")) {
249 btn = elm_radio_add(obj);
250 elm_radio_state_value_set(btn, item->index);
251 elm_radio_group_add(btn, ugd->radio_main);
252 elm_radio_value_set(btn, ugd->selected_radio);
254 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND,
257 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL,
265 static gboolean __bt_main_visible_timeout_cb(gpointer user_data)
269 bt_ug_data *ugd = NULL;
271 ugd = (bt_ug_data *)user_data;
275 if (ugd->remain_time <= 0) {
276 g_source_remove(ugd->timeout_id);
278 ugd->visibility_timeout = 0;
279 ugd->remain_time = 0;
280 ugd->selected_radio = 0;
282 elm_genlist_item_update(ugd->visible_item);
287 elm_genlist_item_update(ugd->visible_item);
293 static int __bt_idle_destroy_ug(void *data)
297 bt_ug_data *ugd = data;
298 service_h service = NULL;
300 retv_if(ugd == NULL, BT_UG_FAIL);
303 if (ugd->bt_launch_mode == BT_LAUNCH_VISIBILITY)
304 service = __bt_main_get_visibility_result(ugd, TRUE);
305 else if (ugd->bt_launch_mode == BT_LAUNCH_PICK)
306 service = __bt_main_get_pick_result(ugd, TRUE);
308 _bt_ug_destroy(data, (void *)service);
311 service_destroy(service);
314 return BT_UG_ERROR_NONE;
317 static void __bt_main_timeout_value_item_sel(void *data, Evas_Object *obj,
322 bt_ug_data *ugd = NULL;
323 bt_radio_item *item = NULL;
327 ret_if(data == NULL);
329 item = (bt_radio_item *)data;
331 ugd = (bt_ug_data *)item->ugd;
333 elm_genlist_item_selected_set((Elm_Object_Item *)event_info,
336 timeout = _bt_util_get_timeout_value(item->index);
339 ret = bt_adapter_set_visibility(
340 BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE,
343 if (ugd->timeout_id) {
344 g_source_remove(ugd->timeout_id);
347 } else if (timeout == 0) {
348 ret = bt_adapter_set_visibility(
349 BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE,
351 if (ugd->timeout_id) {
352 g_source_remove(ugd->timeout_id);
356 ret = bt_adapter_set_visibility(
357 BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE,
360 if (ret == BT_ERROR_NONE) {
361 if (ugd->timeout_id) {
362 g_source_remove(ugd->timeout_id);
366 ugd->remain_time = timeout;
368 ugd->timeout_id = g_timeout_add_seconds(1,
369 __bt_main_visible_timeout_cb, ugd);
373 if (ret != BT_ERROR_NONE) {
374 BT_DBG("bt_adapter_set_visibility() failed");
378 ugd->selected_radio = item->index;
379 ugd->visibility_timeout = timeout;
381 elm_genlist_item_update(ugd->visible_item);
382 elm_radio_value_set(ugd->radio_main, ugd->selected_radio);
384 if (ugd->bt_launch_mode == BT_LAUNCH_VISIBILITY)
385 g_idle_add((GSourceFunc)__bt_idle_destroy_ug, ugd);
391 static void __bt_main_timeout_value_del(void *data, Evas_Object *obj)
395 bt_radio_item *item = (bt_radio_item *)data;
402 static gboolean __bt_main_is_connectable_device(bt_dev_t *dev)
406 bt_ug_data *ugd = NULL;
408 retv_if(dev == NULL, FALSE);
409 retv_if(dev->ugd == NULL, FALSE);
411 ugd = (bt_ug_data *)dev->ugd;
413 if(ugd->bt_launch_mode != BT_LAUNCH_NORMAL) {
414 /* In no normal mode,
415 connectable devices is only shown in the list */
416 BT_DBG("Not in the normal mode");
420 if (dev->service_list == 0) {
421 BT_DBG("No service list");
425 if ((dev->service_list & BT_SC_HFP_SERVICE_MASK) ||
426 (dev->service_list & BT_SC_HSP_SERVICE_MASK) ||
427 (dev->service_list & BT_SC_A2DP_SERVICE_MASK) ||
428 (dev->service_list & BT_SC_HID_SERVICE_MASK) ||
429 (dev->service_list & BT_SC_NAP_SERVICE_MASK)) {
430 /* Connectable device */
438 static char *__bt_main_list_label_get(void *data, Evas_Object *obj,
443 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0 };
444 bt_dev_t *dev = NULL;
446 retv_if(data == NULL, NULL);
448 dev = (bt_dev_t *)data;
450 if (!strcmp(part, "elm.text.1") || !strcmp(part, "elm.text")) {
451 g_strlcpy(buf, dev->name, BT_GLOBALIZATION_STR_LENGTH);
452 BT_DBG("label : %s", buf);
453 } else if (strcmp(part, "elm.text.2") == 0) {
454 if (dev->status == BT_IDLE) {
455 if (__bt_main_is_connectable_device(dev) == 0) {
456 snprintf(buf, BT_GLOBALIZATION_STR_LENGTH,
458 BT_GENLIST_FONT_32_INC,
460 } else if (dev->connected_mask > 0) {
461 snprintf(buf, BT_GLOBALIZATION_STR_LENGTH,
462 BT_SET_FONT_SIZE_COLOR,
463 BT_GENLIST_FONT_32_INC,
464 BT_GENLIST_SUBTEXT_COLOR,
465 BT_STR_TAP_TO_DISCONNECT);
467 snprintf(buf, BT_GLOBALIZATION_STR_LENGTH,
469 BT_GENLIST_FONT_32_INC,
470 BT_STR_TAP_TO_CONNECT);
472 } else if (dev->status == BT_CONNECTING) {
473 snprintf(buf, BT_GLOBALIZATION_STR_LENGTH,
475 BT_GENLIST_FONT_32_INC,
477 } else if (dev->status == BT_SERVICE_SEARCHING) {
478 snprintf(buf, BT_GLOBALIZATION_STR_LENGTH,
480 BT_GENLIST_FONT_32_INC,
481 BT_STR_SEARCHING_SERVICES);
482 } else if (dev->status == BT_DISCONNECTING) {
483 snprintf(buf, BT_GLOBALIZATION_STR_LENGTH,
484 BT_SET_FONT_SIZE_COLOR,
485 BT_GENLIST_FONT_32_INC,
486 BT_GENLIST_SUBTEXT_COLOR,
487 BT_STR_DISCONNECTING);
489 } else { /* for empty item */
491 BT_DBG("empty text for label. \n");
499 static void __bt_main_list_select_cb(void *data, Evas_Object *obj, void *event_info)
503 bt_dev_t *dev = NULL;
504 bt_ug_data *ugd = NULL;
506 ret_if(data == NULL);
508 dev = (bt_dev_t *)data;
509 ret_if(dev->ugd == NULL);
513 if (ugd->op_status == BT_SEARCHING) {
514 ret = bt_adapter_stop_device_discovery();
515 if(ret != BT_ERROR_NONE)
516 BT_DBG("Fail to stop discovery: %d", ret);
519 if (ugd->connect_req == TRUE) {
520 _bt_main_draw_selection_info(ugd, BT_STR_CONNECTION_FAILED);
524 /* Create the profile view */
525 _bt_profile_create_view(dev);
530 static Evas_Object *__bt_main_list_icon_get(void *data, Evas_Object *obj,
535 Evas_Object *icon = NULL;
536 char *dev_icon_file = NULL;
537 bt_dev_t *dev = NULL;
539 retv_if(data == NULL, NULL);
541 dev = (bt_dev_t *)data;
543 if (!strcmp(part, "elm.icon.1") || !strcmp(part, "elm.icon")) {
545 _bt_main_get_device_icon(dev->major_class,
547 dev->connected_mask);
548 icon = _bt_create_icon(obj, dev_icon_file);
549 } else if (!strcmp(part, "elm.icon.2")) {
550 BT_DBG("status : %d", dev->status);
552 if (dev->status == BT_IDLE) {
553 icon = elm_button_add(obj);
554 elm_object_style_set(icon, "reveal");
555 evas_object_smart_callback_add(icon, "clicked",
556 (Evas_Smart_Cb)__bt_main_list_select_cb, (void *)dev);
557 evas_object_propagate_events_set(icon, EINA_FALSE);
559 icon = _bt_create_progressbar(obj, NULL);
567 static char *__bt_main_searched_label_get(void *data, Evas_Object *obj,
572 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0 };
573 bt_dev_t *dev = NULL;
578 dev = (bt_dev_t *)data;
580 if (!strcmp(part, "elm.text")) {
581 g_strlcpy(buf, dev->name, BT_GLOBALIZATION_STR_LENGTH);
582 BT_DBG("label : %s", buf);
590 static Evas_Object *__bt_main_searched_icon_get(void *data,
591 Evas_Object *obj, const char *part)
595 Evas_Object *icon = NULL;
596 char *dev_icon_file = NULL;
597 bt_dev_t *dev = NULL;
599 retv_if(data == NULL, NULL);
601 dev = (bt_dev_t *)data;
603 if (!strcmp(part, "elm.icon.1") || !strcmp(part, "elm.icon")) {
605 _bt_main_get_device_icon(dev->major_class,
607 dev->connected_mask);
608 icon = _bt_create_icon(obj, dev_icon_file);
609 } else if (!strcmp(part, "elm.icon.2")) {
610 if (dev->status != BT_IDLE) {
611 icon = _bt_create_progressbar(obj, NULL);
619 static char *__bt_main_no_device_label_get(void *data, Evas_Object *obj,
624 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0 };
626 if (!strcmp(part, "elm.text")) {
627 g_strlcpy(buf, BT_STR_NO_DEVICE_FOUND,
628 BT_GLOBALIZATION_STR_LENGTH);
635 static char *__bt_main_paired_title_label_get(void *data, Evas_Object *obj,
640 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
642 if (strcmp(part, "elm.text") == 0) {
644 strncpy(buf, BT_STR_PAIRED_DEVICES,
645 BT_GLOBALIZATION_STR_LENGTH);
647 BT_DBG("This part name is not exist in style");
655 static char *__bt_main_searched_title_label_get(void *data, Evas_Object *obj,
660 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
661 bt_ug_data *ugd = NULL;
663 retv_if(data == NULL, NULL);
665 ugd = (bt_ug_data *)data;
667 if (strcmp(part, "elm.text") == 0) {
669 if (ugd->searched_device == NULL ||
670 eina_list_count(ugd->searched_device) == 0) {
671 strncpy(buf, BT_STR_BLUETOOTH_DEVICES,
672 BT_GLOBALIZATION_STR_LENGTH);
674 strncpy(buf, BT_STR_AVAILABLE_DEVICES,
675 BT_GLOBALIZATION_STR_LENGTH);
678 BT_DBG("This part name is not exist in style");
686 static Evas_Object *__bt_main_title_icon_get(void *data, Evas_Object *obj,
691 bt_ug_data *ugd = NULL;
692 Evas_Object *progressbar = NULL;
694 retv_if(data == NULL, NULL);
695 retv_if(obj == NULL, NULL);
696 retv_if(part == NULL, NULL);
698 ugd = (bt_ug_data *)data;
700 if (!strcmp(part, "elm.icon") && ugd->op_status == BT_SEARCHING) {
701 progressbar = _bt_create_progressbar(obj, "list_process_small");
708 static void __bt_main_status_item_sel(void *data, Evas_Object *obj,
713 bt_ug_data *ugd = NULL;
715 ret_if(data == NULL);
717 ugd = (bt_ug_data *)data;
719 elm_genlist_item_selected_set((Elm_Object_Item *)event_info,
722 __bt_main_onoff_btn_cb(data, ugd->onoff_btn, NULL);
728 static void __bt_main_visible_item_sel(void *data, Evas_Object *obj,
733 bt_ug_data *ugd = NULL;
734 Eina_Bool expanded = EINA_FALSE;
736 ret_if(data == NULL);
737 ret_if(event_info == NULL);
739 ugd = (bt_ug_data *)data;
741 elm_genlist_item_selected_set((Elm_Object_Item *)event_info,
744 expanded = elm_genlist_item_expanded_get(event_info);
745 elm_genlist_item_expanded_set(event_info, !expanded);
751 static service_h __bt_main_get_visibility_result(bt_ug_data *ugd,
754 service_h service = NULL;
755 char mode_str[BT_RESULT_STR_MAX] = { 0 };
756 const char *result_str;
758 retv_if(ugd == NULL, NULL);
760 service_create(&service);
762 retv_if(service == NULL, NULL);
765 result_str = BT_RESULT_SUCCESS;
767 result_str = BT_RESULT_FAIL;
769 if (service_add_extra_data(service, "result",
771 BT_DBG("Fail to add extra data");
774 snprintf(mode_str, BT_RESULT_STR_MAX, "%d", (int)ugd->selected_radio);
776 if (service_add_extra_data(service, "visibility",
777 (const char *)mode_str) < 0) {
778 BT_DBG("Fail to add extra data");
784 static service_h __bt_main_get_pick_result(bt_ug_data *ugd,
787 service_h service = NULL;
788 const char *result_str;
789 char address[BT_ADDRESS_STR_LEN] = { 0 };
790 char value_str[BT_RESULT_STR_MAX] = { 0 };
793 retv_if(ugd == NULL, NULL);
794 retv_if(ugd->pick_device == NULL, NULL);
796 dev = ugd->pick_device;
798 service_create(&service);
800 retv_if(service == NULL, NULL);
803 result_str = BT_RESULT_SUCCESS;
805 result_str = BT_RESULT_FAIL;
807 if (service_add_extra_data(service, "result",
809 BT_DBG("Fail to add extra data");
812 _bt_util_addr_type_to_addr_result_string(address, dev->bd_addr);
814 if (service_add_extra_data(service, "address",
815 (const char *)address) < 0) {
816 BT_DBG("Fail to add extra data");
819 if (service_add_extra_data(service, "name",
820 (const char *)dev->name) < 0) {
821 BT_DBG("Fail to add extra data");
824 snprintf(value_str, BT_RESULT_STR_MAX, "%d", dev->rssi);
826 if (service_add_extra_data(service, "rssi",
827 (const char *)value_str) < 0) {
828 BT_DBG("Fail to add extra data");
831 memset(value_str, 0x00, sizeof(value_str));
832 snprintf(value_str, BT_RESULT_STR_MAX, "%d", dev->is_bonded);
834 if (service_add_extra_data(service, "is_bonded",
835 (const char *)value_str) < 0) {
836 BT_DBG("Fail to add extra data");
839 memset(value_str, 0x00, sizeof(value_str));
840 snprintf(value_str, BT_RESULT_STR_MAX, "%d", dev->major_class);
842 if (service_add_extra_data(service, "major_class",
843 (const char *)value_str) < 0) {
844 BT_DBG("Fail to add extra data");
847 memset(value_str, 0x00, sizeof(value_str));
848 snprintf(value_str, BT_RESULT_STR_MAX, "%d", dev->minor_class);
850 if (service_add_extra_data(service, "minor_class",
851 (const char *)value_str) < 0) {
852 BT_DBG("Fail to add extra data");
855 memset(value_str, 0x00, sizeof(value_str));
856 snprintf(value_str, BT_RESULT_STR_MAX, "%ld",
857 (long int)dev->service_class);
859 if (service_add_extra_data(service, "service_class",
860 (const char *)value_str) < 0) {
861 BT_DBG("Fail to add extra data");
864 if (service_add_extra_data_array(service, "uuids",
865 (const char **)dev->uuids,
866 dev->uuid_count) < 0) {
867 BT_DBG("Fail to add extra data");
873 static void __bt_main_quit_btn_cb(void *data, Evas_Object *obj,
878 service_h service = NULL;
879 bt_ug_data *ugd = (bt_ug_data *)data;
883 if (ugd->bt_launch_mode == BT_LAUNCH_VISIBILITY) {
884 service = __bt_main_get_visibility_result(ugd, FALSE);
886 _bt_ug_destroy(data, (void *)service);
889 service_destroy(service);
890 } else if (ugd->bt_launch_mode == BT_LAUNCH_PICK) {
891 service_create(&service);
893 if (service == NULL) {
894 _bt_ug_destroy(data, NULL);
898 if (service_add_extra_data(service, "result",
899 BT_RESULT_FAIL) < 0) {
900 BT_DBG("Fail to add extra data");
903 _bt_ug_destroy(data, (void *)service);
905 service_destroy(service);
907 _bt_ug_destroy(data, NULL);
913 static int __bt_main_enable_bt(void *data)
917 retv_if(data == NULL, -1);
918 bt_ug_data *ugd = (bt_ug_data *)data;
920 if (_bt_util_is_battery_low() == TRUE) {
921 /* Battery is critical low */
922 _bt_main_create_information_popup(ugd,BT_STR_LOW_BATTERY);
923 elm_genlist_item_update(ugd->status_item);
927 ret = bt_adapter_enable();
928 if (ret != BT_ERROR_NONE) {
929 BT_ERR("Failed to enable bluetooth [%d]", ret);
931 ugd->op_status = BT_ACTIVATING;
932 elm_object_disabled_set(ugd->scan_btn, EINA_TRUE);
939 static void __bt_main_onoff_btn_cb(void *data, Evas_Object *obj,
943 ret_if(data == NULL);
946 bt_ug_data *ugd = (bt_ug_data *)data;
948 if (ugd->op_status == BT_DEACTIVATED) {
949 ret = __bt_main_enable_bt(data);
951 ret = bt_adapter_disable();
952 if (ret != BT_ERROR_NONE) {
953 BT_ERR("Failed to disable bluetooth [%d]", ret);
955 ugd->op_status = BT_DEACTIVATING;
956 elm_object_disabled_set(ugd->scan_btn, EINA_TRUE);
960 elm_genlist_item_update(ugd->status_item);
965 static void __bt_main_controlbar_btn_cb(void *data, Evas_Object *obj,
970 bt_ug_data *ugd = NULL;
972 retm_if(data == NULL, "Invalid argument: bt_ug_data is NULL\n");
974 ugd = (bt_ug_data *)data;
976 if (ugd->op_status == BT_SEARCHING) {
977 if (bt_adapter_stop_device_discovery() == BT_ERROR_NONE) {
978 elm_object_text_set(ugd->scan_btn, BT_STR_STOP);
981 _bt_main_scan_device(ugd);
987 static void __bt_main_disconnect_cb(void *data, Evas_Object *obj,
992 bt_dev_t *dev = NULL;
993 bt_ug_data *ugd = NULL;
995 retm_if(data == NULL, "Invalid argument: data is NULL\n");
997 dev = (bt_dev_t *)data;
998 retm_if(dev->ugd == NULL, "ugd is NULL\n");
1003 evas_object_del(ugd->popup);
1007 _bt_main_disconnect_device(ugd, dev);
1012 static void __bt_main_popup_menu_cb(void *data, Evas_Object *obj,
1017 bt_ug_data *ugd = NULL;
1019 retm_if(data == NULL, "Invalid argument: data is NULL\n");
1021 ugd = (bt_ug_data *)data;
1023 if (ugd->popup_menu)
1024 evas_object_del(ugd->popup_menu);
1026 ugd->popup_menu = NULL;
1028 if (ugd->popup == NULL)
1029 ugd->back_cb = NULL;
1034 static char *__bt_main_popup_menu_label_get(void *data, Evas_Object *obj,
1039 bt_dev_t *dev = NULL;
1040 char buf[BT_MAX_MENU_NAME_LEN] = { 0, };
1043 retvm_if(data == NULL, NULL, "Invalid argument: data is NULL\n");
1046 dev = (bt_dev_t *)evas_object_data_get(obj, "dev_info");
1048 retvm_if(dev == NULL, NULL, "dev is NULL\n");
1050 if (strcmp(part, "elm.text") != 0) {
1051 BT_DBG("It is not in elm.text part\n");
1056 case BT_CONNECT_MENU:
1057 snprintf(buf, sizeof(buf), BT_STR_DISCONNECT);
1060 snprintf(buf, sizeof(buf), " ");
1064 BT_DBG("popup_menu_label_get() end. %s", buf);
1070 /* change popup style for popup menu */
1071 static void __bt_main_select_menu_cb(void *data, Evas_Object *obj,
1076 Elm_Object_Item *selected_menu = NULL;
1077 bt_dev_t *dev = NULL;
1078 bt_ug_data *ugd = NULL;
1080 retm_if(data == NULL, "Invalid argument: data is NULL\n");
1081 retm_if(event_info == NULL, "Invalid argument: event_info is NULL\n");
1083 ugd = (bt_ug_data *)data;
1085 selected_menu = (Elm_Object_Item *)event_info;
1087 elm_genlist_item_selected_set(selected_menu, EINA_FALSE);
1089 dev = _bt_main_get_dev_info(ugd->paired_device, ugd->paired_item);
1090 retm_if(dev == NULL, "dev is NULL\n");
1092 ugd->back_cb = NULL;
1094 if (_bt_is_profile_connected(BT_HEADSET_CONNECTED, ugd->conn,
1095 dev->bd_addr) == TRUE) {
1096 BT_DBG("Disconnecting AG service \n");
1097 if (bt_audio_disconnect(dev->addr_str,
1098 BT_AUDIO_PROFILE_TYPE_ALL) == BT_ERROR_NONE) {
1099 ugd->connect_req = TRUE;
1100 dev->status = BT_DISCONNECTING;
1102 BT_DBG("Fail to connect Headset device");
1104 } else if (_bt_is_profile_connected(BT_STEREO_HEADSET_CONNECTED, ugd->conn,
1105 dev->bd_addr) == TRUE) {
1106 BT_DBG("Disconnecting AV service \n");
1107 if (bt_audio_disconnect(dev->addr_str,
1108 BT_AUDIO_PROFILE_TYPE_A2DP) == BT_ERROR_NONE) {
1109 ugd->connect_req = TRUE;
1110 dev->status = BT_DISCONNECTING;
1112 BT_DBG("Fail to connect Headset device");
1114 } else if (_bt_is_profile_connected(BT_HID_CONNECTED, ugd->conn,
1115 dev->bd_addr) == TRUE) {
1116 BT_DBG("Disconnecting HID service!!\n");
1118 if (bt_hid_host_disconnect(dev->addr_str) == BT_ERROR_NONE) {
1119 dev->status = BT_DISCONNECTING;
1120 elm_genlist_item_update((Elm_Object_Item *)dev->genlist_item);
1122 BT_DBG("Fail to connect HID device");
1127 elm_genlist_item_update((Elm_Object_Item *)dev->genlist_item);
1131 static void __bt_main_set_controlbar_mode(void *data, int enable_mode)
1135 bt_ug_data *ugd = NULL;
1139 ret_if(data == NULL);
1141 ugd = (bt_ug_data *)data;
1143 mode = enable_mode ? FALSE : TRUE;
1145 if (ugd->paired_device)
1146 count = eina_list_count(ugd->paired_device);
1148 if (count == 0 || (ugd->op_status != BT_ACTIVATED)) {
1149 BT_DBG("device count: %d, op_status: %d",
1150 eina_list_count(ugd->paired_device), ugd->op_status);
1157 static int __bt_main_request_to_send(bt_ug_data *ugd, bt_dev_t *dev)
1159 obex_ipc_param_t param;
1162 BT_DBG("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
1163 dev->bd_addr[0], dev->bd_addr[1],
1164 dev->bd_addr[2], dev->bd_addr[3],
1165 dev->bd_addr[4], dev->bd_addr[5]);
1167 memset(¶m, 0x00, sizeof(obex_ipc_param_t));
1168 memcpy(param.param2, dev->bd_addr, BT_ADDRESS_LENGTH_MAX);
1170 if (service_get_extra_data(ugd->service, "filecount", &value) < 0)
1171 BT_DBG("Get data error");
1176 param.param3 = atoi(value);
1180 if (service_get_extra_data(ugd->service, "files", &value) < 0)
1181 BT_DBG("Get data error");
1186 param.param4 = g_strdup(value);
1187 param.param5 = g_strdup("normal");
1188 param.param6 = g_strdup(dev->name);
1191 if (_bt_ipc_send_obex_message(¶m, ugd) != BT_UG_ERROR_NONE)
1194 g_free(param.param4);
1195 g_free(param.param5);
1196 g_free(param.param6);
1197 return BT_UG_ERROR_NONE;
1199 _bt_main_launch_syspopup(ugd, BT_SYSPOPUP_REQUEST_NAME,
1200 BT_STR_UNABLE_TO_SEND,
1201 BT_SYSPOPUP_ONE_BUTTON_TYPE);
1203 g_free(param.param4);
1204 g_free(param.param5);
1205 g_free(param.param6);
1210 static void __bt_main_paired_item_sel_cb(void *data, Evas_Object *obj,
1215 bt_ug_data *ugd = NULL;
1216 bt_dev_t *dev = NULL;
1217 Elm_Object_Item *item = NULL;
1218 Evas_Object *btn = NULL;
1219 Evas_Object *popup = NULL;
1220 Evas_Object *popup_btn = NULL;
1221 char msg[BT_DISCONNECT_TEXT_LENGTH] = { 0 };
1224 elm_genlist_item_selected_set((Elm_Object_Item *)event_info,
1227 retm_if(data == NULL, "Invalid argument: bt_ug_data is NULL\n");
1229 ugd = (bt_ug_data *)data;
1230 item = (Elm_Object_Item *)event_info;
1232 ret_if(ugd->waiting_service_response == TRUE);
1233 ret_if(ugd->op_status == BT_PAIRING);
1235 if (ugd->op_status == BT_SEARCHING) {
1236 ret = bt_adapter_stop_device_discovery();
1237 if(ret != BT_ERROR_NONE)
1238 BT_DBG("Fail to stop discovery");
1242 dev = _bt_main_get_dev_info(ugd->paired_device, item);
1243 retm_if(dev == NULL, "Invalid argument: device info is NULL\n");
1244 retm_if(dev->status != BT_IDLE,
1245 "Connecting / Disconnecting is in progress");
1247 if ((ugd->auto_service_search || ugd->waiting_service_response) &&
1248 (dev->service_list == 0)) {
1249 ugd->paired_item = item;
1252 evas_object_del(ugd->popup);
1257 _bt_create_popup(ugd->win_main, BT_STR_INFORMATION,
1258 BT_STR_GETTING_SERVICE_LIST,
1259 _bt_main_popup_del_cb, ugd, 2);
1261 btn = elm_button_add(ugd->popup);
1262 elm_object_text_set(btn, BT_STR_OK);
1263 elm_object_part_content_set(ugd->popup, "button1", btn);
1264 evas_object_smart_callback_add(btn, "clicked",
1265 (Evas_Smart_Cb)_bt_main_popup_del_cb, ugd);
1270 if (ugd->bt_launch_mode == BT_LAUNCH_NORMAL ||
1271 ugd->bt_launch_mode == BT_LAUNCH_USE_NFC) {
1273 ugd->paired_item = item;
1275 if (dev->service_list == 0 &&
1276 ugd->auto_service_search == FALSE) {
1278 if(bt_device_start_service_search(
1279 (const char *)dev->addr_str) == BT_ERROR_NONE) {
1281 dev->status = BT_SERVICE_SEARCHING;
1282 ugd->waiting_service_response = TRUE;
1283 ugd->request_timer =
1284 ecore_timer_add(BT_SEARCH_SERVICE_TIMEOUT,
1286 _bt_main_service_request_cb,
1289 elm_genlist_item_update(ugd->paired_item);
1292 BT_DBG("service search error");
1297 if (dev->connected_mask == 0) {
1298 /* Not connected case */
1299 _bt_main_connect_device(ugd, dev);
1301 /* connected case */
1302 snprintf(msg, sizeof(msg), "%s %s<br>%s", BT_STR_END_CONNECTION,
1304 BT_STR_DISCONNECT_Q);
1307 evas_object_del(ugd->popup);
1311 popup = _bt_create_popup(ugd->win_main, BT_STR_INFORMATION,
1313 _bt_main_popup_del_cb, ugd, 0);
1320 popup_btn = elm_button_add(popup);
1321 elm_object_text_set(popup_btn, BT_STR_OK);
1322 elm_object_part_content_set(popup, "button1", popup_btn);
1323 evas_object_smart_callback_add(popup_btn, "clicked",
1324 __bt_main_disconnect_cb, dev);
1326 popup_btn = elm_button_add(popup);
1327 elm_object_text_set(popup_btn, BT_STR_CANCEL);
1328 elm_object_part_content_set(popup, "button2", popup_btn);
1329 evas_object_smart_callback_add(popup_btn, "clicked",
1330 _bt_main_popup_del_cb, ugd);
1332 } else if (ugd->bt_launch_mode == BT_LAUNCH_SEND_FILE) {
1333 if (_bt_util_is_battery_low() == TRUE) {
1334 /* Battery is critical low */
1335 _bt_main_create_information_popup(ugd, BT_STR_LOW_BATTERY);
1339 if (__bt_main_request_to_send(ugd, dev) == BT_UG_ERROR_NONE)
1340 BT_ERR("Fail to send");
1342 _bt_ug_destroy(ugd, NULL);
1343 } else if (ugd->bt_launch_mode == BT_LAUNCH_PICK) {
1344 ugd->pick_device = dev;
1345 g_idle_add((GSourceFunc)__bt_idle_destroy_ug, ugd);
1351 static void __bt_main_searched_item_sel_cb(void *data, Evas_Object *obj,
1356 bt_ug_data *ugd = NULL;
1357 bt_dev_t *dev = NULL;
1358 Elm_Object_Item *item = NULL;
1361 elm_genlist_item_selected_set((Elm_Object_Item *)event_info,
1364 retm_if(data == NULL, "Invalid argument: bt_ug_data is NULL\n");
1366 ugd = (bt_ug_data *)data;
1368 ret_if(ugd->op_status == BT_PAIRING);
1370 item = (Elm_Object_Item *)event_info;
1372 dev = _bt_main_get_dev_info(ugd->searched_device,
1373 (Elm_Object_Item *)event_info);
1374 retm_if(dev == NULL, "Invalid argument: device info is NULL\n");
1376 if (ugd->bt_launch_mode == BT_LAUNCH_USE_NFC) {
1377 char address[18] = { 0 };
1378 service_h service = NULL;
1380 service_create(&service);
1382 ret_if(service == NULL);
1384 BT_DBG("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", dev->bd_addr[0],
1385 dev->bd_addr[1], dev->bd_addr[2], dev->bd_addr[3],
1386 dev->bd_addr[4], dev->bd_addr[5]);
1388 _bt_util_addr_type_to_addr_string(address, dev->bd_addr);
1390 if (service_add_extra_data(service, "device_address",
1391 (const char *)address) < 0) {
1392 BT_DBG("Fail to add extra data");
1395 if (service_add_extra_data(service, "device_name",
1396 (const char *)dev->name) < 0) {
1397 BT_DBG("Fail to add extra data");
1400 _bt_ug_destroy(ugd, (void *)service);
1402 service_destroy(service);
1405 } else if (ugd->bt_launch_mode == BT_LAUNCH_PICK) {
1406 ugd->pick_device = dev;
1407 g_idle_add((GSourceFunc)__bt_idle_destroy_ug, ugd);
1411 ugd->searched_item = item;
1413 if (_bt_util_is_battery_low() == TRUE) {
1414 /* Battery is critical low */
1415 _bt_main_create_information_popup(ugd, BT_STR_LOW_BATTERY);
1419 if (ugd->bt_launch_mode == BT_LAUNCH_SEND_FILE) {
1420 if (ugd->op_status == BT_SEARCHING) {
1421 ret = bt_adapter_stop_device_discovery();
1422 if(ret != BT_ERROR_NONE)
1423 BT_DBG("Fail to stop discovery");
1426 if (__bt_main_request_to_send(ugd,
1427 dev) == BT_UG_ERROR_NONE) {
1428 BT_ERR("Fail to send");
1431 _bt_ug_destroy(ugd, NULL);
1435 if (_bt_main_request_pairing_with_effect(ugd, item) !=
1437 ugd->searched_item = NULL;
1443 static void __bt_main_item_expanded(void *data, Evas_Object *obj, void *event_info)
1447 Elm_Object_Item *it = event_info;
1448 Elm_Object_Item *git = NULL;
1449 Evas_Object *gl = elm_object_item_widget_get(it);
1450 bt_radio_item *item = NULL;
1452 bt_ug_data *ugd = NULL;
1454 ret_if(data == NULL);
1457 ugd = (bt_ug_data *)data;
1459 for (i = 0; i < BT_MAX_TIMEOUT_ITEMS; i++) {
1460 item = calloc(1, sizeof(bt_radio_item));
1461 ret_if(item == NULL);
1466 git = elm_genlist_item_append(gl, ugd->timeout_value_itc,
1468 ELM_GENLIST_ITEM_NONE,
1469 __bt_main_timeout_value_item_sel,
1475 elm_genlist_realized_items_update(ugd->main_genlist);
1480 static void __bt_main_item_contracted(void *data, Evas_Object *obj, void *event_info)
1484 bt_ug_data *ugd = (bt_ug_data *)data;;
1485 Elm_Object_Item *item = event_info;
1487 ret_if(ugd == NULL);
1488 ret_if(item == NULL);
1490 elm_genlist_item_subitems_clear(item);
1491 elm_genlist_item_update(ugd->visible_item);
1496 static int __bt_main_get_item_type(bt_ug_data *ugd, Elm_Object_Item *item)
1498 int type = BT_ITEM_NO_TYPE;
1499 bt_dev_t *dev = NULL;
1500 Eina_List *l = NULL;
1502 retv_if(ugd == NULL, BT_ITEM_NO_TYPE);
1503 retv_if(item == NULL, BT_ITEM_NO_TYPE);
1505 if (item == ugd->paired_padding || item == ugd->searched_padding ||
1506 item == ugd->paired_title || item == ugd->searched_title) {
1508 return BT_ITEM_NO_TYPE;
1509 } else if (item == ugd->status_item) {
1510 type = (ugd->visible_item != NULL) ? BT_ITEM_TOP : BT_ITEM_NO_TYPE;
1512 } else if (item == ugd->visible_item) {
1513 type = (elm_genlist_item_expanded_get(item) == EINA_TRUE) ?
1514 BT_ITEM_CENTER : BT_ITEM_BOTTOM;
1518 EINA_LIST_FOREACH(ugd->paired_device, l, dev) {
1519 if (dev && (dev->genlist_item == item)) {
1520 return dev->item_type;
1524 EINA_LIST_FOREACH(ugd->searched_device, l, dev) {
1525 if (dev && (dev->genlist_item == item)) {
1526 return dev->item_type;
1530 return BT_ITEM_NO_TYPE;
1533 static int __bt_main_get_1depth_item_type(bt_ug_data *ugd, Elm_Object_Item *item)
1535 Elm_Object_Item *current = NULL;
1536 Elm_Object_Item *next = NULL;
1538 retv_if(ugd == NULL, BT_ITEM_NO_TYPE);
1539 retv_if(item == NULL, BT_ITEM_NO_TYPE);
1541 current = elm_genlist_item_next_get(ugd->visible_item);
1543 while (current != NULL) {
1544 next = elm_genlist_item_next_get(current);
1546 if (current == item) {
1548 next == ugd->paired_padding ||
1549 next == ugd->searched_padding) {
1550 return BT_ITEM_BOTTOM;
1552 return BT_ITEM_CENTER;
1558 return BT_ITEM_NO_TYPE;
1561 static void __bt_main_gl_realized(void *data, Evas_Object *obj, void *event_info)
1568 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
1570 ret_if(data == NULL);
1571 ret_if(item == NULL);
1573 ugd = (bt_ug_data *)data;
1575 depth = elm_genlist_item_expanded_depth_get(item);
1578 item_type = __bt_main_get_item_type(ugd, item);
1580 item_type = __bt_main_get_1depth_item_type(ugd, item);
1583 BT_DBG("type: %d", item_type);
1585 switch (item_type) {
1587 elm_object_item_signal_emit(item, "elm,state,top", "");
1589 case BT_ITEM_CENTER:
1590 elm_object_item_signal_emit(item, "elm,state,center", "");
1592 case BT_ITEM_BOTTOM:
1593 elm_object_item_signal_emit(item, "elm,state,bottom", "");
1596 elm_object_item_signal_emit(item, "elm,state,default", "");
1603 static Evas_Object *__bt_main_add_genlist_dialogue(Evas_Object *parent,
1607 retv_if(ugd == NULL, NULL);
1609 Evas_Object *genlist = NULL;
1610 Elm_Object_Item *git = NULL;
1612 genlist = elm_genlist_add(parent);
1614 /* We shoud set the mode to compress
1615 for using dialogue/2text.2icon.3.tb */
1616 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
1617 evas_object_smart_callback_add(genlist, "realized",
1618 __bt_main_gl_realized, ugd);
1620 ugd->radio_main = elm_radio_add(genlist);
1621 elm_radio_state_value_set(ugd->radio_main, 0);
1622 elm_radio_value_set(ugd->radio_main, 0);
1624 ugd->selected_radio = _bt_util_get_timeout_index(ugd->visibility_timeout);
1626 /* Set item class for dialogue seperator */
1627 ugd->sp_itc = elm_genlist_item_class_new();
1628 retv_if (ugd->sp_itc == NULL, NULL);
1630 ugd->sp_itc->item_style = "dialogue/separator";
1631 ugd->sp_itc->func.content_get = NULL;
1632 ugd->sp_itc->func.text_get = NULL;
1633 ugd->sp_itc->func.state_get = NULL;
1634 ugd->sp_itc->func.del = NULL;
1636 /* Set item class for bluetooth status and on/off button */
1637 ugd->status_itc = elm_genlist_item_class_new();
1638 retv_if (ugd->status_itc == NULL, NULL);
1640 ugd->status_itc->item_style = "dialogue/2text.1icon.10";
1641 ugd->status_itc->func.text_get = __bt_main_status_label_get;
1642 ugd->status_itc->func.content_get = __bt_main_status_icon_get;
1643 ugd->status_itc->func.state_get = NULL;
1644 ugd->status_itc->func.del = NULL;
1646 if (ugd->bt_launch_mode == BT_LAUNCH_NORMAL) {
1647 /* Set item class for visibility */
1648 ugd->visible_itc = elm_genlist_item_class_new();
1649 retv_if (ugd->visible_itc == NULL, NULL);
1651 ugd->visible_itc->item_style = "dialogue/2text.3/expandable";
1652 ugd->visible_itc->func.text_get = __bt_main_visible_label_get;
1653 ugd->visible_itc->func.content_get = NULL;
1654 ugd->visible_itc->func.state_get = NULL;
1655 ugd->visible_itc->func.del = NULL;
1658 /* Set item class for paired dialogue title */
1659 ugd->paired_title_itc = elm_genlist_item_class_new();
1660 retv_if (ugd->paired_title_itc == NULL, NULL);
1662 ugd->paired_title_itc->item_style = "dialogue/grouptitle";
1663 ugd->paired_title_itc->func.text_get = __bt_main_paired_title_label_get;
1664 ugd->paired_title_itc->func.content_get = NULL;
1665 ugd->paired_title_itc->func.state_get = NULL;
1666 ugd->paired_title_itc->func.del = NULL;
1668 /* Set item class for searched dialogue title */
1669 ugd->searched_title_itc = elm_genlist_item_class_new();
1670 retv_if (ugd->searched_title_itc == NULL, NULL);
1672 ugd->searched_title_itc->item_style = "dialogue/grouptitle";
1673 ugd->searched_title_itc->func.text_get =
1674 __bt_main_searched_title_label_get;
1675 ugd->searched_title_itc->func.content_get = __bt_main_title_icon_get;
1676 ugd->searched_title_itc->func.state_get = NULL;
1677 ugd->searched_title_itc->func.del = NULL;
1679 /* Set item class for paired device */
1680 ugd->device_itc = elm_genlist_item_class_new();
1681 retv_if (ugd->device_itc == NULL, NULL);
1683 if (ugd->bt_launch_mode == BT_LAUNCH_PICK)
1684 ugd->device_itc->item_style = "dialogue/1text.2icon";
1686 ugd->device_itc->item_style = "dialogue/2text.2icon.3.tb";
1688 ugd->device_itc->func.text_get = __bt_main_list_label_get;
1689 ugd->device_itc->func.content_get = __bt_main_list_icon_get;
1690 ugd->device_itc->func.state_get = NULL;
1691 ugd->device_itc->func.del = NULL;
1693 /* Set item class for searched device */
1694 ugd->searched_itc = elm_genlist_item_class_new();
1695 retv_if (ugd->searched_itc == NULL, NULL);
1697 ugd->searched_itc->item_style = "dialogue/1text.2icon";
1698 ugd->searched_itc->func.text_get = __bt_main_searched_label_get;
1699 ugd->searched_itc->func.content_get = __bt_main_searched_icon_get;
1700 ugd->searched_itc->func.state_get = NULL;
1701 ugd->searched_itc->func.del = NULL;
1703 /* Set item class for no device */
1704 ugd->no_device_itc = elm_genlist_item_class_new();
1705 retv_if (ugd->no_device_itc == NULL, NULL);
1707 ugd->no_device_itc->item_style = "dialogue/1text";
1708 ugd->no_device_itc->func.text_get = __bt_main_no_device_label_get;
1709 ugd->no_device_itc->func.content_get = NULL;
1710 ugd->no_device_itc->func.state_get = NULL;
1711 ugd->no_device_itc->func.del = NULL;
1713 /* Set item class for timeout value */
1714 ugd->timeout_value_itc = elm_genlist_item_class_new();
1715 retv_if(ugd->timeout_value_itc == NULL, NULL);
1717 ugd->timeout_value_itc->item_style = "dialogue/1text.1icon/expandable2";
1718 ugd->timeout_value_itc->func.text_get = __bt_main_timeout_value_label_get;
1719 ugd->timeout_value_itc->func.content_get = __bt_main_timeout_value_icon_get;
1720 ugd->timeout_value_itc->func.state_get = NULL;
1721 ugd->timeout_value_itc->func.del = __bt_main_timeout_value_del;
1724 git = elm_genlist_item_append(genlist, ugd->sp_itc, ugd, NULL,
1725 ELM_GENLIST_ITEM_NONE, NULL, NULL);
1727 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1729 /* Status and on/off button */
1730 git = elm_genlist_item_append(genlist, ugd->status_itc, ugd, NULL,
1731 ELM_GENLIST_ITEM_NONE,
1732 __bt_main_status_item_sel, ugd);
1733 ugd->status_item = git;
1735 if (ugd->bt_launch_mode == BT_LAUNCH_NORMAL) {
1737 git = elm_genlist_item_append(genlist, ugd->visible_itc, ugd,
1738 NULL, ELM_GENLIST_ITEM_TREE,
1739 __bt_main_visible_item_sel, ugd);
1740 ugd->visible_item = git;
1741 elm_object_item_disabled_set(ugd->visible_item, EINA_TRUE);
1744 evas_object_show(genlist);
1746 evas_object_smart_callback_add(genlist, "expanded", __bt_main_item_expanded, ugd);
1747 evas_object_smart_callback_add(genlist, "contracted", __bt_main_item_contracted, ugd);
1753 static Evas_Object *__bt_main_add_visibility_dialogue(Evas_Object *parent,
1757 retv_if(ugd == NULL, NULL);
1759 Evas_Object *genlist = NULL;
1760 Elm_Object_Item *git = NULL;
1762 genlist = elm_genlist_add(parent);
1764 evas_object_smart_callback_add(genlist, "realized",
1765 __bt_main_gl_realized, ugd);
1767 ugd->radio_main = elm_radio_add(genlist);
1768 elm_radio_state_value_set(ugd->radio_main, 0);
1769 elm_radio_value_set(ugd->radio_main, 0);
1771 ugd->selected_radio = _bt_util_get_timeout_index(ugd->visibility_timeout);
1773 /* Set item class for dialogue seperator */
1774 ugd->sp_itc = elm_genlist_item_class_new();
1775 retv_if (ugd->sp_itc == NULL, NULL);
1777 ugd->sp_itc->item_style = "dialogue/separator";
1778 ugd->sp_itc->func.content_get = NULL;
1779 ugd->sp_itc->func.text_get = NULL;
1780 ugd->sp_itc->func.state_get = NULL;
1781 ugd->sp_itc->func.del = NULL;
1783 /* Set item class for bluetooth status and on/off button */
1784 ugd->status_itc = elm_genlist_item_class_new();
1785 retv_if (ugd->status_itc == NULL, NULL);
1787 ugd->status_itc->item_style = "dialogue/2text.1icon.10";
1788 ugd->status_itc->func.text_get = __bt_main_status_label_get;
1789 ugd->status_itc->func.content_get = __bt_main_status_icon_get;
1790 ugd->status_itc->func.state_get = NULL;
1791 ugd->status_itc->func.del = NULL;
1793 /* Set item class for visibility */
1794 ugd->visible_itc = elm_genlist_item_class_new();
1795 retv_if (ugd->visible_itc == NULL, NULL);
1797 ugd->visible_itc->item_style = "dialogue/2text.3/expandable";
1798 ugd->visible_itc->func.text_get = __bt_main_visible_label_get;
1799 ugd->visible_itc->func.content_get = NULL;
1800 ugd->visible_itc->func.state_get = NULL;
1801 ugd->visible_itc->func.del = NULL;
1803 /* Set item class for timeout value */
1804 ugd->timeout_value_itc = elm_genlist_item_class_new();
1805 retv_if(ugd->timeout_value_itc == NULL, NULL);
1807 ugd->timeout_value_itc->item_style = "dialogue/1text.1icon/expandable2";
1808 ugd->timeout_value_itc->func.text_get = __bt_main_timeout_value_label_get;
1809 ugd->timeout_value_itc->func.content_get = __bt_main_timeout_value_icon_get;
1810 ugd->timeout_value_itc->func.state_get = NULL;
1811 ugd->timeout_value_itc->func.del = __bt_main_timeout_value_del;
1814 git = elm_genlist_item_append(genlist, ugd->sp_itc, ugd, NULL,
1815 ELM_GENLIST_ITEM_NONE, NULL, NULL);
1817 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1819 /* Status and on/off button */
1820 git = elm_genlist_item_append(genlist, ugd->status_itc, ugd, NULL,
1821 ELM_GENLIST_ITEM_NONE,
1822 __bt_main_status_item_sel, ugd);
1823 ugd->status_item = git;
1826 git = elm_genlist_item_append(genlist, ugd->visible_itc, ugd,
1827 NULL, ELM_GENLIST_ITEM_TREE,
1828 __bt_main_visible_item_sel, ugd);
1829 ugd->visible_item = git;
1830 elm_object_item_disabled_set(ugd->visible_item, EINA_TRUE);
1832 evas_object_show(genlist);
1834 evas_object_smart_callback_add(genlist, "expanded", __bt_main_item_expanded, ugd);
1835 evas_object_smart_callback_add(genlist, "contracted", __bt_main_item_contracted, ugd);
1841 static gboolean __bt_main_system_popup_timer_cb(gpointer user_data)
1846 bt_ug_data *ugd = NULL;
1849 retv_if(user_data == NULL, FALSE);
1851 ugd = (bt_ug_data *)user_data;
1853 b = ugd->popup_bundle;
1855 ugd->popup_bundle = NULL;
1856 ugd->popup_timer = 0;
1859 BT_DBG("bundle is NULL\n");
1863 ret = syspopup_launch("bt-syspopup", b);
1865 BT_DBG("Sorry Can not launch popup\n");
1867 BT_DBG("Finally Popup launched \n");
1873 return (0 > ret) ? TRUE : FALSE;
1876 static char *__bt_main_get_name(bt_dev_t *dev)
1880 char *conv_str = NULL;
1881 char tmp_str[BT_DEVICE_NAME_LENGTH_MAX + 1] = { 0, };
1882 char buf[BT_FILE_NAME_LEN_MAX + 1] = { 0, };
1884 retv_if(dev == NULL, NULL);
1886 if (strlen(dev->name) > 0) {
1887 strncpy(tmp_str, dev->name, BT_DEVICE_NAME_LENGTH_MAX);
1888 tmp_str[BT_DEVICE_NAME_LENGTH_MAX] = '\0';
1890 conv_str = elm_entry_utf8_to_markup(tmp_str);
1892 strncpy(buf, conv_str, BT_DEVICE_NAME_LENGTH_MAX);
1894 strncpy(buf, tmp_str, BT_DEVICE_NAME_LENGTH_MAX);
1904 static bool __bt_main_get_mime_type(char *file)
1908 char mime_type[BT_FILE_NAME_LEN_MAX] = {0, };
1909 int len = strlen("image");
1911 retv_if(file == NULL, FALSE);
1913 if (aul_get_mime_from_file(file, mime_type,
1914 BT_FILE_NAME_LEN_MAX) == AUL_R_OK) {
1915 BT_DBG(" mime type =%s \n \n \n", mime_type);
1916 if (0 != strncmp(mime_type, "image", len))
1919 BT_DBG("Error getting mime type");
1927 static bool __bt_main_is_image_file(service_h service)
1932 int number_of_files = 0;
1937 retvm_if(service == NULL, FALSE, "Invalid data bundle");
1939 if (service_get_extra_data(service, "filecount", &value) < 0)
1940 BT_DBG("Get data error");
1942 retv_if(value == NULL, FALSE);
1944 number_of_files = atoi(value);
1945 BT_DBG("[%d] files\n", number_of_files);
1949 if (number_of_files <= 0) {
1950 BT_DBG("No File\n");
1954 if (service_get_extra_data(service, "files", &value) < 0)
1955 BT_DBG("Get data error");
1957 retv_if(value == NULL, FALSE);
1960 while (((token = strstr(param, "?")) != NULL) &&
1961 i < number_of_files) {
1963 if (!__bt_main_get_mime_type(param)) {
1968 BT_DBG("File [%d] [%s]\n", i, param);
1973 if (i == (number_of_files - 1)) {
1974 if (!__bt_main_get_mime_type(param)) {
1978 BT_DBG("File [%d] [%s]\n", i, param);
1980 BT_DBG("Count not match : [%d] / [%d]\n",
1981 number_of_files, i);
1992 /**********************************************************************
1994 ***********************************************************************/
1996 void _bt_main_scan_device(bt_ug_data *ugd)
2001 ret_if(ugd == NULL);
2003 if (ugd->op_status != BT_DEACTIVATED &&
2004 ugd->op_status != BT_ACTIVATED) {
2005 BT_DBG("current bluetooth status [%d]", ugd->op_status);
2009 if (_bt_util_is_battery_low() == TRUE) {
2010 /* Battery is critical low */
2011 _bt_main_create_information_popup(ugd, BT_STR_LOW_BATTERY);
2015 if (ugd->op_status == BT_DEACTIVATED) {
2016 ret = __bt_main_enable_bt((void *)ugd);
2018 /* After activating, searching start by this flag. */
2019 ugd->search_req = TRUE;
2020 elm_object_disabled_set(ugd->scan_btn, EINA_TRUE);
2023 _bt_main_remove_all_searched_devices(ugd);
2025 ret = bt_adapter_start_device_discovery();
2027 ugd->op_status = BT_SEARCHING;
2028 elm_object_text_set(ugd->scan_btn, BT_STR_STOP);
2030 if (ugd->searched_title == NULL)
2031 _bt_main_add_searched_title(ugd);
2033 BT_DBG("Operation failed : Error Cause[%d]", ret);
2037 elm_genlist_item_update(ugd->status_item);
2042 void _bt_main_draw_selection_info(bt_ug_data *ugd, char *message)
2044 if (ugd->selectioninfo)
2045 evas_object_del(ugd->selectioninfo);
2047 ugd->selectioninfo = _bt_create_selectioninfo(ugd->win_main,
2048 message, ugd->rotation,
2049 _bt_main_selectioninfo_hide_cb,
2050 ugd, BT_DELETED_TIMEOUT);
2053 int _bt_main_service_request_cb(void *data)
2057 bt_ug_data *ugd = NULL;
2059 retvm_if(data == NULL, BT_UG_FAIL,
2060 "Invalid argument: bt_ug_data is NULL\n");
2062 ugd = (bt_ug_data *)data;
2064 if (ugd->request_timer) {
2065 ecore_timer_del(ugd->request_timer);
2066 ugd->request_timer = NULL;
2069 ugd->auto_service_search = FALSE;
2071 /* Need to modify API: Address parameter */
2072 if (ugd->waiting_service_response == TRUE) {
2073 bt_dev_t *dev = NULL;
2075 ugd->waiting_service_response = FALSE;
2076 bt_device_cancel_service_search();
2079 _bt_main_get_dev_info(ugd->paired_device, ugd->paired_item);
2080 retvm_if(dev == NULL, BT_UG_FAIL, "dev is NULL\n");
2082 dev->status = BT_IDLE;
2083 elm_genlist_item_update(ugd->paired_item);
2085 _bt_main_connect_device(ugd, dev);
2087 ugd->paired_item = NULL;
2091 return BT_UG_ERROR_NONE;
2094 char *_bt_main_get_device_icon(int major_class, int minor_class, int connected)
2097 char *icon = BT_ICON_UNKNOWN;
2099 BT_DBG("major_class: %d, minor_class: %d\n", major_class, minor_class);
2101 switch (major_class) {
2102 case BT_MAJOR_DEV_CLS_COMPUTER:
2103 icon = (connected == 0) ? BT_ICON_PC : BT_ICON_CONNECTED_PC;
2105 case BT_MAJOR_DEV_CLS_PHONE:
2106 icon = (connected == 0) ? BT_ICON_PHONE :
2107 BT_ICON_CONNECTED_PHONE;
2109 case BT_MAJOR_DEV_CLS_AUDIO:
2110 BT_DBG("minor_class: %x", minor_class);
2112 if (minor_class == BTAPP_MIN_DEV_CLS_HEADPHONES) {
2113 icon = (connected == 0) ? BT_ICON_HEADPHONE :
2114 BT_ICON_CONNECTED_HEADPHONE;
2116 icon = (connected == 0) ? BT_ICON_HEADSET :
2117 BT_ICON_CONNECTED_HEADSET;
2120 case BT_MAJOR_DEV_CLS_LAN_ACCESS_POINT:
2121 icon = (connected == 0) ? BT_ICON_NETWORK :
2122 BT_ICON_CONNECTED_NETWORK;
2124 case BT_MAJOR_DEV_CLS_IMAGING:
2125 if (minor_class == BTAPP_MIN_DEV_CLS_PRINTER) {
2126 icon = (connected == 0) ? BT_ICON_PRINTER :
2127 BT_ICON_CONNECTED_PRINTER;
2128 } else if (minor_class == BTAPP_MIN_DEV_CLS_CAMERA) {
2129 icon = (connected == 0) ? BT_ICON_CAMERA :
2130 BT_ICON_CONNECTED_CAMERA;
2131 } else if (minor_class == BTAPP_MIN_DEV_CLS_DISPLAY) {
2132 icon = (connected == 0) ? BT_ICON_DISPLAY :
2133 BT_ICON_CONNECTED_DISPLAY;
2136 case BT_MAJOR_DEV_CLS_PERIPHERAL:
2137 if (minor_class == BTAPP_MIN_DEV_CLS_KEY_BOARD) {
2138 icon = (connected == 0) ? BT_ICON_KEYBOARD :
2139 BT_ICON_CONNECTED_KEYBOARD;
2140 } else if (minor_class == BTAPP_MIN_DEV_CLS_POINTING_DEVICE) {
2141 icon = (connected == 0) ? BT_ICON_MOUSE :
2142 BT_ICON_CONNECTED_MOUSE;
2143 } else if (minor_class == BTAPP_MIN_DEV_CLS_GAME_PAD) {
2144 icon = (connected == 0) ? BT_ICON_GAMING :
2145 BT_ICON_CONNECTED_GAMING;
2148 case BT_MAJOR_DEV_CLS_HEALTH:
2149 icon = (connected == 0) ? BT_ICON_HEALTH :
2150 BT_ICON_CONNECTED_HEALTH;
2155 icon = (connected == 0) ? BT_ICON_UNKNOWN :
2156 BT_ICON_CONNECTED_UNKNOWN;
2164 void _bt_main_popup_del_cb(void *data, Evas_Object *obj,
2168 retm_if(data == NULL, "Invalid argument: struct bt_appdata is NULL\n");
2170 bt_ug_data *ugd = (bt_ug_data *)data;
2173 BT_DBG("delete popup\n");
2174 evas_object_del(ugd->popup);
2178 ugd->back_cb = NULL;
2183 void _bt_main_selectioninfo_hide_cb(void *data, Evas * e,
2184 Evas_Object *obj, void *event_info)
2187 retm_if(data == NULL, "Invalid argument: struct bt_appdata is NULL\n");
2189 bt_ug_data *ugd = (bt_ug_data *)data;
2191 evas_object_del(ugd->selectioninfo);
2192 ugd->selectioninfo = NULL;
2197 Elm_Object_Item *_bt_main_add_paired_device(bt_ug_data *ugd, bt_dev_t *dev)
2201 Elm_Object_Item *git;
2203 retvm_if(ugd == NULL, NULL, "Invalid argument: ugd is NULL\n");
2204 retvm_if(dev == NULL, NULL, "Invalid argument: dev is NULL\n");
2206 /* Paired device Title */
2207 if (ugd->paired_title == NULL) {
2208 if (ugd->searched_padding == NULL) {
2209 git = elm_genlist_item_append(ugd->main_genlist,
2212 ELM_GENLIST_ITEM_NONE, NULL, NULL);
2213 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
2214 ugd->paired_padding = git;
2216 git = elm_genlist_item_append(ugd->main_genlist,
2217 ugd->paired_title_itc,
2219 ELM_GENLIST_ITEM_NONE,
2221 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
2224 git = elm_genlist_item_insert_before(ugd->main_genlist,
2227 ugd->searched_padding,
2228 ELM_GENLIST_ITEM_NONE,
2230 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
2231 ugd->paired_padding = git;
2233 git = elm_genlist_item_insert_after(ugd->main_genlist,
2234 ugd->paired_title_itc,
2236 ugd->paired_padding,
2237 ELM_GENLIST_ITEM_NONE,
2239 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
2241 ugd->paired_title = git;
2243 __bt_main_set_controlbar_mode(ugd, BT_CONTROL_BAR_ENABLE);
2246 dev->ugd = (void *)ugd;
2247 dev->is_bonded = TRUE;
2248 dev->status = BT_IDLE;
2250 /* Add the device item in the list */
2251 git = elm_genlist_item_insert_after(ugd->main_genlist, ugd->device_itc,
2252 dev, NULL, ugd->paired_title,
2253 ELM_GENLIST_ITEM_NONE,
2254 __bt_main_paired_item_sel_cb, ugd);
2256 dev->genlist_item = git;
2262 Elm_Object_Item *_bt_main_add_searched_device(bt_ug_data *ugd, bt_dev_t *dev)
2266 Elm_Object_Item *git = NULL;
2268 retvm_if(ugd == NULL, NULL, "Invalid argument: ugd is NULL\n");
2269 retvm_if(dev == NULL, NULL, "Invalid argument: dev is NULL\n");
2271 if (ugd->searched_title == NULL)
2272 _bt_main_add_searched_title(ugd);
2274 /* Searched device Item */
2275 if (ugd->searched_device == NULL) {
2276 git = elm_genlist_item_insert_after(ugd->main_genlist, ugd->searched_itc,
2277 dev, NULL, ugd->searched_title, ELM_GENLIST_ITEM_NONE,
2278 __bt_main_searched_item_sel_cb, ugd);
2280 bt_dev_t *item_dev = NULL;
2281 Elm_Object_Item *item = NULL;
2282 Elm_Object_Item *next = NULL;
2284 item = elm_genlist_item_next_get(ugd->searched_title);
2286 /* check the RSSI value of searched device list add arrange its order */
2287 while (item != NULL) {
2288 item_dev = _bt_main_get_dev_info(ugd->searched_device, item);
2289 retv_if(item_dev == NULL, NULL);
2291 if (item_dev->rssi > dev->rssi) {
2292 next = elm_genlist_item_next_get(item);
2294 git = elm_genlist_item_insert_after(ugd->main_genlist,
2296 dev, NULL, item, ELM_GENLIST_ITEM_NONE,
2297 __bt_main_searched_item_sel_cb, ugd);
2302 git = elm_genlist_item_insert_before(ugd->main_genlist,
2304 dev, NULL, item, ELM_GENLIST_ITEM_NONE,
2305 __bt_main_searched_item_sel_cb, ugd);
2311 dev->genlist_item = git;
2312 dev->status = BT_IDLE;
2313 dev->ugd = (void *)ugd;
2314 dev->is_bonded = FALSE;
2320 Elm_Object_Item *_bt_main_add_no_device_found(bt_ug_data *ugd)
2324 Elm_Object_Item *git = NULL;
2326 retvm_if(ugd == NULL, NULL, "Invalid argument: ugd is NULL\n");
2327 retvm_if(ugd->searched_title == NULL, NULL, "title is NULL\n");
2329 /* No device found Item */
2330 git = elm_genlist_item_insert_after(ugd->main_genlist, ugd->no_device_itc,
2331 NULL, NULL, ugd->searched_title, ELM_GENLIST_ITEM_NONE,
2334 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
2340 int _bt_main_draw_list_view(bt_ug_data *ugd)
2347 Evas_Object *layout;
2348 Evas_Object *genlist;
2349 Evas_Object *back_btn;
2350 Elm_Object_Item *navi_it;
2352 retv_if(ugd == NULL, BT_UG_FAIL);
2354 navi = _bt_create_naviframe(ugd->base);
2356 /* create back button */
2357 back_btn = elm_button_add(navi);
2359 _bt_create_bg(navi, "group_list");
2361 layout = _bt_create_layout(navi, NULL, NULL);
2363 genlist = __bt_main_add_genlist_dialogue(layout, ugd);
2365 navi_it = elm_naviframe_item_push(navi, BT_STR_BLUETOOTH, back_btn, NULL, genlist,
2368 /* BT_STR_SCAN will be changed to icon */
2369 btn = _bt_create_button(navi, "naviframe/toolbar/default", BT_STR_SCAN,
2370 NULL, __bt_main_controlbar_btn_cb,
2372 ugd->scan_btn = btn;
2374 elm_object_item_part_content_set(navi_it, "toolbar_button1", btn);
2376 ugd->navi_it = navi_it;
2378 /* Style set should be called after elm_naviframe_item_push(). */
2379 elm_object_style_set(back_btn, "naviframe/back_btn/default");
2380 evas_object_smart_callback_add(back_btn, "clicked",
2381 __bt_main_quit_btn_cb, (void *)ugd);
2383 ugd->navi_bar = navi;
2384 ugd->main_layout = layout;
2385 ugd->main_genlist = genlist;
2386 ugd->confirm_req = BT_NONE_REQ;
2388 /* In the NFC case, we don't need to display the paired device */
2389 if (ugd->op_status == BT_ACTIVATED &&
2390 ugd->bt_launch_mode != BT_LAUNCH_USE_NFC) {
2391 _bt_main_draw_paired_devices(ugd);
2393 if (ugd->paired_device == NULL ||
2394 eina_list_count(ugd->paired_device) == 0) {
2395 if (_bt_util_is_battery_low() == FALSE) {
2396 ret = bt_adapter_start_device_discovery();
2398 ugd->op_status = BT_SEARCHING;
2399 elm_object_text_set(ugd->scan_btn, BT_STR_STOP);
2401 elm_genlist_item_update(ugd->status_item);
2403 if (ugd->searched_title == NULL)
2404 _bt_main_add_searched_title(ugd);
2406 BT_DBG("Operation failed : Error Cause[%d]", ret);
2408 elm_genlist_item_update(ugd->status_item);
2410 } else if (ugd->op_status == BT_DEACTIVATED &&
2411 ugd->bt_launch_mode != BT_LAUNCH_NORMAL) {
2412 __bt_main_enable_bt(ugd);
2415 if (ugd->op_status == BT_ACTIVATED || ugd->op_status == BT_SEARCHING)
2416 elm_object_item_disabled_set(ugd->visible_item, EINA_FALSE);
2420 return BT_UG_ERROR_NONE;
2423 int _bt_main_draw_visibility_view(bt_ug_data *ugd)
2427 Evas_Object *navi = NULL;
2428 Evas_Object *layout = NULL;
2429 Evas_Object *genlist = NULL;
2430 Evas_Object *back_btn = NULL;
2431 Elm_Object_Item *navi_it;
2433 retv_if(ugd == NULL, BT_UG_FAIL);
2435 navi = _bt_create_naviframe(ugd->base);
2437 /* create back button */
2438 back_btn = elm_button_add(navi);
2440 _bt_create_bg(navi, "group_list");
2442 layout = _bt_create_layout(navi, NULL, NULL);
2444 genlist = __bt_main_add_visibility_dialogue(layout, ugd);
2446 navi_it = elm_naviframe_item_push(navi, BT_STR_VISIBLE, back_btn, NULL, genlist,
2449 ugd->navi_it = navi_it;
2451 /* create controlbar */
2452 _bt_create_controlbar(navi, "default");
2454 /* Style set should be called after elm_naviframe_item_push(). */
2455 elm_object_style_set(back_btn, "naviframe/back_btn/default");
2456 evas_object_smart_callback_add(back_btn, "clicked",
2457 __bt_main_quit_btn_cb, (void *)ugd);
2459 ugd->navi_bar = navi;
2460 ugd->main_layout = layout;
2461 ugd->main_genlist = genlist;
2462 ugd->confirm_req = BT_NONE_REQ;
2464 if (ugd->op_status == BT_ACTIVATED)
2465 elm_object_item_disabled_set(ugd->visible_item, EINA_FALSE);
2469 return BT_UG_ERROR_NONE;
2472 static bool __bt_cb_adapter_bonded_device(bt_device_info_s *device_info,
2475 bt_dev_t *dev = NULL;
2476 bool connected = FALSE;
2477 bt_ug_data *ugd = NULL;
2478 void *profile_h = NULL;
2480 retv_if(user_data == NULL, false);
2482 ugd = (bt_ug_data *)user_data;
2484 if (_bt_main_check_and_update_device(ugd->paired_device,
2485 device_info->remote_address,
2486 device_info->remote_name) >= 0) {
2487 /* Update all realized items */
2488 elm_genlist_realized_items_update(ugd->main_genlist);
2493 dev = _bt_main_create_paired_device_item(device_info);
2498 dev->ugd = (void *)ugd;
2500 if (dev->service_list & BT_SC_HFP_SERVICE_MASK ||
2501 dev->service_list & BT_SC_HSP_SERVICE_MASK ||
2502 dev->service_list & BT_SC_A2DP_SERVICE_MASK) {
2503 connected = _bt_is_profile_connected(BT_HEADSET_CONNECTED,
2504 ugd->conn, dev->bd_addr);
2505 dev->connected_mask |= connected ? BT_HEADSET_CONNECTED : 0x00;
2507 connected = _bt_is_profile_connected(BT_STEREO_HEADSET_CONNECTED,
2508 ugd->conn, dev->bd_addr);
2509 dev->connected_mask |= connected ? BT_STEREO_HEADSET_CONNECTED : 0x00;
2510 } else if (dev->service_list & BT_SC_HID_SERVICE_MASK) {
2511 connected = _bt_is_profile_connected(BT_HID_CONNECTED,
2512 ugd->conn, dev->bd_addr);
2513 dev->connected_mask |= connected ? BT_HID_CONNECTED : 0x00;
2516 profile_h = _bt_get_registered_net_profile(ugd->connection,
2519 if (profile_h == NULL) {
2520 profile_h = _bt_get_connected_net_profile(ugd->connection,
2523 dev->connected_mask |= connected ? BT_NETWORK_CONNECTED : 0x00;
2527 _bt_set_profile_state_changed_cb(profile_h, dev);
2529 BT_DBG("connected mask: %d", dev->connected_mask);
2531 if (_bt_main_is_matched_profile(ugd->search_type,
2534 ugd->service) == TRUE) {
2535 BT_DBG("Device count [%d]",
2536 eina_list_count(ugd->paired_device));
2538 if (_bt_main_add_paired_device(ugd, dev) != NULL) {
2539 ugd->paired_device =
2540 eina_list_append(ugd->paired_device, dev);
2542 _bt_update_paired_item_style(ugd);
2545 BT_DBG("Device class and search type do not match \n");
2552 void _bt_main_draw_paired_devices(bt_ug_data *ugd)
2556 ret_if(ugd == NULL);
2558 if (bt_adapter_foreach_bonded_device(__bt_cb_adapter_bonded_device,
2559 (void *)ugd) != BT_ERROR_NONE) {
2560 BT_DBG("bt_adapter_foreach_bonded_device() failed");
2568 void _bt_main_remove_paired_device(bt_ug_data *ugd, bt_dev_t *dev)
2572 bt_dev_t *item = NULL;
2573 Eina_List *l = NULL;
2574 Eina_List *l_next = NULL;
2576 retm_if(ugd == NULL, "Invalid argument: ugd is NULL\n");
2577 retm_if(dev == NULL, "Invalid argument: dev is NULL\n");
2579 EINA_LIST_FOREACH_SAFE(ugd->paired_device, l, l_next, item) {
2580 if (item && (item == dev)) {
2581 elm_object_item_del(dev->genlist_item);
2582 ugd->paired_device =
2583 eina_list_remove_list(ugd->paired_device, l);
2584 _bt_util_free_device_item(item);
2588 if (ugd->paired_device == NULL ||
2589 eina_list_count(ugd->paired_device) == 0) {
2590 elm_object_item_del(ugd->paired_title);
2591 ugd->paired_title = NULL;
2593 if (ugd->paired_padding) {
2594 elm_object_item_del(ugd->paired_padding);
2595 ugd->paired_padding = NULL;
2598 _bt_update_paired_item_style(ugd);
2605 void _bt_main_remove_all_paired_devices(bt_ug_data *ugd)
2609 bt_dev_t *dev = NULL;
2610 Eina_List *l = NULL;
2611 Eina_List *l_next = NULL;
2612 Elm_Object_Item *item;
2613 Elm_Object_Item *next;
2615 ret_if(ugd == NULL);
2617 if (ugd->paired_padding) {
2618 item = elm_genlist_item_next_get(ugd->paired_padding);
2620 elm_object_item_del(ugd->paired_padding);
2621 ugd->paired_padding = NULL;
2623 while (item != NULL && (item != ugd->searched_padding)) {
2624 next = elm_genlist_item_next_get(item);
2625 elm_object_item_del(item);
2629 ugd->paired_title = NULL;
2632 EINA_LIST_FOREACH_SAFE(ugd->paired_device, l, l_next, dev) {
2633 ugd->paired_device =
2634 eina_list_remove_list(ugd->paired_device, l);
2635 _bt_util_free_device_item(dev);
2642 void _bt_main_remove_searched_device(bt_ug_data *ugd, bt_dev_t *dev)
2646 bt_dev_t *item = NULL;
2647 Eina_List *l = NULL;
2648 Eina_List *l_next = NULL;
2650 ret_if(ugd == NULL);
2652 EINA_LIST_FOREACH_SAFE(ugd->searched_device, l, l_next, item) {
2653 if (item && (item == dev)) {
2654 elm_object_item_del(dev->genlist_item);
2655 ugd->searched_device =
2656 eina_list_remove_list(ugd->searched_device, l);
2657 _bt_util_free_device_item(item);
2661 if (ugd->searched_device == NULL ||
2662 eina_list_count(ugd->searched_device) == 0) {
2663 elm_object_item_del(ugd->searched_title);
2664 ugd->searched_title = NULL;
2666 if (ugd->searched_padding) {
2667 elm_object_item_del(ugd->searched_padding);
2668 ugd->searched_padding = NULL;
2671 _bt_update_searched_item_style(ugd);
2678 void _bt_main_remove_all_searched_devices(bt_ug_data *ugd)
2682 bt_dev_t *dev = NULL;
2683 Eina_List *l = NULL;
2684 Eina_List *l_next = NULL;
2685 Elm_Object_Item *item;
2686 Elm_Object_Item *next;
2688 ret_if(ugd == NULL);
2690 if (ugd->searched_padding) {
2691 item = elm_genlist_item_next_get(ugd->searched_padding);
2692 elm_object_item_del(ugd->searched_padding);
2693 ugd->searched_padding = NULL;
2695 while (item != NULL) {
2696 next = elm_genlist_item_next_get(item);
2697 elm_object_item_del(item);
2701 ugd->searched_title = NULL;
2702 ugd->no_device_item = NULL;
2705 EINA_LIST_FOREACH_SAFE(ugd->searched_device, l, l_next, dev) {
2706 ugd->searched_device =
2707 eina_list_remove_list(ugd->searched_device, l);
2708 _bt_util_free_device_item(dev);
2715 gboolean _bt_main_is_headset_connected(bt_ug_data *ugd)
2717 gboolean connected = FALSE;
2718 Eina_List *l = NULL;
2719 bt_dev_t *item = NULL;
2721 retv_if(ugd == NULL, FALSE);
2723 EINA_LIST_FOREACH(ugd->paired_device, l, item) {
2725 if ((item->service_list & BT_SC_HFP_SERVICE_MASK) ||
2726 (item->service_list & BT_SC_HSP_SERVICE_MASK)) {
2727 connected = _bt_is_profile_connected(BT_HEADSET_CONNECTED,
2728 ugd->conn, item->bd_addr);
2739 gboolean _bt_main_is_stereo_headset_connected(bt_ug_data *ugd)
2741 gboolean connected = FALSE;
2742 Eina_List *l = NULL;
2743 bt_dev_t *item = NULL;
2745 retv_if(ugd == NULL, FALSE);
2747 EINA_LIST_FOREACH(ugd->paired_device, l, item) {
2751 if (item->service_list & BT_SC_A2DP_SERVICE_MASK) {
2752 connected = _bt_is_profile_connected(BT_STEREO_HEADSET_CONNECTED,
2753 ugd->conn, item->bd_addr);
2764 void _bt_main_retry_connection(void *data, int response)
2768 bt_ug_data *ugd = NULL;
2769 bt_dev_t *dev = NULL;
2771 ret_if(data == NULL);
2773 ugd = (bt_ug_data *)data;
2774 dev = _bt_main_get_dev_info(ugd->paired_device, ugd->paired_item);
2776 retm_if(dev == NULL, "dev is NULL\n");
2778 if (response == 0) {
2779 BT_DBG("Connect with the same device again\n");
2780 _bt_main_connect_device(ugd, dev);
2782 dev->status = BT_IDLE;
2783 ugd->confirm_req = BT_NONE_REQ;
2784 elm_genlist_item_update(ugd->paired_item);
2790 void _bt_main_connect_device(bt_ug_data *ugd, bt_dev_t *dev)
2794 int headset_type = BT_AUDIO_PROFILE_TYPE_ALL;
2796 ret_if(ugd == NULL);
2797 ret_if(dev == NULL);
2799 if (ugd->connect_req == TRUE) {
2800 _bt_main_draw_selection_info(ugd, BT_STR_CONNECTION_FAILED);
2804 if ((dev->service_list & BT_SC_HFP_SERVICE_MASK) ||
2805 (dev->service_list & BT_SC_HSP_SERVICE_MASK)) {
2806 /* Connect the Headset */
2808 if (_bt_main_is_headset_connected(ugd) == TRUE) {
2809 /* Check if A2DP is connected or not */
2810 if ((dev->service_list & BT_SC_A2DP_SERVICE_MASK) &&
2811 _bt_main_is_stereo_headset_connected(ugd) == TRUE) {
2812 _bt_main_draw_selection_info(ugd, BT_STR_CONNECTION_EXISTS);
2816 headset_type = BT_AUDIO_PROFILE_TYPE_A2DP;
2818 headset_type = BT_AUDIO_PROFILE_TYPE_ALL;
2821 if (bt_audio_connect(dev->addr_str,
2822 headset_type) == BT_ERROR_NONE) {
2823 ugd->connect_req = TRUE;
2824 dev->status = BT_CONNECTING;
2826 BT_DBG("Fail to connect Headset device");
2828 } else if (dev->service_list & BT_SC_A2DP_SERVICE_MASK) {
2829 /* Connect the Stereo Headset */
2830 if (_bt_main_is_stereo_headset_connected(ugd) == TRUE) {
2831 _bt_main_draw_selection_info(ugd, BT_STR_CONNECTION_EXISTS);
2835 if (bt_audio_connect(dev->addr_str,
2836 BT_AUDIO_PROFILE_TYPE_A2DP) == BT_ERROR_NONE) {
2837 ugd->connect_req = TRUE;
2838 dev->status = BT_CONNECTING;
2840 BT_DBG("Fail to connect Headset device");
2842 } else if (dev->service_list & BT_SC_HID_SERVICE_MASK) {
2843 BT_DBG("HID connect request\n");
2845 if (bt_hid_host_connect(dev->addr_str) == BT_ERROR_NONE) {
2846 ugd->connect_req = TRUE;
2847 dev->status = BT_CONNECTING;
2849 BT_DBG("Fail to connect HID device");
2853 if (dev->net_profile) {
2854 if (_bt_connect_net_profile(ugd->connection,
2856 dev) == BT_UG_ERROR_NONE) {
2857 ugd->connect_req = TRUE;
2858 dev->status = BT_CONNECTING;
2860 BT_ERR("Fail to connect the net profile");
2864 elm_genlist_item_update((Elm_Object_Item *)dev->genlist_item);
2869 void _bt_main_disconnect_device(bt_ug_data *ugd, bt_dev_t *dev)
2873 ret_if(ugd == NULL);
2874 ret_if(dev == NULL);
2876 if (ugd->connect_req == TRUE) {
2877 _bt_main_draw_selection_info(ugd, BT_STR_CONNECTION_FAILED);
2881 if (_bt_is_profile_connected(BT_HEADSET_CONNECTED, ugd->conn,
2882 dev->bd_addr) == TRUE) {
2883 BT_DBG("Disconnecting AG service \n");
2884 if (bt_audio_disconnect(dev->addr_str,
2885 BT_AUDIO_PROFILE_TYPE_ALL) == BT_ERROR_NONE) {
2886 ugd->connect_req = TRUE;
2887 dev->status = BT_DISCONNECTING;
2889 BT_DBG("Fail to connect Headset device");
2891 } else if (_bt_is_profile_connected(BT_STEREO_HEADSET_CONNECTED, ugd->conn,
2892 dev->bd_addr) == TRUE) {
2893 BT_DBG("Disconnecting AV service \n");
2894 if (bt_audio_disconnect(dev->addr_str,
2895 BT_AUDIO_PROFILE_TYPE_A2DP) == BT_ERROR_NONE) {
2896 ugd->connect_req = TRUE;
2897 dev->status = BT_DISCONNECTING;
2899 BT_DBG("Fail to connect Headset device");
2901 } else if (_bt_is_profile_connected(BT_HID_CONNECTED, ugd->conn,
2902 dev->bd_addr) == TRUE) {
2903 BT_DBG("Disconnecting HID service!!\n");
2905 if (bt_hid_host_disconnect(dev->addr_str) == BT_ERROR_NONE) {
2906 dev->status = BT_DISCONNECTING;
2908 BT_DBG("Fail to disconnect HID device");
2913 if (dev->net_profile) {
2914 if (_bt_disconnect_net_profile(ugd->connection,
2916 dev) == BT_UG_ERROR_NONE) {
2917 ugd->connect_req = TRUE;
2918 dev->status = BT_CONNECTING;
2920 BT_ERR("Fail to connect the net profile");
2924 elm_genlist_item_update((Elm_Object_Item *)dev->genlist_item);
2929 void _bt_main_change_rotate_mode(void *data)
2933 bt_ug_data *ugd = NULL;
2935 ret_if(data == NULL);
2937 ugd = (bt_ug_data *)data;
2939 BT_DBG("rotation: %d", ugd->rotation);
2944 void _bt_main_change_connection_status(bool connected, bt_ug_data *ugd,
2949 retm_if(ugd == NULL, "Invalid argument: ugd is NULL\n");
2950 retm_if(dev == NULL, "Invalid argument: dev is NULL\n");
2951 retm_if(dev->genlist_item == NULL,
2952 "Invalid argument: genlist_item is NULL\n");
2954 BT_DBG("Connected: %d", connected);
2956 dev->status = BT_IDLE;
2957 dev->connected_mask = connected ? dev->connected_mask : 0x00;
2959 elm_genlist_item_update((Elm_Object_Item *)dev->genlist_item);
2965 void _bt_main_draw_popup_menu(Evas_Object *parent, bt_dev_t *dev,
2970 Evas_Object *menu_list = NULL;
2971 Evas_Object *popup_menu = NULL;
2972 Evas_Object *btn = NULL;
2975 retm_if(parent == NULL, "Invalid argument: parent is NULL\n");
2976 retm_if(dev == NULL, "Invalid argument: ugd is NULL\n");
2977 retm_if(ugd == NULL, "Invalid argument: ugd is NULL\n");
2978 retm_if(ugd->popup_menu != NULL, "Menu popup is displaying\n");
2980 BT_DBG("dev name: %s", dev->name);
2982 name = __bt_main_get_name(dev);
2984 /* create normal popup */
2986 _bt_create_popup(parent, name, NULL, __bt_main_popup_menu_cb, ugd,
2989 elm_object_style_set(popup_menu, "menustyle");
2990 btn = elm_button_add(ugd->popup);
2991 elm_object_text_set(btn, BT_STR_BLUETOOTH_CLOSE);
2992 elm_object_part_content_set(ugd->popup, "button1", btn);
2993 evas_object_smart_callback_add(btn, "clicked", __bt_main_popup_menu_cb, ugd);
2995 ugd->popup_menu = popup_menu;
3000 /* create the popup menu using genlist */
3001 menu_list = _bt_create_genlist(popup_menu);
3003 evas_object_data_set(menu_list, "dev_info", dev);
3005 /* create inner list for menu */
3006 ugd->popup_menu_itc.item_style = "1text";
3007 ugd->popup_menu_itc.func.text_get = __bt_main_popup_menu_label_get;
3008 ugd->popup_menu_itc.func.content_get = NULL;
3009 ugd->popup_menu_itc.func.state_get = NULL;
3010 ugd->popup_menu_itc.func.del = NULL;
3012 BT_DBG("service list: %x", dev->service_list);
3013 BT_DBG("major clase: %x", dev->major_class);
3015 elm_genlist_item_append(menu_list, &ugd->popup_menu_itc,
3016 (void *)BT_CONNECT_MENU, NULL,
3017 ELM_GENLIST_ITEM_NONE,
3018 __bt_main_select_menu_cb, ugd);
3020 /* set inner list to popup */
3021 elm_object_content_set(popup_menu, menu_list);
3022 ugd->back_cb = (bt_app_back_cb) __bt_main_popup_menu_cb;
3027 int _bt_main_request_pairing_with_effect(bt_ug_data *ugd,
3028 Elm_Object_Item *seleted_item)
3034 retvm_if(ugd == NULL, BT_UG_FAIL, "Invalid argument: ugd is NULL\n");
3035 retvm_if(seleted_item == NULL, BT_UG_FAIL,
3036 "Invalid argument: object is NULL\n");
3038 dev = _bt_main_get_dev_info(ugd->searched_device, seleted_item);
3039 retvm_if(dev == NULL, BT_UG_FAIL, "Invalid argument: dev is NULL\n");
3041 if (bt_device_create_bond(dev->addr_str) == BT_ERROR_NONE) {
3042 dev->status = BT_DEV_PAIRING;
3043 ugd->op_status = BT_PAIRING;
3045 elm_genlist_item_update(seleted_item);
3046 elm_object_disabled_set(ugd->scan_btn, EINA_TRUE);
3052 return BT_UG_ERROR_NONE;
3055 void _bt_main_retry_pairing(void *data, int response)
3059 bt_ug_data *ugd = NULL;
3060 bt_dev_t *dev = NULL;
3062 ret_if(data == NULL);
3064 ugd = (bt_ug_data *)data;
3065 dev = _bt_main_get_dev_info(ugd->searched_device, ugd->searched_item);
3066 retm_if(dev == NULL, "dev is NULL\n");
3068 if (response == 0) {
3069 /* Retry pairing with same device */
3070 dev->status = BT_DEV_PAIRING;
3071 elm_genlist_item_update(ugd->searched_item);
3073 if (ugd->op_status != BT_PAIRING) {
3074 if (_bt_main_request_pairing_with_effect
3075 (ugd, ugd->searched_item) != BT_UG_ERROR_NONE)
3076 ugd->searched_item = NULL;
3078 ugd->searched_item = NULL;
3080 dev->status = BT_IDLE;
3081 ugd->confirm_req = BT_NONE_REQ;
3082 elm_genlist_item_update(ugd->searched_item);
3088 void __bt_main_parse_service(bt_ug_data *ugd, service_h service)
3090 char *launch_type = NULL;
3091 char *operation = NULL;
3092 const char *file_url = NULL;
3093 const char *file_path = NULL;
3095 ret_if(ugd == NULL);
3096 ret_if(service == NULL);
3098 if (service_get_operation(service, &operation) < 0)
3099 BT_DBG("Get operation error");
3101 BT_DBG("operation: %s", operation);
3103 if (g_strcmp0(operation, SERVICE_OPERATION_SEND) == 0) {
3104 launch_type = strdup("send");
3106 if (service_get_uri(service, (char **)&file_url) < 0)
3107 BT_DBG("Get uri error");
3109 if (file_url == NULL)
3112 file_path = g_filename_from_uri(file_url, NULL, NULL);
3114 if (file_path == NULL) {
3115 BT_DBG("Not include URI info");
3116 file_path = strdup(file_url);
3119 /* In now, we support only 1 file by AppControl */
3120 if (service_add_extra_data(service, "filecount", "1") < 0)
3121 BT_DBG("Fail to add extra data");
3123 if (service_add_extra_data(service, "files", file_path) < 0)
3124 BT_DBG("Fail to add extra data");
3125 } else if (service_get_extra_data(service, "launch-type",
3126 &launch_type) < 0) {
3127 BT_DBG("Get data error");
3132 BT_DBG("Launch with launch type [%s]\n", launch_type);
3133 _bt_util_set_value(launch_type, &ugd->search_type,
3134 &ugd->bt_launch_mode);
3136 BT_DBG("launch type is NULL");
3140 free((void *)file_url);
3143 free((void *)file_path);
3146 free((void *)launch_type);
3150 void _bt_main_init_status(bt_ug_data *ugd, void *data)
3154 service_h service = NULL;
3155 int remain_time = 0;
3156 char *dev_name = NULL;
3157 char phone_name[BT_DEVICE_NAME_LENGTH_MAX + 1];
3158 bool status = false;
3159 bt_adapter_state_e bt_state = BT_ADAPTER_DISABLED;
3160 bt_adapter_visibility_mode_e mode =
3161 BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
3163 ret_if(ugd == NULL);
3167 if (service != NULL) {
3168 __bt_main_parse_service(ugd, service);
3170 ugd->search_type = MISCELLANEOUS_MAJOR_DEVICE_MASK;
3171 ugd->bt_launch_mode = BT_LAUNCH_NORMAL;
3174 ugd->conn = (void *)dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
3176 if (bt_initialize() != BT_ERROR_NONE)
3177 BT_ERR("bt_initialize() failed");
3179 if (bt_audio_initialize() != BT_ERROR_NONE)
3180 BT_ERR("bt_initialize() failed");
3182 if (bt_adapter_get_state(&bt_state) != BT_ERROR_NONE)
3183 BT_ERR("bt_adapter_get_state() failed.");
3185 if (_bt_create_net_connection(&ugd->connection) != BT_UG_ERROR_NONE)
3186 BT_ERR("_bt_create_net_connection fail");
3188 if (bt_state == BT_ADAPTER_DISABLED) {
3189 ugd->op_status = BT_DEACTIVATED;
3191 if (bt_adapter_is_discovering(&status) != BT_ERROR_NONE)
3192 BT_DBG("bt_adapter_get_state() failed.");
3195 bt_adapter_stop_device_discovery();
3197 ugd->op_status = BT_ACTIVATED;
3199 /* Get adapter name from bluez */
3200 bt_adapter_get_name(&dev_name);
3202 /* Get phone name from vconf */
3203 _bt_util_get_phone_name(phone_name, BT_DEVICE_NAME_LENGTH_MAX);
3205 if (g_strcmp0(dev_name, phone_name) != 0) {
3206 _bt_util_set_phone_name();
3212 if(bt_adapter_get_visibility(&mode, &remain_time) != BT_ERROR_NONE)
3213 BT_DBG("bt_adapter_get_visibility() failed.");
3215 if (mode == BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE) {
3216 ugd->visible = FALSE;
3217 ugd->visibility_timeout = 0;
3218 } else if (mode == BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE){
3219 ugd->visible = TRUE;
3220 ugd->visibility_timeout = -1;
3222 /* BT_ADAPTER_VISIBILITY_MODE_LIMITED_DISCOVERABLE */
3223 /* Need to add the code for getting timeout */
3224 if (vconf_get_int(BT_VCONF_VISIBLE_TIME,
3225 &ugd->visibility_timeout)) {
3226 BT_DBG("Get the timeout value");
3229 ugd->remain_time = remain_time;
3231 if (ugd->remain_time > 0) {
3232 ugd->timeout_id = g_timeout_add_seconds(1,
3233 __bt_main_visible_timeout_cb, ugd);
3235 ugd->visibility_timeout = 0;
3239 /* Set event callbacks */
3240 bt_adapter_set_state_changed_cb(_bt_cb_state_changed, (void *)ugd);
3242 if (ugd->bt_launch_mode == BT_LAUNCH_VISIBILITY) {
3243 /* Don't need to register callback */
3247 bt_audio_set_connection_state_changed_cb(
3248 _bt_cb_audio_state_changed,
3251 bt_adapter_set_device_discovery_state_changed_cb(
3252 _bt_cb_discovery_state_changed,
3255 bt_device_set_bond_created_cb(_bt_cb_bonding_created, (void *)ugd);
3257 bt_device_set_bond_destroyed_cb(_bt_cb_bonding_destroyed, (void *)ugd);
3259 bt_device_set_service_searched_cb(_bt_cb_service_searched, (void *)ugd);
3261 bt_hid_host_initialize(_bt_cb_hid_state_changed, (void *)ugd);
3266 bt_dev_t *_bt_main_create_paired_device_item(void *data)
3271 unsigned char bd_addr[BT_ADDRESS_LENGTH_MAX];
3272 bt_dev_t *dev = NULL;
3273 bt_device_info_s *dev_info = NULL;
3275 retv_if(data == NULL, NULL);
3277 dev_info = (bt_device_info_s *)data;
3279 if (strlen(dev_info->remote_name) == 0)
3282 dev = malloc(sizeof(bt_dev_t));
3283 retv_if(dev == NULL, NULL);
3285 memset(dev, 0, sizeof(bt_dev_t));
3286 strncpy(dev->name, dev_info->remote_name,
3287 BT_DEVICE_NAME_LENGTH_MAX);
3289 dev->major_class = dev_info->bt_class.major_device_class;
3290 dev->minor_class = dev_info->bt_class.minor_device_class;
3291 dev->service_class = dev_info->bt_class.major_service_class_mask;
3293 if (dev_info->service_uuid != NULL && dev_info->service_count > 0) {
3294 dev->uuids = g_new0(char *, dev_info->service_count + 1);
3296 for (i = 0; i < dev_info->service_count; i++) {
3297 dev->uuids[i] = g_strdup(dev_info->service_uuid[i]);
3300 dev->uuid_count = dev_info->service_count;
3303 _bt_util_addr_string_to_addr_type(bd_addr, dev_info->remote_address);
3305 memcpy(dev->addr_str, dev_info->remote_address,
3306 BT_ADDRESS_STR_LEN);
3308 memcpy(dev->bd_addr, bd_addr, BT_ADDRESS_LENGTH_MAX);
3310 _bt_util_get_service_mask_from_uuid_list(dev_info->service_uuid,
3311 dev_info->service_count,
3312 &dev->service_list);
3314 BT_DBG("device name [%s]", dev->name);
3315 BT_DBG("device major class [%x]", dev->major_class);
3316 BT_DBG("device minor class [%x]", dev->minor_class);
3317 BT_DBG("device service class [%x]", dev->service_class);
3318 BT_DBG("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", dev->bd_addr[0],
3319 dev->bd_addr[1], dev->bd_addr[2], dev->bd_addr[3],
3320 dev->bd_addr[4], dev->bd_addr[5]);
3326 bt_dev_t *_bt_main_create_searched_device_item(void *data)
3331 unsigned char bd_addr[BT_ADDRESS_LENGTH_MAX];
3332 bt_dev_t *dev = NULL;
3333 bt_adapter_device_discovery_info_s *dev_info = NULL;
3335 retv_if(data == NULL, NULL);
3337 dev_info = (bt_adapter_device_discovery_info_s *)data;
3339 if (strlen(dev_info->remote_name) == 0)
3342 dev = calloc(1, sizeof(bt_dev_t));
3343 retv_if(dev == NULL, NULL);
3345 strncpy(dev->name, dev_info->remote_name,
3346 BT_DEVICE_NAME_LENGTH_MAX);
3348 dev->major_class = dev_info->bt_class.major_device_class;
3349 dev->minor_class = dev_info->bt_class.minor_device_class;
3350 dev->service_class = dev_info->bt_class.major_service_class_mask;
3351 dev->rssi = dev_info->rssi;
3353 if (dev_info->service_uuid != NULL && dev_info->service_count > 0) {
3354 dev->uuids = g_new0(char *, dev_info->service_count + 1);
3356 for (i = 0; i < dev_info->service_count; i++) {
3357 dev->uuids[i] = g_strdup(dev_info->service_uuid[i]);
3360 dev->uuid_count = dev_info->service_count;
3363 _bt_util_addr_string_to_addr_type(bd_addr, dev_info->remote_address);
3365 memcpy(dev->addr_str, dev_info->remote_address,
3366 BT_ADDRESS_STR_LEN);
3368 memcpy(dev->bd_addr, bd_addr, BT_ADDRESS_LENGTH_MAX);
3370 BT_DBG("device name [%s]", dev->name);
3371 BT_DBG("device major class [%x]", dev->major_class);
3372 BT_DBG("device minor class [%x]", dev->minor_class);
3373 BT_DBG("device service class [%x]", dev->service_class);
3374 BT_DBG("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", dev->bd_addr[0],
3375 dev->bd_addr[1], dev->bd_addr[2], dev->bd_addr[3],
3376 dev->bd_addr[4], dev->bd_addr[5]);
3382 gboolean _bt_main_is_matched_profile(unsigned int search_type,
3383 unsigned int major_class,
3384 unsigned int service_class,
3389 bt_device_major_mask_t major_mask = BT_DEVICE_MAJOR_MASK_MISC;
3391 if (search_type == 0x000000)
3394 BT_DBG("search_type: %x", search_type);
3395 BT_DBG("service_class: %x", service_class);
3397 /* Check the service_class */
3398 if (service_class & search_type) {
3399 if (search_type & OBJECT_TRANSFER_MAJOR_SERVICE_MASK &&
3400 major_class == BT_MAJOR_DEV_CLS_IMAGING) {
3401 if (__bt_main_is_image_file(service))
3408 /* Check the major class */
3409 switch (major_class) {
3410 case BT_MAJOR_DEV_CLS_COMPUTER:
3411 major_mask = BT_DEVICE_MAJOR_MASK_COMPUTER;
3413 case BT_MAJOR_DEV_CLS_PHONE:
3414 major_mask = BT_DEVICE_MAJOR_MASK_PHONE;
3416 case BT_MAJOR_DEV_CLS_LAN_ACCESS_POINT:
3417 major_mask = BT_DEVICE_MAJOR_MASK_LAN_ACCESS_POINT;
3419 case BT_MAJOR_DEV_CLS_AUDIO:
3420 major_mask = BT_DEVICE_MAJOR_MASK_AUDIO;
3422 case BT_MAJOR_DEV_CLS_PERIPHERAL:
3423 major_mask = BT_DEVICE_MAJOR_MASK_PERIPHERAL;
3425 case BT_MAJOR_DEV_CLS_IMAGING:
3426 major_mask = BT_DEVICE_MAJOR_MASK_IMAGING;
3428 case BT_MAJOR_DEV_CLS_WEARABLE:
3429 major_mask = BT_DEVICE_MAJOR_MASK_WEARABLE;
3431 case BT_MAJOR_DEV_CLS_TOY:
3432 major_mask = BT_DEVICE_MAJOR_MASK_TOY;
3434 case BT_MAJOR_DEV_CLS_HEALTH:
3435 major_mask = BT_DEVICE_MAJOR_MASK_HEALTH;
3438 major_mask = BT_DEVICE_MAJOR_MASK_MISC;
3442 BT_DBG("major_mask: %x", major_mask);
3444 if (search_type & major_mask)
3451 bt_dev_t *_bt_main_get_dev_info(Eina_List *list,
3452 Elm_Object_Item *genlist_item)
3456 bt_dev_t *item = NULL;
3457 Eina_List *l = NULL;
3459 retvm_if(list == NULL, NULL, "Invalid argument: list is NULL\n");
3460 retvm_if(genlist_item == NULL, NULL, "Invalid argument: obj is NULL\n");
3462 EINA_LIST_FOREACH(list, l, item) {
3464 if (item->genlist_item == genlist_item)
3473 bt_dev_t *_bt_main_get_dev_info_by_address(Eina_List *list,
3478 bt_dev_t *item = NULL;
3479 Eina_List *l = NULL;
3481 retvm_if(list == NULL, NULL, "Invalid argument: list is NULL\n");
3482 retvm_if(address == NULL, NULL, "Invalid argument: addr is NULL\n");
3484 EINA_LIST_FOREACH(list, l, item) {
3486 if (memcmp(item->addr_str, address, BT_ADDRESS_STR_LEN) == 0)
3495 int _bt_main_check_and_update_device(Eina_List *list, char *addr,
3500 bt_dev_t *item = NULL;
3501 Eina_List *l = NULL;
3503 retv_if(list == NULL, -1);
3504 retv_if(addr == NULL, -1);
3505 retv_if(name == NULL, -1);
3507 EINA_LIST_FOREACH(list, l, item) {
3509 if (memcmp(item->addr_str, addr, BT_ADDRESS_STR_LEN) == 0) {
3510 memset(item->name, 0x00,
3511 BT_DEVICE_NAME_LENGTH_MAX);
3512 memcpy(item->name, name,
3513 BT_DEVICE_NAME_LENGTH_MAX);
3524 void _bt_main_launch_syspopup(void *data, char *event_type, char *title,
3530 bt_ug_data *ugd = NULL;
3533 ret_if(event_type == NULL);
3534 ret_if(type == NULL);
3536 ugd = (bt_ug_data *)data;
3538 _bt_ipc_register_popup_event_signal(ugd->EDBusHandle, data);
3540 b = bundle_create();
3543 bundle_add(b, "event-type", event_type);
3544 bundle_add(b, "title", title);
3545 bundle_add(b, "type", type);
3547 ret = syspopup_launch("bt-syspopup", b);
3549 BT_DBG("Popup launch failed...retry %d \n", ret);
3550 ugd->popup_bundle = b;
3551 ugd->popup_timer = g_timeout_add(BT_UG_SYSPOPUP_TIMEOUT_FOR_MULTIPLE_POPUPS,
3552 (GSourceFunc) __bt_main_system_popup_timer_cb, ugd);
3559 void _bt_main_create_information_popup(bt_ug_data *ugd, char *msg) {
3561 ret_if(ugd == NULL);
3564 evas_object_del(ugd->popup);
3568 ugd->popup = _bt_create_popup(ugd->win_main,
3571 _bt_main_popup_del_cb,
3576 void _bt_main_add_searched_title(bt_ug_data *ugd)
3578 Elm_Object_Item *git;
3580 git = elm_genlist_item_append(ugd->main_genlist,
3583 ELM_GENLIST_ITEM_NONE, NULL, NULL);
3584 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
3585 ugd->searched_padding = git;
3587 git = elm_genlist_item_append(ugd->main_genlist,
3588 ugd->searched_title_itc,
3590 ELM_GENLIST_ITEM_NONE, NULL, NULL);
3592 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
3593 ugd->searched_title = git;
3596 void _bt_update_paired_item_style(bt_ug_data *ugd)
3599 bt_dev_t *item_dev = NULL;
3600 Elm_Object_Item *item = NULL;
3601 Elm_Object_Item *next = NULL;
3603 ret_if(ugd == NULL);
3605 item = elm_genlist_item_next_get(ugd->paired_title);
3607 while (item != NULL && item != ugd->searched_padding) {
3608 item_dev = _bt_main_get_dev_info(ugd->paired_device, item);
3609 ret_if(item_dev == NULL);
3611 next = elm_genlist_item_next_get(item);
3612 if (next == NULL || next == ugd->searched_padding) {
3614 item_dev->item_type = BT_ITEM_NO_TYPE;
3616 item_dev->item_type = BT_ITEM_BOTTOM;
3622 item_dev->item_type = BT_ITEM_TOP;
3624 item_dev->item_type = BT_ITEM_CENTER;
3631 elm_genlist_realized_items_update(ugd->main_genlist);
3634 void _bt_update_searched_item_style(bt_ug_data *ugd)
3637 bt_dev_t *item_dev = NULL;
3638 Elm_Object_Item *item = NULL;
3639 Elm_Object_Item *next = NULL;
3641 ret_if(ugd == NULL);
3643 item = elm_genlist_item_next_get(ugd->searched_title);
3645 while (item != NULL) {
3646 item_dev = _bt_main_get_dev_info(ugd->searched_device, item);
3647 ret_if(item_dev == NULL);
3649 next = elm_genlist_item_next_get(item);
3652 item_dev->item_type = BT_ITEM_NO_TYPE;
3654 item_dev->item_type = BT_ITEM_BOTTOM;
3660 item_dev->item_type = BT_ITEM_TOP;
3662 item_dev->item_type = BT_ITEM_CENTER;
3669 elm_genlist_realized_items_update(ugd->main_genlist);