2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
23 #include <efl_assist.h>
25 #include <vconf-keys.h>
27 //#include "ui_extension.h"
28 #include "w-input-selector.h"
29 #include "w-input-template.h"
30 #include "w-input-smartreply.h"
31 #include "w-input-keyboard.h"
32 #include "w-input-stt-ise.h"
33 #include "w-input-emoticon.h"
34 #include "w-input-stt-tos.h"
36 #ifdef SUPPORT_LOG_MANAGER
37 #include <samsung_log_manager.h>
38 #include <samsung_log_manager_uri.h>
46 App_Data* app_data = NULL;
47 #ifdef SUPPORT_LOG_MANAGER
48 static samsung_log_manager_h g_log_manager = NULL;
51 InputKeyboardData g_input_keyboard_data;
53 static Elm_Object_Item *it_empty;
54 static Elm_Object_Item *it_title;
55 static Elm_Object_Item *it_plus;
56 static int g_smartreply_current_number = 0; /* currently loaded smartreply number */
57 static unsigned int g_template_current_number = 0; /* currnetly loaded template number */
59 Evas_Coord last_step; // 0 ~ 9 for gesture, 10~11 for rotary
61 static Eina_Bool force_highlight_to_top = EINA_FALSE;
62 static Eina_Bool force_highlight_to_bottom = EINA_FALSE;
63 static Eina_Bool is_genlist_highlighed = EINA_FALSE;
65 void _init_app_data(App_Data* app_data);
66 static void _app_language_changed(app_event_info_h event_info, void *user_data);
67 static int _app_control_request_transient_app_cb(void *data);
68 #ifdef SUPPORT_LOG_MANAGER
69 static void log_manager_init(void);
70 static void log_manager_exit(void);
71 static void log_manager_set(const char *feature, const char *extra, const char *value);
74 static char *_genlist_text_set_theme_color(const char *str, const char *code);
76 Evas_Object* _create_genlist(Evas_Object* parent);
77 void _create_genlist_items(void* user_data, bool is_type_reply);
78 void _update_genlist_items(void *user_data);
79 void _update_smartreply_items(void *user_data);
80 void _update_template_items(void *user_data);
81 static void _popup_close_cb(void *data, Evas_Object *obj, void *event_info);
82 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info);
83 char * _toast_delete_popup_access_info_cb(void *data, Evas_Object *obj);
87 void _init_app_data(App_Data* app_data)
89 app_data->win_main = NULL;
90 app_data->layout_main = NULL;
91 app_data->conform = NULL;
92 app_data->naviframe = NULL;
93 app_data->genlist = NULL;
95 app_data->res_path = NULL;
100 Evas_Object* load_edj(Evas_Object* parent, const char* file, const char* group)
103 Evas_Object* content;
106 window = elm_layout_add(parent);
108 ret = elm_layout_file_set(window, file, group);
110 evas_object_del(window);
114 content = elm_layout_add(parent);
115 elm_layout_theme_set(content, "layout", "application", "default");
116 elm_object_part_content_set(window, "elm.swallow.content", content);
118 evas_object_size_hint_weight_set(window, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
124 void init_customizing_theme(void)
126 string stt_edj_path = get_resource_path();
127 string app_edj_path = get_resource_path();
129 stt_edj_path = stt_edj_path + STT_EDJ_FILE;
130 app_edj_path = app_edj_path + APP_EDJ_FILE;
132 elm_theme_extension_add(NULL, stt_edj_path.c_str());
133 elm_theme_extension_add(NULL, app_edj_path.c_str());
137 static Eina_Bool back_cb(void *data, Elm_Object_Item *it)
139 reply_to_sender_by_callback_for_back();
144 static void _stt_clicked_cb(void *data, Evas_Object * obj, void *event_info)
146 App_Data* ad = (App_Data*)data;
148 PRINTFUNC(DLOG_DEBUG, "");
154 bool bAgreed = false;
155 stt_get_user_agreement(&bAgreed);
158 if(is_tos_N66_agreed() == EINA_FALSE){
159 if(is_sap_connection() == EINA_TRUE){
160 ise_show_tos_n66_popup(ad);
162 launch_bt_connection_popup(ad);
165 ise_show_stt_popup(ad);
169 #ifdef SUPPORT_LOG_MANAGER
170 log_manager_set("IM01", "STT", NULL);
174 static void _input_smartreply_notify_cb(void *user_data)
176 ecore_main_loop_iterate();
177 _update_genlist_items((void *)app_data);
180 static void _input_template_notify_cb(void *user_data)
182 _update_genlist_items((void *)app_data);
186 static void _emoticon_clicked_cb(void *data, Evas_Object * obj, void *event_info)
188 App_Data* ad = (App_Data*)data;
190 PRINTFUNC(DLOG_DEBUG, "");
195 // ise_show_emoticon_popup(ad);
196 ise_show_emoticon_popup_rotary(ad);
198 #ifdef SUPPORT_LOG_MANAGER
199 log_manager_set("IM01", "Emoticon", NULL);
203 static void _keyboard_clicked_cb(void *data, Evas_Object * obj, void *event_info)
205 App_Data* ad = (App_Data *)data;
207 PRINTFUNC(DLOG_DEBUG, "");
212 #ifdef SUPPORT_LOG_MANAGER
213 log_manager_set("IM01", "Keypad", NULL);
216 if (app_data->app_type == APP_TYPE_KEYBOARD_FROM_SMS)
217 input_keyboard_launch(ad->win_main);
219 input_keyboard_launch_with_ui(ad->win_main, data);
222 static void __bt_connection_result_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
227 PRINTFUNC(DLOG_ERROR, "service_h is NULL");
231 app_control_get_extra_data(reply, "__BT_CONNECTION__", &val);
233 if ( strcmp(val, "Connected") == 0 ) {
234 PRINTFUNC(DLOG_ERROR, "BT Connected");
236 PRINTFUNC(DLOG_ERROR, "BT Not Connected");
244 static void __ise_smartreply_gl_sel(void *data, Evas_Object *obj, void *event_info)
246 App_Data* app_data = (App_Data*) data;
247 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
250 elm_genlist_item_selected_set(item, EINA_FALSE);
252 int index = (unsigned int) elm_object_item_data_get(item);
254 #ifdef SUPPORT_LOG_MANAGER
255 log_manager_set("IM01", "Preset", NULL);
256 log_manager_set("IM02", "Smart Reply", NULL);
258 char *reply = input_smartreply_get_nth_item(index);
260 input_smartreply_send_feedback(reply);
261 if(app_data->reply_type == REPLY_APP_CONTROL){
262 reply_to_sender_by_appcontrol((void*)app_data, reply, "smartreply");
265 reply_to_sender_by_callback(reply, "smartreply");
273 static void __ise_template_add_gl_sel(void *data, Evas_Object *obj, void *event_info)
275 App_Data* app_data = (App_Data*) data;
276 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
279 elm_genlist_item_selected_set(item, EINA_FALSE);
281 if(is_sap_connection() == EINA_TRUE){
283 show_popup_toast(gettext("WDS_IME_TPOP_ADD_TEMPLATE_ON_YOUR_PHONE_ABB"), true);
285 // send message to Host
286 app_control_h appctrl;
287 app_control_create(&appctrl);
288 app_control_set_app_id(appctrl, "com.samsung.w-manager-service");
289 app_control_add_extra_data(appctrl, "type", "gm_setting");
290 app_control_add_extra_data(appctrl, "data/setting_menu", "texttemplate_setting");
291 app_control_send_launch_request(appctrl, NULL, NULL);
292 app_control_destroy(appctrl);
294 app_control_h app_control;
295 app_control_create(&app_control);
296 app_control_set_app_id(app_control, "com.samsung.bt-connection-popup");
297 app_control_add_extra_data(app_control, "msg", "perform");
298 app_control_send_launch_request(app_control, __bt_connection_result_cb, NULL);
299 app_control_destroy(app_control);
304 static void __ise_template_gl_sel(void *data, Evas_Object *obj, void *event_info)
306 App_Data* app_data = (App_Data*) data;
307 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
311 elm_genlist_item_selected_set(item, EINA_FALSE);
313 index = (unsigned int) elm_object_item_data_get(item);
314 const std::vector<TemplateData> template_list = input_template_get_list();
316 //@ToDo : should call reply function when any template string is selected and confirmed.
317 // Here reply string will be template_list[index].text.c_str();
318 if( index < template_list.size()) {
319 #ifdef SUPPORT_LOG_MANAGER
320 log_manager_set("IM01", "Preset", NULL);
321 log_manager_set("IM02", "Preset except smart reply", NULL);
323 if(app_data->reply_type == REPLY_APP_CONTROL){
324 reply_to_sender_by_appcontrol((void*)app_data, gettext(template_list[index].text.c_str()), "template");
326 reply_to_sender_by_callback(gettext(template_list[index].text.c_str()), "template");
333 static Evas_Object * __ise_gl_3button_content_get(void *data, Evas_Object *obj, const char *part)
335 if (!strcmp(part, "elm.icon.1") || (!strcmp(part, "elm.icon.2")) || (!strcmp(part, "elm.icon.3"))) {
336 Evas_Object* btn = elm_button_add(obj);
337 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
338 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
339 Evas_Object* ic = elm_image_add(btn);
340 elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
341 string path = get_resource_path();
342 if (!strcmp(part, "elm.icon.1")) {
343 elm_object_style_set(btn, "anchor");
344 string path_ic = path + "images/w_mode_stt_ic.png";
345 elm_image_file_set(ic, path_ic.c_str(), NULL);
346 elm_object_content_set(btn, ic);
347 evas_object_layer_set(btn, 32000);
349 int powerSavingMode = -1;
351 // Power Saving mode check
352 ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &powerSavingMode);
355 PRINTFUNC(DLOG_ERROR, "VCONFKEY_SETAPPL_PSMODE FAILED");
358 if (powerSavingMode == SETTING_PSMODE_WEARABLE_ENHANCED) {
359 PRINTFUNC(DLOG_ERROR, "Power Saving mode, disable stt !!!");
360 elm_object_disabled_set(btn, EINA_TRUE);
362 } else if (!strcmp(part, "elm.icon.2")){
363 elm_object_style_set(btn, "anchor");
364 string path_ic = path + "images/Delta_w_mode_emoticon_ic.png";
365 elm_image_file_set(ic, path_ic.c_str(), NULL);
366 elm_object_content_set(btn, ic);
367 evas_object_layer_set(btn, 32000);
369 } else if (!strcmp(part, "elm.icon.3")){
370 elm_object_style_set(btn, "anchor");
371 string path_ic = path + "images/w_mode_keyboard_ic.png";
372 elm_image_file_set(ic, path_ic.c_str(), NULL);
373 elm_object_content_set(btn, ic);
374 evas_object_layer_set(btn, 32000);
375 evas_object_propagate_events_set(btn, EINA_FALSE);
379 } else if (!strcmp(part, "elm.icon.1.touch_area") || (!strcmp(part, "elm.icon.2.touch_area")) || (!strcmp(part, "elm.icon.3.touch_area"))) {
380 Evas_Object* btn = elm_button_add(obj);
381 elm_object_style_set(btn, "touch_area");
382 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
383 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
384 string path = get_resource_path();
385 if (!strcmp(part, "elm.icon.1.touch_area")) {
386 int powerSavingMode = -1;
388 // Power Saving mode check
389 ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &powerSavingMode);
392 PRINTFUNC(DLOG_ERROR, "VCONFKEY_SETAPPL_PSMODE FAILED");
395 if (powerSavingMode == SETTING_PSMODE_WEARABLE_ENHANCED) {
396 PRINTFUNC(DLOG_ERROR, "Power Saving mode, disable stt !!!");
397 elm_object_disabled_set(btn, EINA_TRUE);
400 evas_object_layer_set(btn, 32000);
401 evas_object_smart_callback_add(btn, "clicked", _stt_clicked_cb, app_data);
403 } else if (!strcmp(part, "elm.icon.2.touch_area")){
404 evas_object_layer_set(btn, 32000);
405 evas_object_smart_callback_add(btn, "clicked", _emoticon_clicked_cb, app_data);
406 } else if (!strcmp(part, "elm.icon.3.touch_area")) {
407 evas_object_layer_set(btn, 32000);
408 evas_object_propagate_events_set(btn, EINA_FALSE);
409 evas_object_smart_callback_add(btn, "clicked", _keyboard_clicked_cb, app_data);
413 } else if (!strcmp(part, "base")) {
414 Evas_Object* btn = elm_button_add(obj);
415 elm_object_style_set(btn, "ime_transparent");
421 static char * __ise_smartreply_gl_text_get(void *data, Evas_Object *obj, const char *part)
423 if(!strcmp(part, "elm.text")) {
431 reply = input_smartreply_get_nth_item(index);
435 /* Set hightlight color on first 3 smartreply items */
437 char *colored = _genlist_text_set_theme_color(reply, "AT0113");
439 if (colored == NULL) {
452 static char * __ise_template_gl_text_get(void *data, Evas_Object *obj, const char *part)
454 if(!strcmp(part, "elm.text")) {
455 unsigned int index = (unsigned int)data;
456 const std::vector<TemplateData> template_list = input_template_get_list();
458 if(index < template_list.size()) {
459 if(template_list[index].use_gettext) {
460 return strdup(gettext(template_list[index].text.c_str()));
462 Eina_Strbuf *buf = NULL;
463 const char *str = NULL;
466 buf = eina_strbuf_new();
468 eina_strbuf_append(buf, template_list[index].text.c_str());
469 eina_strbuf_replace_all(buf, "\n", "");
470 eina_strbuf_replace_all(buf, "\r", "");
472 str = eina_strbuf_string_get(buf);
475 markup = elm_entry_utf8_to_markup(str);
477 eina_strbuf_free(buf);
487 static char * __ise_addtemplate_gl_text_get(void *data, Evas_Object *obj, const char *part)
489 if(!strcmp(part, "elm.text")) {
490 return(strdup(gettext("WDS_IME_MBODY_ADD_TEMPLATE_ABB")));
495 static Evas_Object * __ise_gl_1button_content_get(void *data, Evas_Object *obj, const char *part)
497 if (!strcmp(part, "elm.icon")) {
498 Evas_Object* btn = elm_button_add(obj);
499 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
500 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
501 Evas_Object* ic = elm_image_add(btn);
502 elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
503 string path = get_resource_path();
504 elm_object_style_set(btn, "ime_button_template");
505 string path_ic = path + "/images/w_list_add_ic.png";
506 elm_image_file_set(ic, path_ic.c_str(), NULL);
507 elm_object_content_set(btn, ic);
508 evas_object_layer_set(btn, 32000);
515 static void __ise_gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
517 //Update genlist items. The Item texts will be translated in the _gl_text_get().
518 elm_genlist_realized_items_update(obj);
521 static int _app_control_request_transient_app_cb(void *data)
527 static char *_genlist_text_set_theme_color(const char *str, const char *code)
530 Eina_Strbuf *buf = NULL;
531 char *colored = NULL;
536 buf = eina_strbuf_new();
538 PRINTFUNC(DLOG_ERROR, "Can not get create strbuf");
542 // ea_theme_color_get(code,
544 // NULL, NULL, NULL, NULL,
545 // NULL, NULL, NULL, NULL);
547 eina_strbuf_append_printf(buf, "<color=#%02x%02x%02x%02x>%s</color>",
550 colored = eina_strbuf_string_steal(buf);
552 eina_strbuf_free(buf);
558 static void _app_control_send_reply_cb(app_control_h request, app_control_h reply,
559 app_control_result_e result, void *user_data)
561 PRINTFUNC(DLOG_DEBUG, "");
562 reply_to_sender_by_callback(NULL, NULL);
566 void set_source_caller_app_id(app_control_h app_control)
569 PRINTFUNC(DLOG_ERROR, "can't get app_control");
573 // CscFeatureBool is_security_permission_manager = CSC_FEATURE_BOOL_FALSE;
574 // is_security_permission_manager = csc_feature_get_bool(CSC_FEATURE_DEF_BOOL_SECURITY_PERMISSION_MANAGER);
576 // if(is_security_permission_manager == CSC_FEATURE_BOOL_TRUE){
579 app_control_get_caller(app_data->source_app_control, &caller);
582 PRINTFUNC(DLOG_DEBUG, "caller = %s", caller);
583 app_control_add_extra_data(app_control, "caller_appid", caller);
589 void reply_to_sender_by_appcontrol(void *data, const char *value, const char *type)
591 PRINTFUNC(DLOG_DEBUG, "");
596 app_control_h app_control;
598 App_Data *appdata = (App_Data *)data;
601 PRINTFUNC(DLOG_ERROR, "Null pointer");
605 ret = app_control_create(&app_control);
606 if (ret != APP_CONTROL_ERROR_NONE) {
607 PRINTFUNC(DLOG_ERROR, "Can not create app_control : %d", ret);
611 app_id = g_input_keyboard_data.app_id;
612 if (app_id == NULL) {
613 PRINTFUNC(DLOG_INFO, "app id is undefined, use defualt");
614 app_id = "com.samsung.message.appcontrol.compose";
617 if(!strcmp(app_id, "com.samsung.message.appcontrol.compose")){
618 app_id = "com.samsung.msg-send";
621 app_control_set_app_id(app_control, app_id);
622 app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
624 ret = app_control_set_window(app_control,
625 elm_win_xwindow_get(appdata->win_main));
626 if (ret != APP_CONTROL_ERROR_NONE) {
627 PRINTFUNC(DLOG_ERROR, "Can not app control set window : %d", ret);
628 app_control_destroy(app_control);
632 if (g_input_keyboard_data.data_array && g_input_keyboard_data.data_array_len > 0) {
633 app_control_add_extra_data_array(app_control,
634 "selector_keyboard_data_array",
635 (const char**)(g_input_keyboard_data.data_array),
636 g_input_keyboard_data.data_array_len);
639 app_control_add_extra_data(app_control, "selector_send_data_array", "sending_popup");
642 app_control_add_extra_data(app_control, "selected_context", value);
645 app_control_add_extra_data(app_control, "reply_type", type);
647 set_source_caller_app_id(app_control);
649 ret = app_control_send_launch_request(app_control,
650 _app_control_send_reply_cb,
653 if (ret != APP_CONTROL_ERROR_NONE)
654 PRINTFUNC(DLOG_ERROR, "Can not launch app_control: %d", ret);
656 app_control_destroy(app_control);
661 void reply_to_sender_by_callback(const char *value, const char *type)
663 PRINTFUNC(DLOG_DEBUG, "");
665 app_control_h app_control;
667 if(app_control_create(&app_control) == 0) {
671 app_control_add_extra_data(app_control, "selected_context", value);
674 app_control_add_extra_data(app_control, "reply_type", type);
676 set_source_caller_app_id(app_control);
678 ret = app_control_reply_to_launch_request(app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED);
679 if (ret != APP_CONTROL_ERROR_NONE)
680 PRINTFUNC(DLOG_ERROR, "reply failed : %d", ret);
682 app_control_destroy(app_control);
683 app_control_destroy(app_data->source_app_control);
684 app_data->source_app_control = NULL;
688 void reply_to_sender_by_callback_for_back()
690 PRINTFUNC(DLOG_DEBUG, "");
692 app_control_h app_control;
694 if(app_control_create(&app_control) == 0) {
697 app_control_add_extra_data(app_control, "back_to_composer", "yes");
699 ret = app_control_reply_to_launch_request(app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED);
700 if (ret != APP_CONTROL_ERROR_NONE)
701 PRINTFUNC(DLOG_ERROR, "reply failed : %d", ret);
703 app_control_destroy(app_control);
704 app_control_destroy(app_data->source_app_control);
705 app_data->source_app_control = NULL;
709 char* get_resource_path()
711 if(NULL == app_data->res_path) {
712 app_data->res_path = app_get_resource_path();
713 PRINTFUNC(DLOG_INFO, "set resource path = %s", app_data->res_path);
715 return (app_data->res_path);
718 char* get_shared_resource_path()
720 if(NULL == app_data->shared_res_path) {
721 app_data->shared_res_path = app_get_shared_resource_path();
722 PRINTFUNC(DLOG_INFO, "set shared resource path = %s", app_data->shared_res_path);
724 return (app_data->shared_res_path);
727 void show_gl_focus(Eina_Bool bVisible){
728 if(app_data->genlist == NULL)
731 if(bVisible == EINA_TRUE){
732 elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,enable", "elm");
733 //elm_layout_theme_set(app_data->genlist, "genlist", "base", "focus_bg");
734 //elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,show", "elm");
736 elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,disable", "elm");
737 //elm_layout_theme_set(app_data->genlist, "genlist", "base", "default");
738 //elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,hide", "elm");
742 void show_popup_toast(const char *text, bool check_img)
744 PRINTFUNC(DLOG_ERROR, "show_popup_toast");
748 popup = elm_popup_add(app_data->win_main);
749 elm_object_style_set(popup, "toast/circle");
750 elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
751 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
754 string path = get_resource_path();
755 string path_ic = path + "/images/toast_check_icon.png";
756 Evas_Object * img = elm_image_add(popup);
757 elm_image_file_set(img, path_ic.c_str(), NULL);
758 elm_object_part_content_set(popup, "toast,icon", img);
761 elm_object_part_text_set(popup, "elm.text", text);
764 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _popup_back_cb, NULL);
765 evas_object_smart_callback_add(popup, "dismissed", _popup_close_cb, NULL);
766 evas_object_smart_callback_add(popup, "block,clicked", _popup_back_cb, NULL);
768 elm_popup_timeout_set(popup, 2.0);
769 evas_object_show(popup);
772 static void _popup_close_cb(void *data, Evas_Object *obj, void *event_info)
775 evas_object_hide(obj);
776 evas_object_del(obj);
780 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
783 elm_popup_dismiss(obj);
786 char * _toast_delete_popup_access_info_cb(void *data, Evas_Object *obj)
788 PRINTFUNC(DLOG_ERROR, "%s", __func__);
789 const char * info = elm_object_part_text_get((Evas_Object*)data, "elm.text");
795 void _back_to_genlist_for_selector()
797 PRINTFUNC(DLOG_DEBUG, "");
799 if(!app_data) return;
801 if(app_data->app_type == APP_TYPE_STT || app_data->app_type == APP_TYPE_EMOTICON){
802 PRINTFUNC(DLOG_DEBUG, "launched as STT/EMOTICON mode, So exit here.");
803 reply_to_sender_by_callback(NULL, NULL);
807 Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
809 eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
813 char *_it_plus_access_info_cb(void *data, Evas_Object *obj)
815 PRINTFUNC(DLOG_DEBUG, "%s", __func__);
816 std::string text = std::string(gettext("IDS_ACCS_BODY_BUTTON_TTS"));
818 return strdup(text.c_str());
821 char *_access_info_cb(void *data, Evas_Object *obj)
823 PRINTFUNC(DLOG_DEBUG, "%s", __func__);
824 return strdup(gettext("WDS_TTS_TBBODY_DOUBLE_TAP_TO_SEND"));
827 Eina_Bool _access_action_next_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
829 Evas_Object *genlist = (Evas_Object*)data;
830 PRINTFUNC(DLOG_ERROR, "[TNT] _access_action_next_cb called, genlist type:%s", evas_object_type_get(genlist));
831 Elm_Object_Item *it = elm_genlist_first_item_get(genlist);//emptry item?
832 PRINTFUNC(DLOG_ERROR, "[TNT] get first item:%p", it);
833 it = elm_genlist_item_next_get(it);//title item(3 button?)
834 PRINTFUNC(DLOG_ERROR, "[TNT] get Second item:%p, title_item:%p", it, it_title);
835 elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
836 force_highlight_to_top = EINA_TRUE;
840 Eina_Bool _access_action_prev_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
842 Evas_Object *genlist = (Evas_Object*)data;
843 PRINTFUNC(DLOG_ERROR, "[TNT] _access_action_prev_cb called, genlist type:%s", evas_object_type_get(genlist));
844 Elm_Object_Item *it = elm_genlist_last_item_get(genlist);//plus button item
845 PRINTFUNC(DLOG_ERROR, "[TNT] get last item:%p", it);
846 elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
847 force_highlight_to_bottom = EINA_TRUE;
851 static void _item_realized(void *data, Evas_Object *obj, void *event_info) //called when list scrolled
853 PRINTFUNC(DLOG_DEBUG, "%s", __func__);
856 Evas_Object* _create_genlist(Evas_Object* navi)
858 Evas_Object* genlist = elm_genlist_add(navi);
862 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
863 elm_genlist_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
865 Evas_Object* circle_object_genlist = eext_circle_object_genlist_add(genlist, app_data->circle_surface);
866 eext_circle_object_genlist_scroller_policy_set(circle_object_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
867 evas_object_data_set(genlist, "circle", (void *) circle_object_genlist);
868 eext_rotary_object_event_activated_set(circle_object_genlist, EINA_TRUE);
870 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
871 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
873 evas_object_smart_callback_add(genlist, "language,changed", __ise_gl_lang_changed, genlist);
874 evas_object_show(genlist);
876 // uxt_genlist_set_bottom_margin_enabled(genlist, EINA_TRUE);
878 show_gl_focus(EINA_FALSE);
880 Elm_Object_Item *nf_main_item = elm_naviframe_item_push(navi,
887 elm_naviframe_item_pop_cb_set(nf_main_item, back_cb, app_data);
888 evas_object_smart_callback_add(genlist, "realized", _item_realized, NULL);
893 static void _item_position_changed_cb(void *data, Evas_Object *obj, void *event_info)
898 Evas_Object *genlist = (Evas_Object *)obj;
899 Elm_Object_Item *gen_item = (Elm_Object_Item *)data;
902 elm_scroller_region_get(genlist, NULL, &y, NULL, NULL);
904 // PRINTFUNC(DLOG_DEBUG,"y=%d",y);
906 if (250 > y && y >= 100){
907 if (last_step == 0) return;
909 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.0", "elm");
910 show_gl_focus(EINA_TRUE);
911 } else if (100 > y && y >= 50){
912 if (last_step == 1) return;
914 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.1", "elm");
915 show_gl_focus(EINA_TRUE);
916 } else if (y < 50 && y >=0){
917 if (last_step == 2) return;
919 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.9", "elm");
920 show_gl_focus(EINA_FALSE);
925 _main_menu_title_text_get(void *data, Evas_Object *obj, const char *part)
929 snprintf(buf, 1023, "%s", "Select method");
933 void _create_genlist_items(void* user_data, bool is_type_reply)
935 LOGD("[psw] _create_genlist_items");
937 App_Data* app_data = (App_Data*) user_data;
939 if(NULL == app_data->genlist) {
940 app_data->genlist = _create_genlist(app_data->naviframe);
941 if(NULL == app_data->genlist)
945 elm_genlist_clear(app_data->genlist);
946 g_smartreply_current_number = 0; /* reset previous smartreply size to 0 */
948 Elm_Genlist_Item_Class * itc0 = elm_genlist_item_class_new();
949 itc0->item_style = "title";
950 itc0->func.text_get = _main_menu_title_text_get;
951 itc0->func.content_get = NULL;
952 itc0->func.state_get = NULL;
953 itc0->func.del = NULL;
955 Elm_Genlist_Item_Class * itc1 = elm_genlist_item_class_new();
956 itc1->item_style = "3button";
957 itc1->func.text_get = NULL;
958 itc1->func.content_get = __ise_gl_3button_content_get;
959 itc1->func.state_get = NULL;
960 itc1->func.del = NULL;
963 // dummy title for empty space
964 it_empty = elm_genlist_item_append(app_data->genlist, itc0,
966 ELM_GENLIST_ITEM_NONE,
969 if (!is_type_reply) {
971 it_title = elm_genlist_item_append(app_data->genlist, itc1,
973 ELM_GENLIST_ITEM_NONE,
976 elm_genlist_item_select_mode_set(it_title, ELM_OBJECT_SELECT_MODE_NONE);
978 if (input_smartreply_is_enabled() == false) {
979 _update_template_items(app_data);
980 if(g_template_current_number > 0) {
981 Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
982 eext_circle_object_genlist_scroller_policy_set(circle_genlist,
983 ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
986 // dummy title for bottom
987 Elm_Object_Item *dummy;
989 dummy = elm_genlist_item_append(app_data->genlist, itc0,
991 ELM_GENLIST_ITEM_NONE,
994 elm_genlist_item_select_mode_set(dummy, ELM_OBJECT_SELECT_MODE_NONE);
998 Elm_Object_Item *item = elm_genlist_item_next_get(it_title);
999 elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
1001 evas_object_smart_callback_add(app_data->genlist, "elm,item,position,changed", _item_position_changed_cb, it_title);
1003 elm_genlist_item_class_free(itc0);
1004 elm_genlist_item_class_free(itc1);
1007 void _update_genlist_items(void *user_data)
1011 if (input_smartreply_is_enabled())
1012 len = input_smartreply_get_reply_num();
1014 if (g_smartreply_current_number != len)
1015 _update_smartreply_items(user_data);
1017 _update_template_items(user_data);
1019 g_smartreply_current_number = len;
1021 if (g_smartreply_current_number > 0 || g_template_current_number > 0) {
1022 Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
1023 eext_circle_object_genlist_scroller_policy_set(circle_genlist,
1024 ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
1028 void _update_smartreply_items(void *user_data)
1032 Elm_Object_Item *first;
1033 Elm_Object_Item *menu;
1034 Elm_Object_Item *pos;
1039 app_data = (App_Data *)user_data;
1041 if (app_data == NULL) {
1042 PRINTFUNC(DLOG_ERROR, "Can not get app_data");
1046 if (app_data->genlist == NULL) {
1047 /* smartreply will update when genlist is exist only */
1048 PRINTFUNC(DLOG_ERROR, "Can not get getlist");
1052 if (input_smartreply_is_enabled())
1053 len = input_smartreply_get_reply_num();
1055 if (g_smartreply_current_number == len)
1058 first = elm_genlist_first_item_get(app_data->genlist);
1059 menu = elm_genlist_item_next_get(first);
1061 /* Remove current smartreply list */
1062 pos = elm_genlist_item_next_get(menu);
1063 for (i = 0; i < g_smartreply_current_number; i++) {
1064 Elm_Object_Item *next;
1069 next = elm_genlist_item_next_get(pos);
1070 elm_object_item_del(pos);
1074 /* Append newly added smartreply list */
1076 Elm_Genlist_Item_Class *itc;
1078 itc = elm_genlist_item_class_new();
1080 itc->item_style = "1text";
1081 itc->func.text_get = __ise_smartreply_gl_text_get;
1082 itc->func.content_get = NULL;
1083 itc->func.state_get = NULL;
1084 itc->func.del = NULL;
1087 for (i = 0; i < len; i++) {
1088 pos = elm_genlist_item_insert_after(app_data->genlist,
1093 ELM_GENLIST_ITEM_NONE,
1094 __ise_smartreply_gl_sel,
1099 elm_genlist_item_show(menu, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1101 elm_genlist_item_class_free(itc);
1104 g_smartreply_current_number = len;
1108 void _update_template_items(void *user_data)
1112 Elm_Object_Item *first;
1113 Elm_Object_Item *menu;
1114 Elm_Object_Item *pos;
1115 Elm_Object_Item *template_pos;
1117 unsigned int template_len = 0;
1120 app_data = (App_Data *)user_data;
1122 if (app_data == NULL) {
1123 PRINTFUNC(DLOG_ERROR, "Can not get app_data");
1127 if (app_data->genlist == NULL) {
1128 /* smartreply will update when genlist is exist only */
1129 PRINTFUNC(DLOG_ERROR, "Can not get getlist");
1133 if (app_data->app_type == APP_TYPE_REPLY) {
1134 menu = elm_genlist_first_item_get(app_data->genlist);
1136 first = elm_genlist_first_item_get(app_data->genlist);
1137 menu = elm_genlist_item_next_get(first);
1141 /* move to smartreply next if it need */
1142 if (input_smartreply_is_enabled()) {
1143 int smartreply_len = 0;
1145 smartreply_len = input_smartreply_get_reply_num();
1146 if (smartreply_len > 0) {
1149 for (j = 0; j < smartreply_len; j++) {
1153 pos = elm_genlist_item_next_get(pos);
1158 /* Remove Current template list */
1159 template_pos = elm_genlist_item_next_get(pos);
1160 for (i = 0 ; i < g_template_current_number; i++) {
1161 Elm_Object_Item *next;
1163 if (template_pos == NULL) {
1164 PRINTFUNC(DLOG_ERROR, "Template mismatched, iter : %d, current num: %d",
1165 i, g_template_current_number);
1169 next = elm_genlist_item_next_get(template_pos);
1170 elm_object_item_del(template_pos);
1171 template_pos = next;
1174 /* Remove Add or dummpy button */
1176 Elm_Object_Item *next;
1178 next = elm_genlist_item_next_get(template_pos);
1179 elm_object_item_del(template_pos);
1180 template_pos = next;
1183 /* Append New Template list */
1184 const std::vector<TemplateData> template_list = input_template_get_list();
1187 if (template_list.size() > 0) {
1188 Elm_Genlist_Item_Class *itc;
1190 itc = elm_genlist_item_class_new();
1192 itc->item_style = "1text";
1193 itc->func.text_get = __ise_template_gl_text_get;
1194 itc->func.content_get = NULL;
1195 itc->func.state_get = NULL;
1196 itc->func.del = NULL;
1198 for (i = 0; i < template_list.size(); i++) {
1199 bool matched = false;
1201 if(!template_list[i].use_gettext) {
1202 int smartreply_len = 0;
1205 smartreply_len = input_smartreply_get_reply_num();
1206 for (j = 0; j < smartreply_len; j++) {
1209 reply = input_smartreply_get_nth_item(j);
1211 if (!strcmp(reply, template_list[i].text.c_str())) {
1221 if (matched == false) {
1222 pos = elm_genlist_item_insert_after(app_data->genlist,
1227 ELM_GENLIST_ITEM_NONE,
1228 __ise_template_gl_sel,
1234 elm_genlist_item_class_free(itc);
1238 // template add button (+)
1239 /* if (!input_template_is_user_template()) {
1240 Elm_Genlist_Item_Class *itc;
1242 itc = elm_genlist_item_class_new();
1244 itc->item_style = "1text.1icon";
1245 itc->func.text_get = __ise_addtemplate_gl_text_get;;
1246 itc->func.content_get = __ise_gl_1button_content_get;
1247 itc->func.state_get = NULL;
1248 itc->func.del = NULL;
1251 pos = elm_genlist_item_insert_after(app_data->genlist,
1256 ELM_GENLIST_ITEM_NONE,
1257 __ise_template_add_gl_sel,
1260 elm_genlist_item_class_free(itc);
1264 elm_genlist_item_show(menu, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1266 g_template_current_number = template_len;
1270 bool _app_create(void* user_data)
1272 int width = 1000, height = 1000;
1273 // App_Data* app_data = NULL;
1274 Evas_Object* layout = NULL;
1275 Evas_Object* conform = NULL;
1276 Evas_Object* bg = NULL;
1277 Evas_Object* window = NULL;
1278 Eext_Circle_Surface *surface;
1284 _app_language_changed(NULL, NULL);
1285 #ifdef SUPPORT_LOG_MANAGER
1289 app_data = (App_Data*)user_data;
1291 elm_app_base_scale_set(1.3);
1293 window = elm_win_add(NULL, PACKAGE, ELM_WIN_BASIC);
1295 init_customizing_theme();
1297 elm_win_title_set(window, PACKAGE);
1298 elm_win_borderless_set(window, EINA_TRUE);
1299 // ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height);
1300 evas_object_resize(window, width, height);
1301 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
1303 LOGE("elm_win_add() is failed.");
1307 bg = elm_bg_add(window);
1308 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1309 elm_win_resize_object_add(window, bg);
1310 evas_object_show(bg);
1312 layout = elm_layout_add(window);
1313 elm_layout_theme_set(layout, "layout", "application", "default");
1314 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1316 conform = elm_conformant_add(window);
1317 surface = eext_circle_surface_conformant_add(conform);
1318 evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1321 elm_win_resize_object_add(window, conform);
1322 elm_object_content_set(conform, layout);
1324 evas_object_show(layout);
1325 evas_object_show(conform);
1326 evas_object_show(window);
1327 app_data->win_main = window;
1328 app_data->conform = conform;
1329 app_data->layout_main = layout;
1330 app_data->circle_surface = surface;
1331 app_data->app_type = APP_TYPE_SELECT_MODE;
1333 Evas_Object *naviframe = elm_naviframe_add(layout);
1334 elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE);
1335 eext_object_event_callback_add(naviframe, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, NULL);
1336 elm_object_part_content_set(layout, "elm.swallow.content", naviframe);
1337 evas_object_show(naviframe);
1339 app_data->naviframe = naviframe;
1344 void _app_service(app_control_h service, void* user_data)
1348 char *context = NULL;
1349 char *app_id = NULL;
1351 app_control_clone(&(app_data->source_app_control), service);
1353 app_data->reply_type = REPLY_APP_NORMAL;
1354 ret = app_control_get_extra_data(service, "selector_keyboard_app_id", &app_id);
1355 if (ret == APP_CONTROL_ERROR_NONE) {
1356 PRINTFUNC(DLOG_DEBUG, "app_id = %s", app_id);
1360 if(!strcmp(app_id, "com.samsung.message.appcontrol.compose") || !strcmp(app_id, "com.samsung.wemail-send")) {
1361 app_data->reply_type = REPLY_APP_CONTROL;
1363 app_data->reply_type = REPLY_APP_NORMAL;
1369 bool is_type_reply = false;
1370 ret = app_control_get_extra_data(service, APP_CONTROL_DATA_INPUT_TYPE, &context);
1371 if (ret == APP_CONTROL_ERROR_NONE) {
1372 if (!strcmp(context, "input_voice")) {
1373 app_data->app_type = APP_TYPE_STT;
1374 _stt_clicked_cb((void *)app_data, NULL, NULL);
1376 } else if (!strcmp(context, "input_emoticon")) {
1377 app_data->app_type = APP_TYPE_EMOTICON;
1378 _emoticon_clicked_cb((void *)app_data, NULL, NULL);
1380 } else if (!strcmp(context, "input_keyboard")) {
1381 app_data->app_type = APP_TYPE_KEYBOARD;
1382 input_keyboard_init(service);
1383 _keyboard_clicked_cb((void *)app_data, NULL, NULL);
1385 } else if (!strcmp(context, "keyboard_input_from_sms")) {
1386 app_data->app_type = APP_TYPE_KEYBOARD_FROM_SMS;
1387 input_keyboard_init(service);
1388 _keyboard_clicked_cb((void *)app_data, NULL, NULL);
1390 } else if (!strcmp(context, "input_reply")) {
1391 app_data->app_type = APP_TYPE_REPLY;
1392 is_type_reply = true;
1396 if (app_data->genlist == NULL)
1397 app_data->genlist = _create_genlist(app_data->naviframe);
1399 input_keyboard_init(service);
1401 // input_smartreply_init(service);
1402 // input_smartreply_set_notify(_input_smartreply_notify_cb, NULL);
1404 // if (input_smartreply_is_enabled())
1405 // input_smartreply_get_reply_async();
1408 input_template_init(service);
1409 input_template_set_notify(_input_template_notify_cb, NULL);
1411 _create_genlist_items(app_data, is_type_reply);
1414 elm_win_activate(app_data->win_main);
1416 // app_control_request_transient_app(service, elm_win_xwindow_get(app_data->win_main), _app_control_request_transient_app_cb, NULL);
1422 void _app_pause(void* user_data)
1424 PRINTFUNC(DLOG_DEBUG, "");
1428 void _app_resume(void* user_data)
1430 PRINTFUNC(DLOG_DEBUG, "");
1433 void _app_terminate(void* user_data)
1435 App_Data* app_data = NULL;
1436 app_data = (App_Data*)user_data;
1438 if(app_data->genlist){
1439 evas_object_smart_callback_del(app_data->genlist, "elm,item,position,changed", _item_position_changed_cb);
1442 if(app_data->res_path)
1443 free(app_data->res_path);
1445 if(app_data->shared_res_path)
1446 free(app_data->shared_res_path);
1448 input_keyboard_deinit();
1449 input_smartreply_deinit();
1451 input_template_unset_notify();
1452 input_template_deinit();
1454 #ifdef SUPPORT_LOG_MANAGER
1459 static int init_i18n(const char *domain, const char *dir, char *lang_str)
1461 if (setlocale(LC_ALL, "") == NULL) {
1462 PRINTFUNC(DLOG_INFO, "Some environment variable is invalid, setlocale(LC_ALL, \"\") has returns\ed a null pointer");
1463 if (setlocale(LC_ALL, lang_str) == NULL)
1466 if (bindtextdomain(domain, dir) == NULL)
1468 if (textdomain(domain) == NULL)
1475 * @brief Set language and locale.
1479 static void _app_language_changed(app_event_info_h event_info, void *user_data)
1481 char* lang_str = vconf_get_str(VCONFKEY_LANGSET);
1483 setenv("LANG", lang_str, 1);
1484 setenv("LC_MESSAGES", lang_str, 1);
1486 setenv("LANG", "en_GB.utf8", 1);
1487 setenv("LC_MESSAGES", "en_GB.utf8", 1);
1488 lang_str = strdup("en_GB.UTF-8");
1491 init_i18n(PACKAGE, LOCALEDIR, lang_str);
1494 elm_language_set(lang_str);
1501 int main(int argc, char* argv[])
1503 App_Data app_data = {0, };
1504 ui_app_lifecycle_callback_s event_callback = {0, };
1505 app_event_handler_h handlers[5] = {NULL, };
1507 event_callback.create = _app_create;
1508 event_callback.terminate = _app_terminate;
1509 event_callback.pause = _app_pause;
1510 event_callback.resume = _app_resume;
1511 event_callback.app_control = _app_service;
1513 ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, &app_data);
1514 ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, &app_data);
1515 ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, &app_data);
1516 ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed, &app_data);
1517 ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, NULL, &app_data);
1519 _init_app_data(&app_data);
1521 int ret = ui_app_main(argc, argv, &event_callback, &app_data);
1522 if (ret != APP_ERROR_NONE) {
1523 LOGD("ui_app_main() is failed. err = %d", ret);
1529 #ifdef SUPPORT_LOG_MANAGER
1530 static void log_manager_init(void)
1535 samsung_log_manager_create(&g_log_manager);
1538 static void log_manager_exit(void)
1540 samsung_log_manager_destroy(g_log_manager);
1541 g_log_manager = NULL;
1544 static void log_manager_set(const char *feature, const char *extra, const char *value)
1546 const char *uri = USE_APP_FEATURE_SURVEY_URI;
1548 unsigned int request_id;
1551 if (g_log_manager == NULL) {
1552 PRINTFUNC(DLOG_ERROR, "log manager doesn't initialized");
1556 if (feature == NULL) {
1557 PRINTFUNC(DLOG_ERROR, "feature is empty");
1561 log_data = bundle_create();
1563 bundle_add(log_data, "app_id", PACKAGE);
1564 bundle_add(log_data, "feature", feature);
1567 bundle_add(log_data, "extra", extra);
1569 bundle_add(log_data, "value", value);
1571 samsung_log_manager_insert(g_log_manager, uri, log_data, NULL, NULL, &request_id);
1573 bundle_free(log_data);