3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 #include <setting-phone-region-format.h>
19 #define MAX_REGION_STRLEN 256
21 static int setting_phone_region_format_create(void *cb);
22 static int setting_phone_region_format_destroy(void *cb);
23 static int setting_phone_region_format_cleanup(void *cb);
25 setting_view setting_view_phone_region_format = {
26 .create = setting_phone_region_format_create,
27 .destroy = setting_phone_region_format_destroy,
29 .cleanup = setting_phone_region_format_cleanup,
32 static char *__region_format_vconf_str_get();
33 static Eina_Bool __region_animator_cb(void *data);
34 static void __region_genlist_create(void *data);
35 static Eina_Bool __region_genlist_update(void *data);
36 static void __searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info);
38 static int setting_phone_region_format_get_region_fmt(char *list[],
40 /*[OUT]*/ char *region_keyStr[],
43 const char *loc_list = NULL;
45 UChar lang[LANGUAGE_STR_LEN] = { 0, };
46 UChar country[COUNTRY_STR_LEN] = { 0, };
47 UChar variant[SETTING_STR_SLP_LEN] = { 0, };
48 UChar displayname[SETTING_STR_SLP_LEN] = { 0, };
49 const char *localeID = NULL;
50 UErrorCode language_status = U_ZERO_ERROR;
51 UErrorCode country_status = U_ZERO_ERROR;
52 UErrorCode variant_status = U_ZERO_ERROR;
53 UErrorCode displayname_status = U_ZERO_ERROR;
55 int tmp_region_num = 0;
58 char *str_lang = NULL;
59 char *str_country = NULL;
60 char *str_variant = NULL;
61 char *str_displayname = NULL;
62 Eina_List *region_list = NULL;
64 loc_count = uloc_countAvailable();
67 localeID = uloc_getDefault();
68 SETTING_TRACE("localeID = %s", localeID);
70 for (; i < loc_count; i++) {
71 if (tmp_region_num >= REGION_ITEM_MAX)
74 loc_list = uloc_getAvailable(i);
76 /* SETTING_TRACE("loc_list = %s", loc_list); */
77 uloc_getDisplayLanguage(loc_list, localeID, lang, LANGUAGE_STR_LEN, &language_status);
78 if (U_FAILURE(language_status)) {
79 SETTING_TRACE_ERROR("language_status got an error %s:%d ", language_status,language_status);
80 language_status = U_ZERO_ERROR; /* set the value to the initial value */
83 uloc_getDisplayCountry(loc_list, localeID, country, COUNTRY_STR_LEN, &country_status);
84 if (U_FAILURE(country_status)) {
85 SETTING_TRACE_ERROR("country_status got an error %s:%d ", country, country_status);
86 country_status = U_ZERO_ERROR; /* set the value to the initial value */
89 uloc_getDisplayVariant(loc_list, localeID, variant, SETTING_STR_SLP_LEN, &variant_status);
90 if (U_FAILURE(variant_status)) {
91 SETTING_TRACE_ERROR("variant_status got an error %s:%d ", variant, variant_status);
92 variant_status = U_ZERO_ERROR; /* set the value to the initial value */
95 uloc_getDisplayName(loc_list, localeID, displayname, SETTING_STR_SLP_LEN, &displayname_status);
96 if (U_FAILURE(displayname_status)) {
97 SETTING_TRACE_ERROR("displayname_status got an error %s:%d ", displayname, displayname_status);
98 displayname_status = U_ZERO_ERROR; /* set the value to the initial value */
101 str_lang = setting_phone_lang_str_to_utf8(lang);
102 str_country = setting_phone_lang_str_to_utf8(country);
103 str_variant = setting_phone_lang_str_to_utf8(variant);
104 str_displayname = setting_phone_lang_str_to_utf8(displayname);
106 /* filter which has variant */
107 if (str_lang != NULL && str_country != NULL
108 && safeStrLen(str_country) > 1 && safeStrLen(str_variant) == 0) {
109 Setting_Region_Table *item_data = (Setting_Region_Table *) calloc(1, sizeof(Setting_Region_Table));
110 //setting_retvm_if(item_data == NULL, -1, "calloc failed")
112 if(item_data == NULL) {
113 SETTING_TRACE_ERROR("calloc failed");
117 FREE(str_displayname);
121 item_data->desc = (char *)g_strdup(str_displayname);
122 item_data->key = (char *)g_strdup(loc_list);
123 region_list = eina_list_append(region_list, item_data);
130 FREE(str_displayname);
133 region_list = eina_list_sort(region_list, eina_list_count(region_list),
134 setting_phone_region_format_compare_cb);
136 Eina_List *iter = NULL;
137 Setting_Region_Table *item_data = NULL;
139 EINA_LIST_FOREACH(region_list, iter, item_data) {
141 list[i] = (char *)g_strdup(item_data->desc);
143 region_keyStr[i] = (char *)g_strdup(item_data->key);
150 eina_list_free(region_list);
151 SETTING_TRACE("region_num = %d", tmp_region_num);
152 *region_num = tmp_region_num;
156 static char *__region_format_vconf_str_get()
159 char *tempstr = vconf_get_str(VCONFKEY_REGIONFORMAT);
160 setting_retvm_if(NULL == tempstr, NULL, "NULL == tempstr");
162 char *str_region = NULL;
163 char* p = strchr(tempstr, '.');
165 int len = safeStrLen(tempstr) - safeStrLen(".UTF-8");
168 str_region = strndup(tempstr, len); //.UTF8 => 5
170 str_region = (char *)g_strdup(tempstr);
171 SETTING_TRACE_ERROR("region format vconf stored error");
174 str_region = (char *)g_strdup("en_US");
181 static Eina_Bool __region_animator_cb(void *data)
183 //SETTING_TRACE_BEGIN;
184 setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
185 SettingPhoneUG *ad = (SettingPhoneUG *) data;
187 Setting_GenGroupItem_Data *item_data = NULL;
188 if (ad->gl_region_cur_index >= ad->region_num) {
190 ecore_animator_del(ad->animator);
193 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
194 if (ad->pop_progress) {
195 SETTING_TRACE("To delete ad->pop_progress");
196 evas_object_del(ad->pop_progress);
197 ad->pop_progress = NULL;
200 //if (ad->selected_item) {
202 // elm_genlist_item_show(ad->selected_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
204 ad->prev_region = ad->selected_region_idx;
206 Elm_Object_Item *item = NULL;
207 item = elm_genlist_item_append(ad->gl_region, &itc_bottom_seperator, NULL, NULL,
208 ELM_GENLIST_ITEM_NONE, NULL, NULL);
209 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
210 return ECORE_CALLBACK_CANCEL;
213 int i = ad->gl_region_cur_index++;
214 if (isEmptyStr(ad->search_text) || is_substr_ncase(ad->region_desc[i], ad->search_text)) {
216 setting_create_Gendial_field_def(ad->gl_region,
218 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
220 SWALLOW_Type_INVALID, NULL, NULL,
222 ad->region_desc[i]/* HERE */, NULL, NULL);
225 item_data->userdata = ad;
227 SETTING_TRACE_ERROR("item_data is NULL");
230 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
231 ad->selected_region_idx = i;
232 if (item_data) ad->selected_item = item_data->item;
236 return ECORE_CALLBACK_RENEW;
240 static void __region_genlist_create(void *data)
243 setting_retm_if(NULL == data, "data is NULL");
244 SettingPhoneUG *ad = (SettingPhoneUG *) data;
246 if (ad->pop_progress) {
247 evas_object_del(ad->pop_progress);
248 ad->pop_progress = NULL;
250 ad->pop_progress = setting_create_popup_with_progressbar(ad, ad->win_get,
252 NULL, NULL, NULL, 0, TRUE, TRUE);
254 elm_genlist_clear(ad->gl_region);
255 G_FREE(ad->region_vconf_str);
256 ad->region_vconf_str = __region_format_vconf_str_get();
258 Elm_Object_Item *item = NULL;
259 item = elm_genlist_item_append(ad->gl_region, &(ad->itc_seperator), NULL, NULL,
260 ELM_GENLIST_ITEM_NONE, NULL, NULL);
261 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
263 Setting_GenGroupItem_Data *item_data = NULL;
264 ad->gl_region_index = 0;
265 ad->selected_item = NULL;
266 ad->selected_region_idx = -1;
269 for (; i < ad->region_num; i++) {
270 if (ad->gl_region_index >
271 SETTING_PHONE_REGION_FORMAT_ANIMATOR_START_INDEX) {
275 if (isEmptyStr(ad->search_text) ||
276 is_substr_ncase(ad->region_desc[i], ad->search_text)) {
278 setting_create_Gendial_field_def(ad->gl_region,
280 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
282 SWALLOW_Type_INVALID, NULL, NULL,
284 ad->region_desc[i], NULL, NULL);
286 item_data->userdata = ad;
288 SETTING_TRACE_ERROR("item_data is NULL");
291 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
292 ad->selected_region_idx = i;
294 ad->selected_item = item_data->item;
297 ad->gl_region_index++;
300 ad->gl_region_cur_index = i;
302 if (ad->selected_region_idx > -1) {
303 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
304 ad->prev_region = ad->selected_region_idx;
306 if (ad->gl_region_cur_index < ad->region_num &&
307 ad->gl_region_index > SETTING_PHONE_REGION_FORMAT_ANIMATOR_START_INDEX) {
308 //to continue adding items using animator
309 SETTING_TRACE("to continue adding items using animator");
311 ecore_animator_del(ad->animator);
315 ad->animator = ecore_animator_add(__region_animator_cb, ad);
317 else {//had finished adding items
318 SETTING_TRACE("had finished adding items");
319 //if(ad->selected_item) {
320 //show the selected_item item
321 // elm_genlist_item_show(ad->selected_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
323 if (ad->pop_progress) {
324 SETTING_TRACE("To delete ad->pop_progress");
325 evas_object_del(ad->pop_progress);
326 ad->pop_progress = NULL;
331 static Eina_Bool __region_genlist_update(void *data)
334 setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
335 SettingPhoneUG *ad = (SettingPhoneUG *) data;
337 elm_genlist_clear(ad->gl_region);
338 G_FREE(ad->region_vconf_str);
339 ad->region_vconf_str = __region_format_vconf_str_get();
341 Setting_GenGroupItem_Data *item_data = NULL;
342 ad->selected_region_idx = -1;
346 for (; i < ad->region_num; i++) {
347 if (isEmptyStr(ad->search_text) ||
348 is_substr_ncase(ad->region_desc[i], ad->search_text)) {
350 setting_create_Gendial_field_def(ad->gl_region,
352 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
354 SWALLOW_Type_INVALID, NULL, NULL,
356 ad->region_desc[i], NULL, NULL);
358 item_data->userdata = ad;
360 SETTING_TRACE_ERROR("item_data is NULL");
363 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
364 ad->selected_region_idx = i;
370 if (ad->selected_region_idx > -1) {
371 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
376 setting_create_Gendial_field_def(ad->gl_region,
377 &(ad->itc_1text), NULL, NULL,
378 SWALLOW_Type_INVALID, NULL, NULL, 0,
379 _("No search result"), NULL, NULL);
382 ad->search_idler = NULL;
383 return ECORE_CALLBACK_CANCEL;
386 static void __searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info)
389 setting_retm_if(data == NULL, "Data parameter is NULL");
390 SettingPhoneUG *ad = (SettingPhoneUG *)data;
391 setting_searchbar_redraw(ad, ad->search_bar, ad->search_text,
393 __region_genlist_update);
396 /* ***************************************************
400 ***************************************************/
402 static int setting_phone_region_format_create(void *cb)
406 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
408 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
409 Evas_Object *sub_layout = elm_layout_add(ad->navi_bar);
410 elm_layout_theme_set(sub_layout, "layout", "application", "searchbar_base");
411 elm_object_signal_emit(sub_layout, "elm,state,show,searchbar", "elm");
413 setting_push_layout_navi_bar(_("IDS_ST_BODY_REGION"),
414 _("IDS_COM_BODY_BACK"),
417 setting_phone_region_format_click_softkey_cancel_cb,
419 NULL, ad, sub_layout, ad->navi_bar, NULL);
420 //Apply new SIP concept
421 evas_object_data_set(ad->navi_bar, "sip.naviframe.title_obj", "SEARCH");
423 ad->gl_region = elm_genlist_add(ad->navi_bar);
424 elm_object_style_set(ad->gl_region, "dialogue");
426 ad->chk_region = elm_radio_add(ad->gl_region);
427 elm_radio_state_value_set(ad->chk_region, -1);
428 elm_radio_value_set(ad->chk_region, -1);
430 int ret = setting_phone_region_format_get_region_fmt(ad->region_desc,
435 SETTING_TRACE_ERROR("get region format list failed");
439 memset(ad->search_text, '\0', MAX_SEARCH_STR_LEN + 1);
441 __region_genlist_create(ad);
443 ad->search_bar = setting_create_searchbar(ad, sub_layout, __searchbar_changed_cb, NULL);
445 elm_object_part_content_set(sub_layout, "elm.swallow.content", ad->gl_region);
447 setting_view_phone_region_format.is_create = 1;
449 return SETTING_RETURN_SUCCESS;
452 static int setting_phone_region_format_destroy(void *cb)
456 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
457 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
458 //Apply new SIP concept
459 evas_object_data_set(ad->navi_bar, "sip.naviframe.title_obj", NULL);
461 /* FIXED : destroy only if it was created. */
462 if (setting_view_phone_region_format.is_create) {
463 if (ad->search_idler) {
464 ecore_idler_del(ad->search_idler);
465 ad->search_idler = NULL;
469 ecore_animator_del(ad->animator);
473 evas_object_del(ad->popup);
476 if (ad->pop_progress) {
477 evas_object_del(ad->pop_progress);
478 ad->pop_progress = NULL;
481 elm_naviframe_item_pop(ad->navi_bar);
482 setting_view_phone_region_format.is_create = 0;
485 return SETTING_RETURN_SUCCESS;
488 static int setting_phone_region_format_cleanup(void *cb)
492 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
493 setting_phone_region_format_destroy(cb);
494 return SETTING_RETURN_SUCCESS;
498 setting_phone_region_format_click_softkey_cancel_cb(void *data,
503 retm_if(data == NULL, "Data parameter is NULL");
504 SettingPhoneUG *ad = (SettingPhoneUG *) data;
505 setting_view_change(&setting_view_phone_region_format,
506 &setting_view_phone_language_region, ad);
510 setting_phone_region_format_mouse_up_Gendial_list_radio_cb(void *data,
515 setting_retm_if(data == NULL, "Data parameter is NULL");
516 setting_retm_if(event_info == NULL,
517 "Invalid argument: event info is NULL");
519 Evas_Object *radio = (Evas_Object *) data;
520 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
521 elm_genlist_item_selected_set(item, 0);
522 Setting_GenGroupItem_Data *list_item =
523 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
524 SettingPhoneUG *ad = (SettingPhoneUG *) list_item->userdata;
526 SETTING_TRACE("region_keyStr = %s",
527 ad->region_keyStr[list_item->chk_status]);
528 /* if not change, return */
529 //if (ad->prev_region == list_item->chk_status) {
532 elm_radio_value_set(radio, list_item->chk_status);
534 ad->prev_region = list_item->chk_status;
535 SETTING_TRACE("cur_chk_region = %d", ad->prev_region);
537 char region[MAX_REGION_STRLEN] = {0,};
538 snprintf(region, MAX_REGION_STRLEN, "%s.UTF-8", ad->region_keyStr[ad->prev_region]);
540 int ret = setting_phone_region_format_set_dateformat(ad->region_keyStr[ad->prev_region], ad);
541 setting_retm_if(ret == SETTING_RETURN_FAIL, "[Error] set date format fail");
543 ret = vconf_set_str(VCONFKEY_REGIONFORMAT,region);
544 setting_retm_if(ret != 0, "[Error] set value of VCONFKEY_REGIONFORMAT fail");
546 /* after changed, go back to the previous page*/
547 setting_view_change(&setting_view_phone_region_format ,
548 &setting_view_phone_language_region, ad);
552 setting_phone_region_format_compare_cb(const void *d1, const void *d2)
554 Setting_Region_Table *r1 = (Setting_Region_Table *) d1;
555 Setting_Region_Table *r2 = (Setting_Region_Table *) d2;
556 return safeStrCmp(r1->desc, r2->desc);
559 static int setting_phone_region_format_set_dateformat(const char *region,
562 /* SETTING_TRACE_BEGIN; */
563 setting_retvm_if(!region, SETTING_RETURN_FAIL,
564 "region parameter is NULL");
565 setting_retvm_if(data == NULL, SETTING_RETURN_FAIL,
566 "Data parameter is NULL");
568 SettingPhoneUG *ad = (SettingPhoneUG *) data;
570 char *ret_str = NULL;
572 UChar customSkeleton[SETTING_STR_SLP_LEN] = { 0, };
573 UErrorCode status = U_ZERO_ERROR;
575 UChar bestPattern[SETTING_STR_SLP_LEN] = { 0, };
576 char bestPatternString[SETTING_STR_SLP_LEN] = { 0, };
577 char *skeleton = DATA_FORMAT_SKELETON;
579 uret = u_uastrncpy(customSkeleton, skeleton, safeStrLen(skeleton));
580 setting_retvm_if(!uret, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
582 if (ad->pattern_generator == NULL
583 || safeStrCmp(region, ad->prev_locale) != 0) {
584 if (ad->pattern_generator != NULL) {
585 udatpg_close(ad->pattern_generator);
586 ad->pattern_generator = NULL;
588 ad->pattern_generator = udatpg_open(region, &status);
591 int32_t bestPatternCapacity =
592 (int32_t) (sizeof(bestPattern) / sizeof((bestPattern)[0]));
593 (void)udatpg_getBestPattern(ad->pattern_generator, customSkeleton,
594 u_strlen(customSkeleton), bestPattern,
595 bestPatternCapacity, &status);
597 ret_str = u_austrcpy(bestPatternString, bestPattern);
598 setting_retvm_if(!ret_str, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
599 /* SETTING_TRACE("bestPatternString : %s, bestPatternLength: %d", bestPatternString, bestPatternLength); */
603 int len = safeStrLen(bestPatternString);
604 char region_format[len];
605 /* only save 'y', 'M', 'd' charactor */
606 for (; i < len; i++) {
607 if (bestPatternString[i] == 'y' || bestPatternString[i] == 'M'
608 || bestPatternString[i] == 'd') {
609 region_format[j++] = bestPatternString[i];
612 region_format[len] = '\0';
614 char *date_format_str[DATA_FORMAT_CATEGORY_NUM] = {
615 "dMy", "Mdy", "yMd", "ydM" };
616 int date_format_vconf_value = DATA_FORMAT_DEFAULT; /* default is "Mdy" */
617 for (i = 0; i < DATA_FORMAT_CATEGORY_NUM; i++) {
618 if (!safeStrCmp(region_format, date_format_str[i])) {
619 date_format_vconf_value = i;
622 SETTING_TRACE("bestPatternString : %s, format: %s, index: %d",
623 bestPatternString, region_format,
624 date_format_vconf_value);
626 int err = SETTING_RETURN_SUCCESS;
627 setting_set_int_slp_key(INT_SLP_SETTING_DATE_FORMAT,
628 date_format_vconf_value, &err);
629 setting_retvm_if(err == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL,
631 G_FREE(ad->prev_locale);
632 ad->prev_locale = (char *)g_strdup(region);
633 return SETTING_RETURN_SUCCESS;