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.
21 #include <setting-phone-region-format.h>
23 #define MAX_REGION_STRLEN 256
25 static int setting_phone_region_format_create(void *cb);
26 static int setting_phone_region_format_destroy(void *cb);
27 static int setting_phone_region_format_cleanup(void *cb);
29 setting_view setting_view_phone_region_format = {
30 .create = setting_phone_region_format_create,
31 .destroy = setting_phone_region_format_destroy,
33 .cleanup = setting_phone_region_format_cleanup,
36 static char *__region_format_vconf_str_get();
37 static Eina_Bool __region_animator_cb(void *data);
38 static void __region_genlist_create(void *data);
39 static Eina_Bool __region_genlist_update(void *data);
40 static void __searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info);
42 static int setting_phone_region_format_get_region_fmt(char *list[],
44 /*[OUT]*/ char *region_keyStr[],
47 const char *loc_list = NULL;
49 UChar lang[LANGUAGE_STR_LEN] = { 0, };
50 UChar country[COUNTRY_STR_LEN] = { 0, };
51 UChar variant[SETTING_STR_SLP_LEN] = { 0, };
52 UChar displayname[SETTING_STR_SLP_LEN] = { 0, };
53 const char *localeID = NULL;
54 UErrorCode language_status = U_ZERO_ERROR;
55 UErrorCode country_status = U_ZERO_ERROR;
56 UErrorCode variant_status = U_ZERO_ERROR;
57 UErrorCode displayname_status = U_ZERO_ERROR;
59 int tmp_region_num = 0;
62 char *str_lang = NULL;
63 char *str_country = NULL;
64 char *str_variant = NULL;
65 char *str_displayname = NULL;
66 Eina_List *region_list = NULL;
68 loc_count = uloc_countAvailable();
71 localeID = uloc_getDefault();
72 SETTING_TRACE("localeID = %s", localeID);
74 for (; i < loc_count; i++) {
75 if (tmp_region_num >= REGION_ITEM_MAX)
78 loc_list = uloc_getAvailable(i);
80 /* SETTING_TRACE("loc_list = %s", loc_list); */
81 uloc_getDisplayLanguage(loc_list, localeID, lang, LANGUAGE_STR_LEN, &language_status);
82 if (U_FAILURE(language_status)) {
83 SETTING_TRACE_ERROR("language_status got an error %s:%d ", language_status,language_status);
84 language_status = U_ZERO_ERROR; /* set the value to the initial value */
87 uloc_getDisplayCountry(loc_list, localeID, country, COUNTRY_STR_LEN, &country_status);
88 if (U_FAILURE(country_status)) {
89 SETTING_TRACE_ERROR("country_status got an error %s:%d ", country, country_status);
90 country_status = U_ZERO_ERROR; /* set the value to the initial value */
93 uloc_getDisplayVariant(loc_list, localeID, variant, SETTING_STR_SLP_LEN, &variant_status);
94 if (U_FAILURE(variant_status)) {
95 SETTING_TRACE_ERROR("variant_status got an error %s:%d ", variant, variant_status);
96 variant_status = U_ZERO_ERROR; /* set the value to the initial value */
99 uloc_getDisplayName(loc_list, localeID, displayname, SETTING_STR_SLP_LEN, &displayname_status);
100 if (U_FAILURE(displayname_status)) {
101 SETTING_TRACE_ERROR("displayname_status got an error %s:%d ", displayname, displayname_status);
102 displayname_status = U_ZERO_ERROR; /* set the value to the initial value */
105 str_lang = setting_phone_lang_str_to_utf8(lang);
106 str_country = setting_phone_lang_str_to_utf8(country);
107 str_variant = setting_phone_lang_str_to_utf8(variant);
108 str_displayname = setting_phone_lang_str_to_utf8(displayname);
110 /* filter which has variant */
111 if (str_lang != NULL && str_country != NULL
112 && safeStrLen(str_country) > 1 && safeStrLen(str_variant) == 0) {
113 Setting_Region_Table *item_data = (Setting_Region_Table *) calloc(1, sizeof(Setting_Region_Table));
114 //setting_retvm_if(item_data == NULL, -1, "calloc failed")
116 if(item_data == NULL) {
117 SETTING_TRACE_ERROR("calloc failed");
121 FREE(str_displayname);
125 item_data->desc = (char *)g_strdup(str_displayname);
126 item_data->key = (char *)g_strdup(loc_list);
127 region_list = eina_list_append(region_list, item_data);
134 FREE(str_displayname);
137 region_list = eina_list_sort(region_list, eina_list_count(region_list),
138 setting_phone_region_format_compare_cb);
140 Eina_List *iter = NULL;
141 Setting_Region_Table *item_data = NULL;
143 EINA_LIST_FOREACH(region_list, iter, item_data) {
145 list[i] = (char *)g_strdup(item_data->desc);
147 region_keyStr[i] = (char *)g_strdup(item_data->key);
154 eina_list_free(region_list);
155 SETTING_TRACE("region_num = %d", tmp_region_num);
156 *region_num = tmp_region_num;
160 static char *__region_format_vconf_str_get()
163 char *tempstr = vconf_get_str(VCONFKEY_REGIONFORMAT);
164 setting_retvm_if(NULL == tempstr, NULL, "NULL == tempstr");
166 char *str_region = NULL;
167 char* p = strchr(tempstr, '.');
169 int len = safeStrLen(tempstr) - safeStrLen(".UTF-8");
172 str_region = strndup(tempstr, len); //.UTF8 => 5
174 str_region = (char *)g_strdup(tempstr);
175 SETTING_TRACE_ERROR("region format vconf stored error");
178 str_region = (char *)g_strdup("en_US");
185 static Eina_Bool __region_animator_cb(void *data)
187 //SETTING_TRACE_BEGIN;
188 setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
189 SettingPhoneUG *ad = (SettingPhoneUG *) data;
191 Setting_GenGroupItem_Data *item_data = NULL;
192 if (ad->gl_region_cur_index >= ad->region_num) {
194 ecore_animator_del(ad->animator);
197 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
198 if (ad->pop_progress) {
199 SETTING_TRACE("To delete ad->pop_progress");
200 evas_object_del(ad->pop_progress);
201 ad->pop_progress = NULL;
204 if (ad->selected_item) {
206 elm_genlist_item_show(ad->selected_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
208 ad->prev_region = ad->selected_region_idx;
210 Elm_Object_Item *item = NULL;
211 item = elm_genlist_item_append(ad->gl_region, &itc_bottom_seperator, NULL, NULL,
212 ELM_GENLIST_ITEM_NONE, NULL, NULL);
213 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
214 return ECORE_CALLBACK_CANCEL;
217 int i = ad->gl_region_cur_index++;
218 if (isEmptyStr(ad->search_text) || is_substr_ncase(ad->region_desc[i], ad->search_text)) {
220 setting_create_Gendial_field_1radio(ad->gl_region,
221 &(ad->itc_1text_1icon_2),
222 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
227 ad->region_desc[i]/* HERE */, NULL);
230 item_data->userdata = ad;
232 SETTING_TRACE_ERROR("item_data is NULL");
235 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
236 ad->selected_region_idx = i;
237 if (item_data) ad->selected_item = item_data->item;
241 return ECORE_CALLBACK_RENEW;
245 static void __region_genlist_create(void *data)
248 setting_retm_if(NULL == data, "data is NULL");
249 SettingPhoneUG *ad = (SettingPhoneUG *) data;
251 if (ad->pop_progress) {
252 evas_object_del(ad->pop_progress);
253 ad->pop_progress = NULL;
255 ad->pop_progress = setting_create_popup_with_progressbar(ad, ad->win_get,
257 NULL, NULL, NULL, 0, TRUE, TRUE);
259 elm_genlist_clear(ad->gl_region);
260 G_FREE(ad->region_vconf_str);
261 ad->region_vconf_str = __region_format_vconf_str_get();
263 Elm_Object_Item *item = NULL;
264 item = elm_genlist_item_append(ad->gl_region, &(ad->itc_seperator), NULL, NULL,
265 ELM_GENLIST_ITEM_NONE, NULL, NULL);
266 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
268 Setting_GenGroupItem_Data *item_data = NULL;
269 ad->gl_region_index = 0;
270 ad->selected_item = NULL;
271 ad->selected_region_idx = -1;
274 for (; i < ad->region_num; i++) {
275 if (ad->gl_region_index >
276 SETTING_PHONE_REGION_FORMAT_ANIMATOR_START_INDEX) {
280 if (isEmptyStr(ad->search_text) ||
281 is_substr_ncase(ad->region_desc[i], ad->search_text)) {
283 setting_create_Gendial_field_1radio(ad->gl_region,
284 &(ad->itc_1text_1icon_2),
285 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
290 ad->region_desc[i], NULL);
292 item_data->userdata = ad;
294 SETTING_TRACE_ERROR("item_data is NULL");
297 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
298 ad->selected_region_idx = i;
300 ad->selected_item = item_data->item;
303 ad->gl_region_index++;
306 ad->gl_region_cur_index = i;
308 if (ad->selected_region_idx > -1) {
309 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
310 ad->prev_region = ad->selected_region_idx;
312 if (ad->gl_region_cur_index < ad->region_num &&
313 ad->gl_region_index > SETTING_PHONE_REGION_FORMAT_ANIMATOR_START_INDEX) {
314 //to continue adding items using animator
315 SETTING_TRACE("to continue adding items using animator");
317 ecore_animator_del(ad->animator);
321 ad->animator = ecore_animator_add(__region_animator_cb, ad);
323 else {//had finished adding items
324 SETTING_TRACE("had finished adding items");
325 if(ad->selected_item) {
326 //show the selected_item item
327 elm_genlist_item_show(ad->selected_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
329 if (ad->pop_progress) {
330 SETTING_TRACE("To delete ad->pop_progress");
331 evas_object_del(ad->pop_progress);
332 ad->pop_progress = NULL;
337 static Eina_Bool __region_genlist_update(void *data)
340 setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
341 SettingPhoneUG *ad = (SettingPhoneUG *) data;
343 elm_genlist_clear(ad->gl_region);
344 G_FREE(ad->region_vconf_str);
345 ad->region_vconf_str = __region_format_vconf_str_get();
347 Setting_GenGroupItem_Data *item_data = NULL;
348 ad->selected_region_idx = -1;
351 for (; i < ad->region_num; i++) {
352 if (isEmptyStr(ad->search_text) ||
353 is_substr_ncase(ad->region_desc[i], ad->search_text)) {
355 setting_create_Gendial_field_1radio(ad->gl_region,
356 &(ad->itc_1text_1icon_2),
357 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
362 ad->region_desc[i], NULL);
364 item_data->userdata = ad;
366 SETTING_TRACE_ERROR("item_data is NULL");
369 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
370 ad->selected_region_idx = i;
375 if (ad->selected_region_idx > -1) {
376 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
379 ad->search_idler = NULL;
380 return ECORE_CALLBACK_CANCEL;
383 static void __searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info)
386 setting_retm_if(data == NULL, "Data parameter is NULL");
387 SettingPhoneUG *ad = (SettingPhoneUG *)data;
388 setting_searchbar_redraw(ad, ad->search_bar, ad->search_text,
390 __region_genlist_update);
393 /* ***************************************************
397 ***************************************************/
399 static int setting_phone_region_format_create(void *cb)
403 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
405 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
406 Evas_Object *sub_layout = elm_layout_add(ad->navi_bar);
407 elm_layout_theme_set(sub_layout, "layout", "application", "searchbar_base");
408 elm_object_signal_emit(sub_layout, "elm,state,show,searchbar", "elm");
410 setting_push_layout_navi_bar(_("IDS_ST_BODY_REGION"),
411 _("IDS_COM_BODY_BACK"),
414 setting_phone_region_format_click_softkey_cancel_cb,
416 NULL, ad, sub_layout, ad->navi_bar, NULL);
418 ad->gl_region = elm_genlist_add(ad->navi_bar);
419 elm_object_style_set(ad->gl_region, "dialogue");
421 ad->chk_region = elm_radio_add(ad->gl_region);
422 elm_radio_state_value_set(ad->chk_region, -1);
423 elm_radio_value_set(ad->chk_region, -1);
425 int ret = setting_phone_region_format_get_region_fmt(ad->region_desc,
430 SETTING_TRACE_ERROR("get region format list failed");
434 memset(ad->search_text, '\0', MAX_SEARCH_STR_LEN + 1);
436 __region_genlist_create(ad);
438 ad->search_bar = setting_create_searchbar(ad, sub_layout, __searchbar_changed_cb, NULL);
440 elm_object_part_content_set(sub_layout, "elm.swallow.content", ad->gl_region);
442 setting_view_phone_region_format.is_create = 1;
444 return SETTING_RETURN_SUCCESS;
447 static int setting_phone_region_format_destroy(void *cb)
451 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
452 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
454 /* FIXED : destroy only if it was created. */
455 if (setting_view_phone_region_format.is_create) {
456 if (ad->gl_region!= NULL) {
457 elm_genlist_clear(ad->gl_region);
458 evas_object_del(ad->gl_region);
459 ad->gl_region = NULL;
461 if (ad->search_idler) {
462 ecore_idler_del(ad->search_idler);
463 ad->search_idler = NULL;
467 ecore_animator_del(ad->animator);
471 evas_object_del(ad->popup);
474 if (ad->pop_progress) {
475 evas_object_del(ad->pop_progress);
476 ad->pop_progress = NULL;
479 elm_naviframe_item_pop(ad->navi_bar);
480 setting_view_phone_region_format.is_create = 0;
483 return SETTING_RETURN_SUCCESS;
486 static int setting_phone_region_format_cleanup(void *cb)
490 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
491 setting_phone_region_format_destroy(cb);
492 return SETTING_RETURN_SUCCESS;
496 setting_phone_region_format_click_softkey_cancel_cb(void *data,
501 retm_if(data == NULL, "Data parameter is NULL");
502 SettingPhoneUG *ad = (SettingPhoneUG *) data;
503 setting_view_change(&setting_view_phone_region_format,
504 &setting_view_phone_language_region, ad);
508 setting_phone_region_format_mouse_up_Gendial_list_radio_cb(void *data,
513 setting_retm_if(data == NULL, "Data parameter is NULL");
514 setting_retm_if(event_info == NULL,
515 "Invalid argument: event info is NULL");
517 Evas_Object *radio = (Evas_Object *) data;
518 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
519 elm_genlist_item_selected_set(item, 0);
520 Setting_GenGroupItem_Data *list_item =
521 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
522 SettingPhoneUG *ad = (SettingPhoneUG *) list_item->userdata;
528 SETTING_TRACE("region_keyStr = %s",
529 ad->region_keyStr[list_item->chk_status]);
530 /* if not change, return */
531 if (ad->prev_region == list_item->chk_status) {
534 elm_radio_value_set(radio, list_item->chk_status);
536 setting_phone_region_format_close_popup_ex(ad);
539 static void setting_phone_region_format_close_popup_ex(void *data)
542 setting_retm_if(data == NULL, "Data parameter is NULL");
543 SettingPhoneUG *ad = (SettingPhoneUG *) data;
546 "IDS_ST_BODY_CHANGING_REGION_WILL_CLOSE_ALL_APPLICATIONS_AND_UNSAVED_DATA_WILL_BE_LOST_CONTINUE_Q";
547 ad->popup_cb = setting_phone_region_format_exit_cb_ex;
548 ad->popup = setting_create_popup_with_btn(ad, ad->win_get, NULL,
549 _(msg), ad->popup_cb, 0, 2,
550 _("IDS_COM_SK_YES"), _("IDS_COM_SK_NO"));
555 setting_phone_region_format_exit_cb_ex(void *data, Evas_Object *obj,
559 setting_retm_if(data == NULL, "Data parameter is NULL");
560 SettingPhoneUG *ad = (SettingPhoneUG *) data;
562 switch (btn_type(obj)) {
563 case POPUP_RESPONSE_OK:
565 ad->prev_region = elm_radio_value_get(ad->chk_region);
566 SETTING_TRACE("cur_chk_region = %d", ad->prev_region);
568 char region[MAX_REGION_STRLEN];
569 memset(region, 0x00, MAX_REGION_STRLEN);
570 snprintf(region, MAX_REGION_STRLEN, "%s.UTF-8", ad->region_keyStr[ad->prev_region]);
573 setting_phone_region_format_set_dateformat
574 (ad->region_keyStr[ad->prev_region], ad);
575 setting_retm_if(ret == SETTING_RETURN_FAIL,
576 "[Error] set date format fail");
579 vconf_set_str(VCONFKEY_REGIONFORMAT,region);
580 setting_retm_if(ret != 0,
581 "[Error] set value of VCONFKEY_REGIONFORMAT fail");
583 /* after lang-change, go back to the previous page*/
584 setting_view_change(&setting_view_phone_region_format ,
585 &setting_view_phone_language_region, ad);
589 case POPUP_RESPONSE_CANCEL:
591 elm_radio_value_set(ad->chk_region, ad->prev_region);
593 evas_object_del(ad->popup);
601 evas_object_del(ad->popup);
609 evas_object_del(ad->popup);
616 setting_phone_region_format_compare_cb(const void *d1, const void *d2)
618 Setting_Region_Table *r1 = (Setting_Region_Table *) d1;
619 Setting_Region_Table *r2 = (Setting_Region_Table *) d2;
620 return safeStrCmp(r1->desc, r2->desc);
623 static int setting_phone_region_format_set_dateformat(const char *region,
626 /* SETTING_TRACE_BEGIN; */
627 setting_retvm_if(!region, SETTING_RETURN_FAIL,
628 "region parameter is NULL");
629 setting_retvm_if(data == NULL, SETTING_RETURN_FAIL,
630 "Data parameter is NULL");
632 SettingPhoneUG *ad = (SettingPhoneUG *) data;
634 char *ret_str = NULL;
636 UChar customSkeleton[SETTING_STR_SLP_LEN] = { 0, };
637 UErrorCode status = U_ZERO_ERROR;
639 UChar bestPattern[SETTING_STR_SLP_LEN] = { 0, };
640 char bestPatternString[SETTING_STR_SLP_LEN] = { 0, };
641 char *skeleton = DATA_FORMAT_SKELETON;
643 uret = u_uastrncpy(customSkeleton, skeleton, safeStrLen(skeleton));
644 setting_retvm_if(!uret, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
646 if (ad->pattern_generator == NULL
647 || safeStrCmp(region, ad->prev_locale) != 0) {
648 if (ad->pattern_generator != NULL) {
649 udatpg_close(ad->pattern_generator);
650 ad->pattern_generator = NULL;
652 ad->pattern_generator = udatpg_open(region, &status);
655 int32_t bestPatternCapacity =
656 (int32_t) (sizeof(bestPattern) / sizeof((bestPattern)[0]));
657 (void)udatpg_getBestPattern(ad->pattern_generator, customSkeleton,
658 u_strlen(customSkeleton), bestPattern,
659 bestPatternCapacity, &status);
661 ret_str = u_austrcpy(bestPatternString, bestPattern);
662 setting_retvm_if(!ret_str, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
663 /* SETTING_TRACE("bestPatternString : %s, bestPatternLength: %d", bestPatternString, bestPatternLength); */
667 int len = safeStrLen(bestPatternString);
668 char region_format[len];
669 /* only save 'y', 'M', 'd' charactor */
670 for (; i < len; i++) {
671 if (bestPatternString[i] == 'y' || bestPatternString[i] == 'M'
672 || bestPatternString[i] == 'd') {
673 region_format[j++] = bestPatternString[i];
676 region_format[len] = '\0';
678 char *date_format_str[DATA_FORMAT_CATEGORY_NUM] = {
679 "dMy", "Mdy", "yMd", "ydM" };
680 int date_format_vconf_value = DATA_FORMAT_DEFAULT; /* default is "Mdy" */
681 for (i = 0; i < DATA_FORMAT_CATEGORY_NUM; i++) {
682 if (!safeStrCmp(region_format, date_format_str[i])) {
683 date_format_vconf_value = i;
686 SETTING_TRACE("bestPatternString : %s, format: %s, index: %d",
687 bestPatternString, region_format,
688 date_format_vconf_value);
690 int err = SETTING_RETURN_SUCCESS;
691 setting_set_int_slp_key(INT_SLP_SETTING_DATE_FORMAT,
692 date_format_vconf_value, &err);
693 setting_retvm_if(err == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL,
695 G_FREE(ad->prev_locale);
696 ad->prev_locale = (char *)g_strdup(region);
697 return SETTING_RETURN_SUCCESS;