apply FSL(Flora Software License)
[apps/core/preloaded/settings.git] / setting-connectivity / src / setting-connectivity-usb.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
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
7   *
8   *     http://www.tizenopensource.org/license
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * 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.
15   */
16
17
18 #include <setting-connectivity-usb.h>
19
20 #define DEFAULT_USB_BUF_SIZE 64
21 #define SETTING_USB_DEFAULT_MODE 0
22
23 static int setting_connectivity_usb_create(void *cb);
24 static int setting_connectivity_usb_destroy(void *cb);
25 static int setting_connectivity_usb_update(void *cb);
26 static int setting_connectivity_usb_cleanup(void *cb);
27 static void mode_change_vconf_cb(keynode_t *key, void *data);
28 static void set_progressbar_status (int mode);
29 static void unset_progressbar_status (int mode);
30 static int disable_glitem(int index);
31 static int enable_glitem(int index);
32 static void enable_all_buttons();
33 static int disable_all_buttons(int enable);
34 static void unload_popup();
35 void load_usb_connection_popup(Evas_Object *radio);
36 static void usb_status_vconf_cb(keynode_t *key, void *data);
37
38 /* set button style */
39 static Elm_Genlist_Item_Class itc;
40 static Elm_Genlist_Item_Class itc11;
41
42 /* This is pointer to indicate progressbars*/
43 static button_status button[NUM_PROGRESSBAR];
44
45 /* This variable indicates whether or not USB mode is being changed */
46 static int in_mode_change;      /*  NO_CHANGE: USB mode is not being changed, IN_CHANGE: USB mode is being changed */
47
48 /* This variable shows the current/selected USB mode */
49 static int curMode, selMode;
50
51 /* These variables are for the popup */
52 static Evas_Object *win_main, *popup_eo;
53
54 setting_view setting_view_connectivity_usb = {
55         .create = setting_connectivity_usb_create,
56         .destroy = setting_connectivity_usb_destroy,
57         .update = setting_connectivity_usb_update,
58         .cleanup = setting_connectivity_usb_cleanup,
59 };
60
61 /**
62  * This function is for adding buttons with a radio box and a progressbar
63  */
64 Elm_Object_Item *setting_create_Gendial_field_group_item_1radio(Evas_Object * genlist,
65                                                                  Elm_Genlist_Item_Class *itc,
66                                                                  setting_call_back_func gl_sel,
67                                                                  void *sel_data,
68                                                                  SWALLOW_Type swallow_type,
69                                                                  Evas_Object * rgd,
70                                                                  int chk_status,
71                                                                  const char *keyStr,
72                                                                  setting_call_back_func chk_change_cb,
73                                                                  Elm_Object_Item *git,
74                                                                  int index)
75 {
76         SETTING_TRACE_BEGIN;
77         Setting_GenGroupItem_Data *item_data =
78             (Setting_GenGroupItem_Data *) calloc(1,
79                                                  sizeof
80                                                  (Setting_GenGroupItem_Data));
81         item_data->keyStr = (char *)g_strdup(keyStr);
82         item_data->swallow_type = swallow_type;
83         item_data->chk_status = chk_status;
84         item_data->chk_change_cb = chk_change_cb;
85         item_data->rgd = rgd;
86         item_data->index = index;
87
88         item_data->item =
89             elm_genlist_item_append(genlist, itc, item_data, git,
90                                     ELM_GENLIST_ITEM_NONE, gl_sel, sel_data);
91         SETTING_TRACE_END;
92         return item_data->item;
93 }
94
95 /**
96  * Creating progressbar
97  */
98 Evas_Object *create_progressbar(Evas_Object *parent, int num)
99 {
100         SETTING_TRACE_BEGIN;
101         button[num].progressbar = elm_progressbar_add(parent);
102         elm_object_style_set(button[num].progressbar, "list_process");
103         evas_object_size_hint_align_set(button[num].progressbar, EVAS_HINT_FILL,
104                                         0.5);
105         evas_object_size_hint_weight_set(button[num].progressbar,
106                                          EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
107         evas_object_show(button[num].progressbar);
108         elm_progressbar_pulse(button[num].progressbar, EINA_TRUE);
109         SETTING_TRACE_END;
110         return button[num].progressbar;
111 }
112
113 /**
114  * This function set the icons: a radio box and a progressbar
115  */
116 Evas_Object *_gl_icon_get(void *data, Evas_Object *obj, const char *part)
117 {
118         SETTING_TRACE_BEGIN;
119         Setting_GenGroupItem_Data *item_data =
120             (Setting_GenGroupItem_Data *) data;
121         Evas_Object *icon = NULL;
122         if (!strncmp(part, "elm.icon.2", sizeof("elm.icon.2"))) {
123                 switch (button[item_data->index].pstate) {
124                 case STATE_PROGRESSBAR:
125                         icon = create_progressbar(obj, item_data->index);
126                 case STATE_NONE:
127                 default:
128                         break;
129                 }
130         } else {
131                 icon = elm_radio_add(obj);
132                 elm_radio_state_value_set(icon, item_data->chk_status);
133                 elm_radio_group_add(icon, item_data->rgd);
134                 item_data->eo_check = icon;
135                 evas_object_smart_callback_add(icon, "changed",
136                                                item_data->chk_change_cb,
137                                                item_data);
138         }
139         SETTING_TRACE_END;
140         return icon;
141 }
142
143 static void setting_connectivity_usb_radio_up_cb(void *data, Evas_Object *obj, void *event_info)
144 {
145         SETTING_TRACE_BEGIN;
146         setting_retm_if(data == NULL, "ERROR: data == NULL");
147         Evas_Object *radio = (Evas_Object *)obj;
148         SETTING_TRACE("Radio set: when pushing cancel btn on popup\n");
149         elm_radio_value_set(radio, SETTING_USB_DEFAULT_MODE);
150         SETTING_TRACE_END;
151 }
152
153 /**
154  * Do process when clicking on some genlist item
155  */
156 static void setting_connectivity_usb_mouse_up_Gendial_list_radio_cb(void *data,
157                                                                     Evas_Object
158                                                                  *obj,
159                                                                     void
160                                                                     *event_info)
161 {
162         SETTING_TRACE_BEGIN;
163
164         /* error check */
165         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
166         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
167         elm_genlist_item_selected_set(item, 0);
168         Setting_GenGroupItem_Data *list_item =
169             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
170         Evas_Object *radio = NULL;
171
172         setting_retm_if(data == NULL, "Data parameter is NULL");
173
174         if ( in_mode_change == IN_CHANGE)
175         {
176                 SETTING_TRACE("Currently, USB mode is changing\n");
177                 return;
178         }
179
180         /* If selected mode is same as the previous mode, do nothing */
181         if (curMode == list_item->chk_status)
182         {
183                 SETTING_TRACE("Selected mode is same as the previous mode\n");
184                 return ;
185         }
186
187         selMode = list_item->chk_status;
188         /* If USB cable is connected, buttons should be disabled */
189         int jack_status = check_usb_jack_status();
190         if (jack_status == USB_CONNECTED)
191         {
192                 /* USB mode is changing */
193                 in_mode_change = IN_CHANGE;
194                 
195                 if (SETTING_RETURN_FAIL == disable_all_buttons(selMode))
196                 {
197                         SETTING_TRACE("FAIL: disable_all_buttons(index)\n");
198                         return ;
199                 }
200
201                 /* Drawing progressbar */
202                 set_progressbar_status(selMode);
203         }
204
205         int ret;
206         SETTING_TRACE("selMode : %d\n",selMode);
207         ret = vconf_set_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT, selMode);
208         if ( ret != 0 )
209         {
210                 SETTING_TRACE("vconf_set_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT)\n");
211                 return ;
212         }
213         SETTING_TRACE("selMode : %d\n",selMode);
214
215         if (jack_status == USB_DISCONNECTED)
216         {
217                 radio = data;
218                 switch (selMode)
219                 {
220                 case SETTING_USB_DEFAULT_MODE:
221                         SETTING_TRACE("Radio set: clicked Default mode \n");
222                         elm_radio_value_set(radio, SETTING_USB_DEFAULT_MODE);
223                         break;
224                 case SETTING_USB_DEBUG_MODE:
225                 default:
226                         load_usb_connection_popup(radio);
227                         break;
228                 }
229         }
230
231         SETTING_TRACE_END;
232 }
233
234 /**
235  * To create the usb main view
236  */
237 static int setting_connectivity_usb_create(void *cb)
238 {
239         SETTING_TRACE_BEGIN;
240         SETTING_TRACE("Start USB utilities\n");
241         /* error check */
242         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
243
244         SettingConnectivityUG *ad = (SettingConnectivityUG *) cb;
245         Evas_Object *scroller;
246
247         int vconf_ret = -1; 
248         int index = -1;
249         int err = -1;
250         char title_default_usb_button[DEFAULT_USB_BUF_SIZE];
251         int jack_status = USB_DISCONNECTED;
252         SETTING_TRACE("in_mode_change = NO_CHANGE\n");
253         in_mode_change = NO_CHANGE;
254
255         /* win_main of the popup */
256         win_main = ad->win_get;
257
258         ad->ly_usb =
259             setting_create_layout_navi_bar_genlist(ad->win_main_layout,
260                                                    ad->win_get,
261                                                    _(KeyStr_USBconnection),
262                                                    dgettext("sys_string", "IDS_COM_BODY_BACK"),
263                                                    _("IDS_COM_BODY_HELP"),
264                                                    setting_connectivity_usb_click_softkey_cancel_cb,
265                                                    setting_connectivity_usb_click_softkey_set_cb,
266                                                    ad, &scroller,
267                                                    &ad->navi_bar);
268
269         SETTING_TRACE("before init\n");
270
271         for (index = 0; index < NUM_PROGRESSBAR; index++) {
272                 button[index].item = NULL;
273                 button[index].pstate = STATE_NONE;
274         }
275
276         /* itc is for the group titles */
277         setting_create_Gendial_itc("dialogue/title", &itc);
278         SETTING_TRACE("itc is set\n");
279
280         /* itc11 is for the group members */
281         itc11.item_style = "dialogue/1text.2icon";
282         itc11.func.text_get = ad->itc_1text_1icon_2.func.text_get;
283         itc11.func.state_get = ad->itc_1text_1icon_2.func.state_get;
284         itc11.func.del = ad->itc_1text_1icon_2.func.del;
285         itc11.func.content_get = _gl_icon_get;
286
287         SETTING_TRACE("itc11 is set\n");
288
289         /* scroller is a genlist */
290         ad->chk_con = elm_radio_add(scroller);
291         elm_radio_state_value_set(ad->chk_con, -1);
292
293         /* First Group */
294         setting_create_Gendial_field_titleItem(scroller, &itc,
295                                                _("IDS_ST_BODY_DEFAULT_CONNECTION_MODE"), NULL);
296
297         SETTING_TRACE("First group is made\n");
298
299         snprintf(title_default_usb_button, DEFAULT_USB_BUF_SIZE, "USB %s", _("IDS_COM_BODY_DEFAULT"));
300
301         /* First item of the first group */
302         button[SETTING_USB_DEFAULT_MODE].item =
303             setting_create_Gendial_field_group_item_1radio(scroller, &itc11,
304                                                            setting_connectivity_usb_mouse_up_Gendial_list_radio_cb,
305                                                            ad->chk_con,
306                                                            SWALLOW_Type_1RADIO,
307                                                            ad->chk_con,
308                                                            SETTING_USB_DEFAULT_MODE,
309                                                            title_default_usb_button,
310                                                            setting_connectivity_usb_radio_up_cb,
311                                                            NULL, SETTING_USB_DEFAULT_MODE);
312
313         SETTING_TRACE("First item of First group is set\n");
314
315         /* Second Group */
316         setting_create_Gendial_field_titleItem(scroller, &itc,
317                                                _("IDS_ST_POP_SELECT_OTHER_CONNECTION"), NULL);
318
319         SETTING_TRACE("Second group is made\n");
320
321         /* First item of the second group */
322         button[SETTING_USB_DEBUG_MODE].item =
323             setting_create_Gendial_field_group_item_1radio(scroller, &itc11,
324                                                            setting_connectivity_usb_mouse_up_Gendial_list_radio_cb,
325                                                            ad->chk_con,
326                                                            SWALLOW_Type_1RADIO,
327                                                            ad->chk_con,
328                                                            SETTING_USB_DEBUG_MODE,
329                                                            _("IDS_ST_BODY_USB_DEBUGGING"),
330                                                            setting_connectivity_usb_radio_up_cb,
331                                                            NULL, SETTING_USB_DEBUG_MODE);
332
333         SETTING_TRACE("First item of Second group is set\n");
334
335         ad->isUsbConnected = check_usb_jack_status();
336
337         /* Set curMode and selMode which are internal variables */
338         if ( ad->isUsbConnected == USB_CONNECTED)
339         {
340                 setting_get_int_slp_key(INT_SLP_SETTING_USB_MODE, &curMode, &err);
341                 if (err != 0)
342                 {
343                         SETTING_TRACE("FAIL: setting_get_int_slp_key(INT_SLP_SETTING_USB_MODE)\n");
344                         return SETTING_RETURN_FAIL;
345                 }
346         }
347         else    /* USB cable is not connected */
348                 curMode = SETTING_USB_NONE_MODE;
349
350         err = vconf_get_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT, &selMode);
351         if (err != 0)
352         {
353                 SETTING_TRACE("FAIL: vconf_get_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT)\n");
354                 return SETTING_RETURN_FAIL;
355         }
356
357         /*  set state */
358         if (ad->isUsbConnected == USB_CONNECTED) {
359                 SETTING_TRACE("Radio set: initial radio \n");
360                 elm_radio_value_set(ad->chk_con, curMode);
361         }
362         else {
363                 SETTING_TRACE("Radio set: initial radio\n");
364                 elm_radio_value_set(ad->chk_con, selMode);
365         }
366
367         /* Registering callback function for VCONFKEY_SETAPPL_USB_MODE_INT */
368         vconf_ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, mode_change_vconf_cb, ad);
369         if(vconf_ret != 0)
370         {
371                 SETTING_TRACE("FAIL: vconf_notify_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT)\n");
372                 return SETTING_RETURN_FAIL;
373         }
374
375         /* Registering callback function for VCONFKEY_SETAPPL_USB_MODE_INT */
376         vconf_ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_USB_STATUS, usb_status_vconf_cb, ad);
377         if(vconf_ret != 0)
378         {
379                 SETTING_TRACE("FAIL: vconf_notify_key_changed(VCONFKEY_SYSMAN_USB_STATUS)\n");
380                 return SETTING_RETURN_FAIL;
381         }
382
383         SETTING_TRACE("curMode: %d, selMode: %d\n", curMode, selMode);
384
385         setting_view_connectivity_usb.is_create = 1;
386
387         SETTING_TRACE_END;
388         return SETTING_RETURN_SUCCESS;
389 }
390
391 /* check_usb_jack_status() is moved to setting-connectivity.c */
392
393 /**
394  * Disable a button (genlist)
395  *
396  *@param index
397  *
398  *@return
399  */
400 static int disable_glitem(int index)
401 {
402         SETTING_TRACE_BEGIN;
403
404         if (SETTING_USB_DEFAULT_MODE != index && SETTING_USB_DEBUG_MODE != index )
405         {
406                 SETTING_TRACE("ERROR: Item index to disable is invalid.\n");
407                 return SETTING_RETURN_FAIL;
408         }
409
410         elm_object_item_disabled_set(button[index].item, EINA_TRUE);
411         SETTING_TRACE_END;
412         return SETTING_RETURN_SUCCESS;
413 }
414
415 /**
416  * Disable all buttons except a button whose index is the input value.
417  * 
418  *@param enable
419  *
420  *@return
421  */
422 static int disable_all_buttons(int enable)
423 {
424         SETTING_TRACE_BEGIN;
425         
426         if (SETTING_USB_DEFAULT_MODE != enable && SETTING_USB_DEBUG_MODE != enable)
427         {
428                 SETTING_TRACE("ERROR: Item index to disable is invalid.\n");
429                 return SETTING_RETURN_FAIL;
430         }
431
432         if (enable_glitem(enable) == SETTING_RETURN_FAIL)
433         {
434                 SETTING_TRACE("FAIL: enable_glitem()\n");
435                 return SETTING_RETURN_FAIL;
436         }
437         /* When using y=3-x, we can get y=SETTING_USB_DEFAULT_MODE(=0) with x=SETTING_USB_DEBUG_MODE(=3) 
438          * and y=SETTING_USB_DEBUG_MODE(=3) with x=SETTING_USB_DEFAULT_MODE(=0) */
439         if (disable_glitem(SETTING_USB_DEBUG_MODE - enable) == SETTING_RETURN_FAIL)
440         {
441                 SETTING_TRACE("FAIL: disable_glitem()\n");
442                 return SETTING_RETURN_FAIL;
443         }
444
445         SETTING_TRACE_END;
446         return SETTING_RETURN_SUCCESS;
447 }
448
449 /**
450  * Enable a button (genlist)
451  */
452 static int enable_glitem(int index)
453 {
454         SETTING_TRACE_BEGIN;
455
456         if (SETTING_USB_DEFAULT_MODE != index && SETTING_USB_DEBUG_MODE != index)
457         {
458                 SETTING_TRACE("ERROR: Item index to enable is invalid.\n");
459                 return SETTING_RETURN_FAIL;
460         }
461
462         elm_object_item_disabled_set(button[index].item, EINA_FALSE);
463         SETTING_TRACE_END;
464         return SETTING_RETURN_SUCCESS;
465 }
466
467 /**
468  * Enable all buttons.
469  */
470 static void enable_all_buttons()
471 {
472         SETTING_TRACE_BEGIN;
473
474         if(SETTING_RETURN_FAIL == enable_glitem(SETTING_USB_DEFAULT_MODE) 
475                         || SETTING_RETURN_FAIL == enable_glitem(SETTING_USB_DEBUG_MODE))
476         {
477                 SETTING_TRACE("FAIL: enable_glitem()\n");
478                 return ;
479         }
480
481         SETTING_TRACE_END;
482 }
483
484 static void usb_status_vconf_cb(keynode_t *key, void *data)
485 {
486         SETTING_TRACE_BEGIN;
487         setting_retm_if(data == NULL, "ERROR:The parameter(data) is NULL\n");
488         SettingConnectivityUG *ad = (SettingConnectivityUG *) data;
489
490         int val = -1;
491         int ret = -1;
492
493         ret = vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS, &val);
494         setting_retm_if(ret != 0, "FAIL: vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS)");
495
496         switch(val) {
497         case VCONFKEY_SYSMAN_USB_AVAILABLE:
498                 SETTING_TRACE("USB cable is connected\n");
499                 ad->isUsbConnected = USB_CONNECTED;
500
501                 if (IN_CHANGE == in_mode_change) {
502                         SETTING_TRACE("ERROR: Currently, USB mode is being changed. It occurs when USB cable is connected before USB-setting is terminated completely.\n");
503                         return;
504                 }
505                 ret = vconf_get_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT, &selMode);
506                 setting_retm_if(ret != 0, "FAIL: vconf_get_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT)");
507                 ret = vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT, &curMode);
508                 setting_retm_if(ret != 0, "FAIL: vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT)");
509                 if (selMode == curMode) {
510                         SETTING_TRACE("Mode Change completed\n");
511                         unload_popup();
512                         return;
513                 }
514
515                 SETTING_TRACE("in_mode_change = IN_CHANGE\n");
516                 in_mode_change = IN_CHANGE;
517
518                 if (SETTING_RETURN_FAIL == disable_all_buttons(selMode)) {
519                         SETTING_TRACE("FAIL: diable_all_buttons()\n");
520                         return;
521                 }
522
523                 /* The progressbar of the selected mode should be visible */
524                 set_progressbar_status(selMode);
525
526                 /* When USB cable is connected, the popup should be unloaded after disabling all buttons and loading progress bar */
527                 unload_popup();
528                 break;
529         case VCONFKEY_SYSMAN_USB_DISCONNECTED:
530                 SETTING_TRACE("USB cable is not connected\n");
531
532                 if (USB_CONNECTED == ad->isUsbConnected) {
533                         SETTING_TRACE("in_mode_change = IN_CHANGE\n");
534                         in_mode_change = IN_CHANGE;
535                 }
536                 else {
537                         SETTING_TRACE("in_mode_change = NO_CHANGE\n");
538                         in_mode_change = NO_CHANGE;
539                 }
540                 ad->isUsbConnected = USB_DISCONNECTED;
541
542                 SETTING_TRACE("Radio set: Disconnecting USB \n");
543                 elm_radio_value_set(ad->chk_con, SETTING_USB_DEFAULT_MODE);
544                 unset_progressbar_status(selMode);
545                 selMode = SETTING_USB_DEFAULT_MODE;
546                 curMode = SETTING_USB_NONE_MODE;
547                 ret = vconf_set_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT, selMode);
548                 if (ret != 0)
549                 {
550                         SETTING_TRACE("FAIL: setting_get_int_slp_key(INT_SLP_SETTING_USB_MODE)\n");
551                 }
552                 enable_all_buttons();
553                 unload_popup();
554                 break;
555         default:
556                 break;
557         }
558         SETTING_TRACE_END;
559 }
560
561 /**
562  * To change the status of progressbars
563  */
564 static void set_progressbar_status (int mode)
565 {
566     SETTING_TRACE_BEGIN;
567
568         /* The progressbar of the selected mode is visible */
569         SETTING_TRACE("Loading progressbar on btn of %d\n", mode);
570         button[mode].pstate = STATE_PROGRESSBAR;
571         elm_genlist_item_update(button[mode].item);
572
573         SETTING_TRACE_END;
574 }
575
576 static void unset_progressbar_status (int mode)
577 {
578     SETTING_TRACE_BEGIN;
579
580         /* All progressbars are invisible */
581         SETTING_TRACE("Unloading progressbar on btn of %d\n", mode);
582         button[mode].pstate = STATE_NONE;
583         elm_genlist_item_update(button[mode].item);
584
585         SETTING_TRACE_END;
586 }
587
588 /**
589  * When VCONFKEY_SETAPPL_USB_MODE_INT is changed, all buttons are enabled
590  */
591 static void mode_change_vconf_cb(keynode_t *key, void *data)
592 {
593         SETTING_TRACE_BEGIN;
594
595         if(data == NULL)
596         {
597                 SETTING_TRACE("ERROR:The parameter(data) is NULL\n");
598                 return;
599         }
600         SettingConnectivityUG *ad = (SettingConnectivityUG *)data;
601
602         int value = -1;
603         int ret = -1;
604         
605         SETTING_TRACE("curMode: %d, selMode: %d\n", curMode, selMode);
606         ret = vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT, &value);
607         if (ret != 0) 
608         {
609                 SETTING_TRACE("ERROR: vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT)");
610                 return;
611         }
612
613         /* When USB cable is connected, current mode is changed to selected mode.
614          * When USB cable is not connceted, current mode is SETTING_USB_NONE_MODE. */
615         ad->isUsbConnected = check_usb_jack_status();
616         if (ad->isUsbConnected == USB_CONNECTED)
617         {
618                 /* The progressbar of the selected mode is visible */
619                 unset_progressbar_status(selMode);
620
621                 /* The radio box is updated */
622                 if (curMode != SETTING_USB_NONE_MODE)
623                         elm_genlist_item_update(button[curMode].item);
624                 else
625                         elm_genlist_item_update(button[SETTING_USB_DEFAULT_MODE].item);
626                 SETTING_TRACE("Radio set: When current mode is changed with connected USB\n");
627                 elm_radio_value_set(ad->chk_con, selMode);
628
629                 /* update the curMode state */
630                 curMode = value;
631
632                 /* All buttons are enabled */
633                 enable_all_buttons();
634         }
635         else    /* If USB cable is disconnected, current mode is none */
636         {
637                 curMode = SETTING_USB_NONE_MODE;
638         }
639
640         SETTING_TRACE("in_mode_change = NO_CHANGE\n");
641         in_mode_change = NO_CHANGE;
642
643         SETTING_TRACE("curMode: %d, selMode: %d\n", curMode, selMode);
644
645         SETTING_TRACE_END;
646 }
647
648 /**
649  * To destory the view of usb
650  */
651 static int setting_connectivity_usb_destroy(void *cb)
652 {
653         SETTING_TRACE_BEGIN;
654         /* error check */
655         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
656
657         SettingConnectivityUG *ad = (SettingConnectivityUG *) cb;
658         int vconf_ret = -1;
659         int num_err = 0;
660
661         /* Removing the popup if the popup is loaded */
662         unload_popup();
663         win_main = NULL;
664
665         /* Closing vconf trace */
666         vconf_ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT, mode_change_vconf_cb);
667         if (vconf_ret != 0)
668         {
669                 SETTING_TRACE("FAIL: vconf_ignore_key_changed(VCONFKEY_SETAPPL_USB_MODE_INT)\n");
670                 num_err++;
671         }
672         vconf_ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_USB_STATUS, usb_status_vconf_cb);
673         if (vconf_ret != 0)
674         {
675                 SETTING_TRACE("FAIL: vconf_ignore_key_changed(VCONFKEY_SYSMAN_USB_STATUS)\n");
676                 num_err++;
677         }
678
679         if (ad->ly_usb != NULL) {
680                 evas_object_del(ad->ly_usb);
681                 setting_view_connectivity_usb.is_create = 0;
682         }
683
684         SETTING_TRACE_END;
685         if (num_err > 0)
686         {
687                 SETTING_TRACE("ERROR: the number of errors to destroy is %d\n", num_err);
688                 return SETTING_RETURN_FAIL;
689         }
690         else
691         {
692                 return SETTING_RETURN_SUCCESS;
693         }
694
695 }
696
697 /**
698  * To update the view of usb
699  */
700 static int setting_connectivity_usb_update(void *cb)
701 {
702         SETTING_TRACE_BEGIN;
703         /* error check */
704         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
705         SettingConnectivityUG *ad = (SettingConnectivityUG *) cb;
706         int ret;
707
708         if (ad->ly_usb != NULL) {
709                 evas_object_show(ad->ly_usb);
710
711                 ret = vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT, &curMode);
712                 setting_retvm_if(ret != 0, SETTING_RETURN_FAIL, "FAIL: vconf_get_int(VCONFKEY_SETAPPL_USB_MODE_INT");
713                 if (SETTING_USB_NONE_MODE == curMode)
714                 {
715                         ret = vconf_get_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT, &selMode);
716                         setting_retvm_if(ret != 0, SETTING_RETURN_FAIL, "FAIL: vconf_get_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT");
717                         SETTING_TRACE("Radio set: when updating view \n");
718                         elm_radio_value_set(ad->chk_con, selMode);
719                 }
720                 else    /* curMode != SETTING_USB_NONE_MODE */
721                 {
722                         SETTING_TRACE("Radio set: when updating view \n");
723                         elm_radio_value_set(ad->chk_con, curMode);
724                 }
725
726
727         }
728         SETTING_TRACE_END;
729         return SETTING_RETURN_SUCCESS;
730 }
731
732 /**
733  * To cleanup the view of usb
734  */
735 static int setting_connectivity_usb_cleanup(void *cb)
736 {
737         return SETTING_RETURN_SUCCESS;
738 }
739
740 /**
741  * Do process when clicking '<-' button
742  */
743 static void
744 setting_connectivity_usb_click_softkey_cancel_cb(void *data, Evas_Object *obj,
745                                                  void *event_info)
746 {
747         SETTING_TRACE_BEGIN;
748         /* error check */
749         setting_retm_if(data == NULL, "Data parameter is NULL");
750
751         SettingConnectivityUG *ad = (SettingConnectivityUG *) data;
752
753         /* Send destroy request */
754         ug_destroy_me(ad->ug);
755         SETTING_TRACE_END;
756 }
757
758 /**
759  * Do process when clicking 'Help' button
760  */
761 static void
762 setting_connectivity_usb_click_softkey_set_cb(void *data, Evas_Object *obj,
763                                               void *event_info)
764 {
765         SETTING_TRACE_BEGIN;
766         /* error check */
767         setting_retm_if(data == NULL, "Data parameter is NULL");
768
769         SettingConnectivityUG *ad = (SettingConnectivityUG *) data;
770
771         /* Send destroy request */
772         setting_view_change(&setting_view_connectivity_usb,
773                             &setting_view_connectivity_usb_help, ad);
774         SETTING_TRACE_END;
775 }
776
777
778 /**
779  * Here is for loading popup
780  */
781
782 /**
783  * unload popup 
784  */
785 static void unload_popup()
786 {
787         SETTING_TRACE_BEGIN;
788         
789         if (popup_eo != NULL)   
790         {
791                 SETTING_TRACE("evas_object_del(popup_eo)\n");
792                 evas_object_del(popup_eo);
793                 popup_eo = NULL;
794         }
795         else
796         {
797                 SETTING_TRACE("popup_eo == NULL\n");
798         }
799         
800         SETTING_TRACE_END;
801 }
802
803 /**
804  * Callback function to respond pushing cancel button of the usb connection popup
805  */
806 static void usb_connection_response_cb(void *data, Evas_Object *obj, void *event_info)
807 {
808         SETTING_TRACE_BEGIN;
809         setting_retm_if(!data, "ERROR: The parameter is NULL\n");
810         Evas_Object *radio = data;
811         int ret = -1;
812
813         curMode = SETTING_USB_NONE_MODE;
814         selMode = SETTING_USB_DEFAULT_MODE;
815         ret = vconf_set_int(VCONFKEY_SETAPPL_USB_SEL_MODE_INT, selMode);
816         setting_retm_if(ret != 0, "vconf_set_int(VCONF_SETAPPL_USB_SEL_MODE_INT)\n");
817         SETTING_TRACE("Radio set: When cancel btn is clicked\n");
818         elm_radio_value_set(radio, selMode);
819
820         unload_popup();
821         SETTING_TRACE_END;
822 }
823
824 /**
825  * When a button on USB utilities is pushed, 
826  * this function makes a popup if USB cable is not connected
827  */
828 void load_usb_connection_popup(Evas_Object *radio)
829 {
830         SETTING_TRACE_BEGIN;
831         setting_retm_if(!radio, "ERROR: The parameter is NULL\n");
832         unload_popup();
833
834         //popup_eo = elm_popup_with_buttons_add(win_main, popup_title, popup_msg, 1, _("IDS_COM_SK_CANCEL"), -10, NULL);
835         //evas_object_smart_callback_add(popup_eo, "response", usb_connection_response_cb, NULL);
836         popup_eo = elm_popup_add(win_main);
837         elm_object_part_text_set(popup_eo, "title,text", _("IDS_ST_BODY_USB_DEBUGGING"));
838         elm_object_text_set(popup_eo, _("IDS_ST_POP_CONNECT_TO_PC_USB_DEBUGGING_WILL_BE_DISABLED_AUTOMATICALLY_AFTER_USE"));
839         Evas_Object *btn = setting_create_button(win_main, _("IDS_COM_SK_CANCEL"), NULL, usb_connection_response_cb, radio);
840         elm_object_part_content_set(popup_eo, "button1", btn);  
841         evas_object_show(popup_eo);
842
843         if (popup_eo == NULL)
844                 SETTING_TRACE(  "ERROR: ad->popup_eo is NULL \n");
845         if (win_main == NULL)
846                 SETTING_TRACE(  "ERROR: ad->win_main is NULL \n");
847
848         SETTING_TRACE_END;
849 }
850