4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
23 *@defgroup setting-phone
24 *UG creation code for setting-phone
27 * - event notification
32 #include <setting-phone.h>
33 #include <libxml/xmlmemory.h>
35 #include "unicode/unum.h"
38 #define UG_MODULE_API __attribute__ ((visibility("default")))
41 setting_view *__get_phone_view_to_load(service_h service)
45 char *viewtype = NULL;
47 service_get_extra_data(service, "viewtype", &viewtype);
51 SETTING_TRACE("viewtype:%s", viewtype);
53 if (!safeStrCmp(viewtype, "language")) {
56 service_get_extra_data(service, "caller", &caller);
58 setting_view_node_table_register(&setting_view_phone_display_language, NULL);
59 return &setting_view_phone_display_language;
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);
67 return &setting_view_phone_language_region;
70 return NULL; /* &setting_view_phone_main; */
74 Evas_Object *__get_phone_layout_to_return(service_h service, void *priv)
77 SettingPhoneUG *phoneUG = priv;
78 char *viewtype = NULL;
80 service_get_extra_data(service, "viewtype", &viewtype);
83 SETTING_TRACE("viewtype:%s", viewtype);
85 if (!safeStrCmp(viewtype, "language")) {
86 return phoneUG->ly_language;
88 return NULL; /* &setting_view_phone_main; */
94 const char *get_language_by_mobile_country_code(int mcc)
96 const char *simLanguage = NULL;
99 case 262: /* GERMAN */
100 simLanguage = "de_DE.UTF-8";
102 case 204: /* DUTCH */
103 simLanguage = "nl_NL.UTF-8";
105 case 214: /* SPAINISH */
106 simLanguage = "es_ES.UTF-8";
108 case 268: /* PORTUGUESE */
109 simLanguage = "pt_PT.UTF-8";
111 case 202: /* GREEK */
112 simLanguage = "el_GR.UTF-8";
114 case 222: /* ITALIAN */
115 simLanguage = "it_IT.UTF-8";
117 case 208: /* FRENCH */
118 simLanguage = "fr_FR.UTF-8";
120 case 286: /* TURKISH */
121 simLanguage = "tr_TR.UTF-8";
123 case 450: /* KOREAN */
124 simLanguage = "ko_KR.UTF-8";
126 case 440: /* JAPAN */
127 simLanguage = "ja_JP.UTF-8";
129 case 460: /* CHINA */
130 simLanguage = "zh_CN.UTF-8";
132 case 454: /* CANTONESE */
133 simLanguage = "zh_HK.UTF-8";
135 case 466: /* TAIWAN */
136 simLanguage = "zh_TW.UTF-8";
138 case 250: /* RUSSIAN */
139 simLanguage = "ru_RU.UTF-8";
141 default: /* get value from db/menu_widget/language at vconf */
142 simLanguage = "en_US.UTF-8";
150 static void setting_phone_update_item(void *data)
152 setting_retm_if(data == NULL, "data is NULL");
153 SettingPhoneUG *ad = (SettingPhoneUG *) data;
155 Setting_GenGroupItem_Data* item_to_update = NULL;
157 item_to_update = ad->data_display_language;
158 retm_if (!item_to_update, "ad->data_display_language is NULL");
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);
166 char *pa_region = vconf_get_str(VCONFKEY_REGIONFORMAT);
167 if (pa_region == NULL) {
169 ("[Error] get value of VCONFKEY_REGIONFORMAT fail.");
173 item_to_update = ad->data_region_fmt;
174 retm_if (!item_to_update, "ad->data_region_fmt is NULL");
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);
182 if (ad->data_region_fmt_example) {
184 setting_phone_lang_get_example_desc(pa_region, ad);
185 ad->data_region_fmt_example->keyStr =
186 (char *)g_strdup(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);
193 if (ad->pop_progress)
195 evas_object_del(ad->pop_progress);
201 char *setting_phone_lang_get_region_str(const char *region)
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;
210 const char *pa_lang = vconf_get_str(VCONFKEY_LANGSET);
212 char *q = strchr(pa_lang, '.');
216 SETTING_TRACE("pa_lang:%s", pa_lang);
218 uloc_setDefault(pa_lang, &err);
219 free((void *)pa_lang);
222 SETTING_TRACE_ERROR("get vconf failed");
225 localeID = uloc_getDefault();
226 uloc_getDisplayName(region, localeID, displayname, SETTING_STR_SLP_LEN,
229 if (U_FAILURE(status)) {
230 SETTING_TRACE("NO : uloc_getDisplayName : %d ", status);
232 SETTING_TRACE(" OK : uloc_getDisplayName : %s ", displayname);
235 char *str_displayname = setting_phone_lang_str_to_utf8(displayname);
236 ret_str = (char *)g_strdup(str_displayname);
238 if (str_displayname) {
239 FREE(str_displayname);
245 * Change language string to UTF8 format, the invoker need to free the return string
247 * @param unichars The source string will be translated.
249 * @return UTF8 format string.
251 char *setting_phone_lang_str_to_utf8(const UChar *unichars)
253 retv_if(unichars == NULL, NULL);
258 UErrorCode status = U_ZERO_ERROR;
260 len = u_strlen(unichars);
261 len_str = sizeof(char) *4 * (len + 1);
262 str = (char *)calloc(1, len_str);
266 u_strToUTF8(str, len_str, &len_utf8, unichars, len, &status);
270 char *setting_phone_lang_get_by_pattern(const char *locale,
271 const char *skeleton, void *data)
273 setting_retvm_if(!locale, NULL, "locale parameter is NULL");
274 setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
276 SettingPhoneUG *ad = (SettingPhoneUG *) data;
278 char *ret_str = NULL;
279 UChar customSkeleton[SETTING_STR_SLP_LEN] = { 0, };
280 UErrorCode status = U_ZERO_ERROR;
281 UDateFormat *formatter = NULL;
283 UChar bestPattern[SETTING_STR_SLP_LEN] = { 0, };
284 UChar formatted[SETTING_STR_SLP_LEN] = { 0, };
286 char bestPatternString[SETTING_STR_SLP_LEN] = { 0, };
287 char formattedString[SETTING_STR_SLP_LEN] = { 0, };
289 u_uastrncpy(customSkeleton, skeleton, safeStrLen(skeleton));
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;
297 ad->pattern_generator = udatpg_open(locale, &status);
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);
306 u_austrcpy(bestPatternString, bestPattern);
307 SETTING_TRACE("BestPattern is %s", bestPatternString);
309 UDate date = ucal_getNow();
311 udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, bestPattern,
313 int32_t formattedCapacity =
314 (int32_t) (sizeof(formatted) / sizeof((formatted)[0]));
315 (void)udat_format(formatter, date, formatted, formattedCapacity, NULL,
317 u_austrcpy(formattedString, formatted);
318 SETTING_TRACE("DATE & TIME is %s", formattedString);
320 udat_close(formatter);
322 ret_str = g_strdup(formattedString);
326 static char *__setting_phone_number_format_get(const char *region)
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;
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);
341 return g_strdup(number_char); /* should be freed by caller */
344 char *setting_phone_lang_get_example_desc(const char *region, void *data)
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,
352 enum appcore_time_format timeformat = APPCORE_TIME_FORMAT_12;
353 int ret = appcore_get_timeformat(&timeformat);
355 SETTING_TRACE_ERROR("call appcore_get_timeformat fail.");
356 timeformat = APPCORE_TIME_FORMAT_12;
359 char *time_skeleton = "hhmm";
360 if (timeformat == APPCORE_TIME_FORMAT_24) {
361 time_skeleton = "HHmm";
364 char *time = setting_phone_lang_get_by_pattern(region, time_skeleton, data);
366 char *number = __setting_phone_number_format_get(region);
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);
376 r_str_text = eina_strbuf_string_steal(temp_str);
377 /* eina_strbuf_string_free(temp_str); */
378 eina_strbuf_free(temp_str);
382 return r_str_text; /* will be freed in calling place */
386 static void setting_phone_ug_cb_resize(void *data, Evas *e, Evas_Object *obj,
389 SettingPhoneUG *ad = (SettingPhoneUG *) data;
390 /* setting_view_update(&setting_view_about_main, ad); */
391 setting_view_update(ad->view_to_load, ad);
394 static void *setting_phone_ug_on_create(ui_gadget_h ug, enum ug_mode mode,
395 service_h service, void *priv)
397 setting_retvm_if((!priv), NULL, "!priv");
399 SettingPhoneUG *phoneUG = priv;
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);
407 setting_retvm_if(phoneUG->win_main_layout == NULL, NULL,
408 "cannot get main window ");
410 /* --------------------------------------------------------- */
411 char *pa_path = NULL;;
413 pa_path = vconf_get_str(VCONFKEY_LANGSET);
416 ("%s*** language setting has no proper value (nil) ***%s",
417 SETTING_FONT_BGREEN, SETTING_FONT_BLACK);
421 setting_set_i18n(SETTING_PACKAGE, SETTING_LOCALEDIR);
423 /* --------------------------------------------------------- */
426 int ret = setting_get_int_slp_key(INT_SLP_SETTING_SIM_SLOT, &value, &err);
428 SETTING_TRACE("fail to get vconf");
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));
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("********************************************");
443 phoneUG->sim_lang = get_language_by_mobile_country_code(atoi(phoneUG->imsi.szMcc));
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 */
450 SETTING_TRACE("sim_lang: [%s]", phoneUG->sim_lang);
452 /* register view node table */
453 setting_view_node_table_intialize();
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));
460 // 2 text - genlist > items
461 setting_create_Gendial_itc("dialogue/2text", &(phoneUG->itc_1icon_2text));
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));
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;
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);
493 static void setting_phone_ug_on_start(ui_gadget_h ug, service_h service,
498 static void setting_phone_ug_on_pause(ui_gadget_h ug, service_h service,
503 static void setting_phone_ug_on_resume(ui_gadget_h ug, service_h service,
508 static void setting_phone_ug_on_destroy(ui_gadget_h ug, service_h service,
512 setting_retm_if((!ug || !priv), "!ug || !priv");
513 SettingPhoneUG *phoneUG = priv;
515 evas_object_event_callback_del(phoneUG->win_main_layout, EVAS_CALLBACK_RESIZE, setting_phone_ug_cb_resize); /* fix flash issue for gallery */
518 if (phoneUG->handle && tel_deinit(phoneUG->handle) != TAPI_API_SUCCESS) {
519 SETTING_TRACE_ERROR("tel_deinit failed");
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,
525 setting_view_destroy(&setting_view_phone_region_format,
527 setting_view_destroy(&setting_view_phone_language_region, phoneUG);
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));
538 static void setting_phone_ug_on_message(ui_gadget_h ug, service_h msg,
539 service_h service, void *priv)
542 setting_retm_if(NULL == priv, "priv is NULL");
543 char *pid_str = NULL;
545 service_get_extra_data(msg, "DEADPID", &pid_str);
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");
553 int ret = app_terminate_dead_cb(pid, priv);
554 setting_retm_if(ret != 0, "call app_terminate_dead_cb fail");
558 static void setting_phone_ug_on_event(ui_gadget_h ug, enum ug_event event,
559 service_h service, void *priv)
563 SettingPhoneUG *ad = (SettingPhoneUG *) priv;
565 case UG_EVENT_LOW_MEMORY:
567 case UG_EVENT_LOW_BATTERY:
569 case UG_EVENT_REGION_CHANGE:
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);
575 elm_object_item_text_set(navi_it, _(KeyStr_LanguageRegion));
576 setting_phone_update_item(ad);
580 case UG_EVENT_LANG_CHANGE:
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);
586 elm_object_item_text_set(navi_it, _(KeyStr_LanguageRegion));
587 setting_phone_update_item(ad);
590 if (ad->pop_progress) {
591 evas_object_del(ad->pop_progress);
597 case UG_EVENT_ROTATE_PORTRAIT:
599 case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
601 case UG_EVENT_ROTATE_LANDSCAPE:
603 case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
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)
615 SettingPhoneUG *ad = (SettingPhoneUG *) priv;
617 SETTING_TRACE("event:%d", event);
619 case UG_KEY_EVENT_END:
621 if (elm_naviframe_top_item_get(ad->navi_bar) ==
622 elm_naviframe_bottom_item_get(ad->navi_bar)) {
625 setting_view_cb_at_endKey(ad);
634 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
637 SettingPhoneUG *phoneUG = calloc(1, sizeof(SettingPhoneUG));
638 setting_retvm_if(!phoneUG, -1, "Create SettingPhoneUG obj failed");
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;
649 ops->opt = UG_OPT_INDICATOR_ENABLE;
654 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
657 struct SettingPhoneUG *phoneUG;
658 setting_retm_if(!ops, "ops == NULL");
666 UG_MODULE_API int setting_plugin_reset(service_h service, void *priv)
671 char *ug_type = NULL;
673 service_get_extra_data(service, "viewtype", &ug_type);
674 #if SUPPORT_RUN_SYSTEM_COMMAND
675 ret += excuteCmd(SETTING_POSTINST_FILE, 1, ug_type);
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");
685 if (0 == safeStrCmp(ug_type, "language"))
687 SETTING_TRACE("Begin to reset language & region...");
689 //b .reset default localeid
691 uloc_setDefault("en_US", &err);
693 //c. reset date&time format
694 vconf_set_int(VCONFKEY_SETAPPL_DATE_FORMAT_INT, SETTING_DATE_FORMAT_DD_MM_YYYY);
696 //d. terminate other apps
697 // ret += aul_app_get_running_app_info(app_terminate_func, NULL);