Fix UI of region setting
[apps/core/preloaded/settings.git] / setting-phone / src / setting-phone.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  *@defgroup setting-phone
24  *UG creation code for setting-phone
25  *
26  * - display
27  * - event notification
28  * - dispaly language
29  * - region format
30  */
31
32 #include <setting-phone.h>
33 #include <libxml/xmlmemory.h>
34 #include <Ecore_X.h>
35 #include "unicode/unum.h"
36
37 #ifndef UG_MODULE_API
38 #define UG_MODULE_API __attribute__ ((visibility("default")))
39 #endif
40
41 setting_view *__get_phone_view_to_load(service_h service)
42 {
43         SETTING_TRACE_BEGIN;
44
45         char *viewtype = NULL;
46
47         service_get_extra_data(service, "viewtype", &viewtype);
48         if(!viewtype)
49                 return NULL;
50
51         SETTING_TRACE("viewtype:%s", viewtype);
52
53         if (!safeStrCmp(viewtype, "language")) {
54                 char *caller = NULL;
55
56                 service_get_extra_data(service, "caller", &caller);
57                 if (caller) {
58                         setting_view_node_table_register(&setting_view_phone_display_language, NULL);
59                         return &setting_view_phone_display_language;
60                 } else {
61                         setting_view_node_table_register(&setting_view_phone_language_region, NULL);
62                         setting_view_node_table_register(&setting_view_phone_display_language,
63                                                          &setting_view_phone_language_region);
64                         setting_view_node_table_register(&setting_view_phone_region_format,
65                                                          &setting_view_phone_language_region);
66
67                         return &setting_view_phone_language_region;
68                 }
69         } else {
70                 return NULL;    /* &setting_view_phone_main; */
71         }
72 }
73
74 Evas_Object *__get_phone_layout_to_return(service_h service, void *priv)
75 {
76         SETTING_TRACE_BEGIN;
77         SettingPhoneUG *phoneUG = priv;
78         char *viewtype = NULL;
79
80         service_get_extra_data(service, "viewtype", &viewtype);
81         if(!viewtype)
82                 return NULL;
83         SETTING_TRACE("viewtype:%s", viewtype);
84
85         if (!safeStrCmp(viewtype, "language")) {
86                 return phoneUG->ly_language;
87         } else {
88                 return NULL;    /* &setting_view_phone_main; */
89         }
90
91 }
92
93
94 const char *get_language_by_mobile_country_code(int mcc)
95 {
96         const char *simLanguage = NULL;
97
98         switch (mcc) {
99         case 262:               /* GERMAN */
100                 simLanguage = "de_DE.UTF-8";
101                 break;
102         case 204:               /* DUTCH */
103                 simLanguage = "nl_NL.UTF-8";
104                 break;
105         case 214:               /* SPAINISH */
106                 simLanguage = "es_ES.UTF-8";
107                 break;
108         case 268:               /* PORTUGUESE */
109                 simLanguage = "pt_PT.UTF-8";
110                 break;
111         case 202:               /* GREEK */
112                 simLanguage = "el_GR.UTF-8";
113                 break;
114         case 222:               /* ITALIAN */
115                 simLanguage = "it_IT.UTF-8";
116                 break;
117         case 208:               /* FRENCH */
118                 simLanguage = "fr_FR.UTF-8";
119                 break;
120         case 286:               /* TURKISH */
121                 simLanguage = "tr_TR.UTF-8";
122                 break;
123         case 450:               /* KOREAN */
124                 simLanguage = "ko_KR.UTF-8";
125                 break;
126         case 440:               /* JAPAN */
127                 simLanguage = "ja_JP.UTF-8";
128                 break;
129         case 460:               /* CHINA */
130                 simLanguage = "zh_CN.UTF-8";
131                 break;
132         case 454:               /* CANTONESE */
133                 simLanguage = "zh_HK.UTF-8";
134                 break;
135         case 466:               /* TAIWAN */
136                 simLanguage = "zh_TW.UTF-8";
137                 break;
138         case 250:               /* RUSSIAN */
139                 simLanguage = "ru_RU.UTF-8";
140                 break;
141         default:                /* get value from db/menu_widget/language at vconf */
142                 simLanguage = "en_US.UTF-8";
143                 break;
144         }
145         return simLanguage;
146
147 }
148
149
150 static void setting_phone_update_item(void *data)
151 {
152         setting_retm_if(data == NULL, "data is NULL");
153         SettingPhoneUG *ad = (SettingPhoneUG *) data;
154
155         Setting_GenGroupItem_Data* item_to_update = NULL;
156
157         item_to_update = ad->data_display_language;
158         retm_if (!item_to_update, "ad->data_display_language is NULL");
159
160         if (item_to_update) {
161                 item_to_update->sub_desc = get_pa_display_language_str();
162                 elm_object_item_data_set(item_to_update->item, item_to_update);
163                 elm_genlist_item_update(item_to_update->item);
164         }
165
166         char *pa_region = vconf_get_str(VCONFKEY_REGIONFORMAT);
167         if (pa_region == NULL) {
168                 SETTING_TRACE_ERROR
169                     ("[Error] get value of VCONFKEY_REGIONFORMAT fail.");
170                 return;
171         }
172
173         item_to_update = ad->data_region_fmt;
174         retm_if (!item_to_update, "ad->data_region_fmt is NULL");
175
176         if (item_to_update) {
177                 item_to_update->sub_desc = setting_phone_lang_get_region_str(pa_region);
178                 elm_object_item_data_set(item_to_update->item, item_to_update);
179                 elm_genlist_item_update(item_to_update->item);
180         }
181
182         if (ad->data_region_fmt_example) {
183                 char *example_desc =
184                     setting_phone_lang_get_example_desc(pa_region, ad);
185                 ad->data_region_fmt_example->keyStr =
186                     (char *)g_strdup(example_desc);
187                 FREE(example_desc);
188                 elm_object_item_data_set(ad->data_region_fmt_example->item, ad->data_region_fmt_example);
189                 elm_genlist_item_update(ad->data_region_fmt_example->item);
190         }
191
192 #if 0
193         if (ad->pop_progress)
194         {
195                 evas_object_del(ad->pop_progress);
196                 ad->popup = NULL;
197         }
198 #endif
199 }
200
201 char *setting_phone_lang_get_region_str(const char *region)
202 {
203         SETTING_TRACE_BEGIN;
204         setting_retvm_if(region == NULL, NULL, "region parameter is NULL");
205         const char *localeID = NULL;
206         UChar displayname[SETTING_STR_SLP_LEN] = { 0, };
207         UErrorCode status = U_ZERO_ERROR;
208         char *ret_str = NULL;
209
210         const char *pa_lang = vconf_get_str(VCONFKEY_LANGSET);
211         if (pa_lang) {
212                 char *q = strchr(pa_lang, '.');
213                 if (q) {
214                         *q = '\0';
215                 }   
216                 SETTING_TRACE("pa_lang:%s", pa_lang);
217                 int err = -1; 
218                 uloc_setDefault(pa_lang, &err);
219                 free((void *)pa_lang);
220                 pa_lang = NULL;
221         } else {
222                 SETTING_TRACE_ERROR("get vconf failed");
223         }
224
225         localeID = uloc_getDefault();
226         uloc_getDisplayName(region, localeID, displayname, SETTING_STR_SLP_LEN,
227                             &status);
228
229         if (U_FAILURE(status)) {
230                 SETTING_TRACE("NO : uloc_getDisplayName : %d ", status);
231         } else {
232                 SETTING_TRACE(" OK : uloc_getDisplayName : %s ", displayname);
233         }
234
235         char *str_displayname = setting_phone_lang_str_to_utf8(displayname);
236         ret_str = (char *)g_strdup(str_displayname);
237
238         if (str_displayname) {
239                 FREE(str_displayname);
240         }
241         return ret_str;
242 }
243
244 /**
245 * Change language string to UTF8 format, the invoker need to free the return string
246 *
247 * @param unichars The source string will be translated.
248 *
249 * @return UTF8 format string.
250 */
251 char *setting_phone_lang_str_to_utf8(const UChar *unichars)
252 {
253         retv_if(unichars == NULL, NULL);
254         int len = 0;
255         int len_str = 0;
256         int len_utf8 = 0;
257         char *str = NULL;
258         UErrorCode status = U_ZERO_ERROR;
259
260         len = u_strlen(unichars);
261         len_str = sizeof(char) *4 * (len + 1);
262         str = (char *)calloc(1, len_str);
263         if (!str)
264                 return NULL;
265
266         u_strToUTF8(str, len_str, &len_utf8, unichars, len, &status);
267         return str;
268 }
269
270 char *setting_phone_lang_get_by_pattern(const char *locale,
271                                                const char *skeleton, void *data)
272 {
273         setting_retvm_if(!locale, NULL, "locale parameter is NULL");
274         setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
275
276         SettingPhoneUG *ad = (SettingPhoneUG *) data;
277
278         char *ret_str = NULL;
279         UChar customSkeleton[SETTING_STR_SLP_LEN] = { 0, };
280         UErrorCode status = U_ZERO_ERROR;
281         UDateFormat *formatter = NULL;
282
283         UChar bestPattern[SETTING_STR_SLP_LEN] = { 0, };
284         UChar formatted[SETTING_STR_SLP_LEN] = { 0, };
285
286         char bestPatternString[SETTING_STR_SLP_LEN] = { 0, };
287         char formattedString[SETTING_STR_SLP_LEN] = { 0, };
288
289         u_uastrncpy(customSkeleton, skeleton, safeStrLen(skeleton));
290
291         if (ad->pattern_generator == NULL
292             || safeStrCmp(locale, ad->prev_locale) != 0) {
293                 if (ad->pattern_generator != NULL) {
294                         udatpg_close(ad->pattern_generator);
295                         ad->pattern_generator = NULL;
296                 }
297                 ad->pattern_generator = udatpg_open(locale, &status);
298         }
299
300         int32_t bestPatternCapacity =
301             (int32_t) (sizeof(bestPattern) / sizeof((bestPattern)[0]));
302         (void)udatpg_getBestPattern(ad->pattern_generator, customSkeleton,
303                                     u_strlen(customSkeleton), bestPattern,
304                                     bestPatternCapacity, &status);
305
306         u_austrcpy(bestPatternString, bestPattern);
307         SETTING_TRACE("BestPattern is %s", bestPatternString);
308
309         UDate date = ucal_getNow();
310         formatter =
311             udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, bestPattern,
312                       -1, &status);
313         int32_t formattedCapacity =
314             (int32_t) (sizeof(formatted) / sizeof((formatted)[0]));
315         (void)udat_format(formatter, date, formatted, formattedCapacity, NULL,
316                           &status);
317         u_austrcpy(formattedString, formatted);
318         SETTING_TRACE("DATE & TIME is %s", formattedString);
319
320         udat_close(formatter);
321
322         ret_str = g_strdup(formattedString);
323         return ret_str;
324 }
325
326 static char *__setting_phone_number_format_get(const char *region)
327 {
328         setting_retvm_if(region == NULL, NULL, "region parameter is NULL");
329         UNumberFormat *fmt = NULL;
330         UErrorCode status = U_ZERO_ERROR;
331         UChar number_uchar[MAX_DISPLAY_NAME_LEN_ON_UI] = {0,};
332         char number_char[MAX_DISPLAY_NAME_LEN_ON_UI] = {0,};
333         double example_number = 1234567.89;
334
335         fmt = unum_open(UNUM_DEFAULT, NULL, -1, region, NULL, &status);
336         unum_formatDouble(fmt, example_number, number_uchar, MAX_DISPLAY_NAME_LEN_ON_UI, NULL, &status);
337         u_austrcpy(number_char, number_uchar);
338         SETTING_TRACE("number_char = %s", number_char);
339         unum_close(fmt);
340
341         return g_strdup(number_char); /* should be freed by caller */
342 }
343
344 char *setting_phone_lang_get_example_desc(const char *region, void *data)
345 {
346         setting_retvm_if(region == NULL, NULL, "region parameter is NULL");
347         setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
348         char *date = setting_phone_lang_get_by_pattern(region,
349                                                        UDAT_YEAR_MONTH_WEEKDAY_DAY,
350                                                        data);
351
352         enum appcore_time_format timeformat = APPCORE_TIME_FORMAT_12;
353         int ret = appcore_get_timeformat(&timeformat);
354         if (ret == -1) {
355                 SETTING_TRACE_ERROR("call appcore_get_timeformat fail.");
356                 timeformat = APPCORE_TIME_FORMAT_12;
357         }
358
359         char *time_skeleton = "hhmm";
360         if (timeformat == APPCORE_TIME_FORMAT_24) {
361                 time_skeleton = "HHmm";
362         }
363
364         char *time = setting_phone_lang_get_by_pattern(region, time_skeleton, data);
365
366         char *number = __setting_phone_number_format_get(region);
367
368         Eina_Strbuf *temp_str = eina_strbuf_new();
369         char *r_str_text = NULL;
370         eina_strbuf_append_printf(temp_str,
371                                   "%s", _("IDS_ST_BODY_REGIONAL_EXAMPLE"));
372         eina_strbuf_append_printf(temp_str, "<br>%s : %s", _("IDS_ST_BODY_DATE"), date);
373         eina_strbuf_append_printf(temp_str, "<br>%s : %s", _("IDS_COM_BODY_DETAILS_TIME"), time);
374         eina_strbuf_append_printf(temp_str, "<br>%s : %s", _("IDS_ST_BODY_NUMBER"), number);
375
376         r_str_text = eina_strbuf_string_steal(temp_str);
377         /* eina_strbuf_string_free(temp_str); */
378         eina_strbuf_free(temp_str);
379         G_FREE(date);
380         G_FREE(time);
381         G_FREE(number);
382         return r_str_text;      /* will be freed in calling place */
383 }
384
385
386 static void setting_phone_ug_cb_resize(void *data, Evas *e, Evas_Object *obj,
387                                        void *event_info)
388 {
389         SettingPhoneUG *ad = (SettingPhoneUG *) data;
390         /* setting_view_update(&setting_view_about_main, ad); */
391         setting_view_update(ad->view_to_load, ad);
392 }
393
394 static void *setting_phone_ug_on_create(ui_gadget_h ug, enum ug_mode mode,
395                                         service_h service, void *priv)
396 {
397         setting_retvm_if((!priv), NULL, "!priv");
398         SETTING_TRACE_BEGIN;
399         SettingPhoneUG *phoneUG = priv;
400         phoneUG->ug = ug;
401
402         phoneUG->win_main_layout = (Evas_Object *) ug_get_parent_layout(ug);
403         phoneUG->win_get = (Evas_Object *) ug_get_window();
404         evas_object_show(phoneUG->win_main_layout);
405         phoneUG->evas = evas_object_evas_get(phoneUG->win_main_layout);
406
407         setting_retvm_if(phoneUG->win_main_layout == NULL, NULL,
408                          "cannot get main window ");
409
410         /* --------------------------------------------------------- */
411         char *pa_path = NULL;;
412
413         pa_path = vconf_get_str(VCONFKEY_LANGSET);
414         if (!pa_path) {
415                 SETTING_TRACE
416                     ("%s*** language setting has no proper value (nil) ***%s",
417                      SETTING_FONT_BGREEN, SETTING_FONT_BLACK);
418                 return NULL;
419         }
420         /* set launguage */
421         setting_set_i18n(SETTING_PACKAGE, SETTING_LOCALEDIR);
422         FREE(pa_path);
423         /* ---------------------------------------------------------     */
424         int value = 0;
425         int err;
426         int ret = setting_get_int_slp_key(INT_SLP_SETTING_SIM_SLOT, &value, &err);
427         if (ret != 0) {
428                 SETTING_TRACE("fail to get vconf");
429         }
430         if (value == VCONFKEY_TELEPHONY_SIM_INSERTED) {
431                 phoneUG->handle = tel_init(NULL);
432                 SETTING_TRACE("phoneUG->handle:%d", phoneUG->handle);
433                 memset(&(phoneUG->imsi), 0, sizeof(TelSimImsiInfo_t));
434                 if (phoneUG->handle
435                     && TAPI_API_SUCCESS == tel_get_sim_imsi(phoneUG->handle, &(phoneUG->imsi))) {
436                         SETTING_TRACE("********************************************");
437                         //SETTING_TRACE("imsi.bValid: [%d]", phoneUG->imsi.bValid);
438                         SETTING_TRACE("imsi.szMcc: [%s]", phoneUG->imsi.szMcc);
439                         SETTING_TRACE("imsi.szMnc: [%s]", phoneUG->imsi.szMnc);
440                         SETTING_TRACE("imsi.szMsin: [%s]", phoneUG->imsi.szMsin);
441                         SETTING_TRACE("********************************************");
442
443                         phoneUG->sim_lang = get_language_by_mobile_country_code(atoi(phoneUG->imsi.szMcc));
444                 }
445         }
446         if (!phoneUG->sim_lang) {
447                 /* if CSC has updated configuration for setting, initial vconf value changes. */
448                 phoneUG->sim_lang = vconf_get_str(VCONFKEY_LANGSET); /* allocated */
449         }
450         SETTING_TRACE("sim_lang: [%s]", phoneUG->sim_lang);
451
452         /* register view node table */
453         setting_view_node_table_intialize();
454
455         setting_create_Gendial_itc("dialogue/1text.1icon.2",
456                                    &(phoneUG->itc_1text_1icon_2));
457         setting_create_Gendial_itc("dialogue/1text.1icon",
458                                    &(phoneUG->itc_1text_1icon));
459
460         // 2 text - genlist > items
461         setting_create_Gendial_itc("dialogue/2text", &(phoneUG->itc_1icon_2text));
462
463         setting_create_Gendial_itc("dialogue/1text", &(phoneUG->itc_1text));
464         setting_create_Gendial_itc("dialogue/2text.3/expandable",
465                                    &(phoneUG->itc_2text_3_parent));
466         setting_create_Gendial_itc("dialogue/1text.1icon/expandable2",
467                                    &(phoneUG->itc_1icon_1text_sub));
468
469         phoneUG->itc_seperator.item_style = "dialogue/separator";
470         phoneUG->itc_seperator.func.text_get = NULL;
471         phoneUG->itc_seperator.func.content_get = NULL;
472         phoneUG->itc_seperator.func.state_get = NULL;
473         phoneUG->itc_seperator.func.del = NULL;
474
475         setting_create_Gendial_itc("dialogue/2text.3", &(phoneUG->itc_2text_2));
476         setting_create_Gendial_itc("multiline/1text",
477                                    &(phoneUG->itc_bg_1icon));
478         phoneUG->pattern_generator = NULL;
479         phoneUG->prev_locale = NULL;
480         /*  creating a view. */
481         phoneUG->bundle_data = service;
482         phoneUG->view_to_load = __get_phone_view_to_load(service);
483         setting_retvm_if(NULL == phoneUG->view_to_load, NULL,
484                          "NULL == phoneUG->view_to_load");
485         setting_view_node_set_cur_view(phoneUG->view_to_load);
486         setting_view_create(phoneUG->view_to_load, (void *)phoneUG);
487         evas_object_event_callback_add(phoneUG->win_main_layout,
488                                        EVAS_CALLBACK_RESIZE,
489                                        setting_phone_ug_cb_resize, phoneUG);
490         return __get_phone_layout_to_return(service, phoneUG);
491 }
492
493 static void setting_phone_ug_on_start(ui_gadget_h ug, service_h service,
494                                       void *priv)
495 {
496 }
497
498 static void setting_phone_ug_on_pause(ui_gadget_h ug, service_h service,
499                                       void *priv)
500 {
501 }
502
503 static void setting_phone_ug_on_resume(ui_gadget_h ug, service_h service,
504                                        void *priv)
505 {
506 }
507
508 static void setting_phone_ug_on_destroy(ui_gadget_h ug, service_h service,
509                                         void *priv)
510 {
511         SETTING_TRACE_BEGIN;
512         setting_retm_if((!ug || !priv), "!ug || !priv");
513         SettingPhoneUG *phoneUG = priv;
514
515         evas_object_event_callback_del(phoneUG->win_main_layout, EVAS_CALLBACK_RESIZE, setting_phone_ug_cb_resize);     /* fix flash issue for gallery */
516         phoneUG->ug = ug;
517
518         if (phoneUG->handle && tel_deinit(phoneUG->handle) != TAPI_API_SUCCESS) {
519                 SETTING_TRACE_ERROR("tel_deinit failed");
520         }
521         /*  called when this shared gadget is terminated. similar with app_exit */
522         if (&setting_view_phone_language_region == phoneUG->view_to_load) {
523                 setting_view_destroy(&setting_view_phone_display_language,
524                                      phoneUG);
525                 setting_view_destroy(&setting_view_phone_region_format,
526                                      phoneUG);
527                 setting_view_destroy(&setting_view_phone_language_region, phoneUG);
528         }
529
530         if (NULL != ug_get_layout(phoneUG->ug)) {
531                 evas_object_hide((Evas_Object *) ug_get_layout(phoneUG->ug));
532                 evas_object_del((Evas_Object *) ug_get_layout(phoneUG->ug));
533         }
534
535         SETTING_TRACE_END;
536 }
537
538 static void setting_phone_ug_on_message(ui_gadget_h ug, service_h msg,
539                                         service_h service, void *priv)
540 {
541         SETTING_TRACE_BEGIN;
542         setting_retm_if(NULL == priv, "priv is NULL");
543         char *pid_str = NULL;
544
545         service_get_extra_data(msg, "DEADPID", &pid_str);
546         if (pid_str)
547         {
548                 errno = 0;
549                 int pid = (int)g_ascii_strtod(pid_str, NULL);
550                 SETTING_TRACE_DEBUG("pid = %d",pid);
551                 setting_retm_if(errno == ERANGE, "call g_ascii_strtod fail");
552
553                 int ret = app_terminate_dead_cb(pid, priv);
554                 setting_retm_if(ret != 0, "call app_terminate_dead_cb fail");
555         }
556 }
557
558 static void setting_phone_ug_on_event(ui_gadget_h ug, enum ug_event event,
559                                       service_h service, void *priv)
560 {
561         SETTING_TRACE_BEGIN;
562
563         SettingPhoneUG *ad = (SettingPhoneUG *) priv;
564         switch (event) {
565         case UG_EVENT_LOW_MEMORY:
566                 break;
567         case UG_EVENT_LOW_BATTERY:
568                 break;
569         case UG_EVENT_REGION_CHANGE:
570         {
571                 if (ad->gl_lang_region && setting_view_phone_language_region.is_create) {
572                         elm_genlist_realized_items_update(ad->gl_lang_region);
573                         Elm_Object_Item *navi_it = elm_naviframe_top_item_get(ad->navi_bar);
574                         ret_if(!navi_it);
575                         elm_object_item_text_set(navi_it, _(KeyStr_LanguageRegion));
576                         setting_phone_update_item(ad);
577                 }
578         }
579         break;
580         case UG_EVENT_LANG_CHANGE:
581         {
582                 if (ad->gl_lang_region && setting_view_phone_language_region.is_create) {
583                         elm_genlist_realized_items_update(ad->gl_lang_region);
584                         Elm_Object_Item *navi_it = elm_naviframe_top_item_get(ad->navi_bar);
585                         ret_if(!navi_it);
586                         elm_object_item_text_set(navi_it, _(KeyStr_LanguageRegion));
587                         setting_phone_update_item(ad);
588                 }
589
590                 if (ad->pop_progress) {
591                         evas_object_del(ad->pop_progress);
592                         ad->popup = NULL;
593                 }
594         }
595         break;
596
597         case UG_EVENT_ROTATE_PORTRAIT:
598                 break;
599         case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
600                 break;
601         case UG_EVENT_ROTATE_LANDSCAPE:
602                 break;
603         case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
604                 break;
605         default:
606                 break;
607         }
608 }
609
610 static void setting_phone_ug_on_key_event(ui_gadget_h ug,
611                                           enum ug_key_event event,
612                                           service_h service, void *priv)
613 {
614         SETTING_TRACE_BEGIN;
615         SettingPhoneUG *ad = (SettingPhoneUG *) priv;
616
617         SETTING_TRACE("event:%d", event);
618         switch (event) {
619         case UG_KEY_EVENT_END:
620                 {
621                         if (elm_naviframe_top_item_get(ad->navi_bar) ==
622                            elm_naviframe_bottom_item_get(ad->navi_bar)) {
623                                 ug_destroy_me(ug);
624                         } else {
625                                 setting_view_cb_at_endKey(ad);
626                         }
627                 }
628                 break;
629         default:
630                 break;
631         }
632 }
633
634 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
635 {
636         SETTING_TRACE_BEGIN;
637         SettingPhoneUG *phoneUG = calloc(1, sizeof(SettingPhoneUG));
638         setting_retvm_if(!phoneUG, -1, "Create SettingPhoneUG obj failed");
639
640         ops->create = setting_phone_ug_on_create;
641         ops->start = setting_phone_ug_on_start;
642         ops->pause = setting_phone_ug_on_pause;
643         ops->resume = setting_phone_ug_on_resume;
644         ops->destroy = setting_phone_ug_on_destroy;
645         ops->message = setting_phone_ug_on_message;
646         ops->event = setting_phone_ug_on_event;
647         ops->key_event = setting_phone_ug_on_key_event;
648         ops->priv = phoneUG;
649         ops->opt = UG_OPT_INDICATOR_ENABLE;
650
651         return 0;
652 }
653
654 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
655 {
656         SETTING_TRACE_BEGIN;
657         struct SettingPhoneUG *phoneUG;
658         setting_retm_if(!ops, "ops == NULL");
659
660         phoneUG = ops->priv;
661         if (phoneUG)
662                 FREE(phoneUG);
663 }
664
665 /*****/
666 UG_MODULE_API int setting_plugin_reset(service_h service, void *priv)
667 {
668         SETTING_TRACE_BEGIN;
669
670         int ret = 0;
671         char *ug_type = NULL;
672
673         service_get_extra_data(service, "viewtype", &ug_type);
674 #if SUPPORT_RUN_SYSTEM_COMMAND
675         ret += excuteCmd(SETTING_POSTINST_FILE, 1, ug_type);
676 #else
677         if (0 == safeStrCmp(ug_type, "language")) {
678                 // INT_SLP_SETTING_LANG
679                 ret += vconf_set_int(VCONFKEY_SETAPPL_LANG_INT, 9);
680                 ret += vconf_set_str(VCONFKEY_LANGSET, "en_GB.UTF-8");
681                 ret += vconf_set_str(VCONFKEY_REGIONFORMAT,"en_GB.UTF-8");
682         }
683
684 #endif
685         if (0 == safeStrCmp(ug_type, "language"))
686         {
687                 SETTING_TRACE("Begin to reset language & region...");
688
689                 //b .reset default localeid
690                 int err = -1;
691                 uloc_setDefault("en_US", &err);
692
693                 //c. reset date&time format
694                 vconf_set_int(VCONFKEY_SETAPPL_DATE_FORMAT_INT, SETTING_DATE_FORMAT_DD_MM_YYYY);
695
696                 //d. terminate other apps
697                 // ret += aul_app_get_running_app_info(app_terminate_func, NULL);
698         }
699         /*  DO NOTHING */
700         return ret;
701
702 }
703
704 /*****/