apply FSL license
[apps/home/settings.git] / setting-phone / src / setting-phone-display-language.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
4   * Licensed under the Flora License, Version 1.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *     http://www.tizenopensource.org/license
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16
17
18 #include <setting-phone-display-language.h>
19
20 static int setting_phone_display_language_create(void *cb);
21 static int setting_phone_display_language_destroy(void *cb);
22 static int setting_phone_display_language_cleanup(void *cb);
23
24
25 setting_view setting_view_phone_display_language = {
26         .create = setting_phone_display_language_create,
27         .destroy = setting_phone_display_language_destroy,
28         .update = NULL,
29         .cleanup = setting_phone_display_language_cleanup,
30 };
31
32 static void setting_phone_display_language_caller_exist_left_cb(void *data,
33                                                       Evas_Object *obj,
34                                                       void *event_info)
35 {
36         SETTING_TRACE_BEGIN;
37         setting_retm_if(data == NULL, "Data parameter is NULL");
38         SettingPhoneUG *ad = (SettingPhoneUG *) data;
39
40         /*  Create Bundle and send message */
41         bundle *b = NULL;
42         b = bundle_create();
43         setting_retm_if(b == NULL, "bundle_create failed");
44
45         bundle_add(b, "result", "lbutton_click");
46         ug_send_result(ad->ug, b);
47         bundle_free(b);
48
49         ug_destroy_me(ad->ug);
50 }
51
52 /*
53  * exit and save
54  */
55 static void setting_phone_display_language_caller_exist_right_cb(void *data,
56                                                        Evas_Object *obj,
57                                                        void *event_info)
58 {
59         SETTING_TRACE_BEGIN;
60         setting_retm_if(data == NULL, "Data parameter is NULL");
61         SettingPhoneUG *ad = (SettingPhoneUG *) data;
62         int ret, err;
63
64         int cur_chk_lang = (int)elm_radio_value_get(ad->chk_lang);
65
66         setting_phone_lang_change_lang_value(cur_chk_lang);
67
68         SETTING_TRACE("---> cur_chk_lang : %d", cur_chk_lang);
69         ret = setting_set_int_slp_key(INT_SLP_SETTING_LANG, cur_chk_lang, &err);
70
71         if (0 == cur_chk_lang) {
72                 (void)vconf_set_str(VCONFKEY_LANGSET, ad->sim_lang);
73         }
74
75         /* Just filter out Setting App, other Apps stil need to be terminated 
76        until they implement updating language or region automatically */
77         if (aul_app_get_running_app_info(app_terminate_func, NULL) < 0) {
78                 /*  tet_infoline("aul_app_get_running_app_info() failed in positive test case"); */
79         }
80
81         const char *pa_lang = vconf_get_str(VCONFKEY_LANGSET);
82         if (pa_lang) {
83                 char *q = strchr(pa_lang, '.');
84                 if (q) {
85                         *q = '\0';
86                 }
87                 SETTING_TRACE("pa_lang:%s", pa_lang);
88                 int err = -1;
89                 uloc_setDefault(pa_lang, &err);
90                 free((void *)pa_lang);
91                 pa_lang = NULL;
92         } else {
93                 SETTING_TRACE_ERROR("get vconf failed");
94         }
95
96         /*  Create Bundle and send message */
97         bundle *b = NULL;
98         b = bundle_create();
99         setting_retm_if(b == NULL, "bundle_create failed");
100
101         bundle_add(b, "result", "rbutton_click");
102         ug_send_result(ad->ug, b);
103         bundle_free(b);
104
105         ug_destroy_me(ad->ug);
106 }
107
108
109 /* ***************************************************
110  *
111  *basic func
112  *
113  ***************************************************/
114
115 static int setting_phone_display_language_create(void *cb)
116 {
117         SETTING_TRACE_BEGIN;
118         /* error check */
119         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
120
121         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
122         char *title = _("IDS_ST_HEADER_DISPLAY_LANGUAGE");
123
124         Evas_Object *scroller = NULL;
125         setting_call_back_func gl_sel_cb = NULL;
126
127         if (&setting_view_phone_display_language == ad->view_to_load) {
128                 char *l_btn = NULL;
129                 char *r_btn = NULL;
130                 char *temp = NULL;
131
132                 setting_call_back_func l_button_cb = NULL;
133                 setting_call_back_func r_button_cb = NULL;
134         
135                 bundle *data = ad->bundle_data;
136                 if (NULL != (temp = (char *)bundle_get_val(data, "lbutton"))) {
137                         l_btn = temp;
138                         l_button_cb =
139                             setting_phone_display_language_caller_exist_left_cb;
140                 }
141
142                 if (NULL != (temp = (char *)bundle_get_val(data, "title"))) {
143                         title = temp;
144                 }
145
146                 if (NULL != (temp = (char *)bundle_get_val(data, "rbutton"))) {
147                         r_btn = temp;
148                         r_button_cb =
149                             setting_phone_display_language_caller_exist_right_cb;
150                 }               
151
152                 ad->ly_language =
153                     setting_create_layout_navi_bar_genlist(ad->win_main_layout,
154                                                            ad->win_get, title,
155                                                            l_btn, r_btn,
156                                                            l_button_cb,
157                                                            r_button_cb, ad,
158                                                            &scroller,
159                                                            &ad->navi_bar);
160                 
161                 gl_sel_cb = setting_mouse_up_Gendial_list_radio_cb;
162         } else {
163                 /* add basic layout */
164                 setting_push_layout_navi_bar_genlist(ad->win_main_layout, ad->win_get,
165                                              title, _("IDS_COM_BODY_BACK"),
166                                              NULL,
167                                              setting_phone_display_language_click_softkey_cancel_cb,
168                                              NULL, ad, &scroller, ad->navi_bar);
169                 gl_sel_cb = setting_phone_display_language_mouse_up_Gendial_list_radio_cb;
170         }
171
172         ad->gl_lang = scroller;
173
174         Elm_Object_Item *item = NULL;
175         item =
176             elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
177                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
178         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
179
180         /* scroller is a genlist */
181         ad->chk_lang = elm_radio_add(scroller);
182         elm_radio_state_value_set(ad->chk_lang, -1);
183
184
185         // get a table
186         setting_lang_entry* table = setting_get_language_table();
187
188
189         Setting_GenGroupItem_Data *item_data = NULL;
190         item_data =
191             setting_create_Gendial_field_1radio(scroller,
192                                                 &(ad->itc_1text_1icon_2),
193                                                 gl_sel_cb,
194                                                 ad->chk_lang,
195                                                 SWALLOW_Type_1RADIO,
196                                                 ad->chk_lang, 0,
197                                                 "IDS_COM_BODY_AUTOMATIC", NULL);
198         if (item_data) {
199                 item_data->userdata = ad;
200         } else {
201                 SETTING_TRACE_ERROR("item_data is NULL");
202         }
203
204         item_data =
205             setting_create_Gendial_field_1radio(scroller,
206                                                 &(ad->itc_1text_1icon_2),
207                                                 gl_sel_cb,
208                                                 ad->chk_lang,
209                                                 SWALLOW_Type_1RADIO,
210                                                 ad->chk_lang,
211                                                 SETTING_LANG_KOREA,
212                                                 table[SETTING_LANG_KOREA].title, NULL);
213         if (item_data) {
214                 item_data->userdata = ad;
215         } else {
216                 SETTING_TRACE_ERROR("item_data is NULL");
217         }
218
219         item_data =
220             setting_create_Gendial_field_1radio(scroller,
221                                                 &(ad->itc_1text_1icon_2),
222                                                 gl_sel_cb,
223                                                 ad->chk_lang,
224                                                 SWALLOW_Type_1RADIO,
225                                                 ad->chk_lang,
226                                                 SETTING_LANG_ENGLISH,
227                                                 table[SETTING_LANG_ENGLISH].title, NULL);
228         if (item_data) {
229                 item_data->userdata = ad;
230         } else {
231                 SETTING_TRACE_ERROR("item_data is NULL");
232         }
233
234         item_data =
235             setting_create_Gendial_field_1radio(scroller,
236                                                 &(ad->itc_1text_1icon_2),
237                                                 gl_sel_cb,
238                                                 ad->chk_lang,
239                                                 SWALLOW_Type_1RADIO,
240                                                 ad->chk_lang,
241                                                 SETTING_LANG_GERMAN,
242                                                 table[SETTING_LANG_GERMAN].title, NULL);
243         if (item_data) {
244                 item_data->userdata = ad;
245         } else {
246                 SETTING_TRACE_ERROR("item_data is NULL");
247         }
248
249         item_data =
250             setting_create_Gendial_field_1radio(scroller,
251                                                 &(ad->itc_1text_1icon_2),
252                                                 gl_sel_cb,
253                                                 ad->chk_lang,
254                                                 SWALLOW_Type_1RADIO,
255                                                 ad->chk_lang,
256                                                 SETTING_LANG_DUTCH,
257                                                 table[SETTING_LANG_DUTCH].title, NULL);
258         if (item_data) {
259                 item_data->userdata = ad;
260         } else {
261                 SETTING_TRACE_ERROR("item_data is NULL");
262         }
263
264         item_data =
265             setting_create_Gendial_field_1radio(scroller,
266                                                 &(ad->itc_1text_1icon_2),
267                                                 gl_sel_cb,
268                                                 ad->chk_lang,
269                                                 SWALLOW_Type_1RADIO,
270                                                 ad->chk_lang,
271                                                 SETTING_LANG_SPAINISH,
272                                                 table[SETTING_LANG_SPAINISH].title, NULL);
273         if (item_data) {
274                 item_data->userdata = ad;
275         } else {
276                 SETTING_TRACE_ERROR("item_data is NULL");
277         }
278
279         item_data =
280             setting_create_Gendial_field_1radio(scroller,
281                                                 &(ad->itc_1text_1icon_2),
282                                                 gl_sel_cb,
283                                                 ad->chk_lang,
284                                                 SWALLOW_Type_1RADIO,
285                                                 ad->chk_lang,
286                                                 SETTING_LANG_PORTUGUESE,
287                                                 table[SETTING_LANG_PORTUGUESE].title, NULL);
288         if (item_data) {
289                 item_data->userdata = ad;
290         } else {
291                 SETTING_TRACE_ERROR("item_data is NULL");
292         }
293
294         item_data =
295             setting_create_Gendial_field_1radio(scroller,
296                                                 &(ad->itc_1text_1icon_2),
297                                                 gl_sel_cb,
298                                                 ad->chk_lang,
299                                                 SWALLOW_Type_1RADIO,
300                                                 ad->chk_lang,
301                                                 SETTING_LANG_GREEK,
302                                                 table[SETTING_LANG_GREEK].title, NULL);
303         if (item_data) {
304                 item_data->userdata = ad;
305         } else {
306                 SETTING_TRACE_ERROR("item_data is NULL");
307         }
308
309         item_data =
310             setting_create_Gendial_field_1radio(scroller,
311                                                 &(ad->itc_1text_1icon_2),
312                                                 gl_sel_cb,
313                                                 ad->chk_lang,
314                                                 SWALLOW_Type_1RADIO,
315                                                 ad->chk_lang,
316                                                 SETTING_LANG_ITALIAN,
317                                                 table[SETTING_LANG_ITALIAN].title, NULL);
318         if (item_data) {
319                 item_data->userdata = ad;
320         } else {
321                 SETTING_TRACE_ERROR("item_data is NULL");
322         }
323
324         item_data =
325             setting_create_Gendial_field_1radio(scroller,
326                                                 &(ad->itc_1text_1icon_2),
327                                                 gl_sel_cb,
328                                                 ad->chk_lang,
329                                                 SWALLOW_Type_1RADIO,
330                                                 ad->chk_lang,
331                                                 SETTING_LANG_FRENCH,
332                                                 table[SETTING_LANG_FRENCH].title, NULL);
333         if (item_data) {
334                 item_data->userdata = ad;
335         } else {
336                 SETTING_TRACE_ERROR("item_data is NULL");
337         }
338
339         item_data =
340             setting_create_Gendial_field_1radio(scroller,
341                                                 &(ad->itc_1text_1icon_2),
342                                                 gl_sel_cb,
343                                                 ad->chk_lang,
344                                                 SWALLOW_Type_1RADIO,
345                                                 ad->chk_lang,
346                                                 SETTING_LANG_TURKISH,
347                                                 table[SETTING_LANG_TURKISH].title, NULL);
348         if (item_data) {
349                 item_data->userdata = ad;
350         } else {
351                 SETTING_TRACE_ERROR("item_data is NULL");
352         }
353
354         item_data =
355             setting_create_Gendial_field_1radio(scroller,
356                                                 &(ad->itc_1text_1icon_2),
357                                                 gl_sel_cb,
358                                                 ad->chk_lang,
359                                                 SWALLOW_Type_1RADIO,
360                                                 ad->chk_lang,
361                                                 SETTING_LANG_RUSSIAN,
362                                                 table[SETTING_LANG_RUSSIAN].title, NULL);
363         if (item_data) {
364                 item_data->userdata = ad;
365         } else {
366                 SETTING_TRACE_ERROR("item_data is NULL");
367         }
368
369         // set radio button to the selected state.
370         int index = -1;
371         int ret, err;
372         ret = setting_get_int_slp_key(INT_SLP_SETTING_LANG, &index, &err);
373         elm_radio_value_set(ad->chk_lang, index);
374
375         ad->prev_lang = (int)elm_radio_value_get(ad->chk_lang);
376         setting_view_phone_display_language.is_create = 1;
377
378         return SETTING_RETURN_SUCCESS;
379 }
380
381 static int setting_phone_display_language_destroy(void *cb)
382 {
383         SETTING_TRACE_BEGIN;
384         /* error check */
385         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
386         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
387
388         /*  FIXED : destroy only if it was created. */
389         if (setting_view_phone_display_language.is_create) {
390                 if (ad->popup) {
391                         evas_object_del(ad->popup);
392                         ad->popup = NULL;
393                 }
394
395                 if (ad->pop_progress) {
396                         evas_object_del(ad->pop_progress);
397                         ad->pop_progress = NULL;
398                 }
399                 if (ad->killed_pid_list) {
400                         eina_list_free(ad->killed_pid_list);
401                         ad->killed_pid_list = NULL;
402                 }
403                 elm_naviframe_item_pop(ad->navi_bar);
404                 setting_view_phone_display_language.is_create = 0;
405         }
406
407         return SETTING_RETURN_SUCCESS;
408 }
409
410 static int setting_phone_display_language_cleanup(void *cb)
411 {
412         SETTING_TRACE_BEGIN;
413         /* error check */
414         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
415         setting_phone_display_language_destroy(cb);
416
417         return SETTING_RETURN_SUCCESS;
418 }
419
420 static void
421 setting_phone_display_language_click_softkey_cancel_cb(void *data,
422                                                        Evas_Object *obj,
423                                                        void *event_info)
424 {
425         SETTING_TRACE_BEGIN;
426         /* error check */
427         retm_if(data == NULL, "Data parameter is NULL");
428         SettingPhoneUG *ad = (SettingPhoneUG *) data;
429         setting_view_change(&setting_view_phone_display_language,
430                             &setting_view_phone_language_region, ad);
431 }
432
433 static void
434 setting_phone_display_language_mouse_up_Gendial_list_radio_cb(void *data,
435                                                               Evas_Object *obj,
436                                                               void *event_info)
437 {
438         SETTING_TRACE_BEGIN;
439         /* error check */
440         setting_retm_if(data == NULL, "Data parameter is NULL");
441         setting_retm_if(event_info == NULL,
442                         "Invalid argument: event info is NULL");
443
444         Evas_Object *radio = (Evas_Object *) data;
445         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
446         elm_genlist_item_selected_set(item, 0);
447         Setting_GenGroupItem_Data *list_item =
448             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
449         SettingPhoneUG *ad = (SettingPhoneUG *) list_item->userdata;
450
451         if (ad->popup) {
452                 return;
453         }
454
455         /*  if not change, return */
456         if (ad->prev_lang == list_item->chk_status) {
457                 SETTING_TRACE("NOT CHANGED ");
458                 return;
459         }
460
461         elm_radio_value_set(radio, list_item->chk_status);
462         setting_phone_display_language_close_popup_ex(ad);
463 }
464
465 static void setting_phone_display_language_close_popup_ex(void *data)
466 {
467         SETTING_TRACE_BEGIN;
468         setting_retm_if(data == NULL, "Data parameter is NULL");
469         SettingPhoneUG *ad = (SettingPhoneUG *) data;
470
471         ad->popup_cb = setting_phone_display_language_exit_cb_ex;
472         ad->popup = setting_create_popup_with_btn(ad, ad->win_get,
473                                          _
474                                          ("IDS_ST_POP_CHANGING_LANGUAGE_WILL_CLOSE_ALL_APPLICATIONS_AND_UNSAVED_DATA_WILL_BE_LOST_CONTINUE_Q"),
475                                          NULL, ad->popup_cb, 0,
476                                          2, _("IDS_COM_SK_YES"),_("IDS_COM_SK_NO"));
477 }
478
479 static void
480 setting_phone_display_language_exit_cb_ex(void *data, Evas_Object *obj,
481                                           void *event_info)
482 {
483         SETTING_TRACE_BEGIN;
484         setting_retm_if(data == NULL, "Data parameter is NULL");
485         SettingPhoneUG *ad = (SettingPhoneUG *) data;
486
487         switch (btn_type(obj)) {
488         case POPUP_RESPONSE_OK:
489                 {
490                         ad->prev_lang = elm_radio_value_get(ad->chk_lang);
491                         SETTING_TRACE("cur_chk_lang = %d", ad->prev_lang);
492
493                         /////////////////////////////////////////////////////////////////
494                         // 0. change VCONFKEY_LANGSET
495                         /////////////////////////////////////////////////////////////////
496                         setting_phone_lang_change_lang_value(ad->prev_lang);
497                         
498                         if (ad->killed_pid_list) {
499                                 eina_list_free(ad->killed_pid_list);
500                                 ad->killed_pid_list = NULL;
501                         }
502
503                         /////////////////////////////////////////////////////////////////
504                         // 1. KILL APPS
505                         /////////////////////////////////////////////////////////////////
506                         /* just filter out Setting App, other Apps stil need to be terminated untill they implement updating language or region automatically */
507                         if (aul_app_get_running_app_info (app_terminate_func, ad) < 0) {
508                                 /*  tet_infoline("aul_app_get_running_app_info() failed in positive test case"); */
509                         }
510
511                         SETTING_TRACE("eina_list_count(ad->killed_pid_list):%d", eina_list_count(ad->killed_pid_list));
512                         if (0 != eina_list_count(ad->killed_pid_list)) {
513                                 if (ad->pop_progress) {
514                                         evas_object_del(ad->pop_progress);
515                                         ad->pop_progress = NULL;
516                                 }
517                                 ad->pop_progress = setting_create_popup_with_progressbar(ad, ad->win_get,
518                                                          "pending_list",
519                                                          NULL, NULL, NULL, 10);
520                         }
521                         
522                         /*  if set automatic */
523                         if (0 == ad->prev_lang) {
524                                 vconf_set_str(VCONFKEY_LANGSET, ad->sim_lang);
525                         }
526
527                         /////////////////////////////////////////////////////////////////
528                         // 2. GET SELECTED LANG
529                         /////////////////////////////////////////////////////////////////
530                         const char *pa_lang = vconf_get_str(VCONFKEY_LANGSET);
531                         if (pa_lang) {  /* remove the */
532                                 char *q = strchr(pa_lang, '.');
533                                 if (q)
534                                         *q = '\0';
535                         }
536                         SETTING_TRACE("pa_lang:%s", pa_lang);
537                         int err = -1;
538                         /////////////////////////////////////////////////////////////////
539                         // 3. SET DEFAULT
540                         /////////////////////////////////////////////////////////////////
541                         // default UI language
542                         uloc_setDefault(pa_lang, &err);
543                         FREE(pa_lang);
544
545                         /* after lang-change, go back to the previous page*/
546                         elm_naviframe_item_pop(ad->navi_bar);
547                         setting_view_phone_display_language.is_create = 0;
548
549                         break;
550                 }
551         case POPUP_RESPONSE_CANCEL:
552                 {
553                         elm_radio_value_set(ad->chk_lang, ad->prev_lang);
554                         if (ad->popup) {
555                                 evas_object_del(ad->popup);
556                                 ad->popup = NULL;
557                         }
558                         return;
559                 }
560         default:
561                 {
562                         if (ad->popup) {
563                                 evas_object_del(ad->popup);
564                                 ad->popup = NULL;
565                         }
566                         return;
567                 }
568         }
569
570         if (ad->popup) {
571                 evas_object_del(ad->popup);
572                 ad->popup = NULL;
573         }
574 }