2 * Copyright (c) 2013-2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * PROPRIETARY/CONFIDENTIAL
6 * This software is the confidential and proprietary information of
7 * SAMSUNG ELECTRONICS ("Confidential Information").
8 * You shall not disclose such Confidential Information and shall
9 * use it only in accordance with the terms of the license agreement
10 * you entered into with SAMSUNG ELECTRONICS.
11 * SAMSUNG make no representations or warranties about the suitability
12 * of the software, either express or implied, including but not
13 * limited to the implied warranties of merchantability, fitness for
14 * a particular purpose, or non-infringement.
15 * SAMSUNG shall not be liable for any damages suffered by licensee as
16 * a result of using, modifying or distributing this software or its derivatives.
22 * Created on: Oct 9, 2013
27 #include <vconf-keys.h>
28 #include <unicode/ustring.h>
29 #include <unicode/udat.h>
30 #include <unicode/udatpg.h>
32 #include "setting-language.h"
33 #include "setting_view_toast.h"
37 static struct _lang_menu_item lang_menu_its[LANGUAGE_ITEM_COUNT];
38 static Evas_Object * g_lang_radio = NULL;
40 static void change_language_enabling(keynode_t *key, void * data)
42 if( is_connected_GM() )
44 DBG("Setting - language can not change!!");
47 struct _toast_data * toast = _create_toast(tmp_ad, _("IDS_ST_TPOP_CHANGE_LANGUAGE_ON_MOBILE_DEVICE"));
49 _show_toast(tmp_ad, toast);
52 elm_naviframe_item_pop(tmp_ad->nf);
58 void _initialize_language(void * data)
66 register_vconf_changing(VCONFKEY_WMS_WMANAGER_CONNECTED, change_language_enabling, NULL);
69 void _set_launguage_update_cb( void (*cb)(void*) )
71 DBG("_set_launguage_update_cb() is called!");
75 DBG("callback is NULL");
82 void _clear_g_lang_menu_items()
84 DBG("_clear_g_lang_menu_items");
87 for(i = 0; i < LANGUAGE_ITEM_COUNT; i++ )
89 if( lang_menu_its[i].name )
90 free(lang_menu_its[i].name);
91 if( lang_menu_its[i].sub_name )
92 free(lang_menu_its[i].sub_name);
93 if( lang_menu_its[i].id )
94 free(lang_menu_its[i].id);
98 void _clear_lang_cb(void *data , Evas *e, Evas_Object *obj, void *event_info)
100 DBG("_clear_lang_cb");
107 if( ad->language_rdg ) {
108 ad->language_rdg = NULL;
115 _clear_g_lang_menu_items();
117 unregister_vconf_changing(VCONFKEY_WMS_WMANAGER_CONNECTED, change_language_enabling);
119 ad->MENU_TYPE = SETTING_DISPLAY;
122 Ecore_Timer * lang_timer = NULL;
124 static Eina_Bool _update_language(void * data)
126 char *locale = vconf_get_str(VCONFKEY_LANGSET);
127 elm_language_set(locale);
128 //elm_config_all_flush();
132 lang_update_cb( tmp_ad );
137 return ECORE_CALLBACK_CANCEL;
140 static int _set_dateformat(const char *region)
142 char *ret_str = NULL;
144 UChar customSkeleton[256] = { 0, };
145 UErrorCode status = U_ZERO_ERROR;
146 UDateTimePatternGenerator *pattern_generator;
148 UChar bestPattern[256] = { 0, };
149 char bestPatternString[256] = { 0, };
150 char *skeleton = "yMd";
152 uret = u_uastrncpy(customSkeleton, skeleton, strlen(skeleton));
154 pattern_generator = udatpg_open(region, &status);
156 int32_t bestPatternCapacity =
157 (int32_t) (sizeof(bestPattern) / sizeof((bestPattern)[0]));
158 (void)udatpg_getBestPattern(pattern_generator, customSkeleton,
159 u_strlen(customSkeleton), bestPattern,
160 bestPatternCapacity, &status);
162 ret_str = u_austrcpy(bestPatternString, bestPattern);
166 int len = strlen(bestPatternString);
167 char region_format[4] = {0, };
169 /* only save 'y', 'M', 'd' charactor */
170 for (; i < len; i++) {
171 if (bestPatternString[i] == 'y' && ymd[0] == 0) {
172 region_format[j++] = bestPatternString[i];
174 } else if (bestPatternString[i] == 'M' && ymd[1] == 0) {
175 region_format[j++] = bestPatternString[i];
177 } else if (bestPatternString[i] == 'd' && ymd[2] == 0) {
178 region_format[j++] = bestPatternString[i];
183 region_format[3] = '\0';
185 char *date_format_str[4] = {
186 "dMy", "Mdy", "yMd", "ydM" };
187 int date_format_vconf_value = 1; /* default is "Mdy" */
188 for (i = 0; i < 4; i++) {
189 if (strlen(region_format) != 0 && !strcmp(region_format, date_format_str[i])) {
190 date_format_vconf_value = i;
194 DBG("bestPatternString : %s, format: %s, index: %d",
195 bestPatternString, region_format, date_format_vconf_value);
197 vconf_set_int(VCONFKEY_SETAPPL_DATE_FORMAT_INT, date_format_vconf_value);
202 void _gl_lang_sel_cb(void * data, Evas_Object * obj, void * event_info)
204 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
206 int lang_index = (int)data;
209 snprintf(buf, sizeof(buf)-1, "%s.UTF-8", lang_menu_its[lang_index].id);
211 vconf_set_str(VCONFKEY_LANGSET, buf);
212 vconf_set_str(VCONFKEY_REGIONFORMAT, buf);
214 _set_dateformat(lang_menu_its[lang_index].id);
216 const char * temp = vconf_get_str(VCONFKEY_LANGSET);
218 DBG("Setting - %s", temp);
222 elm_radio_value_set(g_lang_radio, lang_index);
225 char *locale = vconf_get_str(VCONFKEY_LANGSET);
226 elm_language_set(locale);
230 lang_update_cb( tmp_ad );
234 elm_naviframe_item_pop(tmp_ad->nf);
238 void _lang_sel_changed_cb(void *data, Evas_Object *obj, void *event_info)
243 char * _gl_lang_title_get(void *data, Evas_Object *obj, const char *part)
246 Item_Data *id = data;
247 int index = id->index;
249 if( !strcmp(part, "elm.text.2") )
251 snprintf(buf, sizeof(buf)-1, "%s", lang_menu_its[index].sub_name);
253 else if( !strcmp(part, "elm.text") || !strcmp(part, "elm.text.1") )
255 snprintf(buf, sizeof(buf)-1, "%s", lang_menu_its[index].name);
260 Evas_Object * _gl_lang_ridio_get(void *data, Evas_Object *obj, const char *part)
262 Evas_Object *radio = NULL;
263 Evas_Object *radio_main = evas_object_data_get(obj, "radio_main");
266 Item_Data *id = data;
267 int index = id->index;
269 if( !strcmp(part, "elm.icon") )
271 radio = elm_radio_add(obj);
272 elm_object_style_set(radio, "list");
273 elm_radio_state_value_set(radio, index);
274 evas_object_smart_callback_add(radio, "changed", _lang_sel_changed_cb, (void *)index);
275 evas_object_size_hint_align_set(radio, EVAS_HINT_FILL, EVAS_HINT_FILL);
276 evas_object_size_hint_weight_set(radio, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
277 evas_object_propagate_events_set(radio, EINA_FALSE);
278 evas_object_repeat_events_set(radio, EINA_TRUE);
280 elm_radio_group_add(radio, radio_main);
282 const char * lang_set = vconf_get_str(VCONFKEY_LANGSET);
284 snprintf(buf, sizeof(buf)-1, "%s.UTF-8", lang_menu_its[index].id);
285 char * alt_lang_set = strdup(buf);
287 if( !strcasecmp(lang_set, buf) )
289 elm_radio_value_set(radio_main, index);
293 elm_genlist_item_show(id->item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
298 snprintf(buf, sizeof(buf)-1, "%s.UTF8", lang_menu_its[index].id);
299 char * alt_lang_set2 = strdup(buf);
300 if( !strcasecmp(lang_set, buf) )
302 elm_radio_value_set(radio_main, index);
306 elm_genlist_item_show(id->item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
311 DBG("Setting - current language is %s", lang_set);
319 static void _lang_gl_del(void *data, Evas_Object *obj)
321 // FIXME: Unrealized callback can be called after this.
322 // Accessing Item_Data can be dangerous on unrealized callback.
323 Item_Data *id = data;
328 Evas_Object* _create_lang_list(void* data)
330 DBG("_create_lang_list:clear");
335 DBG("%s", "_create_display_list - appdata is null");
338 Evas_Object *genlist = NULL;
339 Elm_Genlist_Item_Class *itc_temp = NULL;
340 struct _lang_menu_item *menu_its = NULL;
343 Evas_Object * layout = elm_layout_add(ad->nf);
344 elm_layout_file_set(layout, EDJE_PATH, "setting/genlist/layout");
345 evas_object_size_hint_weight_set (layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
346 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
348 Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
349 itc->item_style = "2text.1icon.1";
350 itc->func.text_get = _gl_lang_title_get;
351 itc->func.content_get = _gl_lang_ridio_get;
352 itc->func.del = _lang_gl_del;
354 Elm_Genlist_Item_Class *itc_1line = elm_genlist_item_class_new();
355 itc_1line->item_style = "1text.1icon.1";
356 itc_1line->func.text_get = _gl_lang_title_get;
357 itc_1line->func.content_get = _gl_lang_ridio_get;
358 itc_1line->func.del = _lang_gl_del;
360 genlist = elm_genlist_add(layout);
361 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
363 menu_its = lang_menu_its;
365 Eina_List * lang_list = _get_language_list();
366 struct _lang_menu_item * node = NULL;
369 int lang_count = eina_list_count(lang_list);
371 DBG("Setting - language count: %d", lang_count);
375 node = (struct _lang_menu_item * ) eina_list_data_get(lang_list);
378 lang_menu_its[index].name = strdup(node->name);
379 if( strlen(node->sub_name) > 0 )
380 lang_menu_its[index].sub_name = strdup(node->sub_name);
382 lang_menu_its[index].sub_name = NULL;
383 lang_menu_its[index].id = strdup(node->id);
387 lang_list = eina_list_next(lang_list);
390 for ( idx = 0; idx < lang_count; idx++ )
392 if( lang_menu_its[idx].sub_name != NULL )
398 itc_temp = itc_1line;
400 Item_Data *id = calloc(sizeof(Item_Data), 1);
402 id->item = elm_genlist_item_append(
403 genlist, // genlist object
404 itc_temp, // item class
407 ELM_GENLIST_ITEM_NONE,
408 _gl_lang_sel_cb, // call back
412 ad->language_rdg = elm_radio_add(genlist);
413 elm_radio_state_value_set(ad->language_rdg, lang_count);
414 elm_radio_value_set(ad->language_rdg, lang_count);
416 g_lang_radio = ad->language_rdg;
418 evas_object_data_set(genlist, "radio_main", ad->language_rdg);
420 elm_genlist_item_class_free(itc);
421 elm_genlist_item_class_free(itc_1line);
423 elm_object_part_content_set(layout, "elm.genlist", genlist);
428 void _langlist_load()
432 if(is_file_exist(LANGLIST_FILE_PATH_IN_RW))
434 _parseLangListXML(LANGLIST_FILE_PATH_IN_RW);
438 _parseLangListXML(LANGLIST_FILE_PATH_IN_RO);
443 Eina_List* _get_language_list()
445 if (NULL == s_langlist)
452 void _langlist_destroy()
454 Eina_List * list = s_langlist;
455 struct _lang_menu_item * node;
457 node = (struct _lang_menu_item * ) eina_list_data_get(list);
462 free(node->sub_name);
466 list = eina_list_next(list);
468 s_langlist = eina_list_free(s_langlist);
471 static void _parseLangListXML(char* docname)
476 doc = xmlParseFile(docname);
478 DBG("Setting - Documentation is not parsed successfully");
482 cur = xmlDocGetRootElement(doc);
484 DBG("Setting - Empty documentation");
489 if (xmlStrcmp(cur->name, (const xmlChar *) "langlist")) {
490 DBG("Setting - Documentation of the wrong type, root node != settings");
495 cur = cur->xmlChildrenNode;
496 _tree_walk_langlist(cur);
505 static void _tree_walk_langlist(xmlNodePtr cur)
507 xmlNode *cur_node = NULL;
508 char * id = NULL; // ex. ko_KR
510 char * temp_name = NULL;
511 char * sub_name = NULL;
512 const char * dim = "(";
514 for (cur_node = cur; cur_node;cur_node = cur_node->next)
516 if (cur_node->type == XML_ELEMENT_NODE)
518 id = (char *)g_strdup((char*)xmlGetProp(cur_node, (const xmlChar *)"id"));
519 name = (char *)g_strdup((char*)xmlGetProp(cur_node, (const xmlChar *)"string"));
520 //mcc = (char *)g_strdup((char*) xmlGetProp(cur_node, (const xmlChar *)"mcc"));
522 struct _lang_menu_item * pitem = (struct _lang_menu_item *)calloc(1, sizeof(struct _lang_menu_item));
525 temp_name = strdup(name);
526 pitem->name = (char *)g_strdup(strtok(temp_name, dim));
528 sub_name = strdup(name);
529 pitem->sub_name = (char *)g_strdup(replace(sub_name, pitem->name, ""));
535 s_langlist = eina_list_append(s_langlist, pitem);
540 const char * setting_get_lang_title(void)
546 if( s_langlist == NULL )
551 Eina_List* lang_list = s_langlist;
552 Eina_List* elist = NULL;
554 struct _lang_menu_item * lang_entry;
557 char* language = NULL;
560 language = vconf_get_str(VCONFKEY_LANGSET);
562 DBG("current language : %s", language);
564 if ( language == NULL )
571 lang_entry = (struct _lang_menu_item * ) eina_list_data_get(lang_list);
574 DBG("%s : language -> %s, locale -> %s", __func__, language, lang_entry->id);
576 snprintf(buf, sizeof(buf)-1, "%s.UTF-8", lang_entry->id);
577 if ( !strcmp(buf, language) )
579 char pull_title_buf[128];
580 if(lang_entry->sub_name && strlen(lang_entry->sub_name) > 1)
581 snprintf(pull_title_buf, sizeof(pull_title_buf)-1, "%s %s", lang_entry->name, lang_entry->sub_name);
583 snprintf(pull_title_buf, sizeof(pull_title_buf)-1, "%s", lang_entry->name);
584 title = strdup(pull_title_buf);
588 lang_list = eina_list_next(lang_list);