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 <bluetooth.h>
19 #include <Elementary.h>
21 #include "bt-main-ug.h"
22 #include "bt-main-view.h"
23 #include "bt-dbus-method.h"
25 #include "bt-widget.h"
26 #include "bt-type-define.h"
27 #include "bt-string-define.h"
28 #include "bt-profile-view.h"
29 #include "bt-ipc-handler.h"
31 #include "bt-net-connection.h"
33 /**********************************************************************
34 * Static Functions declaration
35 ***********************************************************************/
36 static void __bt_profile_focused_cb(void *data, Evas_Object *obj,
40 /**********************************************************************
42 ***********************************************************************/
44 static int __bt_profile_delete_button(void *data)
49 bt_ug_data *ugd = NULL;
50 bt_profile_view_data *vd = NULL;
52 retv_if(data == NULL, BT_UG_FAIL);
54 dev = (bt_dev_t *)data;
55 retv_if(dev->ugd == NULL, BT_UG_FAIL);
58 retv_if(ugd->profile_vd == NULL, BT_UG_FAIL);
62 /* When we try to delete the buttun, 'focused' event occurs.
63 To remove this event, delete the callback.
65 evas_object_smart_callback_del(dev->entry, "focused",
66 __bt_profile_focused_cb);
68 evas_object_del(vd->save_btn);
69 evas_object_del(vd->cancel_btn);
72 vd->cancel_btn = NULL;
74 /* To shutdown the IME, set the focus to FALSE */
75 elm_object_focus_set(dev->entry, EINA_FALSE);
77 evas_object_smart_callback_add(dev->entry, "focused",
78 __bt_profile_focused_cb, dev);
81 return BT_UG_ERROR_NONE;
84 static void __bt_profile_save_clicked_cb(void *data, Evas_Object *obj,
90 const char *entry_string;
96 dev = (bt_dev_t *)data;
97 ret_if(dev->layout == NULL);
98 ret_if(dev->entry == NULL);
100 elm_object_signal_emit((Evas_Object *)dev->layout,
101 "elm,state,eraser,hide", "elm");
103 entry_string = elm_entry_entry_get(dev->entry);
104 ret_if(entry_string == NULL);
105 str = elm_entry_markup_to_utf8(entry_string);
107 if (str == NULL || strlen(str) == 0) {
108 elm_object_focus_set(dev->entry, EINA_TRUE);
112 ret_if(dev->ugd == NULL);
116 _bt_create_popup(ugd->win_main, BT_STR_ERROR,
118 _bt_main_popup_del_cb, ugd, 2);
119 ugd->back_cb = _bt_util_launch_no_event;
124 g_strlcpy(dev->name, str, BT_DEVICE_NAME_LENGTH_MAX);
125 bt_device_set_alias(dev->addr_str, str);
126 elm_genlist_item_update((Elm_Object_Item *)dev->genlist_item);
130 /* If we try to delete the button in this function,
131 the crash will occur. */
132 g_idle_add((GSourceFunc) __bt_profile_delete_button, dev);
137 static void __bt_profile_eraser_clicked_cb(void *data, Evas_Object *obj,
138 const char *emission, const char *source)
142 ret_if(NULL == data);
144 elm_entry_entry_set((Evas_Object *)data, "");
149 static void __bt_profile_changed_cb(void *data, Evas_Object *obj,
154 bt_dev_t *dev = NULL;
155 Evas_Object *layout = NULL;
158 ret_if(data == NULL);
160 dev = (bt_dev_t *)data;
161 ret_if(dev->layout == NULL);
163 layout = (Evas_Object *)dev->layout;
165 if (elm_object_focus_get(layout)) {
166 if (elm_entry_is_empty(obj)) {
167 elm_object_signal_emit(layout,
168 "elm,state,eraser,hide", "elm");
170 elm_object_signal_emit(layout,
171 "elm,state,eraser,show", "elm");
178 static void __bt_profile_focused_cb(void *data, Evas_Object *obj,
183 bt_dev_t *dev = NULL;
184 bt_ug_data *ugd = NULL;
185 bt_profile_view_data *vd = NULL;
186 Evas_Object *layout = NULL;
187 Evas_Object *btn = NULL;
190 ret_if(data == NULL);
192 dev = (bt_dev_t *)data;
193 ret_if(dev->layout == NULL);
195 layout = (Evas_Object *)dev->layout;
197 if (!elm_entry_is_empty(obj)) {
198 elm_object_signal_emit(layout,
199 "elm,state,eraser,show", "elm");
202 ret_if(dev->ugd == NULL);
205 ret_if(ugd->profile_vd == NULL);
206 vd = ugd->profile_vd;
208 if (vd->cancel_btn == NULL) {
209 btn = _bt_create_button(ugd->navi_bar,
210 "naviframe/back_btn/default",
212 __bt_profile_save_clicked_cb, dev);
214 vd->cancel_btn = btn;
217 elm_object_item_part_content_set(vd->navi_it,
218 "title_right_btn", vd->cancel_btn);
223 static void __bt_profile_unfocused_cb(void *data, Evas_Object *obj,
228 bt_dev_t *dev = NULL;
230 ret_if(data == NULL);
232 dev = (bt_dev_t *)data;
233 ret_if(dev->layout == NULL);
235 elm_object_signal_emit((Evas_Object *)dev->layout,
236 "elm,state,eraser,hide", "elm");
241 static void __bt_profile_maxlength_reached(void *data, Evas_Object *obj,
246 /* In now, there is no UX guide */
251 static Evas_Object *__bt_profile_name_icon_get(void *data, Evas_Object *obj,
256 Elm_Entry_Filter_Limit_Size limit_filter;
257 Evas_Object *layout = NULL;
258 Evas_Object *entry = NULL;
259 bt_dev_t *dev = NULL;
261 retv_if(NULL == data, NULL);
263 dev = (bt_dev_t *)data;
265 if (!strcmp(part, "elm.icon")) {
266 layout = elm_layout_add(obj);
267 dev->layout = layout;
268 elm_layout_theme_set(layout, "layout", "editfield", "title");
269 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
272 entry = elm_entry_add(obj);
275 limit_filter.max_byte_count = 0;
276 limit_filter.max_char_count = BT_DEVICE_NAME_LENGTH_MAX;
278 elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size,
281 elm_entry_prediction_allow_set(entry, EINA_FALSE);
283 elm_entry_entry_set(entry, dev->name);
285 evas_object_smart_callback_add(entry, "changed",
286 __bt_profile_changed_cb, dev);
287 evas_object_smart_callback_add(entry, "focused",
288 __bt_profile_focused_cb, dev);
289 evas_object_smart_callback_add(entry, "unfocused",
290 __bt_profile_unfocused_cb, dev);
291 evas_object_smart_callback_add(entry, "maxlength,reached",
292 __bt_profile_maxlength_reached,
295 evas_object_show(entry);
297 elm_object_part_content_set(layout,
298 "elm.swallow.content", entry);
300 elm_object_part_text_set(layout, "elm.text",
301 (const char *)BT_STR_DEVICE_NAME);
303 elm_object_signal_callback_add(layout, "elm,eraser,clicked",
304 "elm", __bt_profile_eraser_clicked_cb,
313 static void __bt_profile_name_item_sel(void *data, Evas_Object *obj,
319 elm_genlist_item_selected_set((Elm_Object_Item *)event_info,
325 static void __bt_profile_unpair_item_sel(void *data, Evas_Object *obj,
329 bt_dev_t *dev = NULL;
332 elm_genlist_item_selected_set((Elm_Object_Item *)event_info,
334 ret_if(NULL == data);
336 dev = (bt_dev_t *)data;
338 if (bt_device_destroy_bond(dev->addr_str) != BT_ERROR_NONE) {
339 BT_DBG("Fail to unpair");
345 static char *__bt_profile_unpair_label_get(void *data, Evas_Object *obj,
350 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
352 if (!strcmp(part, "elm.text")) {
353 g_strlcpy(buf, BT_STR_UNPAIR, BT_GLOBALIZATION_STR_LENGTH);
355 BT_DBG("empty text for label. \n");
363 static char *__bt_proflie_title_label_get(void *data, Evas_Object *obj,
368 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
370 if (strcmp(part, "elm.text") == 0) {
372 g_strlcpy(buf, BT_STR_CONNECTION_OPTIONS,
373 BT_GLOBALIZATION_STR_LENGTH);
375 BT_DBG("This part name is not exist in style");
383 static char *__bt_proflie_call_option_label_get(void *data, Evas_Object *obj,
388 bt_dev_t *dev = NULL;
389 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
391 retv_if(NULL == data, NULL);
393 dev = (bt_dev_t *)data;
395 if (strcmp(part, "elm.text") == 0) {
396 g_strlcpy(buf, BT_STR_CALL_AUDIO,
397 BT_GLOBALIZATION_STR_LENGTH);
399 BT_DBG("This part name is not exist in style");
407 static char *__bt_proflie_media_option_label_get(void *data, Evas_Object *obj,
412 bt_dev_t *dev = NULL;
413 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
415 retv_if(NULL == data, NULL);
417 dev = (bt_dev_t *)data;
419 if (strcmp(part, "elm.text") == 0) {
420 g_strlcpy(buf, BT_STR_MEDIA_AUDIO,
421 BT_GLOBALIZATION_STR_LENGTH);
423 BT_DBG("This part name is not exist in style");
431 static char *__bt_proflie_hid_option_label_get(void *data, Evas_Object *obj,
436 bt_dev_t *dev = NULL;
437 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
439 retv_if(NULL == data, NULL);
441 dev = (bt_dev_t *)data;
443 if (strcmp(part, "elm.text") == 0) {
444 g_strlcpy(buf, BT_STR_INPUT_DEVICE,
445 BT_GLOBALIZATION_STR_LENGTH);
447 BT_DBG("This part name is not exist in style");
455 static char *__bt_proflie_nap_option_label_get(void *data, Evas_Object *obj,
460 bt_dev_t *dev = NULL;
461 char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0, };
463 retv_if(NULL == data, NULL);
465 dev = (bt_dev_t *)data;
467 if (strcmp(part, "elm.text") == 0) {
468 g_strlcpy(buf, BT_STR_INTERNET_ACCESS,
469 BT_GLOBALIZATION_STR_LENGTH);
471 BT_DBG("This part name is not exist in style");
479 static Evas_Object *__bt_profile_call_option_icon_get(void *data, Evas_Object *obj,
484 Evas_Object *check = NULL;
485 bt_dev_t *dev = NULL;
487 retv_if(NULL == data, NULL);
489 dev = (bt_dev_t *)data;
491 if (!strcmp(part, "elm.icon")) {
492 check = elm_check_add(obj);
494 dev->call_checked = dev->connected_mask & \
495 BT_HEADSET_CONNECTED;
497 elm_check_state_pointer_set(check,
498 (Eina_Bool *)&dev->call_checked);
500 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND,
503 evas_object_size_hint_align_set(check, EVAS_HINT_FILL,
512 static Evas_Object *__bt_profile_media_option_icon_get(void *data, Evas_Object *obj,
517 Evas_Object *check = NULL;
518 bt_dev_t *dev = NULL;
520 retv_if(NULL == data, NULL);
522 dev = (bt_dev_t *)data;
524 if (!strcmp(part, "elm.icon")) {
525 check = elm_check_add(obj);
527 dev->media_checked = dev->connected_mask & \
528 BT_STEREO_HEADSET_CONNECTED;
530 elm_check_state_pointer_set(check,
531 (Eina_Bool *)&dev->media_checked);
533 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND,
536 evas_object_size_hint_align_set(check, EVAS_HINT_FILL,
545 static Evas_Object *__bt_profile_hid_option_icon_get(void *data, Evas_Object *obj,
550 Evas_Object *check = NULL;
551 bt_dev_t *dev = NULL;
553 retv_if(NULL == data, NULL);
555 dev = (bt_dev_t *)data;
557 if (!strcmp(part, "elm.icon")) {
558 check = elm_check_add(obj);
560 dev->hid_checked = dev->connected_mask & \
563 elm_check_state_pointer_set(check,
564 (Eina_Bool *)&dev->hid_checked);
566 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND,
569 evas_object_size_hint_align_set(check, EVAS_HINT_FILL,
578 static Evas_Object *__bt_profile_nap_option_icon_get(void *data, Evas_Object *obj,
583 Evas_Object *check = NULL;
584 bt_dev_t *dev = NULL;
586 retv_if(NULL == data, NULL);
588 dev = (bt_dev_t *)data;
590 if (!strcmp(part, "elm.icon")) {
591 check = elm_check_add(obj);
593 dev->network_checked = dev->connected_mask & \
594 BT_NETWORK_CONNECTED;
596 elm_check_state_pointer_set(check,
597 (Eina_Bool *)&dev->network_checked);
599 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND,
602 evas_object_size_hint_align_set(check, EVAS_HINT_FILL,
611 int __bt_profile_connect_option(bt_ug_data *ugd, bt_dev_t *dev,
617 gboolean connected = FALSE;
619 retv_if(ugd == NULL, BT_UG_FAIL);
620 retv_if(dev == NULL, BT_UG_FAIL);
622 if (dev->status != BT_IDLE) {
623 _bt_main_draw_selection_info(ugd, BT_STR_CONNECTION_FAILED);
627 if (type == BT_HEADSET_DEVICE)
628 connected = _bt_main_is_headset_connected(ugd);
629 else if (type == BT_STEREO_HEADSET_DEVICE)
630 connected = _bt_main_is_stereo_headset_connected(ugd);
632 if (connected == TRUE) {
633 _bt_main_draw_selection_info(ugd, BT_STR_CONNECTION_EXISTS);
637 if (type == BT_HEADSET_DEVICE || type == BT_STEREO_HEADSET_DEVICE) {
638 if (type == BT_STEREO_HEADSET_DEVICE)
639 audio_profile = BT_AUDIO_PROFILE_TYPE_A2DP;
641 audio_profile = BT_AUDIO_PROFILE_TYPE_HSP_HFP;
643 if (bt_audio_connect(dev->addr_str,
644 audio_profile) != BT_ERROR_NONE) {
645 BT_DBG("Fail to connect Headset device");
648 } else if (type == BT_HID_DEVICE) {
649 BT_DBG("HID connect request\n");
651 if (bt_hid_host_connect(dev->addr_str) != BT_ERROR_NONE) {
654 } else if (type == BT_NETWORK_DEVICE){
655 BT_DBG("Network connect request\n");
657 if (_bt_connect_net_profile(ugd->connection,
659 dev) != BT_UG_ERROR_NONE) {
660 BT_ERR("Fail to connect the net profile");
664 BT_DBG("Unknown type");
668 ugd->connect_req = TRUE;
669 dev->status = BT_CONNECTING;
670 elm_genlist_item_update((Elm_Object_Item *)dev->genlist_item);
672 if (ugd->profile_vd->genlist) {
673 _bt_util_set_list_disabled(ugd->profile_vd->genlist,
678 return BT_UG_ERROR_NONE;
681 int __bt_profile_disconnect_option(bt_ug_data *ugd, bt_dev_t *dev,
687 bt_ug_ipc_param_t param;
688 gboolean connected = FALSE;
690 retv_if(ugd == NULL, BT_UG_FAIL);
691 retv_if(dev == NULL, BT_UG_FAIL);
693 if (dev->status != BT_IDLE) {
694 _bt_main_draw_selection_info(ugd, BT_STR_CONNECTION_FAILED);
698 memset(¶m, 0x00, sizeof(bt_ug_ipc_param_t));
699 memcpy(param.param2, dev->bd_addr, BT_ADDRESS_LENGTH_MAX);
701 if (type == BT_HEADSET_DEVICE) {
702 connected = _bt_is_profile_connected(BT_HEADSET_CONNECTED,
703 ugd->conn, dev->bd_addr);
704 } else if (type == BT_STEREO_HEADSET_DEVICE) {
705 connected = _bt_is_profile_connected(BT_STEREO_HEADSET_CONNECTED,
706 ugd->conn, dev->bd_addr);
707 } else if (type == BT_HID_DEVICE) {
708 connected = _bt_is_profile_connected(BT_HID_CONNECTED,
709 ugd->conn, dev->bd_addr);
710 } else if (type == BT_NETWORK_DEVICE) {
711 connected = _bt_get_connected_net_profile(ugd->connection,
712 dev->bd_addr) != NULL ? TRUE : FALSE;
715 if (connected == FALSE) {
716 BT_DBG("Not connected");
720 if (type == BT_HEADSET_DEVICE || type == BT_STEREO_HEADSET_DEVICE) {
721 if (type == BT_STEREO_HEADSET_DEVICE)
722 audio_profile = BT_AUDIO_PROFILE_TYPE_A2DP;
724 audio_profile = BT_AUDIO_PROFILE_TYPE_HSP_HFP;
726 if (bt_audio_disconnect(dev->addr_str,
727 audio_profile) != BT_ERROR_NONE) {
728 BT_DBG("Fail to connect Headset device");
731 } else if (type == BT_HID_DEVICE) {
732 BT_DBG("Disconnecting HID service!!\n");
734 if (bt_hid_host_disconnect(dev->addr_str) != BT_ERROR_NONE) {
735 BT_DBG("Fail to disconnect HID device");
738 } else if (type == BT_NETWORK_DEVICE) {
739 BT_DBG("Disconnecting network service!!\n");
741 if (_bt_disconnect_net_profile(ugd->connection,
743 dev) != BT_UG_ERROR_NONE) {
744 BT_ERR("Fail to disconnect the net profile");
748 BT_DBG("Unknown type");
752 ugd->connect_req = TRUE;
753 dev->status = BT_DISCONNECTING;
754 elm_genlist_item_update((Elm_Object_Item *)dev->genlist_item);
756 if (ugd->profile_vd->genlist) {
757 _bt_util_set_list_disabled(ugd->profile_vd->genlist,
762 return BT_UG_ERROR_NONE;
765 static void __bt_profile_call_disconnect_cb(void *data, Evas_Object *obj,
770 bt_dev_t *dev = NULL;
771 bt_ug_data *ugd = NULL;
773 retm_if(data == NULL, "Invalid argument: data is NULL\n");
775 dev = (bt_dev_t *)data;
776 retm_if(dev->ugd == NULL, "ugd is NULL\n");
781 evas_object_del(ugd->popup);
785 __bt_profile_disconnect_option((bt_ug_data *)dev->ugd,
786 dev, BT_HEADSET_DEVICE);
791 static void __bt_profile_call_option_item_sel(void *data, Evas_Object *obj,
796 int ret = BT_UG_ERROR_NONE;
797 bt_dev_t *dev = NULL;
798 bt_ug_data *ugd = NULL;
799 Elm_Object_Item *item = NULL;
800 Evas_Object *popup = NULL;
801 Evas_Object *popup_btn = NULL;
802 char msg[BT_DISCONNECT_TEXT_LENGTH] = { 0 };
804 ret_if(event_info == NULL);
806 item = (Elm_Object_Item *)event_info;
807 elm_genlist_item_selected_set(item, EINA_FALSE);
809 ret_if(data == NULL);
811 dev = (bt_dev_t *)data;
812 ret_if(dev->ugd == NULL);
816 if (dev->call_checked) {
818 snprintf(msg, sizeof(msg), "%s %s<br>%s", BT_STR_END_CONNECTION,
820 BT_STR_DISCONNECT_Q);
823 evas_object_del(ugd->popup);
827 popup = _bt_create_popup(ugd->win_main, BT_STR_INFORMATION,
829 _bt_main_popup_del_cb, ugd, 0);
836 popup_btn = elm_button_add(popup);
837 elm_object_text_set(popup_btn, BT_STR_OK);
838 elm_object_part_content_set(popup, "button1", popup_btn);
839 evas_object_smart_callback_add(popup_btn, "clicked",
840 __bt_profile_call_disconnect_cb, dev);
842 popup_btn = elm_button_add(popup);
843 elm_object_text_set(popup_btn, BT_STR_CANCEL);
844 elm_object_part_content_set(popup, "button2", popup_btn);
845 evas_object_smart_callback_add(popup_btn, "clicked",
846 _bt_main_popup_del_cb, ugd);
848 ret = __bt_profile_connect_option((bt_ug_data *)dev->ugd,
849 dev, BT_HEADSET_DEVICE);
852 elm_genlist_item_update(item);
857 static void __bt_profile_media_disconnect_cb(void *data, Evas_Object *obj,
862 bt_dev_t *dev = NULL;
863 bt_ug_data *ugd = NULL;
865 retm_if(data == NULL, "Invalid argument: data is NULL\n");
867 dev = (bt_dev_t *)data;
868 retm_if(dev->ugd == NULL, "ugd is NULL\n");
873 evas_object_del(ugd->popup);
877 __bt_profile_disconnect_option((bt_ug_data *)dev->ugd,
878 dev, BT_STEREO_HEADSET_DEVICE);
883 static void __bt_profile_media_option_item_sel(void *data, Evas_Object *obj,
888 int ret = BT_UG_ERROR_NONE;
889 bt_dev_t *dev = NULL;
890 bt_ug_data *ugd = NULL;
891 Elm_Object_Item *item = NULL;
892 Evas_Object *popup = NULL;
893 Evas_Object *popup_btn = NULL;
894 char msg[BT_DISCONNECT_TEXT_LENGTH] = { 0 };
896 ret_if(event_info == NULL);
898 item = (Elm_Object_Item *)event_info;
899 elm_genlist_item_selected_set(item, EINA_FALSE);
901 ret_if(data == NULL);
903 dev = (bt_dev_t *)data;
904 ret_if(dev->ugd == NULL);
908 if (dev->media_checked) {
910 snprintf(msg, sizeof(msg), "%s %s<br>%s", BT_STR_END_CONNECTION,
912 BT_STR_DISCONNECT_Q);
915 evas_object_del(ugd->popup);
919 popup = _bt_create_popup(ugd->win_main, BT_STR_INFORMATION,
921 _bt_main_popup_del_cb, ugd, 0);
928 popup_btn = elm_button_add(popup);
929 elm_object_text_set(popup_btn, BT_STR_OK);
930 elm_object_part_content_set(popup, "button1", popup_btn);
931 evas_object_smart_callback_add(popup_btn, "clicked",
932 __bt_profile_media_disconnect_cb, dev);
934 popup_btn = elm_button_add(popup);
935 elm_object_text_set(popup_btn, BT_STR_CANCEL);
936 elm_object_part_content_set(popup, "button2", popup_btn);
937 evas_object_smart_callback_add(popup_btn, "clicked",
938 _bt_main_popup_del_cb, ugd);
940 ret = __bt_profile_connect_option((bt_ug_data *)dev->ugd,
941 dev, BT_STEREO_HEADSET_DEVICE);
944 elm_genlist_item_update(item);
949 static void __bt_profile_hid_disconnect_cb(void *data, Evas_Object *obj,
954 bt_dev_t *dev = NULL;
955 bt_ug_data *ugd = NULL;
957 retm_if(data == NULL, "Invalid argument: data is NULL\n");
959 dev = (bt_dev_t *)data;
960 retm_if(dev->ugd == NULL, "ugd is NULL\n");
965 evas_object_del(ugd->popup);
969 __bt_profile_disconnect_option((bt_ug_data *)dev->ugd,
975 static void __bt_profile_network_disconnect_cb(void *data, Evas_Object *obj,
980 bt_dev_t *dev = NULL;
981 bt_ug_data *ugd = NULL;
983 retm_if(data == NULL, "Invalid argument: data is NULL\n");
985 dev = (bt_dev_t *)data;
986 retm_if(dev->ugd == NULL, "ugd is NULL\n");
991 evas_object_del(ugd->popup);
995 __bt_profile_disconnect_option((bt_ug_data *)dev->ugd,
996 dev, BT_NETWORK_DEVICE);
1001 static void __bt_profile_hid_option_item_sel(void *data, Evas_Object *obj,
1006 int ret = BT_UG_ERROR_NONE;
1007 bt_dev_t *dev = NULL;
1008 bt_ug_data *ugd = NULL;
1009 Elm_Object_Item *item = NULL;
1010 Evas_Object *popup = NULL;
1011 Evas_Object *popup_btn = NULL;
1012 char msg[BT_DISCONNECT_TEXT_LENGTH] = { 0 };
1014 ret_if(event_info == NULL);
1016 item = (Elm_Object_Item *)event_info;
1017 elm_genlist_item_selected_set(item, EINA_FALSE);
1019 ret_if(data == NULL);
1021 dev = (bt_dev_t *)data;
1022 ret_if(dev->ugd == NULL);
1026 if (dev->hid_checked) {
1027 /* connected case */
1028 snprintf(msg, sizeof(msg), "%s %s<br>%s", BT_STR_END_CONNECTION,
1030 BT_STR_DISCONNECT_Q);
1032 evas_object_del(ugd->popup);
1036 popup = _bt_create_popup(ugd->win_main, BT_STR_INFORMATION,
1038 _bt_main_popup_del_cb, ugd, 0);
1045 popup_btn = elm_button_add(popup);
1046 elm_object_text_set(popup_btn, BT_STR_OK);
1047 elm_object_part_content_set(popup, "button1", popup_btn);
1048 evas_object_smart_callback_add(popup_btn, "clicked",
1049 __bt_profile_hid_disconnect_cb, dev);
1051 popup_btn = elm_button_add(popup);
1052 elm_object_text_set(popup_btn, BT_STR_CANCEL);
1053 elm_object_part_content_set(popup, "button2", popup_btn);
1054 evas_object_smart_callback_add(popup_btn, "clicked",
1055 _bt_main_popup_del_cb, ugd);
1057 ret = __bt_profile_connect_option((bt_ug_data *)dev->ugd,
1058 dev, BT_HID_DEVICE);
1061 elm_genlist_item_update(item);
1066 static void __bt_profile_nap_option_item_sel(void *data, Evas_Object *obj,
1071 int ret = BT_UG_ERROR_NONE;
1072 bt_dev_t *dev = NULL;
1073 bt_ug_data *ugd = NULL;
1074 Elm_Object_Item *item = NULL;
1075 Evas_Object *popup = NULL;
1076 Evas_Object *popup_btn = NULL;
1077 char msg[BT_DISCONNECT_TEXT_LENGTH] = { 0 };
1079 ret_if(event_info == NULL);
1081 item = (Elm_Object_Item *)event_info;
1082 elm_genlist_item_selected_set(item, EINA_FALSE);
1084 ret_if(data == NULL);
1086 dev = (bt_dev_t *)data;
1087 ret_if(dev->ugd == NULL);
1091 if (dev->network_checked) {
1092 /* connected case */
1093 snprintf(msg, sizeof(msg), "%s %s<br>%s", BT_STR_END_CONNECTION,
1095 BT_STR_DISCONNECT_Q);
1097 evas_object_del(ugd->popup);
1101 popup = _bt_create_popup(ugd->win_main, BT_STR_INFORMATION,
1103 _bt_main_popup_del_cb, ugd, 0);
1110 popup_btn = elm_button_add(popup);
1111 elm_object_text_set(popup_btn, BT_STR_OK);
1112 elm_object_part_content_set(popup, "button1", popup_btn);
1113 evas_object_smart_callback_add(popup_btn, "clicked",
1114 __bt_profile_network_disconnect_cb, dev);
1116 popup_btn = elm_button_add(popup);
1117 elm_object_text_set(popup_btn, BT_STR_CANCEL);
1118 elm_object_part_content_set(popup, "button2", popup_btn);
1119 evas_object_smart_callback_add(popup_btn, "clicked",
1120 _bt_main_popup_del_cb, ugd);
1122 ret = __bt_profile_connect_option((bt_ug_data *)dev->ugd,
1123 dev, BT_NETWORK_DEVICE);
1126 elm_genlist_item_update(item);
1131 static int __bt_profile_get_item_type(bt_profile_view_data *vd, Elm_Object_Item *item)
1134 int type = BT_ITEM_NO_TYPE;
1135 Elm_Object_Item *current = NULL;
1136 Elm_Object_Item *next = NULL;
1138 retv_if(vd == NULL, BT_ITEM_NO_TYPE);
1139 retv_if(item == NULL, BT_ITEM_NO_TYPE);
1141 if (item == vd->name_item) {
1143 } else if (item == vd->unpair_item) {
1144 return BT_ITEM_BOTTOM;
1147 current = elm_genlist_item_next_get(vd->title_item);
1149 while (current != NULL) {
1150 next = elm_genlist_item_next_get(current);
1152 if (current == item) {
1154 type = (i == 0) ? BT_ITEM_NO_TYPE : BT_ITEM_BOTTOM;
1156 type = (i == 0) ? BT_ITEM_TOP : BT_ITEM_CENTER;
1165 return BT_ITEM_NO_TYPE;
1168 static void __bt_profile_gl_realized(void *data, Evas_Object *obj, void *event_info)
1174 bt_profile_view_data *vd;
1175 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
1177 ret_if(data == NULL);
1178 ret_if(item == NULL);
1180 ugd = (bt_ug_data *)data;
1182 vd = ugd->profile_vd;
1185 item_type = __bt_profile_get_item_type(vd, item);
1187 BT_DBG("type: %d", item_type);
1189 switch (item_type) {
1191 elm_object_item_signal_emit(item, "elm,state,top", "");
1193 case BT_ITEM_CENTER:
1194 elm_object_item_signal_emit(item, "elm,state,center", "");
1196 case BT_ITEM_BOTTOM:
1197 elm_object_item_signal_emit(item, "elm,state,bottom", "");
1200 elm_object_item_signal_emit(item, "elm,state,default", "");
1208 /* Create genlist and append items */
1209 static Evas_Object *__bt_profile_draw_genlist(bt_ug_data *ugd, bt_dev_t *dev_info)
1213 bt_profile_view_data *vd = NULL;
1214 Evas_Object *genlist = NULL;
1215 Elm_Object_Item *git = NULL;
1217 retv_if(ugd == NULL, NULL);
1218 retv_if(ugd->profile_vd == NULL, NULL);
1220 vd = ugd->profile_vd;
1222 /* Set item class for dialogue normal items */
1223 vd->name_itc = elm_genlist_item_class_new();
1224 retv_if (vd->name_itc == NULL, NULL);
1226 vd->name_itc->item_style = "dialogue/1icon";
1227 vd->name_itc->func.text_get = NULL;
1228 vd->name_itc->func.content_get = __bt_profile_name_icon_get;
1229 vd->name_itc->func.state_get = NULL;
1230 vd->name_itc->func.del = NULL;
1232 vd->unpair_itc = elm_genlist_item_class_new();
1233 retv_if (vd->unpair_itc == NULL, NULL);
1235 vd->unpair_itc->item_style = "dialogue/1text";
1236 vd->unpair_itc->func.text_get = __bt_profile_unpair_label_get;
1237 vd->unpair_itc->func.content_get = NULL;
1238 vd->unpair_itc->func.state_get = NULL;
1239 vd->unpair_itc->func.del = NULL;
1241 /* Create genlist */
1242 genlist = elm_genlist_add(ugd->navi_bar);
1244 evas_object_smart_callback_add(genlist, "realized",
1245 __bt_profile_gl_realized, ugd);
1248 git = elm_genlist_item_append(genlist, ugd->sp_itc, NULL, NULL,
1249 ELM_GENLIST_ITEM_NONE, NULL, NULL);
1251 elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1253 /* device name item */
1254 git = elm_genlist_item_append(genlist, vd->name_itc, dev_info, NULL,
1255 ELM_GENLIST_ITEM_NONE,
1256 __bt_profile_name_item_sel, ugd);
1257 vd->name_item = git;
1260 git = elm_genlist_item_append(genlist, vd->unpair_itc, NULL, NULL,
1261 ELM_GENLIST_ITEM_NONE,
1262 __bt_profile_unpair_item_sel, dev_info);
1264 vd->unpair_item = git;
1266 /* If the device has no headset profile, exit this function */
1267 if (!(dev_info->service_list & BT_SC_HFP_SERVICE_MASK) &&
1268 !(dev_info->service_list & BT_SC_HSP_SERVICE_MASK) &&
1269 !(dev_info->service_list & BT_SC_A2DP_SERVICE_MASK) &&
1270 !(dev_info->service_list & BT_SC_HID_SERVICE_MASK) &&
1271 !(dev_info->service_list & BT_SC_NAP_SERVICE_MASK)) {
1275 vd->title_itc = elm_genlist_item_class_new();
1276 retv_if (vd->title_itc == NULL, NULL);
1278 vd->title_itc->item_style = "dialogue/title";
1279 vd->title_itc->func.text_get = __bt_proflie_title_label_get;
1280 vd->title_itc->func.content_get = NULL;
1281 vd->title_itc->func.state_get = NULL;
1282 vd->title_itc->func.del = NULL;
1284 vd->call_itc = elm_genlist_item_class_new();
1285 retv_if (vd->call_itc == NULL, NULL);
1287 vd->call_itc->item_style = "dialogue/1text.1icon.2";
1288 vd->call_itc->func.text_get = __bt_proflie_call_option_label_get;
1289 vd->call_itc->func.content_get = __bt_profile_call_option_icon_get;
1290 vd->call_itc->func.state_get = NULL;
1291 vd->call_itc->func.del = NULL;
1293 vd->media_itc = elm_genlist_item_class_new();
1294 retv_if (vd->media_itc == NULL, NULL);
1296 vd->media_itc->item_style = "dialogue/1text.1icon.2";
1297 vd->media_itc->func.text_get = __bt_proflie_media_option_label_get;
1298 vd->media_itc->func.content_get = __bt_profile_media_option_icon_get;
1299 vd->media_itc->func.state_get = NULL;
1300 vd->media_itc->func.del = NULL;
1302 vd->hid_itc = elm_genlist_item_class_new();
1303 retv_if (vd->hid_itc == NULL, NULL);
1305 vd->hid_itc->item_style = "dialogue/1text.1icon.2";
1306 vd->hid_itc->func.text_get = __bt_proflie_hid_option_label_get;
1307 vd->hid_itc->func.content_get = __bt_profile_hid_option_icon_get;
1308 vd->hid_itc->func.state_get = NULL;
1309 vd->hid_itc->func.del = NULL;
1311 vd->network_itc = elm_genlist_item_class_new();
1312 retv_if (vd->network_itc == NULL, NULL);
1314 vd->network_itc->item_style = "dialogue/1text.1icon.2";
1315 vd->network_itc->func.text_get = __bt_proflie_nap_option_label_get;
1316 vd->network_itc->func.content_get = __bt_profile_nap_option_icon_get;
1317 vd->network_itc->func.state_get = NULL;
1318 vd->network_itc->func.del = NULL;
1320 /* Connection options title */
1321 git = elm_genlist_item_append(genlist, vd->title_itc, NULL, NULL,
1322 ELM_GENLIST_ITEM_NONE,
1325 elm_genlist_item_select_mode_set(git,
1326 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1328 vd->title_item = git;
1330 if (dev_info->service_list & BT_SC_HFP_SERVICE_MASK ||
1331 dev_info->service_list & BT_SC_HSP_SERVICE_MASK) {
1333 elm_genlist_item_append(genlist, vd->call_itc,
1335 ELM_GENLIST_ITEM_NONE,
1336 __bt_profile_call_option_item_sel,
1340 if (dev_info->service_list & BT_SC_A2DP_SERVICE_MASK) {
1342 elm_genlist_item_append(genlist, vd->media_itc,
1344 ELM_GENLIST_ITEM_NONE,
1345 __bt_profile_media_option_item_sel,
1349 BT_DBG("service list: %x", dev_info->service_list);
1350 BT_DBG("is hid: %d", dev_info->service_list & BT_SC_HID_SERVICE_MASK);
1352 if (dev_info->service_list & BT_SC_HID_SERVICE_MASK) {
1354 elm_genlist_item_append(genlist, vd->hid_itc,
1356 ELM_GENLIST_ITEM_NONE,
1357 __bt_profile_hid_option_item_sel,
1361 if (dev_info->service_list & BT_SC_NAP_SERVICE_MASK) {
1363 elm_genlist_item_append(genlist, vd->network_itc,
1365 ELM_GENLIST_ITEM_NONE,
1366 __bt_profile_nap_option_item_sel,
1375 static void __bt_profile_back_cb(void *data, Evas_Object *obj,
1380 bt_dev_t *dev_info = NULL;
1381 bt_ug_data *ugd = NULL;
1382 bt_profile_view_data *vd = NULL;
1384 ret_if(data == NULL);
1386 dev_info = (bt_dev_t *)data;
1387 ret_if(dev_info == NULL);
1388 ret_if(dev_info->ugd == NULL);
1390 ugd = dev_info->ugd;
1391 ret_if(ugd->profile_vd == NULL);
1393 vd = ugd->profile_vd;
1396 evas_object_data_set(vd->genlist, "view_data", NULL);
1397 elm_genlist_clear(vd->genlist);
1402 elm_genlist_item_class_free(vd->name_itc);
1403 vd->name_itc = NULL;
1406 if (vd->unpair_itc) {
1407 elm_genlist_item_class_free(vd->unpair_itc);
1408 vd->unpair_itc = NULL;
1411 if (vd->title_itc) {
1412 elm_genlist_item_class_free(vd->title_itc);
1413 vd->title_itc = NULL;
1417 elm_genlist_item_class_free(vd->call_itc);
1418 vd->call_itc = NULL;
1421 if (vd->media_itc) {
1422 elm_genlist_item_class_free(vd->media_itc);
1423 vd->media_itc = NULL;
1427 elm_genlist_item_class_free(vd->hid_itc);
1431 vd->save_btn = NULL;
1432 vd->cancel_btn = NULL;
1435 ugd->profile_vd = NULL;
1437 elm_naviframe_item_pop(ugd->navi_bar);
1443 /**********************************************************************
1445 ***********************************************************************/
1447 void _bt_profile_create_view(bt_dev_t *dev_info)
1451 bt_profile_view_data *vd = NULL;
1452 bt_ug_data *ugd = NULL;
1453 Evas_Object *layout = NULL;
1454 Evas_Object *genlist = NULL;
1455 Elm_Object_Item *navi_it;
1456 Evas_Object *back_btn = NULL;
1458 ret_if(dev_info == NULL);
1459 ret_if(dev_info->ugd == NULL);
1461 ugd = dev_info->ugd;
1462 dev_info->layout = NULL;
1464 vd = calloc(1, sizeof(bt_profile_view_data));
1467 ugd->profile_vd = vd;
1468 vd->win_main = ugd->win_main;
1469 vd->navi_bar = ugd->navi_bar;
1471 _bt_create_bg(ugd->navi_bar, "group_list");
1473 layout = _bt_create_layout(ugd->navi_bar, NULL, NULL);
1474 vd->layout = layout;
1476 genlist = __bt_profile_draw_genlist(ugd, dev_info);
1477 vd->genlist = genlist;
1479 /* Set ugd as genlist object data. */
1480 /* We can get this data from genlist object anytime. */
1481 evas_object_data_set(genlist, "view_data", vd);
1483 /* create back button */
1484 back_btn = elm_button_add(layout);
1486 navi_it = elm_naviframe_item_push(ugd->navi_bar, BT_STR_DETAILS,
1487 back_btn, NULL, genlist, NULL);
1489 /* Style set should be called after elm_naviframe_item_push(). */
1490 elm_object_style_set(back_btn, "naviframe/back_btn/default");
1491 evas_object_smart_callback_add(back_btn, "clicked",
1492 __bt_profile_back_cb, (void *)dev_info);
1494 vd->navi_it = navi_it;
1501 void _bt_profile_delete_view(void *data)
1505 __bt_profile_back_cb(data, NULL, NULL);