tizen 2.3 release
[apps/home/b2-clocksetting.git] / src / setting-bluetooth.c
1 /*
2  * Copyright (c) 2010 Samsung Electronics, Inc.
3  * All rights reserved.
4  *
5  * This software is a confidential and proprietary information
6  * of Samsung Electronics, Inc. ("Confidential Information").  You
7  * shall not disclose such Confidential Information and shall use
8  * it only in accordance with the terms of the license agreement
9  * you entered into with Samsung Electronics.
10  */
11 /*
12  * setting-bluetooth.c
13  *
14  *  Created on: Oct 9, 2013
15  *      Author: min-hoyun
16  */
17
18 #include <feedback.h>
19
20 #include "setting-bluetooth.h"
21 #include "setting_control_bt.h"
22 #include "setting_data_vconf.h"
23 #include "setting-common-sound.h"
24 #include "util.h"
25
26
27 static struct _bt_menu_item bt_menu_its[] = {
28         { "IDS_QP_BUTTON_BLUETOOTH",            DISABLE, _blutooth_cb           },
29         { "IDS_VCALL_BODY_BT_HEADSET",          DISABLE, _BT_headset_cb         },
30         { "IDS_ST_MBODY_MAKE_VISIBLE_ABB",      DISABLE, _visibility_cb         },      // "IDS_OP_BODY_VISIBILITY"
31         { NULL, DISABLE, NULL }
32 };
33
34 static char * bluetooth_enable_str[] = {
35                 "IDS_ST_BODY_OFF_M_STATUS",
36                 "IDS_ST_BODY_ON_M_STATUS",
37                 "IDS_COM_POP_PROCESSING"
38 };
39
40 static char * visible_str[] = {
41                 "IDS_ST_BODY_DISABLED_M_STATUS",
42                 "IDS_ST_BODY_YOUR_GEAR_IS_VISIBLE_FOR_PS_ABB"
43 };
44
45
46 static Ecore_Timer *bt_timer = NULL;
47 static Ecore_Timer *vb_timer = NULL;
48
49 static Elm_Object_Item* bt_it = NULL;
50 static Elm_Object_Item* vb_it = NULL;
51 static Elm_Object_Item* hf_it = NULL;
52
53 static Evas_Object * bt_genlist = NULL;
54 static Evas_Object * g_bt_check = NULL;
55 static Evas_Object * g_vb_check = NULL;
56
57 static int is_bt_operating = BT_NON_OPERATING;
58 static int timeout_seconds = VISIBILITY_TIMEOUT;
59 static bt_adapter_visibility_mode_e visibility_mode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
60 static int origin_bt_enable;
61 static double bt_time = 0.0;
62 static int is_connected_hf = FALSE;
63 static char * g_device_name = NULL;
64
65
66 static void _init_bt_value();
67 static int is_handsfree_connected();
68 static void _bt_genlist_update();
69 static int is_disable_visibility_item_view();
70 static void _update_visibility_view();
71
72
73 static void sap_state_vconf_change_cb(keynode_t *key, void * data)
74 {
75         _update_visibility_item_view(is_handsfree_connected());
76 }
77
78 static void _bt_adapter_state_enabled_cb(int result, bt_adapter_state_e adapter_state, void *user_data)
79 {
80         DBG("Setting - _bt_adapter_state_enabled_cb() is called!");
81
82         if (adapter_state == BT_ADAPTER_ENABLED)
83         {
84                 DBG("Setting - BT adapter state : BT_ADAPTER_ENABLED");
85
86                 bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable = 1;
87
88                 _bt_genlist_update();
89         }
90         else if (adapter_state == BT_ADAPTER_DISABLED)
91         {
92                 DBG("Setting - BT adapter state : BT_ADAPTER_DISABLED");
93
94                 bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable = 0;
95                 is_connected_hf = FALSE;
96
97                 _bt_genlist_update();
98         }
99         _init_bt_value();
100 }
101
102 void initialize_bt()
103 {
104         DBG("Setting - initialize_bt()");
105
106         if( bt_initialize() != BT_ERROR_NONE )
107         {
108                 ERR("Setting - bt_initialize() is failed....");
109                 return;
110         }
111         DBG("Setting - bt_initialize() is success");
112
113         if(bt_adapter_set_state_changed_cb(_bt_adapter_state_enabled_cb, NULL) != BT_ERROR_NONE)
114         {
115                 ERR("[%s] bt_adapter_set_state_changed_cb() failed.", __FUNCTION__);
116                 return;
117         }
118         else
119         {
120                 DBG("bt_adapter_set_state_changed_cb() is success!");
121         }
122
123         bluetooth_hf_init(hf_event_handler, NULL);
124
125         register_vconf_changing("memory/private/sap/conn_status", sap_state_vconf_change_cb, NULL);
126
127         int ret;
128         ret = feedback_initialize();
129         if(ret != FEEDBACK_ERROR_NONE){
130                 DBG("feedback_initialize failed");
131         }
132 }
133
134 Eina_Bool _clear_bluetooth_cb(void *data, Elm_Object_Item *it)
135 {
136         clear_bt_resource();
137
138         return EINA_TRUE;
139 }
140
141 static void _disable_visibility_item_view()
142 {
143         bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = DISABLE;
144         timeout_seconds = VISIBILITY_TIMEOUT;
145
146         _update_visibility_view();
147 }
148
149 static void hf_event_handler(int event, void *data, void *user_data)
150 {
151         switch (event) {
152         case BLUETOOTH_EVENT_HF_CONNECTED:
153                 DBG("Setting - BLUETOOTH_EVENT_HF_CONNECTED");
154                 _update_visibility_item_view(TRUE);
155                 break;
156
157         case BLUETOOTH_EVENT_HF_DISCONNECTED:
158                 DBG("Setting - BLUETOOTH_EVENT_HF_DISCONNECTED");
159                 _update_visibility_item_view(is_handsfree_connected());
160                 break;
161         }
162 }
163
164 void _update_visibility_item_view(int is_hf_connected)
165 {
166         DBG("Setting - _update_view() is called!!");
167
168         if(is_hf_connected)
169         {
170                 is_connected_hf = TRUE;
171
172                 if(vb_timer)
173                 {
174                         ecore_timer_del(vb_timer);
175                         vb_timer = NULL;
176                 }
177
178                 bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = DISABLE;
179                 timeout_seconds = VISIBILITY_TIMEOUT;
180
181                 _update_visibility_view();
182         }
183         else
184         {
185                 is_connected_hf = FALSE;
186
187                 _update_visibility_view();
188         }
189 }
190
191 void clear_bt_resource()
192 {
193         bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable = DISABLE;
194         is_bt_operating = BT_NON_OPERATING;
195
196         if ( timeout_seconds == 0 && vb_timer )
197         {
198                 ecore_timer_del(vb_timer);
199                 vb_timer = NULL;
200
201                 bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = DISABLE;
202                 timeout_seconds = VISIBILITY_TIMEOUT;
203         }
204
205         bluetooth_hf_deinit();
206
207         int ret = bt_adapter_unset_state_changed_cb();
208         
209         if (ret != BT_ERROR_NONE)
210         {
211                 ERR("Setting - bt adapter unset state changed cb is fail");
212         }
213
214         if (bt_deinitialize() < 0)
215         {
216                 ERR("Setting - bt_deinitialize() failed.");
217                 return;
218         }
219         DBG("Setting - bt_deinitialize() is success");
220
221         bt_genlist = NULL;
222         vb_it = NULL;
223         bt_it = NULL;
224         g_bt_check = NULL;
225         g_vb_check = NULL;
226
227         /* Unregister SAP status vconf changeing callback */
228         unregister_vconf_changing("memory/private/sap/conn_status", sap_state_vconf_change_cb);
229
230         ret = feedback_deinitialize();
231         if(ret != FEEDBACK_ERROR_NONE){
232                 DBG("feedback_deinitialize failed");
233         }
234 }
235
236 static void _init_bt_value()
237 {
238         bt_timer = NULL;
239         bt_time = 0.0;
240         timeout_seconds = VISIBILITY_TIMEOUT;
241         bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = DISABLE;
242         is_bt_operating = BT_NON_OPERATING;
243 }
244
245 static void _alternate_bt_mode( void * data )
246 {
247         int ret = 0;
248         bt_adapter_state_e value;
249
250         //appdata * ad = data;
251
252         int prev_bt_enable = bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable;
253         bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable = 2;
254         if( bt_it != NULL)
255         {
256                 elm_genlist_item_fields_update( bt_it, "elm.text.2", ELM_GENLIST_ITEM_FIELD_TEXT);
257                 elm_check_state_set(g_bt_check, !prev_bt_enable);
258                 edje_object_signal_emit(elm_layout_edje_get(g_bt_check), "elm,state,disabled", "elm");
259         }
260
261         if (bt_adapter_get_state(&value) != BT_ERROR_NONE)
262         {
263                 ERR("Setting - bt_adapter_get_state() is failed ");
264                 _init_bt_value();
265                 return;
266         }       
267
268         if( value == EINA_TRUE )
269         {
270                 DBG("Setting - Current bt is on....disable...");
271
272                 bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable = 0;
273                 is_connected_hf = TRUE;
274                 _disable_visibility_item_view();
275
276                 if( hf_it )
277                 {
278                         elm_genlist_item_update(hf_it);
279                 }
280
281                 ret = bt_adapter_disable();
282
283                 timeout_seconds = 0;    // vb_timer stop!!
284         }
285         else
286         {
287                 DBG("Setting - Current bt is off....enable...");
288                 ret = bt_adapter_enable();
289         }
290
291         if ( ret != BT_ERROR_NONE )
292         {
293                 DBG("Setting - Enalbe or Disable failed.... : %d", ret);
294
295                 bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable = origin_bt_enable;
296                 
297                 _bt_genlist_update();
298                 _init_bt_value();
299
300                 return;
301         }
302 }
303
304 static void _blutooth_cb(void *data, Evas_Object *obj, void *event_info)
305 {
306         DBG("Setting - %s", "Setting - _blutooth_cb is called");
307
308         Elm_Object_Item* it = (Elm_Object_Item *)event_info;
309         elm_genlist_item_selected_set(it, EINA_FALSE);
310
311         if (is_bt_operating == BT_OPERATING)
312         {
313                 DBG("Setting - _blutooth_cb() is same status ");
314
315                 return;
316         }
317         is_bt_operating = BT_OPERATING;
318
319         appdata *ad = data;
320         if( ad == NULL )
321         {
322                 DBG("%s", "Setting - _blutooth_cb - ad or check is null");
323                 return;
324         }
325
326         // previous state backup
327         origin_bt_enable = bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable;
328
329         if( vb_timer != NULL && vb_it != NULL )
330         {
331                 DBG("Setting - vb_it is disabled");
332
333                 bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = DISABLE;
334                 timeout_seconds = 0;
335
336                 ecore_timer_del(vb_timer);
337                 vb_timer = NULL;
338
339                 _update_visibility_view();
340
341                 //elm_genlist_item_update(vb_it);
342         }
343
344         _alternate_bt_mode(data);
345 }
346
347 static int is_valid_timeout(int seconds)
348 {
349         return ( (seconds > 0) && (seconds <= VISIBILITY_TIMEOUT) );
350 }
351
352 static void _bt_genlist_update()
353 {
354         if( bt_it )
355         {
356                 elm_genlist_item_fields_update( bt_it, "elm.text.2", ELM_GENLIST_ITEM_FIELD_TEXT);
357
358                 int bt_enable = bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable;
359                 edje_object_signal_emit(elm_layout_edje_get(g_bt_check), "elm,state,enabled", "elm");
360                 elm_check_state_set(g_bt_check, (bt_enable == 1) ? EINA_TRUE : EINA_FALSE);
361         }
362         if( hf_it )
363         {
364                 elm_genlist_item_update(hf_it);
365         }
366         if( vb_it )
367         {
368                 elm_genlist_item_fields_update( vb_it, "elm.text.1", ELM_GENLIST_ITEM_FIELD_TEXT);
369                 elm_genlist_item_fields_update( vb_it, "elm.text.2", ELM_GENLIST_ITEM_FIELD_TEXT);
370
371                 elm_check_state_set(g_vb_check, (bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable == 1) ? EINA_TRUE : EINA_FALSE);
372
373                 if( is_disable_visibility_item_view() )
374                 {
375                         edje_object_signal_emit(elm_layout_edje_get(g_vb_check), "elm,state,disabled", "elm");
376                 }
377                 else
378                 {
379                         edje_object_signal_emit(elm_layout_edje_get(g_vb_check), "elm,state,enabled", "elm");
380                 }
381         }
382 }
383
384 static void _update_visibility_view()
385 {
386         DBG("Setting - _update_visibility_view()");
387
388         if( vb_it )
389         {
390                 elm_genlist_item_fields_update( vb_it, "elm.text.1", ELM_GENLIST_ITEM_FIELD_TEXT);
391                 elm_genlist_item_fields_update( vb_it, "elm.text.2", ELM_GENLIST_ITEM_FIELD_TEXT);
392
393                 elm_check_state_set(g_vb_check, (bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable == TRUE)
394                                                                                  ? EINA_TRUE : EINA_FALSE);
395
396                 if( is_disable_visibility_item_view() )
397                 {
398                         edje_object_signal_emit(elm_layout_edje_get(g_vb_check), "elm,state,disabled", "elm");
399                 }
400                 else
401                 {
402                         edje_object_signal_emit(elm_layout_edje_get(g_vb_check), "elm,state,enabled", "elm");
403                 }
404         }
405 }
406
407 static void _update_visibility_item_update(void * data)
408 {
409         appdata * ad = data;
410         if( ad == NULL )
411         {
412                 DBG("Setting - ad is null.");
413                 return;
414         }
415
416         if( ad->MENU_TYPE == SETTING_BLUETOOTH )
417         {
418                 DBG("Setting - update_visibility_item_update");
419
420                 _update_visibility_view();
421                 //_bt_genlist_update();
422         }
423 }
424
425 static void _init_vb_data(void * data)
426 {
427         bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = DISABLE;
428         timeout_seconds = VISIBILITY_TIMEOUT;
429         _update_visibility_item_update(data);
430         vb_timer = NULL;
431 }
432
433 static Eina_Bool __vb_timeout(void *data)
434 {
435         if( is_valid_timeout(timeout_seconds) )
436         {
437                 DBG("Setting - %d seconds", timeout_seconds);
438
439                 --timeout_seconds;
440
441                 _update_visibility_item_update(data);
442
443                 return ECORE_CALLBACK_RENEW;
444         }
445
446         bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = DISABLE;
447         _update_visibility_item_update(data);
448
449         DBG("Setting - visibility time is out.");
450
451         if( visibility_mode != BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE )
452         {
453                 if( bt_adapter_set_visibility(BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE, 0) != BT_ERROR_NONE )
454                 {
455                         DBG("[%s] Setting - bt_adapter_set_visibility(NON) failed.", __FUNCTION__);
456                         _init_vb_data(data);
457                         return ECORE_CALLBACK_CANCEL;
458                 }
459                 visibility_mode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
460                 DBG("[%s] Setting - bt_adapter_set_visibility(NON) success.", __FUNCTION__);
461         }
462
463         _init_vb_data(data);
464
465         return ECORE_CALLBACK_CANCEL;
466 }
467
468 static void _start_visibility_timer(void * data)
469 {
470         if ( vb_timer)  // Timer Start
471         {
472                 ecore_timer_del(vb_timer);
473                 vb_timer = NULL;
474         }
475         vb_timer = ecore_timer_add(1.0, (Ecore_Task_Cb) __vb_timeout, data);
476 }
477
478 static void _bt_visibility_mode(void * data)
479 {
480         bt_adapter_state_e bt_state;
481
482         if( bt_adapter_get_state(&bt_state) != BT_ERROR_NONE )
483         {
484                 DBG("[%s] Setting - bt_adapter_get_state() failed.", __FUNCTION__);
485                 return;
486         }
487
488         int state = DISABLE;
489         vconf_get_int(VCONFKEY_BT_STATUS, &state);
490
491         DBG("Setting - bt state : %d", state);
492
493         if( bt_state == BT_ADAPTER_ENABLED )
494         {
495                 if(bt_adapter_get_visibility(&visibility_mode, NULL) != BT_ERROR_NONE)
496                 {
497                         DBG("[%s] Setting - bt_adapter_get_visibility() failed.", __FUNCTION__);
498                         return;
499                 }
500
501                 DBG("Setting - visibility_mode : %d", visibility_mode);
502
503                 if( visibility_mode == BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE )
504                 {
505                         if( bt_adapter_set_visibility(BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE, 0) != BT_ERROR_NONE )
506                         {
507                                 DBG("[%s] Setting - bt_adapter_set_visibility(VISIBLE) failed.", __FUNCTION__);
508                         }
509                         else
510                         {
511                                 visibility_mode = BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE;
512                                 DBG("[%s] Setting - bt_adapter_set_visibility(VISIBLE) success.", __FUNCTION__);
513
514                                 bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = ENABLE;
515                                 timeout_seconds = VISIBILITY_TIMEOUT;
516
517                                 _update_visibility_view();
518
519                                 _start_visibility_timer(data);  // Timer start
520                         }
521                 }
522                 else if( visibility_mode == BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE )
523                 {
524                         DBG("[%s] Setting - Visibility mode was already set as BT_ADAPTER_VISIBILITY_MODE_GENERAL_DISCOVERABLE.", __FUNCTION__);
525
526                         timeout_seconds = 0;    // Timer stop;
527
528                         if( bt_adapter_set_visibility(BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE, 0) != BT_ERROR_NONE )
529                         {
530                                 DBG("[%s] Setting - bt_adapter_set_visibility(NON) failed.", __FUNCTION__);
531                         }
532                         else
533                         {
534                                 visibility_mode = BT_ADAPTER_VISIBILITY_MODE_NON_DISCOVERABLE;
535                                 DBG("[%s] Setting - bt_adapter_set_visibility(NON) success.", __FUNCTION__);
536                         }
537                 }
538         }
539 }
540
541 static int is_disable_visibility_item_view()
542 {
543         return ( !bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable || is_connected_hf );
544 }
545
546 static void _visibility_cb(void *data, Evas_Object *obj, void *event_info)
547 {
548         DBG("%s", "Setting - _visibility_cb is called");
549
550         Elm_Object_Item* it = (Elm_Object_Item *)event_info;
551         elm_genlist_item_selected_set(it, EINA_FALSE);
552
553         bool touch_sound_enable = false;
554         if( get_sound_mode() == SOUND_MODE_SOUND )
555         {
556                 vconf_get_bool(VCONFKEY_SETAPPL_TOUCH_SOUNDS_BOOL, &touch_sound_enable);
557                 if( touch_sound_enable )
558                 {
559                         feedback_play(FEEDBACK_PATTERN_TOUCH_TAP);
560                 }
561         }
562
563         if( is_disable_visibility_item_view() )
564         {
565                 DBG("Setting - disable visibility!!");
566                 return;
567         }
568
569         appdata *ad = data;
570         if( ad == NULL )
571         {
572                 DBG("%s", "Setting - _visibility_cb - ad or check is null");
573                 return;
574         }
575
576         _bt_visibility_mode(data);
577 }
578
579 static int _is_enable_BT_headset()
580 {
581         int enable = FALSE;
582
583         vconf_get_int(VCONFKEY_BT_STATUS, &enable);
584
585         return (enable != VCONFKEY_BT_STATUS_OFF) && bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable;
586 }
587
588 static void _BT_headset_cb(void *data, Evas_Object *obj, void *event_info)
589 {
590         DBG("%s", "Setting - _BT_headset_cb is called");
591
592         Elm_Object_Item* it = (Elm_Object_Item *)event_info;
593         elm_genlist_item_selected_set(it, EINA_FALSE);
594
595         if( !_is_enable_BT_headset() )
596                 return;
597
598         app_control_h service;
599         app_control_create(&service);
600         app_control_set_app_id(service, "org.tizen.bluetooth");
601         app_control_add_extra_data(service, "launch-type", "setting");
602         app_control_send_launch_request(service, NULL, NULL);
603         app_control_destroy(service);
604 }
605
606 static char * _get_device_name()
607 {
608         char *bt_adapter_name = NULL;
609
610 #if 0
611         bt_adapter_state_e bt_state;
612         if( bt_adapter_get_state(&bt_state) != BT_ERROR_NONE )
613         {
614                 DBG("[%s] Setting - bt_adapter_get_state() failed.", __FUNCTION__);
615                 return NULL;
616         }
617         if (bt_adapter_get_name(&bt_adapter_name) != BT_ERROR_NONE)
618         {
619                 ERR("%s,%d: bt get name fail", __func__, __LINE__);
620                 return NULL;
621         }
622 #endif
623         bt_adapter_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
624
625         return strdup(bt_adapter_name);
626 }
627
628 static char * _gl_bt_title_get(void *data, Evas_Object *obj, const char *part)
629 {
630         char buf[1024];
631         Bt_Item_Data *id = data;
632         int index = id->index;
633         char expression[32];
634
635         if( !strcmp(part, "elm.text.1") || !strcmp(part, "elm.text") )
636         {
637                 if( index == BT_MENU_TYPE_BT_ON_OFF )
638                 {
639                         snprintf(buf, sizeof(buf)-1, "%s", _(bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].name));
640                 }
641                 else if( index == BT_MENU_TYPE_VISIBLE_ON_OFF )
642                 {
643                         if( is_disable_visibility_item_view() )
644                         {
645                                 strcpy(expression, "<font color=#515151>%s</font>");
646                         }
647                         else
648                         {
649                                 strcpy(expression, "%s");
650                         }
651                         snprintf(buf, sizeof(buf)-1, expression, _(bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].name));
652                 }
653                 else
654                 {
655                         if( !_is_enable_BT_headset() )
656                         {
657                                 strcpy(expression, "<font color=#515151>%s</font>");
658                         }
659                         else
660                         {
661                                 strcpy(expression, "%s");
662                         }
663                         snprintf(buf, sizeof(buf)-1, expression, _(bt_menu_its[BT_MENU_TYPE_BT_HEADSET].name));
664                 }
665         }
666         else if( !strcmp(part, "elm.text.2") )
667         {
668                 if( index == BT_MENU_TYPE_BT_ON_OFF )
669                 {
670                         DBG("BT item subtitle updated!!");
671                         int sub_title_type = bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable;
672                         char * subtitle = subtitle = _(bluetooth_enable_str[sub_title_type]);
673                         snprintf(buf, sizeof(buf)-1, "%s", subtitle);
674                 }
675                 else if( index == BT_MENU_TYPE_VISIBLE_ON_OFF )
676                 {
677                         if( is_disable_visibility_item_view() )
678                         {
679                                 strcpy(expression, "<font color=#515151>%s</font>");
680
681                                 if( g_device_name == NULL )
682                                 {
683                                         g_device_name = _get_device_name();
684                                         if( g_device_name == NULL )
685                                         {
686                                                 g_device_name = _(visible_str[bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable]);
687                                         }
688                                 }
689
690                                 snprintf(buf, sizeof(buf)-1, expression, g_device_name);
691                         }
692                         else
693                         {
694                                 if( bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable )
695                                 {
696                                         int hour = timeout_seconds / 60;
697                                         int minutes = timeout_seconds % 60;
698
699                                         char time_buf[16] = {0,};
700                                         snprintf(time_buf, sizeof(time_buf)-1, "%02d:%02d", hour, minutes);
701
702                                         snprintf(buf, sizeof(buf)-1, _(visible_str[bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable]), time_buf);
703                                 }
704                                 else
705                                 {
706                                         g_device_name = _get_device_name();
707                                         if( g_device_name == NULL )
708                                         {
709                                                 g_device_name = _(visible_str[bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable]);
710                                         }
711
712                                         snprintf(buf, sizeof(buf)-1, "%s", g_device_name);
713                                 }
714                         }
715                 }
716         }
717         return strdup(buf);
718 }
719 #if 0
720 static Evas_Object * _get_emtpy_layout(Evas_Object * parent)
721 {
722         if( parent == NULL )
723                 return NULL;
724
725         Evas_Object * layout = elm_layout_add(parent);
726         elm_layout_file_set(layout, EDJE_PATH, "setting-empty/swallow");
727
728         return layout;
729 }
730 #endif
731
732 static Evas_Object * _gl_bt_check_get(void *data, Evas_Object *obj, const char *part)
733 {
734         Evas_Object *check = NULL;
735
736         Bt_Item_Data *id = data;
737         int index = id->index;
738
739         if( !strcmp(part, "elm.icon") )
740         {
741                 check = elm_check_add(obj);
742                 elm_object_style_set(check, "list");
743                 elm_check_state_set(check, (bt_menu_its[index].is_enable == TRUE) ? EINA_TRUE : EINA_FALSE);
744                 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
745                 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
746                 evas_object_propagate_events_set(check, EINA_FALSE);
747                 evas_object_repeat_events_set(check, EINA_TRUE);
748
749                 if( index == BT_MENU_TYPE_VISIBLE_ON_OFF )
750                 {
751                         if( is_disable_visibility_item_view() )
752                         {
753                                 edje_object_signal_emit(elm_layout_edje_get(check), "elm,state,disabled", "elm");
754                         }
755                         g_vb_check = check;
756                 }
757                 else if( index == BT_MENU_TYPE_BT_ON_OFF )
758                 {
759                         g_bt_check = check;
760                 }
761         }
762         return check;
763 }
764
765 static void _bt_gl_del(void *data, Evas_Object *obj)
766 {
767         Bt_Item_Data *id = data;
768         if (id)
769                 free(id);
770 }
771
772 static void init_values()
773 {
774         if( !vb_timer )
775         {
776                 bt_menu_its[BT_MENU_TYPE_VISIBLE_ON_OFF].is_enable = DISABLE;
777         }
778 }
779
780 static int is_handsfree_connected()
781 {
782         int ret = FALSE;
783         int headset_connected = FALSE;
784         int sap_connected = FALSE;
785
786         vconf_get_int(VCONFKEY_BT_DEVICE, &headset_connected);
787         DBG("Heaadset connected : %x", headset_connected);
788
789         if ( headset_connected & VCONFKEY_BT_DEVICE_AG_CONNECTED )
790         {
791                 DBG("Setting - Heaadset connected");
792                 return TRUE;
793         }
794
795         vconf_get_int("memory/private/sap/conn_status", &sap_connected);
796         DBG("Sap connected : %d", sap_connected);
797
798         if (sap_connected) {
799                 DBG("Setting - Sap connected");
800                 return TRUE;
801         }
802
803         return ret;
804 }
805
806 static int is_add_BT_headset()
807 {
808         // temporary code!!
809         // this code will be changed!!
810         return TRUE;
811 }
812
813 static int is_BT_enable()
814 {
815         int enable = DISABLE;
816
817         if (bt_adapter_get_state(&enable) != BT_ERROR_NONE)
818         {
819                 ERR("Setting - bt_adapter_get_state() is failed ");
820                 _init_bt_value();
821                 enable = DISABLE;
822         }
823
824         return enable;
825 }
826
827 Evas_Object* _create_bt_list(void* data)
828 {
829         appdata *ad = data;
830         if( ad == NULL )
831         {
832                 DBG("%s", "_create_bluetooth_list - appdata is null");
833                 return NULL;
834         }
835
836         Evas_Object *genlist  = NULL;
837         struct _bt_menu_item *menu_its = NULL;
838         Elm_Genlist_Item_Class *temp_itc = NULL;
839         int idx = 0;
840
841         init_values();
842
843         bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable = is_BT_enable();
844
845         DBG("Setting - BT status is %d", bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable);
846
847         if( bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable > 1 )
848         {
849                 bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable = ENABLE;
850         }
851
852         if( bt_menu_its[BT_MENU_TYPE_BT_ON_OFF].is_enable )
853         {
854                 is_connected_hf = is_handsfree_connected();
855         }
856         else
857         {
858                 is_connected_hf = FALSE;
859         }
860
861         elm_theme_extension_add(NULL, EDJE_PATH);
862         Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
863         itc->item_style = "2text.1icon.1";
864         itc->func.text_get = _gl_bt_title_get;
865         itc->func.content_get = _gl_bt_check_get;
866         itc->func.del = _bt_gl_del;
867
868         Elm_Genlist_Item_Class *itc2 = elm_genlist_item_class_new();
869         itc2->item_style = "1text";
870         itc2->func.text_get = _gl_bt_title_get;
871         itc2->func.del = _bt_gl_del;
872
873         Elm_Genlist_Item_Class *itc3 = elm_genlist_item_class_new();
874         itc3->item_style = "multiline.2text.1icon";
875         itc3->func.text_get = _gl_bt_title_get;
876         itc3->func.content_get = _gl_bt_check_get;
877         itc3->func.del = _bt_gl_del;
878
879         Evas_Object * layout = elm_layout_add(ad->nf);
880         elm_layout_file_set(layout, EDJE_PATH, "setting/genlist/layout");
881         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
882
883         genlist = elm_genlist_add(layout);
884         elm_genlist_block_count_set(genlist, 14);
885         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
886
887         menu_its = bt_menu_its;
888
889         Elm_Genlist_Item_Class *itc_arr[3] = { itc, itc2, itc3 };
890
891         for (idx = 0; idx < BT_LIST_ITEM_COUNT; idx++)
892         {
893                 // if bt headset is disable, continue
894                 if( idx == BT_MENU_TYPE_BT_HEADSET && !is_add_BT_headset() )
895                         continue;
896
897                 Bt_Item_Data *id = calloc(sizeof(Bt_Item_Data), 1);
898                 id->index = idx;
899                 id->item = elm_genlist_item_append(
900                                                         genlist,                                // genlist object
901                                                         itc_arr[idx],                   // item class
902                                                         id,                             // data
903                                                         NULL,
904                                                         ELM_GENLIST_ITEM_NONE,
905                                                         menu_its[ idx ].func,   // call back
906                                                         ad);
907
908                 if(idx == BT_MENU_TYPE_BT_ON_OFF)
909                 {
910                         bt_it = id->item;
911                 }
912                 else if(idx == BT_MENU_TYPE_BT_HEADSET)
913                 {
914                         hf_it = id->item;
915                 }
916                 else
917                 {
918                         vb_it = id->item;
919                 }
920         }
921         elm_genlist_item_class_free(itc);
922         elm_genlist_item_class_free(itc2);
923         elm_genlist_item_class_free(itc3);
924
925         bt_genlist = genlist;
926
927         elm_object_part_content_set(layout, "elm.genlist", genlist);
928
929         return layout;
930 }