4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <setting-phone-language-region.h>
22 #include <setting-common-draw-widget.h>
23 #include <app_manager.h>
24 #include <pkgmgr-info.h>
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);
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,
43 * @brief Callback of language change flush timer
45 * @param cb The view data passed between all callbacks
46 * @return #1 means call it again, else means call it only once
48 static Eina_Bool setting_phone_language_region_flush_timer_cb(void *cb)
51 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
52 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
54 elm_config_all_flush();
55 ad->lang_flush_timer = NULL;
62 static Eina_Bool setting_phone_language_region_freeze_event_timer_cb(void *cb)
65 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
66 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
68 evas_object_freeze_events_set(ad->navi_bar, EINA_FALSE);
70 ad->event_freeze_timer = NULL;
76 * @brief Finds appid with specific category
78 * @return 0 if success, negative value(<0) if fail. Callback is not called if return value is negative
80 static int _find_appid_ime_list(const pkgmgrinfo_appinfo_h handle, void *user_data)
83 char **result = (char **)user_data;
88 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
89 if (ret == PMINFO_R_OK) {
90 *result = strdup(appid);
92 LOGW("pkgmgrinfo_appinfo_get_appid failed!");
95 LOGW("user_data is null!");
98 return -1; /* This callback is no longer called. */
102 * @brief create keyboard ug by app control
104 * @param ad The view data passed
106 static void setting_phone_lang_create_keyboard_ug(SettingPhoneUG *ad)
111 /* Launch IME List application; e.g., org.tizen.inputmethod-setting-list */
113 app_control_h app_control;
115 pkgmgrinfo_appinfo_filter_h handle;
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);
124 pkgmgrinfo_appinfo_filter_destroy(handle);
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);
138 app_control_destroy(app_control);
142 LOGW("AppID with http://tizen.org/category/ime-list category is not available");
147 * @brief create voice recognition ug by app control
150 static void setting_phone_lang_create_voice_recognition_ug(SettingPhoneUG *ad)
153 if (app_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);
160 * @brief create text-to-speech ug by app control
163 static void setting_phone_lang_create_text_speech_ug(SettingPhoneUG *ad)
166 if (app_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);
173 * @brief create readout(old name : drivingmode) ug by app control
175 * @param ad The view data passed
177 static void setting_phone_lang_create_readout_ug(SettingPhoneUG *ad)
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);
189 * @brief Callback of cancel button
191 * @param cb The view data passed between all callbacks
193 static Eina_Bool setting_phone_lang_click_softkey_cancel_cb(void *data, Elm_Object_Item *it)
196 retvm_if(data == NULL, EINA_FALSE, "Data parameter is NULL");
197 SettingPhoneUG *ad = (SettingPhoneUG *) data;
199 Eina_Bool is_freezed = evas_object_freeze_events_get(ad->navi_bar);
200 SETTING_TRACE_DEBUG("is_freezed : %d", is_freezed);
204 ug_destroy_me(ad->ug);
209 * @brief Callback of view cleanup
211 * @param cb The view data passed between all callbacks
212 * @return #1 on success, else on failed
214 static void setting_phone_lang_item_Gendial_mouse_up_cb(void *data,
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;
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");
227 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
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_launcher("org.tizen.voice-setting|show:voice-control");
245 } else if (!safeStrCmp("IDS_ST_BODY_TTS", list_item->keyStr)) {
246 app_launcher("org.tizen.voice-setting|show:tts");
250 /* ***************************************************
254 ***************************************************/
256 * @brief Callback of view creating
258 * @param cb The view data passed between all callbacks
259 * @return #1 on success, else on failed
261 static int setting_phone_language_region_create(void *cb)
265 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
267 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
268 Evas_Object *scroller = NULL;
270 int region_automatic;
272 ad->lang_change = EINA_FALSE;
274 char *title = "IDS_ST_HEADER_LANGUAGE_AND_INPUT";
276 setting_create_layout_navi_bar_genlist(ad->win_main_layout,
280 setting_phone_lang_click_softkey_cancel_cb,
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;
292 elm_genlist_item_append(scroller, &itc_seperator,
293 NULL, NULL, ELM_GENLIST_ITEM_NONE,
295 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
297 char *pa_display_lang = get_pa_display_language_str();
298 ad->data_display_language =
299 setting_create_Gendial_field_def(scroller,
301 setting_phone_lang_item_Gendial_mouse_up_cb,
302 ad, SWALLOW_Type_INVALID,
304 "IDS_ST_HEADER_DISPLAY_LANGUAGE",
307 if (ad->data_display_language) {
308 ad->data_display_language->userdata = ad;
310 SETTING_TRACE_ERROR("ad->data_display_language is NULL");
312 G_FREE(pa_display_lang);
314 char *pa_region = vconf_get_str(VCONFKEY_REGIONFORMAT);
315 if (pa_region == NULL) {
317 ("[Error] get value of VCONFKEY_REGIONFORMAT fail.");
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, ®ion_automatic);
323 if (region_automatic == 1) {
324 region_format_str = (char *)g_strdup(_("IDS_ST_BODY_ANSWERINGMODE_AUTOMATIC"));
326 region_format_str = setting_phone_lang_get_region_str(pa_region);
328 ad->data_region_fmt =
329 setting_create_Gendial_field_def(scroller,
331 setting_phone_lang_item_Gendial_mouse_up_cb,
332 ad, SWALLOW_Type_INVALID,
334 _(REGION_FORMAT_LOWER),
335 region_format_str, NULL);
336 if (ad->data_region_fmt) {
337 ad->data_region_fmt->userdata = ad;
339 SETTING_TRACE_ERROR("ad->data_region_fmt is NULL");
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,
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);
352 ad->data_title_keyboard = setting_create_Gendial_field_titleItem(scroller, &itc_group_item, _("IDS_ST_BODY_KEYBOARD"), NULL);
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",
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",
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",
379 setting_view_phone_language_region.is_create = 1;
380 return SETTING_RETURN_SUCCESS;
384 * @brief Callback of view destroy
386 * @param cb The view data passed between all callbacks
387 * @return #1 on success, else on failed
389 static int setting_phone_language_region_destroy(void *cb)
393 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
395 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
397 evas_object_smart_callback_del(ad->gl_lang_region, "realized", __gl_realized_cb);
399 if (ad->ly_language != NULL) {
400 evas_object_del(ad->ly_language);
401 ad->ly_language = NULL;
403 if (ad->lang_flush_timer) {
404 ecore_timer_del(ad->lang_flush_timer);
405 ad->lang_flush_timer = NULL;
408 if (ad->event_freeze_timer) {
409 ecore_timer_del(ad->event_freeze_timer);
410 ad->event_freeze_timer = NULL;
413 if (ad->pattern_generator) {
414 udatpg_close(ad->pattern_generator);
415 ad->pattern_generator = NULL;
417 setting_view_phone_language_region.is_create = 0;
420 return SETTING_RETURN_SUCCESS;
426 * @brief Callback of view update
428 * @param cb The view data passed between all callbacks
429 * @return #1 on success, else on failed
431 static int setting_phone_language_region_update(void *cb)
435 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
437 SettingPhoneUG *ad = (SettingPhoneUG *) cb;
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")); */
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);
450 /*refresh region ex */
451 char *pa_region = vconf_get_str(VCONFKEY_REGIONFORMAT);
452 if (pa_region == NULL) {
454 ("[Error] get value of VCONFKEY_REGIONFORMAT fail.");
455 return SETTING_RETURN_FAIL;
458 if (ad->data_region_fmt) {
459 int region_automatic = 1;
460 int ret = vconf_get_bool(VCONFKEY_SETAPPL_REGION_AUTOMATIC_BOOL, ®ion_automatic);
461 if (ret == VCONF_ERROR) {
462 SETTING_TRACE_ERROR("get vconf region automatic err.");
465 if (region_automatic == 1) {
466 ad->data_region_fmt->sub_desc = (char *)g_strdup(_("IDS_ST_BODY_ANSWERINGMODE_AUTOMATIC"));
468 ad->data_region_fmt->sub_desc = setting_phone_lang_get_region_str(pa_region);
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);
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);
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);
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);
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);
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);
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;
510 return SETTING_RETURN_SUCCESS;
516 * @brief Callback of view cleanup
518 * @param cb The view data passed between all callbacks
519 * @return #1 on success, else on failed
521 static int setting_phone_language_region_cleanup(void *cb)
524 return SETTING_RETURN_SUCCESS;