tizen 2.4 release
[apps/home/settings.git] / setting-phone / src / setting-phone-language-region.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-language-region.h>
22 #include <setting-common-draw-widget.h>
23 #include <app_manager.h>
24 #include <pkgmgr-info.h>
25
26
27 static int setting_phone_language_region_create(void *cb);
28 static int setting_phone_language_region_destroy(void *cb);
29 static int setting_phone_language_region_update(void *cb);
30 static int setting_phone_language_region_cleanup(void *cb);
31
32 setting_view setting_view_phone_language_region = {
33         .create = setting_phone_language_region_create,
34         .destroy = setting_phone_language_region_destroy,
35         .update = setting_phone_language_region_update,
36         .cleanup = setting_phone_language_region_cleanup,
37 };
38
39
40
41 #if 0
42 /**
43  * @brief Callback of language change flush timer
44  *
45  * @param cb The view data passed between all callbacks
46  * @return #1 means call it again, else means call it only once
47  */
48 static Eina_Bool setting_phone_language_region_flush_timer_cb(void *cb)
49 {
50         SETTING_TRACE_BEGIN;
51         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
52         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
53
54         elm_config_all_flush();
55         ad->lang_flush_timer = NULL;
56
57         SETTING_TRACE_END;
58         return EINA_FALSE;
59 }
60 #endif
61
62 static Eina_Bool setting_phone_language_region_freeze_event_timer_cb(void *cb)
63 {
64         SETTING_TRACE_BEGIN;
65         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
66         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
67
68         evas_object_freeze_events_set(ad->navi_bar, EINA_FALSE);
69
70         ad->event_freeze_timer = NULL;
71         SETTING_TRACE_END;
72         return EINA_FALSE;
73 }
74
75 /**
76  * @brief Finds appid with specific category
77  *
78  * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative
79  */
80 static int _find_appid_ime_list(const pkgmgrinfo_appinfo_h handle, void *user_data)
81 {
82         if (user_data) {
83                 char **result = (char **)user_data;
84                 char *appid = NULL;
85                 int ret = 0;
86
87                 /* Get appid */
88                 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
89                 if (ret == PMINFO_R_OK) {
90                         *result = strdup(appid);
91                 } else {
92                         LOGW("pkgmgrinfo_appinfo_get_appid failed!");
93                 }
94         } else {
95                 LOGW("user_data is null!");
96         }
97
98         return -1;  /* This callback is no longer called. */
99 }
100
101 /**
102  * @brief create keyboard ug by app control
103  *
104  * @param ad The view data passed
105  */
106 static void setting_phone_lang_create_keyboard_ug(SettingPhoneUG *ad)
107 {
108         SETTING_TRACE_BEGIN;
109         ret_if(ad == NULL);
110
111         /* Launch IME List application; e.g., org.tizen.inputmethod-setting-list */
112         int ret;
113         app_control_h app_control;
114         char *app_id = NULL;
115         pkgmgrinfo_appinfo_filter_h handle;
116
117         /* Find appid with "http://tizen.org/category/ime-list" category; appid might be different in models. */
118         ret = pkgmgrinfo_appinfo_filter_create(&handle);
119         if (ret == PMINFO_R_OK) {
120                 ret = pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_CATEGORY, "http://tizen.org/category/ime-list");
121                 if (ret == PMINFO_R_OK) {
122                         ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, _find_appid_ime_list, &app_id);
123                 }
124                 pkgmgrinfo_appinfo_filter_destroy(handle);
125         }
126
127         if (app_id) {
128                 ret = app_control_create(&app_control);
129                 if (ret == APP_CONTROL_ERROR_NONE) {
130                         app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
131                         app_control_set_app_id(app_control, app_id);
132                         app_control_add_extra_data(app_control, "caller", "settings");  /* Indicates Settings application is caller. */
133                         app_control_set_launch_mode(app_control, APP_CONTROL_LAUNCH_MODE_GROUP);
134                         ret = app_control_send_launch_request(app_control, NULL, NULL);
135                         if (ret != APP_CONTROL_ERROR_NONE) {
136                                 LOGW("app_control_send_launch_request failed(%d): %s", ret, app_id);
137                         }
138                         app_control_destroy(app_control);
139                 }
140                 free(app_id);
141         } else {
142                 LOGW("AppID with http://tizen.org/category/ime-list category is not available");
143         }
144 }
145
146 /**
147  * @brief create voice recognition ug by app control
148  *
149  */
150 static void setting_phone_lang_create_voice_recognition_ug(SettingPhoneUG *ad)
151 {
152         SETTING_TRACE_BEGIN;
153         if (app_group_launcher("setting-voice-efl|show_what:stt") == 0) {
154                 ad->event_freeze_timer = ecore_timer_add(1, setting_phone_language_region_freeze_event_timer_cb, ad);
155                 evas_object_freeze_events_set(ad->navi_bar, EINA_TRUE);
156         }
157 }
158
159 /**
160  * @brief create text-to-speech ug by app control
161  *
162  */
163 static void setting_phone_lang_create_text_speech_ug(SettingPhoneUG *ad)
164 {
165         SETTING_TRACE_BEGIN;
166         if (app_group_launcher("setting-voice-efl|show_what:tts") == 0) {
167                 ad->event_freeze_timer = ecore_timer_add(1, setting_phone_language_region_freeze_event_timer_cb, ad);
168                 evas_object_freeze_events_set(ad->navi_bar, EINA_TRUE);
169         }
170 }
171
172 /**
173  * @brief create readout(old name : drivingmode) ug by app control
174  *
175  * @param ad The view data passed
176  */
177 static void setting_phone_lang_create_readout_ug(SettingPhoneUG *ad)
178 {
179         SETTING_TRACE_BEGIN;
180         ret_if(ad == NULL);
181
182         if (app_launcher("setting-drivingmode-efl") == 0) {
183                 ad->event_freeze_timer = ecore_timer_add(1, setting_phone_language_region_freeze_event_timer_cb, ad);
184                 evas_object_freeze_events_set(ad->navi_bar, EINA_TRUE);
185         }
186 }
187
188 /**
189  * @brief Callback of cancel button
190  *
191  * @param cb The view data passed between all callbacks
192  */
193 static Eina_Bool setting_phone_lang_click_softkey_cancel_cb(void *data, Elm_Object_Item *it)
194 {
195         SETTING_TRACE_BEGIN;
196         retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
197         SettingPhoneUG *ad = (SettingPhoneUG *) data;
198
199         Eina_Bool is_freezed = evas_object_freeze_events_get(ad->navi_bar);
200         SETTING_TRACE_DEBUG("is_freezed : %d", is_freezed);
201         if (is_freezed)
202                 return EINA_FALSE;
203
204         ug_destroy_me(ad->ug);
205         return EINA_FALSE;
206 }
207
208 /**
209  * @brief Callback of view cleanup
210  *
211  * @param cb The view data passed between all callbacks
212  * @return #1 on success, else on failed
213  */
214 static void setting_phone_lang_item_Gendial_mouse_up_cb(void *data,
215                                                         Evas_Object *obj,
216                                                         void *event_info)
217 {
218         SETTING_TRACE_BEGIN;
219         setting_retm_if(!data || !event_info, "data||event_info is NULL");
220         SettingPhoneUG *ad = (SettingPhoneUG *) data;
221         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
222
223         elm_genlist_item_selected_set(item, 0);
224         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
225         setting_retm_if(NULL == list_item, "list_item is NULL");
226
227         SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
228
229         if (!safeStrCmp("IDS_ST_HEADER_DISPLAY_LANGUAGE", list_item->keyStr)) {
230                 setting_view_change(&setting_view_phone_language_region,
231                                     &setting_view_phone_display_language, ad);
232         } else if (!safeStrCmp(_(REGION_FORMAT_LOWER), list_item->keyStr)) {
233                 setting_view_change(&setting_view_phone_language_region,
234                                     &setting_view_phone_region_format, ad);
235         } else if (!safeStrCmp("IDS_ST_BODY_KEYBOARD", list_item->keyStr)) {
236                 setting_phone_lang_create_keyboard_ug(ad);
237         } else if (!safeStrCmp("IDS_VC_HEADER_VOICE_RECOGNITION", list_item->keyStr)) {
238                 setting_phone_lang_create_voice_recognition_ug(ad);
239         } else if (!safeStrCmp("IDS_ST_HEADER_TEXT_TO_SPEECH", list_item->keyStr)) {
240                 setting_phone_lang_create_text_speech_ug(ad);
241         } else if (!safeStrCmp("IDS_VC_MBODY_NOTIFICATION_READ_OUT", list_item->keyStr)) {
242                 setting_phone_lang_create_readout_ug(ad);
243         } else if (!safeStrCmp("IDS_ST_BODY_VOICE_CONTROL", list_item->keyStr)) {
244                 app_group_launcher("org.tizen.voice-setting|show:voice-control");
245         } else if (!safeStrCmp("IDS_ST_BODY_TTS", list_item->keyStr)) {
246                 app_group_launcher("org.tizen.voice-setting|show:tts");
247         }
248 }
249
250 /* ***************************************************
251  *
252  * main view func
253  *
254  ***************************************************/
255 /**
256  * @brief Callback of view creating
257  *
258  * @param cb The view data passed between all callbacks
259  * @return #1 on success, else on failed
260  */
261 static int setting_phone_language_region_create(void *cb)
262 {
263         SETTING_TRACE_BEGIN;
264         /* error check */
265         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
266
267         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
268         Evas_Object *scroller = NULL;
269
270         int region_automatic;
271
272         ad->lang_change = EINA_FALSE;
273
274         char *title = "IDS_ST_HEADER_LANGUAGE_AND_INPUT";
275         ad->ly_language =
276             setting_create_layout_navi_bar_genlist(ad->win_main_layout,
277                                                    ad->win_get, title,
278                                                                                            NULL,
279                                                    NULL,
280                                                    setting_phone_lang_click_softkey_cancel_cb,
281                                                    NULL, ad, &scroller,
282                                                    &(ad->navi_bar));
283         Elm_Object_Item *navi_it = elm_naviframe_top_item_get(ad->navi_bar);
284         elm_naviframe_item_pop_cb_set(navi_it, setting_phone_lang_click_softkey_cancel_cb, ad);
285         retv_if(ad->ly_language == NULL, SETTING_RETURN_FAIL);
286         ad->gl_lang_region = scroller;
287         ad->lang_region_navi_it = navi_it;
288         SETTING_TRACE("navi_it:%p", navi_it);
289         evas_object_smart_callback_add(ad->gl_lang_region, "realized", __gl_realized_cb, NULL);
290         Elm_Object_Item *item = NULL;
291         item =
292             elm_genlist_item_append(scroller, &itc_seperator,
293                                     NULL, NULL, ELM_GENLIST_ITEM_NONE,
294                                     NULL, NULL);
295         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
296
297         char *pa_display_lang = get_pa_display_language_str();
298         ad->data_display_language =
299             setting_create_Gendial_field_def(scroller,
300                                              &(ad->itc_2text_2),
301                                              setting_phone_lang_item_Gendial_mouse_up_cb,
302                                              ad, SWALLOW_Type_INVALID,
303                                              NULL, NULL, 0,
304                                              "IDS_ST_HEADER_DISPLAY_LANGUAGE",
305                                              _(pa_display_lang),
306                                              NULL);
307         if (ad->data_display_language) {
308                 ad->data_display_language->userdata = ad;
309         } else {
310                 SETTING_TRACE_ERROR("ad->data_display_language is NULL");
311         }
312         G_FREE(pa_display_lang);
313
314         char *pa_region = vconf_get_str(VCONFKEY_REGIONFORMAT);
315         if (pa_region == NULL) {
316                 SETTING_TRACE_ERROR
317                 ("[Error] get value of VCONFKEY_REGIONFORMAT fail.");
318         }
319         ad->prev_locale = (char *)g_strdup(pa_region);
320         /*check if the region is set to auto */
321         char *region_format_str = NULL;
322         vconf_get_bool(VCONFKEY_SETAPPL_REGION_AUTOMATIC_BOOL, &region_automatic);
323         if (region_automatic == 1) {
324                 region_format_str = (char *)g_strdup(_("IDS_ST_BODY_ANSWERINGMODE_AUTOMATIC"));
325         } else {
326                 region_format_str = setting_phone_lang_get_region_str(pa_region);
327         }
328         ad->data_region_fmt =
329             setting_create_Gendial_field_def(scroller,
330                                              &(ad->itc_2text_2),
331                                              setting_phone_lang_item_Gendial_mouse_up_cb,
332                                              ad, SWALLOW_Type_INVALID,
333                                              NULL, NULL, 0,
334                                              _(REGION_FORMAT_LOWER),
335                                              region_format_str, NULL);
336         if (ad->data_region_fmt) {
337                 ad->data_region_fmt->userdata = ad;
338         } else {
339                 SETTING_TRACE_ERROR("ad->data_region_fmt is NULL");
340         }
341
342         char *example_desc = setting_phone_lang_get_example_desc(pa_region, ad);
343         ad->data_region_fmt_example = setting_create_Gendial_field_def(scroller, &itc_multiline_text,
344                                                                        NULL,
345                                                                        NULL,
346                                                                        SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
347                                                                        NULL, NULL, 0, example_desc, NULL, NULL);
348         if (ad->data_region_fmt_example)
349                 elm_genlist_item_select_mode_set(ad->data_region_fmt_example->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
350
351         /* keyboard */
352         ad->data_title_keyboard = setting_create_Gendial_field_titleItem(scroller, &itc_group_item, _("IDS_ST_BODY_KEYBOARD"), NULL);
353         ad->data_keyboard =
354             setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
355                                              setting_phone_lang_item_Gendial_mouse_up_cb,
356                                              ad, SWALLOW_Type_INVALID, NULL,
357                                              NULL, 0, "IDS_ST_BODY_KEYBOARD",
358                                              NULL, NULL);
359
360         /* Speech */
361         ad->data_title_speech = setting_create_Gendial_field_titleItem(scroller, &itc_group_item, _("IDS_ST_BODY_SPEECH"), NULL);
362         setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
363                                          setting_phone_lang_item_Gendial_mouse_up_cb,
364                                          ad, SWALLOW_Type_INVALID, NULL,
365                                          NULL, 0, "IDS_ST_BODY_VOICE_CONTROL",
366                                          NULL, NULL);
367         setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
368                                          setting_phone_lang_item_Gendial_mouse_up_cb,
369                                          ad, SWALLOW_Type_INVALID, NULL,
370                                          NULL, 0, "IDS_ST_BODY_TTS",
371                                          NULL, NULL);
372         if (pa_region) {
373                 FREE(pa_region);
374         }
375         if (example_desc) {
376                 FREE(example_desc);
377         }
378
379         setting_view_phone_language_region.is_create = 1;
380         return SETTING_RETURN_SUCCESS;
381 }
382
383 /**
384  * @brief Callback of view destroy
385  *
386  * @param cb The view data passed between all callbacks
387  * @return #1 on success, else on failed
388  */
389 static int setting_phone_language_region_destroy(void *cb)
390 {
391         SETTING_TRACE_BEGIN;
392         /* error check */
393         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
394
395         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
396
397         evas_object_smart_callback_del(ad->gl_lang_region, "realized", __gl_realized_cb);
398
399         if (ad->ly_language != NULL) {
400                 evas_object_del(ad->ly_language);
401                 ad->ly_language = NULL;
402
403                 if (ad->lang_flush_timer) {
404                         ecore_timer_del(ad->lang_flush_timer);
405                         ad->lang_flush_timer = NULL;
406                 }
407
408                 if (ad->event_freeze_timer) {
409                         ecore_timer_del(ad->event_freeze_timer);
410                         ad->event_freeze_timer = NULL;
411                 }
412
413                 if (ad->pattern_generator) {
414                         udatpg_close(ad->pattern_generator);
415                         ad->pattern_generator = NULL;
416                 }
417                 setting_view_phone_language_region.is_create = 0;
418         }
419
420         return SETTING_RETURN_SUCCESS;
421 }
422
423
424
425 /**
426  * @brief Callback of view update
427  *
428  * @param cb The view data passed between all callbacks
429  * @return #1 on success, else on failed
430  */
431 static int setting_phone_language_region_update(void *cb)
432 {
433         SETTING_TRACE_BEGIN;
434         /* error check */
435         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
436
437         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
438
439         if (ad->ly_language != NULL) {
440                 evas_object_show(ad->ly_language);
441                 /*refresh the title */
442                 elm_object_item_text_set(ad->lang_region_navi_it, _("IDS_ST_HEADER_LANGUAGE_AND_INPUT")); /*"IDS_ST_BODY_LANGUAGE_AND_KEYBOARD")); */
443
444                 if (ad->data_display_language) {
445                         G_FREE(ad->data_display_language->sub_desc);
446                         ad->data_display_language->sub_desc = get_pa_display_language_str();
447                         elm_object_item_data_set(ad->data_display_language->item, ad->data_display_language);
448                         elm_genlist_item_update(ad->data_display_language->item);
449                 }
450                 /*refresh region ex */
451                 char *pa_region = vconf_get_str(VCONFKEY_REGIONFORMAT);
452                 if (pa_region == NULL) {
453                         SETTING_TRACE_ERROR
454                         ("[Error] get value of VCONFKEY_REGIONFORMAT fail.");
455                         return SETTING_RETURN_FAIL;
456                 }
457
458                 if (ad->data_region_fmt) {
459                         int region_automatic = 1;
460                         int ret = vconf_get_bool(VCONFKEY_SETAPPL_REGION_AUTOMATIC_BOOL, &region_automatic);
461                         if (ret == VCONF_ERROR) {
462                                 SETTING_TRACE_ERROR("get vconf region automatic err.");
463                         }
464
465                         if (region_automatic == 1) {
466                                 ad->data_region_fmt->sub_desc = (char *)g_strdup(_("IDS_ST_BODY_ANSWERINGMODE_AUTOMATIC"));
467                         } else {
468                                 ad->data_region_fmt->sub_desc = setting_phone_lang_get_region_str(pa_region);
469                         }
470                         G_FREE(ad->data_region_fmt->keyStr);
471                         ad->data_region_fmt->keyStr = (char *)g_strdup(_(REGION_FORMAT_LOWER));
472                         elm_object_item_data_set(ad->data_region_fmt->item, ad->data_region_fmt);
473                         elm_genlist_item_update(ad->data_region_fmt->item);
474                 }
475                 if (ad->data_region_fmt_example) {
476                         char *example_desc = setting_phone_lang_get_example_desc(pa_region, ad);
477                         G_FREE(ad->data_region_fmt_example->keyStr);
478                         ad->data_region_fmt_example->keyStr = (char *)g_strdup(example_desc);
479                         FREE(example_desc);
480                         elm_object_item_data_set(ad->data_region_fmt_example->item, ad->data_region_fmt_example);
481                         elm_genlist_item_update(ad->data_region_fmt_example->item);
482                 }
483                 if (ad->data_title_keyboard) {
484                         G_FREE(ad->data_title_keyboard->keyStr);
485                         ad->data_title_keyboard->keyStr = (char *)g_strdup(_("IDS_ST_BODY_KEYBOARD"));
486                         elm_object_item_data_set(ad->data_title_keyboard->item, ad->data_title_keyboard);
487                         elm_genlist_item_update(ad->data_title_keyboard->item);
488                 }
489                 if (ad->data_title_speech) {
490                         G_FREE(ad->data_title_speech->keyStr);
491                         ad->data_title_speech->keyStr = (char *)g_strdup(_("IDS_ST_BODY_SPEECH"));
492                         elm_object_item_data_set(ad->data_title_speech->item, ad->data_title_speech);
493                         elm_genlist_item_update(ad->data_title_speech->item);
494                 }
495                 if (ad->data_readout) {
496                         G_FREE(ad->data_readout->sub_desc);
497                         ad->data_readout->sub_desc = get_pa_noti_readout_str();
498                         elm_object_item_data_set(ad->data_readout->item, ad->data_readout);
499                         elm_genlist_item_update(ad->data_readout->item);
500                 }
501
502                 FREE(pa_region);
503         }
504 #if 0
505         if (ad->lang_change) {
506                 ad->lang_flush_timer = ecore_timer_add(0.3, setting_phone_language_region_flush_timer_cb, ad);
507                 ad->lang_change = EINA_FALSE;
508         }
509 #endif
510         return SETTING_RETURN_SUCCESS;
511 }
512
513
514
515 /**
516  * @brief Callback of view cleanup
517  *
518  * @param cb The view data passed between all callbacks
519  * @return #1 on success, else on failed
520  */
521 static int setting_phone_language_region_cleanup(void *cb)
522 {
523         SETTING_TRACE_BEGIN;
524         return SETTING_RETURN_SUCCESS;
525 }