tizen 2.4 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 #include <eventsystem.h>
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  * @brief function of item click
111  *
112  * @param data The view data passed between all callbacks
113  */
114 static void setting_phone_display_language_close_popup_ex(void *data)
115 {
116         SETTING_TRACE_BEGIN;
117         setting_retm_if(data == NULL, "Data parameter is NULL");
118         SettingPhoneUG *ad = (SettingPhoneUG *) data;
119
120         if (ad->selected_locale == NULL) {
121                 return;
122         }
123
124         if (safeStrCmp(ad->selected_locale, "IDS_ST_BODY_ANSWERINGMODE_AUTOMATIC") == 0) {
125
126                 /* [control] set automatic - TRUE */
127                 vconf_set_bool(VCONFKEY_SETAPPL_LANG_AUTOMATIC_BOOL, TRUE);
128
129                 /* [control] set vconf language */
130                 if (ad->sim_lang != NULL) {
131                         set_language_helper(ad->sim_lang);
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                         if (safeStrCmp(ad->selected_locale, pnode->title) == 0) {
147                                 /* [control] set automatic - TRUE */
148                                 vconf_set_bool(VCONFKEY_SETAPPL_LANG_AUTOMATIC_BOOL, FALSE);
149
150                                 char temp[32] = {0,};
151                                 snprintf(temp, 32, "%s.UTF-8", pnode->locale);
152                                 /* [control] set vconf language */
153                                 set_language_helper(pnode->locale);
154                                 elm_language_set(temp);
155
156                                 int region_automatic = 1;
157                                 vconf_get_bool(VCONFKEY_SETAPPL_REGION_AUTOMATIC_BOOL, &region_automatic);
158                                 if (region_automatic == 1) {
159                                         /* [control] region format set - if 'automatic region' */
160                                         set_regionformat_helper(pnode->locale);
161
162                                         int ret = setting_phone_region_format_set_dateformat(pnode->locale, ad);
163                                         if (ret == SETTING_RETURN_FAIL) {
164                                                 SETTING_TRACE_ERROR("[Error] set date format fail");
165                                         }
166                                 }
167                                 SETTING_TRACE_DEBUG("selectd language is %s, its locale is %s", ad->selected_locale, pnode->locale);
168                         }
169                 }
170         }
171
172         FREE(ad->selected_locale);
173
174         /* 2. GET SELECTED LANG */
175         const char *pa_lang = vconf_get_str(VCONFKEY_LANGSET);
176         if (pa_lang) {  /* remove the */
177                 char *q = strchr(pa_lang, '.');
178                 if (q) {
179                         *q = '\0';
180                 }
181         }
182         SETTING_TRACE("pa_lang:%s", pa_lang);
183         int err = -1;
184
185         /* 3. SET DEFAULT */
186         /* default UI language */
187         uloc_setDefault(pa_lang, &err);
188
189         char *caller = NULL;
190         app_control_h service = ad->bundle_data;
191
192         app_control_get_extra_data(service, "caller", &caller);
193
194         if (caller) {
195                 int ret = setting_phone_region_format_set_dateformat(pa_lang, ad);
196                 if (ret == SETTING_RETURN_FAIL) {
197                         SETTING_TRACE_ERROR("[Error] set date format fail");
198                 }
199
200                 const char *lang = vconf_get_str(VCONFKEY_LANGSET);
201                 if (lang) {
202                         ret = set_regionformat_helper(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(ad, ad->ly_language,
226                                                                                          PROGRESSBAR_STYLE,
227                                                                                          NULL, KeyStr_Loading, setting_phone_display_language_done_popup_resp_cb, 3/*0*/, TRUE, TRUE, 0);       /* 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         setting_retm_if(NULL == list_item, "list_item is NULL");
254
255         ad->selected_locale = (char *)strdup(list_item->keyStr);
256         setting_phone_display_language_close_popup_ex(ad);
257 }
258
259
260
261
262 /* ***************************************************
263  *
264  *basic func
265  *
266  ***************************************************/
267
268 /**
269  * @brief Callback of view creating
270  *
271  * @param cb The view data passed between all callbacks
272  * @return #1 on success, else on failed
273  */
274 static int setting_phone_display_language_create(void *cb)
275 {
276         SETTING_TRACE_BEGIN;
277         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
278
279         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
280         /*char *title = "IDS_ST_HEADER_LANGUAGE_AND_INPUT"; */
281         char *title = "IDS_ST_HEADER_DISPLAY_LANGUAGE";
282
283         Evas_Object *scroller = NULL;
284         setting_call_back_func gl_sel_cb = NULL;
285
286         if (&setting_view_phone_display_language == ad->view_to_load) {
287                 char *caller = NULL;
288
289                 app_control_h service = ad->bundle_data;
290
291                 app_control_get_extra_data(service, "caller", &caller);
292
293                 if (caller) {
294                         ad->ly_language = setting_create_layout_navi_bar_genlist(ad->win_main_layout,
295                                                                                  ad->win_get,
296                                                                                  title,
297                                                                                  "IDS_ST_BUTTON_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                 } else {
303                         SETTING_TRACE_ERROR("[ERROR] caller is empty");
304                         return SETTING_RETURN_FAIL;
305                 }
306         } else {
307                 /* add basic layout */
308                 Elm_Object_Item *navi_it = setting_push_layout_navi_bar_genlist(ad->win_main_layout, ad->win_get,
309                                                                                 title, "IDS_ST_BUTTON_BACK",
310                                                                                 NULL,
311                                                                                 setting_phone_display_language_click_softkey_cancel_cb,
312                                                                                 NULL, ad, &scroller, ad->navi_bar);
313                 elm_naviframe_item_pop_cb_set(navi_it, setting_phone_display_language_click_softkey_cancel_cb, ad);
314                 gl_sel_cb = setting_phone_display_language_mouse_up_Gendial_list_radio_cb;
315         }
316
317         ad->gl_lang = scroller;
318         elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
319
320         evas_object_smart_callback_add(ad->gl_lang, "realized", __gl_realized_cb, NULL);
321
322         /* scroller is a genlist */
323         ad->chk_lang = elm_radio_add(scroller);
324         elm_radio_state_value_set(ad->chk_lang, -1);
325
326         /* create loop operation here */
327         Eina_List *elist = NULL;
328         setting_lang_entry *pnode = NULL;
329         int idx = SETTING_LANG_KOREA;           /* 2 */
330         int item_idx = 0;
331         Setting_GenGroupItem_Data *last_item = NULL;
332         Setting_GenGroupItem_Data *item_data = NULL;
333
334         /* load language table from XML file */
335         Eina_List *langlist = setting_get_language_list();
336
337         EINA_LIST_FOREACH(langlist, elist, pnode) {
338                 item_data =
339                     setting_create_Gendial_field_def(scroller,
340                                                      &(ad->itc_1text),
341                                                      gl_sel_cb,
342                                                      ad,
343                                                      SWALLOW_Type_INVALID, NULL, NULL,
344                                                      /*idx,                     // <<< WARNING */
345                                                      0,
346                                                      pnode->title, NULL, NULL);
347                 if (item_data) {
348                         item_data->userdata = ad;
349                         item_idx++;
350                         last_item = item_data;
351                 } else {
352                         SETTING_TRACE_ERROR("item_data is NULL");
353                 }
354                 idx++;
355         }
356
357         setting_view_phone_display_language.is_create = 1;
358
359         return SETTING_RETURN_SUCCESS;
360 }
361
362
363
364 /**
365  * @brief Callback of view destroy
366  *
367  * @param cb The view data passed between all callbacks
368  * @return #1 on success, else on failed
369  */
370 static int setting_phone_display_language_destroy(void *cb)
371 {
372         SETTING_TRACE_BEGIN;
373         /* error check */
374         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
375         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
376
377         evas_object_smart_callback_del(ad->gl_lang, "realized", __gl_realized_cb);
378
379         /*  FIXED : destroy only if it was created. */
380         if (setting_view_phone_display_language.is_create) {
381                 if (ad->pop_progress_lang) {
382                         evas_object_del(ad->pop_progress_lang);
383                         ad->pop_progress_lang = NULL;
384                 }
385                 elm_naviframe_item_pop(ad->navi_bar);
386                 setting_view_phone_display_language.is_create = 0;
387
388                 setting_get_language_list_destroy();
389         }
390
391         return SETTING_RETURN_SUCCESS;
392 }
393
394
395
396 /**
397  * @brief Callback of view cleanup
398  *
399  * @param cb The view data passed between all callbacks
400  * @return #1 on success, else on failed
401  */
402 static int setting_phone_display_language_cleanup(void *cb)
403 {
404         SETTING_TRACE_BEGIN;
405         /* error check */
406         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
407         setting_phone_display_language_destroy(cb);
408
409         return SETTING_RETURN_SUCCESS;
410 }
411