8bd8523c017ad0623a16c5f0b7503250eccfd814
[apps/home/settings.git] / src / setting-main.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Contact: MyoungJune Park <mj2004.park@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 /**
23  * @file setting-cis-main2.c
24  * @brief implement first view of Setting application
25  *
26  * first view has tabbar and Gengrid
27  */
28 #define _GNU_SOURCE
29
30 #include <setting-main.h>
31 #include <setting-handler.h>
32 #include <setting-helper.h>
33
34 #include <setting-common-sound.h>
35 #include <setting-common-alarmmgr.h>
36
37 #include <sqlite3.h>
38
39 /**
40  * [UI] search bar
41  * plain list item style
42  */
43 static char *s_grid_items[] = {
44         /* 1 */
45         KeyStr_FlightMode,
46         KeyStr_HighTouchSens,
47         KeyStr_MultiWindowMode,
48
49         KeyStr_Storage,
50         KeyStr_Sounds,
51         KeyStr_Display,
52
53         KeyStr_Wallpaper,
54         KeyStr_LockedScreen,
55         KeyStr_Noti_Panel,
56
57         /* 2 */
58         KeyStr_Motions,
59         /*      KeyStr_SafetyAssistance, */
60         KeyStr_Powersaving,
61
62 };
63
64 static int setting_main_create(void *cb);
65 static int setting_main_destroy(void *cb);
66 static int setting_main_update(void *cb);
67 static int setting_main_cleanup(void *cb);
68
69 setting_view setting_view_main = {
70         .create = setting_main_create,
71         .update = setting_main_update,
72         .destroy = setting_main_destroy,
73         .cleanup = setting_main_cleanup,
74 };
75
76
77 /*//////////////////////////////////////////////////////////////////////////////////////////// */
78
79 void __all_gl_realized_cb(void *data, Evas_Object *obj, void *event_info)
80 {
81         /*SETTING_TRACE_BEGIN; */
82         __gl_realized_cb(data, obj, event_info);
83         setting_retm_if(event_info == NULL, "invalid parameter: event_info is NULL");
84         Elm_Object_Item *item = (Elm_Object_Item *)event_info;
85         /*elm_object_item_signal_emit(item, "elm,state,default", "elm");//to cancel the 2depth color */
86         Setting_GenGroupItem_Data *item_data = elm_object_item_data_get(item);
87         if (!item_data) {
88                 return;
89         }
90
91         if (item_data->isPlaying) {
92                 elm_object_item_signal_emit(item_data->item, "elm,state,expanded", "elm");
93         }
94 }
95
96 static void __all_gl_group_clicked_cb(void *data, Evas_Object *obj, void *event_info)
97 {
98         SETTING_TRACE_BEGIN;
99         /* error check */
100         /*setting_retm_if(data == NULL, "Data parameter is NULL"); */
101         int view_type = (int)data;
102         setting_main_appdata *ad = g_main_ad;
103         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
104         elm_genlist_item_selected_set(item, 0);
105         Setting_GenGroupItem_Data *data_parentItem = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
106         setting_retm_if(data_parentItem == NULL, "data_parentItem is NULL");
107
108
109         Elm_Object_Item *start_item = NULL;
110         Elm_Object_Item *end_item = NULL;
111         Elm_Object_Item *it;
112
113         data_parentItem->isPlaying = !data_parentItem->isPlaying;
114         int hide_flag = !(data_parentItem->isPlaying);
115         SETTING_TRACE("----------------------> expand list:%s, hide_flag:%d", _(data_parentItem->keyStr), hide_flag);
116
117         /*to controll the arrow */
118         if (hide_flag)
119                 elm_object_item_signal_emit(data_parentItem->item, "elm,state,contracted", "elm");
120         else
121                 elm_object_item_signal_emit(data_parentItem->item, "elm,state,expanded", "elm");
122
123         int group_idx = data_parentItem->chk_status;
124
125         SETTING_TRACE("view_type:%d, group_idx:%d", view_type, group_idx);
126         start_item = ad->gl_data_item[view_type][group_idx]->item;
127         SETTING_TRACE("START:%s", _(ad->gl_data_item[view_type][group_idx]->keyStr));
128         if (group_idx != GL_Group_Apps) {
129                 end_item = ad->gl_data_item[view_type][group_idx + 1]->item;
130                 SETTING_TRACE("END:%s", _(ad->gl_data_item[view_type][group_idx + 1]->keyStr));
131         }
132
133         for (it = elm_genlist_item_next_get(start_item);
134              it && it != end_item; it = elm_genlist_item_next_get(it)) {
135                 Setting_GenGroupItem_Data *data_parentItem = (Setting_GenGroupItem_Data *)elm_object_item_data_get(it);
136                 if (data_parentItem && data_parentItem->keyStr) SETTING_TRACE("data_parentItem:%s", data_parentItem->keyStr);
137                 elm_genlist_item_hide_set(it, hide_flag);
138                 if (!hide_flag && group_idx == GL_Group_Apps) {
139                         elm_genlist_item_bring_in(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
140                 }
141         }
142 }
143
144
145 Evas_Object *_view_list_geter(void *data)
146 {
147         SETTING_TRACE_BEGIN;
148         retvm_if(data == NULL, NULL, "Invalid argument: data is NULL");
149         setting_main_appdata *ad = (setting_main_appdata *)data;
150         SETTING_TRACE("ad->sc_gl[SC_All]:%p", ad->sc_gl[SC_All_List]);
151
152         if (ad->sc_gl[SC_All_List]) {
153                 evas_object_show(ad->sc_gl[SC_All_List]);
154                 return ad->sc_gl[SC_All_List];
155         }
156
157         Evas_Object *genlist = elm_genlist_add(ad->win_main);
158         retvm_if(genlist == NULL, NULL, "Cannot set genlist object as contento of layout");
159
160         ad->sc_gl[SC_All_List] = genlist;
161         elm_genlist_realization_mode_set(genlist, EINA_TRUE);
162         elm_object_style_set(genlist, "dialogue");
163         elm_genlist_clear(genlist);     /* first to clear list */
164         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);       /* resolve abnormal height issue */
165         evas_object_smart_callback_add(genlist, "realized", __all_gl_realized_cb, ad);
166         evas_object_show(genlist);
167
168         Setting_GenGroupItem_Data *item_data = NULL;
169         Elm_Object_Item *item = NULL;
170         int group_dx = GL_Group_QuickSettings;
171         setting_main_genlist_handler_reset(ad);
172         /*---------------------------------------------------------------------------------------- */
173         /* 2.category name loop */
174         /*---------------------------------------------------------------------------------------- */
175         int i, j;
176         char *keyStr = NULL;
177         char *icon_path = NULL;
178         char *ug_args = NULL;
179
180         char *group_name = NULL;
181         int index = 0;
182         for (i = 0; i < setting_cfg_get_category_length(); i++) {
183                 group_name = setting_cfg_get_category_name(i);
184                 group_dx++;/*from the first */
185                 item_data = setting_create_Gendial_field_groupitem(
186                                 genlist,
187                                 &(ad->itc[GENDIAL_Type_expandable_proc]),
188                                 NULL,
189                                 __all_gl_group_clicked_cb,
190                                 (void *)VIEW_All_List,
191                                 SWALLOW_Type_INVALID,
192                                 NULL, /* l_icon */
193                                 NULL, /* r_icon */
194                                 0,
195                                 group_name,
196                                 NULL, /* r_icon */
197                                 NULL);
198                 if (item_data) {
199                         item_data->isPlaying = TRUE;/*expandable ? */
200                         item_data->chk_status = group_dx;/*keep the group idx */
201
202                         ad->gl_data_item[VIEW_All_List][group_dx] = item_data;
203                         __BACK_POINTER_SET(ad->gl_data_item[VIEW_All_List][group_dx]);
204                 }
205
206                 index = 0;
207
208
209                 /*---------------------------------------------------------------------------------------- */
210                 /* 2. display each items, following category */
211                 /*---------------------------------------------------------------------------------------- */
212                 /* add sub items */
213                 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
214                         keyStr = setting_cfg_get_keyname_idx(i, j);
215
216                         ug_args = setting_cfg_get_ug_args_idx(i, j);
217                         icon_path = setting_cfg_get_icon_path_idx(i, j);
218
219                         mainlist_entry *entry =  settinig_drawer_hash_find(ad, keyStr);
220
221                         if (entry) {
222                                 if (entry->type == UG_HANDLE) {
223                                         if (is_ug_installed_by_ug_args(ug_args)) {
224                                                 item_data = entry->ui_handler(ad, keyStr, icon_path, ug_args, genlist, NULL);
225                                                 entry->item_data = item_data;
226                                         }
227                                 } else if (entry->type == UI_PROC) {
228                                         item_data = entry->ui_handler(ad, keyStr, icon_path, ug_args, genlist, NULL);
229                                         entry->item_data = item_data;
230                                 }
231                         } else {
232                                 entry = settinig_drawer_hash_find(ad, "Default");
233                                 item_data = entry->ui_handler(ad, keyStr, icon_path, ug_args, genlist, NULL);
234                                 entry->item_data = item_data;
235                         }
236
237                         /* dupcated code (REFACTORING) */
238                         if (item_data && item_data->item) {
239
240                                 set_node_pointer(keyStr, item_data->item);
241                                 setting_genlist_item_groupstyle_set(item_data, SETTING_GROUP_STYLE_CENTER);
242                                 index++;
243                         }
244                 }
245
246                 /*if (item_data) */
247                 /*SETTING_TRACE("keyStr[%s] is being set to BOTTOM style",_(item_data->keyStr)); */
248                 setting_genlist_item_groupstyle_set(item_data, index == 1 ? SETTING_GROUP_STYLE_NONE : SETTING_GROUP_STYLE_BOTTOM);
249         }
250         setting_main_genlist_handler_set(ad, VIEW_All_List);
251         setting_main_genlist_handler_reset(ad);
252         return genlist;
253 }
254
255 static void ___grid_select_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
256 {
257         /*SETTING_TRACE_BEGIN; */
258         Evas_Object *image = elm_object_part_content_get(obj, "elm.swallow.icon");
259         const char *file;
260         elm_image_file_get(image, &file, NULL);
261         /*SETTING_TRACE("file:%s", file); */
262         if (!safeStrCmp(IMG_SETTING, file)) {
263                 return;
264         }
265         setting_dim_evas_object(elm_object_part_content_get(obj, "elm.swallow.icon"), FALSE);
266         elm_object_signal_emit(obj, "SELECTED", "elm");
267
268         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
269         retm_if(data == NULL, "Invalid argument: data is NULL");
270         Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info;
271         Evas_Point *point_down = data;
272         point_down->x = ev->output.x;
273         point_down->y = ev->output.y;
274 }
275
276 static void ___grid_release_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
277 {
278         /*SETTING_TRACE_BEGIN; */
279         setting_undo_dim_evas_object(elm_object_part_content_get(obj, "elm.swallow.icon"), FALSE);
280         elm_object_signal_emit(obj, "UNSELECTED", "elm");
281 }
282
283 static void ___grid_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
284 {
285         /*SETTING_TRACE_BEGIN; */
286         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
287         retm_if(data == NULL, "Invalid argument: data is NULL");
288         Evas_Point *point_down = data;
289         Evas_Event_Mouse_Move *ev = (Evas_Event_Mouse_Move *)event_info;
290         int x_offset = ev->cur.output.x - point_down->x;
291         int y_offset = ev->cur.output.y - point_down->y;
292         if (x_offset < 0) x_offset = -x_offset;
293         if (y_offset < 0) y_offset = -y_offset;
294         if (x_offset <= MIN_MOVE_DISTANCE && y_offset <= MIN_MOVE_DISTANCE) {
295                 return;
296         }
297         setting_undo_dim_evas_object(elm_object_part_content_get(obj, "elm.swallow.icon"), FALSE);
298         elm_object_signal_emit(obj, "UNSELECTED", "elm");
299 }
300 static void ___grid_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
301 {
302         /*SETTING_TRACE_BEGIN; */
303         ret_if(!data);
304         Evas_Point *point_down = data;
305         FREE(point_down);/*delete the date. */
306 }
307
308 /**
309 * To make an object looks clickable: if pressed, it is dim color;if unpressed, it is normal color;
310 *
311 * @param[in] obj
312 */
313 EXPORT_PUBLIC
314 void __grid_clickable_enable(Evas_Object *obj)
315 {
316         if (obj) {
317                 Evas_Point *point_down = calloc(1, sizeof(Evas_Point));
318                 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, ___grid_select_cb, point_down);
319                 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP, ___grid_release_cb, NULL);
320                 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE, ___grid_mouse_move_cb, point_down);
321                 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, ___grid_del_cb, point_down);
322         }
323 }
324
325 static void __grid_binded_vconf_cb(keynode_t *key, void *data)
326 {
327         SETTING_TRACE_BEGIN;
328         char *vconf_name = vconf_keynode_get_name(key);
329         SETTING_TRACE("the value of [ %s ] just changed", vconf_name);
330         ret_if(!data);
331         Evas_Object *layout = data;
332         SETTING_TRACE("layout:%p", layout);
333         Evas_Object *image = elm_object_part_content_get(layout, "elm.swallow.icon");
334         ret_if(!image);
335
336         int status = 0;
337         char *icon_path = NULL;
338         if (!safeStrCmp(vconf_name, VCONFKEY_TELEPHONY_FLIGHT_MODE)) {
339                 vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &status);
340                 if (!status) {
341                         icon_path = (char *)g_strdup(SETTING_ICON_PATH_CFG"settings_flightoff2.png");
342                 } else {
343                         icon_path = (char *)g_strdup(SETTING_ICON_PATH_CFG"A01-1_icon_Flight_Mode.png");
344                 }
345         }
346 #if SUPPORT_NETWORK_RESTRICTION
347         else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_NETWORK_RESTRICT_MODE)) {
348                 vconf_get_bool(VCONFKEY_SETAPPL_NETWORK_RESTRICT_MODE, &status);
349                 if (!status) {
350                         icon_path = (char *)g_strdup(IMG_NetRestrictionOffMode);
351                 } else {
352                         icon_path = (char *)g_strdup(IMG_NetRestrictionMode);
353                 }
354         }
355 #endif
356         else if (!safeStrCmp(vconf_name, VCONFKEY_SETAPPL_ENHANCED_TOUCH)) {
357                 vconf_get_bool(VCONFKEY_SETAPPL_ENHANCED_TOUCH, &status);
358                 if (status) {
359                         icon_path = (char *)g_strdup(IMG_HighTouch);
360                 } else {
361                         icon_path = (char *)g_strdup(IMG_HighTouchOff);
362                 }
363         } else if (!safeStrCmp(vconf_name, VCONFKEY_QUICKSETTING_MULTIWINDOW_ENABLED)) {
364 #if 0
365                 vconf_get_bool(VCONFKEY_QUICKSETTING_MULTIWINDOW_ENABLED, &status);
366                 if (!status) {
367                         icon_path = (char *)g_strdup(IMG_MutiWindowDisable);
368                 } else {
369                         icon_path = (char *)g_strdup(IMG_MutiWindow);
370                 }
371 #else
372                 icon_path = (char *)g_strdup(IMG_MutiWindow);
373 #endif
374         }
375
376         if (icon_path) elm_image_file_set(image, icon_path, NULL);
377 }
378
379 /*Duplicate one to give diff instance vconf cb to the two same name grids */
380 static void __grid_binded_vconf_cb2(keynode_t *key, void *data)
381 {
382         __grid_binded_vconf_cb(key, data);
383 }
384
385 static void _grid_del(void *data, Evas_Object *obj)
386 {
387         GridItem *item_data = (GridItem *) data;
388         if (item_data) {
389                 G_FREE(item_data->name);
390                 G_FREE(item_data->icon_path);
391                 G_FREE((item_data->ug_name));
392                 FREE(item_data);
393         }
394 }
395
396
397
398 /**
399 * @brief update toggle state in Genlist
400 *
401 * when genGrid updates, the toggle states in Genlist should be updated too.
402 *
403 * @param data application context
404 * @param obj NOT USED
405 * @param event_info NOT USED
406 */
407 static void ____gg_process_toogle_icon(void *data, Evas_Object *obj, void *event_info)
408 {
409         SETTING_TRACE_BEGIN;
410         setting_retm_if(data == NULL, "data is NULL");
411         GridItem *pitem = (GridItem *)data;
412         /* do nothing now */
413         setting_main_appdata *ad = pitem->data;
414         setting_retm_if(ad == NULL, "ad is NULL");
415
416         if (safeStrCmp(pitem->name, KeyStr_FlightMode) == 0) {
417
418                 int old_status, err;
419                 setting_get_bool_slp_key(BOOL_SLP_SETTING_FLIGHT_MODE, &old_status, &err);
420                 /* new status */
421                 if (ad && !old_status) {
422                         ad->popup_flight_mode = setting_create_popup_with_btn(NULL,
423                                                                               ad->win_main, KeyStr_FlightMode,
424                                                                               ENABLE_FLIGHT_MODE_MSG,
425                                                                               setting_flightmode_turn_on_resp_cb,
426                                                                               0, 2, "IDS_ST_BUTTON_ENABLE", "IDS_COM_SK_CANCEL");
427                 } else {
428
429                         Setting_GenGroupItem_Data *item_to_update;
430                         int i;
431                         for (i = VIEW_All_List; i < VIEW_Max; i++) {
432                                 item_to_update = ad->gl_data_item[i][GL_FlightMode];
433                                 setting_update_gl_item_chk_status(item_to_update, !old_status);
434                         }
435
436                         setting_main_alternate_flight_mode(!old_status);
437                 }
438                 return;
439         } else if (safeStrCmp(pitem->name, KeyStr_MultiWindowMode) == 0) {
440                 int ret = 0;
441                 int value = 0;
442                 ret = vconf_get_bool(VCONFKEY_QUICKSETTING_MULTIWINDOW_ENABLED, &value);
443                 SETTING_TRACE_DEBUG("vconf_get_bool() returns %d", ret);
444
445                 const char *tmp = pitem->icon_path;
446                 if (!value) {
447                         /*OFF->ON */
448                         pitem->icon_path = (char *)g_strdup(IMG_MutiWindow);
449                 } else {
450                         /*ON->OFF */
451                         pitem->icon_path = (char *)g_strdup(IMG_MutiWindowDisable);
452                 }
453                 G_FREE(tmp);
454                 /*update the icon */
455                 Evas_Object *layout = NULL;
456                 Evas_Object *image = NULL;
457                 if ((layout = elm_object_item_part_content_get(pitem->item, "elm.swallow.icon"))
458                     && (image = elm_object_part_content_get(layout, "elm.swallow.icon"))) {
459                         elm_image_file_set(image, pitem->icon_path, NULL);
460                 }
461
462                 vconf_set_bool(VCONFKEY_QUICKSETTING_MULTIWINDOW_ENABLED, !value);
463         } else if (safeStrCmp(pitem->name, KeyStr_NetRestrictionMode) == 0) {
464                 int status = SETTING_ON_OFF_BTN_OFF;
465                 int err;
466                 setting_get_bool_slp_key(BOOL_SLP_SETTING_NET_RESTRICTION_MODE, &status, &err);
467
468                 if (!status) {
469                         /* Off -> On */
470                         ad->popup_net_restriction_mode = setting_create_popup_with_btn(NULL,
471                                                                                        ad->win_main,
472                                                                                        "IDS_ST_HEADER_NETWORK_RESTRICTION_MODE_ABB_JPN",
473                                                                                        "IDS_QP_POP_IN_NETWORK_RESTRICTION_MODE_YOU_CAN_USE_ALL_YOUR_APPLICATIONS_WITHOUT_CONNECTING_TO_THE_NETWORK_YOU_CAN_ALSO_RECEIVE_CALLS_AND_SMS_MESSAGES_MSG_JPN",
474                                                                                        setting_main_net_restriction_mode_turn_on_resp_cb,
475                                                                                        0,       /* timer */
476                                                                                        2,       /* button count */
477                                                                                        "IDS_COM_SK_OK",
478                                                                                        "IDS_COM_SK_CANCEL");
479                 } else {
480                         /* On -> Off */
481                         ad->popup_net_restriction_mode = setting_create_popup_with_btn(NULL,
482                                                                                        ad->win_main,
483                                                                                        "IDS_ST_HEADER_NETWORK_RESTRICTION_MODE_ABB_JPN" ,
484                                                                                        "IDS_QP_POP_NETWORK_RESTRICTION_MODE_WILL_BE_DISABLED_JPN" ,
485                                                                                        setting_main_net_restriction_mode_turn_off_resp_cb,
486                                                                                        0,       /* timer */
487                                                                                        2,       /* button count */
488                                                                                        "IDS_COM_SK_OK",
489                                                                                        "IDS_COM_SK_CANCEL");
490                 }
491                 return;
492         } else if (safeStrCmp(pitem->name, KeyStr_HighTouchSens) == 0) {
493                 int old_status = display_get_enhanced_touch();
494                 display_set_enhanced_touch((!old_status));
495                 int new_status = display_get_enhanced_touch();
496                 SETTING_TRACE("old_status:%d, display_get_enhanced_touch():%d", old_status, new_status);
497                 if (new_status >= 0) {
498                         const char *tmp = pitem->icon_path;
499                         if (1 == new_status) {
500
501                                 vconf_set_bool(VCONFKEY_SETAPPL_ENHANCED_TOUCH, 1); /*sync to vconf */
502                                 pitem->icon_path = (char *)g_strdup(IMG_HighTouch);
503                         } else {
504                                 vconf_set_bool(VCONFKEY_SETAPPL_ENHANCED_TOUCH, 0); /*sync to vconf */
505                                 pitem->icon_path = (char *)g_strdup(IMG_HighTouchOff);
506                         }
507                         G_FREE(tmp);
508
509                         Evas_Object *layout = NULL;
510                         Evas_Object *image = NULL;
511                         if ((layout = elm_object_item_part_content_get(pitem->item, "elm.swallow.icon"))
512                             && (image = elm_object_part_content_get(layout, "elm.swallow.icon"))) {
513                                 elm_image_file_set(image, pitem->icon_path, NULL);
514                         }
515                 } else {
516                         setting_create_simple_popup(NULL, ad->win_main,
517                                                     NULL, "IDS_COM_POP_UNEXPECTED_ERROR");
518                 }
519                 return;
520         }
521 }
522
523
524 /**
525  * call event handler when touching each item on grid
526  @todo REMOVE THE IF_ELSE NESTED
527  */
528 static void ___gg_item_selected(void *data, Evas_Object *obj, void *event_info)
529 {
530         SETTING_TRACE_BEGIN;
531         setting_retm_if(data == NULL, "data is NULL");
532         GridItem *pitem = (GridItem *)data;
533
534         setting_main_appdata *ad = pitem->data;
535         setting_retm_if(ad == NULL, "ad is NULL");
536
537
538         char *style = evas_object_data_get(obj, "style");
539         /*SETTING_TRACE("style:%s", style); */
540         if (!isEmptyStr(style)) { /*has value "WithCheck", it indicates we are in edit mode */
541                 /*in edit mode */
542                 Evas_Object *layout = elm_object_item_part_content_get(pitem->item, "elm.swallow.icon");
543                 if (layout) {
544                         Evas_Object *check = elm_object_part_content_get(layout, "elm.swallow.check");
545                         if (check) {
546                                 int old = elm_check_state_get(check);
547                                 SETTING_TRACE("old:%d", old);
548                                 elm_check_state_set(check, !old);
549
550                                 if (!old)
551                                         ad->edit_sel_list = eina_list_append(ad->edit_sel_list, pitem->name);
552                                 else {
553                                         /*NOTE!! DO NOT USE eina_list_remove() */
554                                         /*The API was based on eina_list_data_find_list(), */
555                                         /*which cannot statisfy ad->edit_sel_list's demanding(ad->edit_sel_list keep const strings,not addresses of memory) */
556                                         /*eina_list_data_find_list use memory address to compare: list_data == data */
557                                         Eina_List *list = ad->edit_sel_list;
558                                         while (list) {
559                                                 char *str = eina_list_data_get(list);
560                                                 if (NULL == str)
561                                                         continue;
562                                                 if (0 == safeStrCmp(str, pitem->name))
563                                                         break;
564                                                 list = eina_list_next(list);
565                                         }
566                                         ad->edit_sel_list = eina_list_remove_list(ad->edit_sel_list, list);
567                                 }
568
569                                 char text[MAX_DISPLAY_NAME_LEN_ON_UI + 1] = {0, };
570                                 snprintf(text, MAX_DISPLAY_NAME_LEN_ON_UI, _("IDS_ST_HEADER_PD_SELECTED"), eina_list_count(ad->edit_sel_list));
571                                 elm_object_item_part_text_set(ad->edit_navi_it, "elm.text.title", text);
572                         }
573                 }
574                 return;
575         }
576
577         if (ad->isInUGMode && ad->ug) {
578                 SETTING_TRACE(" UG is already loaded - do nothing ");
579                 return;         /* do nothing */
580         }
581
582         effect_playsound_play();/* make sound (touch) */
583
584         if (!safeStrCmp(pitem->name, KeyStr_FlightMode)
585             || !safeStrCmp(pitem->name, KeyStr_NetRestrictionMode)
586             || !safeStrCmp(pitem->name, KeyStr_HighTouchSens)
587             /*|| !safeStrCmp(pitem->name, KeyStr_MultiWindowMode)*/) {
588                 ____gg_process_toogle_icon(data, obj, event_info);
589                 return;
590         } else if (!safeStrCmp(pitem->name, KeyStr_Call)
591                    || !safeStrCmp(pitem->name, keystr_Blockingmode)
592 #if SUPPORT_DRIVINGMODE
593                    || !safeStrCmp(pitem->name, keystr_Drivingmode)
594 #endif
595                   ) {
596                 SETTING_TRACE("pitem->ug_name:%s", pitem->ug_name);
597                 if (app_launcher(pitem->ug_name) == 0) {
598                         /* add timer */
599                         ad->event_freeze_timer = ecore_timer_add(1, setting_main_freeze_event_timer_cb, ad);
600                         evas_object_freeze_events_set(ad->navibar_main, EINA_TRUE);
601                 }
602                 int click_times = setting_cfg_get_click_times((char *)(pitem->name));
603                 setting_cfg_set_click_times((char *)(pitem->name), ++click_times);
604                 setting_cfg_file_update();
605                 return;
606         }
607
608         /*special checking: */
609         /*1.Network cannot work when SIM card is not prepared */
610         if (safeStrCmp(pitem->name, KeyStr_Network) == 0) {
611                 int err = 0;
612                 int value;
613                 setting_get_int_slp_key(INT_SLP_SETTING_SIM_SLOT, &value, &err);
614                 if (VCONFKEY_TELEPHONY_SIM_INSERTED != value) {
615                         setting_create_simple_popup(NULL, ad->win_main, NULL,
616                                                     "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES");
617                         SETTING_TRACE_ERROR("*** [ERR] Invalid SIM. sim_slot_type=%d ***", value);
618                         return;
619                 }
620         }
621         /*2.powersaving cannot work when Flightmode on */
622         if (safeStrCmp(pitem->name, KeyStr_Powersaving) == 0) {
623                 int status = 0;
624                 vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &status);
625                 if (status) {
626                         setting_create_simple_popup(NULL, ad->win_main,
627                                                     NULL, "IDS_IM_POP_THIS_FEATURE_IS_NOT_AVAILABLE_WHILE_FLIGHT_MODE_IS_ON");
628                         return;
629                 }
630         }
631
632         /*3.Quick command cannot work when TTS on */
633         int tts_state = 0;
634         vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &tts_state);
635         if (tts_state) {
636                 if (!safeStrCmp(pitem->name, KeyStr_QUICK_CMD)) {
637                         char noti_str[MAX_SPECIALIZITION_LEN + 1] = { 0, };
638                         snprintf(noti_str, sizeof(noti_str), _(FEATURE_UNAVALIABLE_WHILE_TTS_ON), _(KeyStr_QUICK_CMD));
639                         setting_create_popup_without_btn(NULL, ad->win_main, NULL, _(noti_str),
640                                                          NULL, 0.0, TRUE, FALSE);
641                         return;
642                 }
643         }
644
645         /* initialize UG module */
646         struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
647         setting_retm_if(!cbs, "calloc failed");
648         cbs->layout_cb = setting_main_layout_ug_cb;
649         cbs->result_cb = setting_main_result_ug_cb;
650         cbs->destroy_cb = setting_main_destroy_ug_cb;
651         cbs->priv = (void *)ad;
652
653         char *path = get_ug_path_from_ug_args((void *)(pitem->ug_name));        /* void* -> char* */
654         app_control_h svc = get_bundle_from_ug_args((void *)(pitem->ug_name));  /* void* -> char* */
655         setting_main_click_grid_item_ug_cb(ad, obj, path, svc, cbs);
656
657         FREE(path);
658         FREE(cbs);
659         app_control_destroy(svc);
660
661         int click_times = setting_cfg_get_click_times((char *)(pitem->name));
662         setting_cfg_set_click_times((char *)(pitem->name), ++click_times);
663         setting_cfg_file_update();
664 }
665
666 static Eina_Bool _navibar_back_pop_cb(void *data, Elm_Object_Item *it)
667 {
668         SETTING_TRACE_BEGIN;
669         retv_if(!data, EINA_FALSE);
670         setting_main_appdata *ad = (setting_main_appdata *) data;
671
672         if (ad && ad->win_main) {
673                 elm_win_lower(ad->win_main);
674         }
675
676         SETTING_TRACE_END;
677         return EINA_FALSE;
678 }
679
680
681 void _setting_genlist_itc_init(void *cb)
682 {
683         setting_main_appdata *ad = (setting_main_appdata *) cb;
684
685         /* [UI] create structures for genlist style */
686         setting_create_Gendial_itc("1line", &(ad->itc[GENDIAL_Type_1text_1icon_2]));
687         setting_create_Gendial_itc("1line", &(ad->itc[GENDIAL_Type_1text_2icon]));
688         setting_create_Gendial_itc("1line", &(ad->itc[GENDIAL_Type_1icon_2text]));
689         setting_create_Gendial_itc("dialogue/1text.1icon.2", &(ad->itc[GENDIAL_Type_1text_2icon_2]));
690         setting_create_Gendial_itc("dialogue/2text.2icon.3", &(ad->itc[GENDIAL_Type_2text_2icon_3]));
691         setting_create_Gendial_itc("groupindex", &(ad->itc[GENDIAL_Type_group_item]));
692         setting_create_Gendial_itc("searchbar", &(ad->itc[GENDIAL_Type_sel_all]));
693         setting_create_Gendial_itc("setting.1text.2icon", &(ad->itc[GENDIAL_Type_1text_2icon_9]));
694         setting_create_Gendial_itc("setting.1text.2icon.1", &(ad->itc[GENDIAL_Type_1text_2icon_10]));
695         setting_create_Gendial_itc("dialogue/2text", &(ad->itc[GENDIAL_Type_2text_3]));
696
697         setting_create_Gendial_itc("1line", &(ad->itc[GENDIAL_Type_1text_2icon_divider]));
698         setting_create_Gendial_itc("groupindex", &(ad->itc[GENDIAL_Type_expandable_proc]));
699
700         ad->itc_expand_grid.func.del = NULL;    /* _gl_Gendial_del; */
701 }
702
703 static void _setting_tapi_init(void *cb)
704 {
705         setting_main_appdata *ad = (setting_main_appdata *) cb;
706         /*pass NULL to let TAPI access default module */
707         ad->handle = tel_init(NULL);
708         if (!ad->handle) {
709                 SETTING_TRACE_ERROR("*** [ERR] tel_init failed ***");
710         } else {
711                 SETTING_TRACE("tel_init ok[handle:%p]", ad->handle);
712         }
713 }
714
715 static void _setting_tapi_deinit(void *cb)
716 {
717         setting_main_appdata *ad = (setting_main_appdata *) cb;
718
719         if (ad->handle) {
720                 int tapi_ret = tel_deinit(ad->handle);
721                 if (tapi_ret != TAPI_API_SUCCESS) {
722                         SETTING_TRACE_DEBUG("*** [ERR] tel_deinit. [%d] ***", tapi_ret);
723                 } else {
724                         SETTING_TRACE("***  tel_deinit OK ");
725                 }
726                 ad->handle = NULL;
727         }
728 }
729
730 /* "virtualkeypad,state,on" */
731 static void ___title_toolbar_show(void *data, Evas_Object *obj, void *event_info)
732 {
733         SETTING_TRACE_BEGIN;
734         setting_main_appdata *ad = (setting_main_appdata *) data;
735
736         Evas_Object *navi_bar = NULL;
737
738         if (ad->isInUGMode && ad->ug) {
739                 Evas_Object *layout = (Evas_Object *)ug_get_layout(ad->ug);
740                 if (layout) {
741                         navi_bar = elm_object_part_content_get(layout, "elm.swallow.content");
742                 }
743         } else {
744                 navi_bar = ad->navibar_main;
745         }
746
747         const char *support = evas_object_data_get(navi_bar, "sip.naviframe.title_obj");
748         SETTING_TRACE("support:%s", support);
749         Elm_Object_Item *top_item = elm_naviframe_top_item_get(navi_bar);
750         if (0 == safeStrCmp("SEARCH", support)) {
751                 /* do nothing */
752         } else if (support) {
753                 if (top_item) {
754                         elm_object_item_signal_emit(top_item, "elm,state,sip,shown", "");
755                 }
756         }
757 }
758
759 /* "virtualkeypad,state,off" */
760 static void ___title_toolbar_hide(void *data, Evas_Object *obj, void *event_info)
761 {
762         SETTING_TRACE_BEGIN;
763         setting_main_appdata *ad = (setting_main_appdata *) data;
764
765         Evas_Object *navi_bar = NULL;
766
767         if (ad->isInUGMode && ad->ug) {
768                 Evas_Object *layout = (Evas_Object *)ug_get_layout(ad->ug);
769                 if (layout) {
770                         navi_bar = elm_object_part_content_get(layout, "elm.swallow.content");
771                 }
772         } else {
773                 navi_bar = ad->navibar_main;
774         }
775
776         const char *support = evas_object_data_get(navi_bar, "sip.naviframe.title_obj");
777
778         SETTING_TRACE("support:%s", support);
779         Elm_Object_Item *top_item = elm_naviframe_top_item_get(navi_bar);
780         if (0 == safeStrCmp("SEARCH", support)) {
781                 /* do nothing */
782         } else if (support) {
783                 if (top_item) {
784                         elm_object_item_signal_emit(top_item, "elm,state,sip,hidden", "");
785                 }
786         }
787 }
788
789 Evas_Object *setting_main_layout_conform_create(Evas_Object *win_layout, Evas_Object *win_obj, void *data)
790 {
791         SETTING_TRACE_BEGIN;
792         LAUNCH_SETTING_IN();
793         Evas_Object *layout = NULL;
794
795         Evas_Object *conform = NULL;
796         /*conform = elm_conformant_add(win_obj); */
797         conform = (Evas_Object *) app_get_preinitialized_conformant();
798         if (!conform)
799                 conform = elm_conformant_add(win_obj);
800
801         setting_main_appdata *ad = (setting_main_appdata *) data;
802         if (!conform) {
803                 return NULL;
804         }
805
806         SETTING_TRACE_DEBUG("Add conformant!!!!!");
807
808         /*  Base Layout */
809         layout = elm_layout_add(conform);
810         setting_retvm_if(layout == NULL, FALSE, "layout == NULL");
811
812         elm_layout_theme_set(layout, "layout", "application", "default");
813         evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
814         evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL);
815         /*elm_win_resize_object_add(win_obj, layout); */
816         elm_win_resize_object_add(win_obj, conform);
817         elm_object_content_set(conform, layout);
818
819         Evas_Object *bg = setting_create_bg(layout, win_obj, "group_list");
820         elm_object_part_content_set(layout, "elm.swallow.bg", bg);
821         evas_object_show(layout);
822
823         evas_object_smart_callback_add(conform, "virtualkeypad,state,on", ___title_toolbar_show, ad);
824         evas_object_smart_callback_add(conform, "virtualkeypad,state,off", ___title_toolbar_hide, ad);
825
826         elm_win_conformant_set(ad->win_main, EINA_TRUE);
827         evas_object_show(conform);
828
829         /* Indicator bg */
830         Evas_Object *indicator_bg = elm_bg_add(conform);
831         elm_object_style_set(indicator_bg, "indicator/headerbg");
832         elm_object_part_content_set(conform, "elm.swallow.indicator_bg", indicator_bg);
833         evas_object_show(indicator_bg);
834
835         ad->conform = conform;
836         evas_object_data_set(win_obj, "conformant", conform);
837         LAUNCH_SETTING_OUT();
838         return layout;
839 }
840
841 /**
842 * @brief create all view layout
843 *
844 * win_main
845 * conformant
846 * ly_main
847 * navibar <- view_layout        <- "elm.swallow.bg"             : bg
848 *                                                       <- "elm.swallow.content"        : all_list
849 *                               <- "elm.swallow.left"           : left_panel
850 */
851 static int setting_main_create(void *cb)
852 {
853         SETTING_TRACE_BEGIN;
854         LAUNCH_SETTING_IN();
855         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
856         setting_main_appdata *ad = (setting_main_appdata *) cb;
857
858         _setting_tapi_init(ad);
859         _setting_genlist_itc_init(ad);
860         settinig_drawer_hash_init(ad);
861
862         /* create a layout conformant */
863         ad->ly_main = setting_main_layout_conform_create(ad->win_main, ad->win_main, ad);
864         setting_retvm_if(ad->ly_main == NULL, FALSE, "ly_main == NULL");
865
866         /* create a navibar */
867         ad->navibar_main = setting_create_navi_bar(ad->ly_main);
868         setting_retvm_if(ad->navibar_main == NULL, FALSE, "navibar_main == NULL");
869         setting_conformant_keypad_state(ad->win_main, TRUE);
870
871
872         /* LAYOUT */
873         Evas_Object *view_layout = elm_layout_add(ad->navibar_main);
874         setting_retvm_if(view_layout == NULL, FALSE, "view_layout == NULL");
875         elm_layout_theme_set(view_layout, "layout", "application", "default");
876         evas_object_show(view_layout);
877         ad->view_layout = view_layout;
878
879         /* push a view to the naviframe */
880         Elm_Object_Item *navi_it = elm_naviframe_item_push(ad->navibar_main, "IDS_ST_OPT_SETTINGS", NULL, NULL, view_layout, NULL);
881         elm_naviframe_item_title_enabled_set(navi_it, EINA_TRUE, EINA_TRUE);
882         ad->main_navi_it = navi_it;
883         elm_object_item_domain_text_translatable_set(navi_it, SETTING_PACKAGE, EINA_TRUE);
884         elm_naviframe_item_pop_cb_set(navi_it, _navibar_back_pop_cb, ad);
885
886         if (! is_searchmode_app(ad->is_searchmode)) {
887                 ad->list_type = SETTING_LIST_VIEW;
888                 ad->view_type = SETTING_TAB_VIEW_QUICK_SETTINGS;
889                 (void)preference_get_int(PREFKEY_VIEW_TYPE, &ad->list_type);
890                 (void)preference_get_int(PREFKEY_TAB_VIEW_TAB, &ad->view_type);
891                 SETTING_TRACE("ad->list_type:%d", ad->list_type);
892                 SETTING_TRACE("ad->view_type:%d", ad->view_type);
893
894                 Evas_Object *all_list = NULL;
895
896                 all_list = _view_list_geter(ad);
897
898                 setting_retvm_if(all_list == NULL, FALSE, "all_list == NULL");
899                 elm_object_part_content_set(view_layout, "elm.swallow.content", all_list);
900
901         }
902
903         setting_view_main.is_create = 1;
904         LAUNCH_SETTING_OUT();
905         SETTING_TRACE_END;
906         return SETTING_RETURN_SUCCESS;
907 }
908
909 static int setting_main_destroy(void *cb)
910 {
911         SETTING_TRACE_BEGIN;
912         /* error check */
913         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
914
915         setting_main_appdata *ad = (setting_main_appdata *) cb;
916         if (0 == setting_view_main.is_create) {
917                 /*already not exsit */
918                 return SETTING_RETURN_SUCCESS;
919         }
920         evas_object_smart_callback_del(ad->conform, "virtualkeypad,state,on", ___title_toolbar_show);
921         evas_object_smart_callback_del(ad->conform, "virtualkeypad,state,off", ___title_toolbar_hide);
922         evas_object_data_set(ad->win_main, "conformant", NULL);
923         _setting_tapi_deinit(ad);
924
925         if (ad->event_freeze_timer) {
926                 ecore_timer_del(ad->event_freeze_timer);
927                 ad->event_freeze_timer = NULL;
928         }
929         evas_object_smart_callback_del(ad->main_genlist, "realized", __gl_realized_cb);
930         if (ad->save_idler) {
931                 ecore_timer_del(ad->save_idler);
932                 ad->save_idler = NULL;
933         }
934
935         if (ad->update_idler) {
936                 ecore_timer_del(ad->update_idler);
937                 ad->update_idler = NULL;
938         }
939
940         if (ad->bt_timer) {
941                 ecore_timer_del(ad->bt_timer);
942                 ad->bt_timer = NULL;
943         }
944         if (ad->wifi_timer) {
945                 ecore_timer_del(ad->wifi_timer);
946                 ad->wifi_timer = NULL;
947         }
948         if (ad->nfc_timer) {
949                 ecore_timer_del(ad->nfc_timer);
950                 ad->nfc_timer = NULL;
951         }
952
953         if (ad->update_font_idler) {
954                 ecore_idler_del(ad->update_font_idler);
955                 ad->update_font_idler = NULL;
956         }
957
958         if (ad->driving_mode_popup) {
959                 evas_object_del(ad->driving_mode_popup);
960                 ad->driving_mode_popup = NULL;
961         }
962
963         elm_object_part_content_unset(ad->view_layout, "elm.swallow.content");
964         elm_object_item_part_content_unset(ad->main_navi_it, "tabbar");
965         if (ad->sc_gl[SC_All_List]) {
966                 evas_object_del(ad->sc_gl[SC_All_List]);
967                 ad->sc_gl[SC_All_List] = NULL;
968         }
969         if (ad->sc_gl[SC_All_Grid]) {
970                 evas_object_del(ad->sc_gl[SC_All_Grid]);
971                 ad->sc_gl[SC_All_Grid] = NULL;
972         }
973
974         if (ad->ctrl_bar) {
975                 evas_object_del(ad->ctrl_bar);
976                 ad->ctrl_bar = NULL;
977         }
978         int i = SETTING_TAB_VIEW_QUICK_SETTINGS;
979         for (; i < SETTING_TAB_VIEW_MAX; i++) {
980                 if (ad->sub_view[i]) {
981                         evas_object_del(ad->sub_view[i]);
982                         ad->sub_view[i] = NULL;
983                 }
984         }
985
986         if (ad->save_idler) {
987                 ecore_timer_del(ad->save_idler);
988                 ad->save_idler = NULL;
989         }
990
991         if (ad->update_idler) {
992                 ecore_timer_del(ad->update_idler);
993                 ad->update_idler = NULL;
994         }
995
996         if (ad->bt_timer) {
997                 ecore_timer_del(ad->bt_timer);
998                 ad->bt_timer = NULL;
999         }
1000         if (ad->wifi_timer) {
1001                 ecore_timer_del(ad->wifi_timer);
1002                 ad->wifi_timer = NULL;
1003         }
1004         if (ad->nfc_timer) {
1005                 ecore_timer_del(ad->nfc_timer);
1006                 ad->nfc_timer = NULL;
1007         }
1008
1009         if (ad->update_font_idler) {
1010                 ecore_idler_del(ad->update_font_idler);
1011                 ad->update_font_idler = NULL;
1012         }
1013
1014         /* sound */
1015         effect_playsound_close();
1016
1017         /* then destroy the UI object. */
1018         if (ad->ly_main) {
1019                 evas_object_del(ad->ly_main);
1020                 ad->ly_main = NULL;
1021         }
1022
1023
1024         /*
1025         int ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE, __vconf_change_cb);
1026         if (ret != 0) {
1027                 SETTING_TRACE_ERROR("call vconf_ignore_key_changed failed");
1028         }
1029         */
1030
1031         setting_view_main.is_create = 0;
1032         SETTING_TRACE_END;
1033         return SETTING_RETURN_SUCCESS;
1034 }
1035
1036 static int setting_main_update(void *cb)
1037 {
1038         SETTING_TRACE_BEGIN;
1039
1040         /* error check */
1041         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1042
1043         setting_main_appdata *ad = (setting_main_appdata *) cb;
1044
1045         if (ad->ly_main != NULL) {
1046                 /*evas_object_show(ad->ly_main); */
1047         }
1048
1049         return SETTING_RETURN_SUCCESS;
1050 }
1051
1052
1053
1054 static int setting_main_cleanup(void *cb)
1055 {
1056         SETTING_TRACE_BEGIN;
1057         /* error check */
1058         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1059
1060         setting_main_appdata *ad = (setting_main_appdata *) cb;
1061
1062         if (ad->ly_main != NULL) {
1063                 /*evas_object_hide(ad->ly_main); */
1064         }
1065
1066         return SETTING_RETURN_SUCCESS;
1067 }
1068
1069
1070 /* ***************************************************
1071  *
1072  *general func
1073  *
1074  ***************************************************/
1075 /*/////////////////////////////////////////////////////////////////////////////////// */
1076
1077