tizen 2.3 release
[apps/home/settings.git] / setting-phone / src / setting-phone-display-language.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 #include <setting-phone-display-language.h>
22
23 #include <setting-common-draw-widget.h>
24
25
26 static int setting_phone_display_language_create(void *cb);
27 static int setting_phone_display_language_destroy(void *cb);
28 static int setting_phone_display_language_cleanup(void *cb);
29
30
31 setting_view setting_view_phone_display_language = {
32         .create = setting_phone_display_language_create,
33         .destroy = setting_phone_display_language_destroy,
34         .update = NULL,
35         .cleanup = setting_phone_display_language_cleanup,
36 };
37
38
39
40
41 /**
42  * @brief Callback of cancel button by caller
43  *
44  * @param data The view data passed between all callbacks
45  */
46 static void setting_phone_display_language_caller_exist_right_cb(void *data,
47                                                        Evas_Object *obj,
48                                                        void *event_info)
49 {
50         SETTING_TRACE_BEGIN;
51         setting_retm_if(data == NULL, "Data parameter is NULL");
52
53         SettingPhoneUG *ad = (SettingPhoneUG *) data;
54         /*  Create Bundle and send message */
55         app_control_h svc;
56         if(app_control_create(&svc)) {
57                 return;
58         }
59
60         app_control_add_extra_data(svc, "result", "rbutton_click");
61         ug_send_result(ad->ug, svc);
62
63         app_control_destroy(svc);
64
65         ug_destroy_me(ad->ug);
66 }
67
68
69
70 /**
71  * @brief Callback of cancel button
72  *
73  * @param data The view data passed between all callbacks
74  * @param it Naviframe item
75  */
76 static Eina_Bool setting_phone_display_language_click_softkey_cancel_cb(void *data, Elm_Object_Item *it)
77 {
78         SETTING_TRACE_BEGIN;
79         retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
80         SettingPhoneUG *ad = (SettingPhoneUG *) data;
81         setting_view_change(&setting_view_phone_display_language, &setting_view_phone_language_region, ad);
82
83         return EINA_TRUE;
84 }
85
86
87
88 /**
89  * @brief Callback of pop_progress_lang timeout
90  *
91  * @param data The view data passed between all callbacks
92  */
93 void setting_phone_display_language_done_popup_resp_cb(void *data, Evas_Object *obj, void *event_info)
94 {
95         SETTING_TRACE_BEGIN;
96         retm_if(data == NULL, "Data parameter is NULL");
97         SettingPhoneUG *ad = (SettingPhoneUG *) data;
98
99         if (ad->pop_progress_lang) {
100                 evas_object_del(ad->pop_progress_lang);
101                 ad->pop_progress_lang = NULL;
102         }
103
104         elm_naviframe_item_pop(ad->navi_bar);
105         setting_view_phone_display_language.is_create = 0;
106 }
107
108
109
110 /**
111  * @brief function of item click
112  *
113  * @param data The view data passed between all callbacks
114  */
115 static void setting_phone_display_language_close_popup_ex(void *data)
116 {
117         SETTING_TRACE_BEGIN;
118         setting_retm_if(data == NULL, "Data parameter is NULL");
119         SettingPhoneUG *ad = (SettingPhoneUG *) data;
120
121         if(ad->selected_locale == NULL) {
122                 return;
123         }
124
125         if(safeStrCmp(ad->selected_locale, "IDS_COM_BODY_AUTOMATIC") == 0) {
126
127                 // [control] set automatic - TRUE
128                 vconf_set_bool(VCONFKEY_SETAPPL_LANG_AUTOMATIC_BOOL, TRUE);
129
130                 // [control] set vconf language
131                 if(ad->sim_lang != NULL) {
132                         vconf_set_str(VCONFKEY_LANGSET, ad->sim_lang);
133                         elm_language_set( ad->sim_lang);
134                         SETTING_TRACE_DEBUG("select Automatic : sim_lang is %s", ad->sim_lang);
135                 }
136         } else {
137                 // create loop operation here
138                 Eina_List* elist = NULL;
139                 //Eina_List* tmplist = NULL;
140                 setting_lang_entry* pnode = NULL;
141
142                 // load language table from XML file
143                 Eina_List* langlist = setting_get_language_list();
144
145                 EINA_LIST_FOREACH( langlist, elist, pnode)
146                 {
147                         if( safeStrCmp(ad->selected_locale, pnode->title) == 0)
148                         {
149                                 // [control] set automatic - TRUE
150                                 vconf_set_bool(VCONFKEY_SETAPPL_LANG_AUTOMATIC_BOOL, FALSE);
151
152                                 char temp[32] = {0,};
153                                 snprintf(temp, 32, "%s.UTF-8", pnode->locale);
154                                 // [control] set vconf language
155                                 vconf_set_str(VCONFKEY_LANGSET, temp);
156                                 elm_language_set(temp);
157
158                                 int region_automatic = 1;
159                                 vconf_get_bool(VCONFKEY_SETAPPL_REGION_AUTOMATIC_BOOL, &region_automatic);
160                                 if(region_automatic == 1) {
161                                         // [control] region format set - if 'automatic region'
162                                         vconf_set_str(VCONFKEY_REGIONFORMAT, temp);
163                                         int ret = setting_phone_region_format_set_dateformat(pnode->locale, ad);
164                                         if (ret == SETTING_RETURN_FAIL) {
165                                                 SETTING_TRACE_ERROR("[Error] set date format fail");
166                                         }
167                                 }
168                                 SETTING_TRACE_DEBUG("selectd language is %s, its locale is %s", ad->selected_locale, pnode->locale);
169                         }
170                 }
171         }
172
173         FREE(ad->selected_locale);
174
175         // 2. GET SELECTED LANG
176         const char *pa_lang = vconf_get_str(VCONFKEY_LANGSET);
177         if (pa_lang) {  /* remove the */
178                 char *q = strchr(pa_lang, '.');
179                 if (q) {
180                         *q = '\0';
181                 }
182         }
183         SETTING_TRACE("pa_lang:%s", pa_lang);
184         int err = -1;
185
186         // 3. SET DEFAULT
187         // default UI language
188         uloc_setDefault(pa_lang, &err);
189
190         char *caller = NULL;
191         app_control_h service = ad->bundle_data;
192
193         app_control_get_extra_data(service, "caller", &caller);
194
195         if(caller) {
196                 int ret = setting_phone_region_format_set_dateformat(pa_lang, ad);
197                 if (ret == SETTING_RETURN_FAIL) {
198                         SETTING_TRACE_ERROR("[Error] set date format fail");
199                 }
200
201                 const char *lang = vconf_get_str(VCONFKEY_LANGSET);
202                 if (lang) {
203                         ret = vconf_set_str(VCONFKEY_REGIONFORMAT, lang);
204                         if (ret != 0) {
205                                 SETTING_TRACE_ERROR("[Error] set value of VCONFKEY_REGIONFORMAT fail");
206                         }
207                         FREE(lang);
208                 }
209
210                 /*  Create Bundle and send message */
211                 app_control_h svc;
212                 if(app_control_create(&svc)) {
213                         return;
214                 }
215
216                 app_control_add_extra_data(svc, "result", "rbutton_click");
217                 ug_send_result(ad->ug, svc);
218
219                 app_control_destroy(svc);
220
221                 ug_destroy_me(ad->ug);
222                 FREE(caller);
223
224         } else {
225                 ad->pop_progress_lang = setting_create_popup_with_progressbar_withobject(ad, ad->pop_progress_lang, ad->ly_language,
226                                  PROGRESSBAR_STYLE,
227                                  NULL, KeyStr_Loading, setting_phone_display_language_done_popup_resp_cb, 3/*0*/, TRUE, TRUE);  // 3 seconds to wait in maximum
228         }
229
230         FREE(pa_lang);
231 }
232
233
234
235 /**
236  * @brief Callback of language item click event
237  *
238  * @param data The view data passed between all callbacks
239  * @param event_info The select genlist item
240  */
241 static void setting_phone_display_language_mouse_up_Gendial_list_radio_cb(void *data,
242                                                               Evas_Object *obj,
243                                                               void *event_info)
244 {
245         SETTING_TRACE_BEGIN;
246         setting_retm_if(data == NULL, "Data parameter is NULL");
247         setting_retm_if(event_info == NULL, "Invalid argument: event info is NULL");
248         SettingPhoneUG *ad = (SettingPhoneUG *)data;
249         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
250
251         elm_genlist_item_selected_set(item, 0);
252         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
253
254         ad->selected_locale = (char*)strdup(list_item->keyStr);
255         setting_phone_display_language_close_popup_ex(ad);
256 }
257
258
259
260
261 /* ***************************************************
262  *
263  *basic func
264  *
265  ***************************************************/
266
267 /**
268  * @brief Callback of view creating
269  *
270  * @param cb The view data passed between all callbacks
271  * @return #1 on success, else on failed
272  */
273 static int setting_phone_display_language_create(void *cb)
274 {
275         SETTING_TRACE_BEGIN;
276         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
277
278         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
279         //char *title = "IDS_ST_HEADER_LANGUAGE_AND_INPUT";
280         char *title = "IDS_ST_HEADER_DISPLAY_LANGUAGE";
281
282         Evas_Object *scroller = NULL;
283         setting_call_back_func gl_sel_cb = NULL;
284
285         if (&setting_view_phone_display_language == ad->view_to_load) {
286                 char *caller = NULL;
287
288                 app_control_h service = ad->bundle_data;
289
290                 app_control_get_extra_data(service, "caller", &caller);
291
292                 if(caller)
293                 {
294                         ad->ly_language = setting_create_layout_navi_bar_genlist(ad->win_main_layout,
295                                         ad->win_get,
296                                         title,
297                                         "IDS_COM_BODY_BACK", NULL,
298                                         setting_phone_display_language_caller_exist_right_cb, NULL,
299                                         ad, &scroller, &ad->navi_bar);
300                         gl_sel_cb = setting_phone_display_language_mouse_up_Gendial_list_radio_cb;
301                         FREE(caller);
302                 }
303                 else
304                 {
305                         SETTING_TRACE_ERROR("[ERROR] caller is empty");
306                         return SETTING_RETURN_FAIL;
307                 }
308         } else {
309                 /* add basic layout */
310                 Elm_Object_Item *navi_it = setting_push_layout_navi_bar_genlist(ad->win_main_layout, ad->win_get,
311                                              title, "IDS_COM_BODY_BACK",
312                                              NULL,
313                                              NULL,
314                                              NULL, ad, &scroller, ad->navi_bar);
315                 elm_naviframe_item_pop_cb_set(navi_it, setting_phone_display_language_click_softkey_cancel_cb, ad);
316                 gl_sel_cb = setting_phone_display_language_mouse_up_Gendial_list_radio_cb;
317         }
318
319         ad->gl_lang = scroller;
320         elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
321
322         evas_object_smart_callback_add(ad->gl_lang, "realized", __gl_realized_cb, NULL);
323
324         Elm_Object_Item *item = NULL;
325         item =
326             elm_genlist_item_append(scroller, &itc_seperator, NULL, NULL,
327                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
328         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
329
330         /* scroller is a genlist */
331         ad->chk_lang = elm_radio_add(scroller);
332         elm_radio_state_value_set(ad->chk_lang, -1);
333
334         // create loop operation here
335         Eina_List* elist = NULL;
336         setting_lang_entry* pnode = NULL;
337         int idx = SETTING_LANG_KOREA;           // 2
338         int item_idx = 0;
339         Setting_GenGroupItem_Data *last_item = NULL;
340         Setting_GenGroupItem_Data *item_data = NULL;
341
342         // load language table from XML file
343         Eina_List* langlist = setting_get_language_list();
344
345         EINA_LIST_FOREACH( langlist, elist, pnode) {
346                 item_data =
347                         setting_create_Gendial_field_def(scroller,
348                                                         &(ad->itc_1text),
349                                                         gl_sel_cb,
350                                                         ad,
351                                                         SWALLOW_Type_INVALID, NULL, NULL,
352                                                         //idx,                  // <<< WARNING
353                                                         0,
354                                                         pnode->title, NULL, NULL);
355                 if (item_data) {
356                         item_data->userdata = ad;
357                         if (item_idx == 0) {
358                                 item_data->group_style = SETTING_GROUP_STYLE_TOP;
359                         } else {
360                                 item_data->group_style = SETTING_GROUP_STYLE_CENTER;
361                         }
362
363                         if (item_data->item)
364                         {
365                                 if (item_data->group_style == SETTING_GROUP_STYLE_TOP) {
366                                         elm_object_item_signal_emit(item_data->item, "elm,state,top", "");
367                                 } else if (item_data->group_style == SETTING_GROUP_STYLE_BOTTOM) {
368                                         elm_object_item_signal_emit(item_data->item, "elm,state,bottom", "");
369                                 } else if (item_data->group_style == SETTING_GROUP_STYLE_CENTER) {
370                                         elm_object_item_signal_emit(item_data->item, "elm,state,center", "");
371                                 } else {
372                                         elm_object_item_signal_emit(item_data->item, "elm,state,normal", "");
373                                 }
374                         }
375                         item_idx++;
376                         last_item = item_data;
377                 } else {
378                         SETTING_TRACE_ERROR("item_data is NULL");
379                 }
380                 idx++;
381         }
382         if (last_item) {
383                 last_item->group_style = SETTING_GROUP_STYLE_BOTTOM;
384         }
385
386         /*item = elm_genlist_item_append(scroller, &itc_bottom_seperator, NULL, NULL,
387                                 ELM_GENLIST_ITEM_NONE, NULL, NULL);
388         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);*/
389
390         setting_view_phone_display_language.is_create = 1;
391
392         return SETTING_RETURN_SUCCESS;
393 }
394
395
396
397 /**
398  * @brief Callback of view destroy
399  *
400  * @param cb The view data passed between all callbacks
401  * @return #1 on success, else on failed
402  */
403 static int setting_phone_display_language_destroy(void *cb)
404 {
405         SETTING_TRACE_BEGIN;
406         /* error check */
407         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
408         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
409
410         evas_object_smart_callback_del(ad->gl_lang, "realized", __gl_realized_cb);
411
412         /*  FIXED : destroy only if it was created. */
413         if (setting_view_phone_display_language.is_create) {
414                 if (ad->pop_progress_lang) {
415                         evas_object_del(ad->pop_progress_lang);
416                         ad->pop_progress_lang = NULL;
417                 }
418                 elm_naviframe_item_pop(ad->navi_bar);
419                 setting_view_phone_display_language.is_create = 0;
420
421                 setting_get_language_list_destroy();
422         }
423
424         return SETTING_RETURN_SUCCESS;
425 }
426
427
428
429 /**
430  * @brief Callback of view cleanup
431  *
432  * @param cb The view data passed between all callbacks
433  * @return #1 on success, else on failed
434  */
435 static int setting_phone_display_language_cleanup(void *cb)
436 {
437         SETTING_TRACE_BEGIN;
438         /* error check */
439         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
440         setting_phone_display_language_destroy(cb);
441
442         return SETTING_RETURN_SUCCESS;
443 }
444