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"
41 App_Data* app_data = NULL;
43 InputKeyboardData g_input_keyboard_data;
45 static Elm_Object_Item *it_empty;
46 static Elm_Object_Item *it_title;
47 static Elm_Object_Item *it_plus;
48 static int g_smartreply_current_number = 0; /* currently loaded smartreply number */
49 static unsigned int g_template_current_number = 0; /* currnetly loaded template number */
51 Evas_Coord last_step; // 0 ~ 9 for gesture, 10~11 for rotary
53 void _init_app_data(App_Data* app_data);
54 static void _app_language_changed(app_event_info_h event_info, void *user_data);
56 static char *_genlist_text_set_theme_color(const char *str, const char *code);
58 Evas_Object* _create_genlist(Evas_Object* parent);
59 void _create_genlist_items(void* user_data, bool is_type_reply);
60 void _update_genlist_items(void *user_data);
61 void _update_smartreply_items(void *user_data);
62 void _update_template_items(void *user_data);
63 static void _popup_close_cb(void *data, Evas_Object *obj, void *event_info);
64 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info);
68 void _init_app_data(App_Data* app_data)
70 app_data->win_main = NULL;
71 app_data->layout_main = NULL;
72 app_data->conform = NULL;
73 app_data->naviframe = NULL;
74 app_data->genlist = NULL;
76 app_data->res_path = NULL;
81 Evas_Object* load_edj(Evas_Object* parent, const char* file, const char* group)
87 window = elm_layout_add(parent);
89 ret = elm_layout_file_set(window, file, group);
91 evas_object_del(window);
95 content = elm_layout_add(parent);
96 elm_layout_theme_set(content, "layout", "application", "default");
97 elm_object_part_content_set(window, "elm.swallow.content", content);
99 evas_object_size_hint_weight_set(window, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
105 void init_customizing_theme(void)
107 string stt_edj_path = get_resource_path();
108 string app_edj_path = get_resource_path();
110 stt_edj_path = stt_edj_path + STT_EDJ_FILE;
111 app_edj_path = app_edj_path + APP_EDJ_FILE;
113 elm_theme_extension_add(NULL, stt_edj_path.c_str());
114 elm_theme_extension_add(NULL, app_edj_path.c_str());
118 static Eina_Bool back_cb(void *data, Elm_Object_Item *it)
120 reply_to_sender_by_callback_for_back();
125 static void _stt_clicked_cb(void *data, Evas_Object * obj, void *event_info)
127 App_Data* ad = (App_Data*)data;
129 PRINTFUNC(DLOG_DEBUG, "");
135 bool bAgreed = false;
136 stt_get_user_agreement(&bAgreed);
139 if(is_tos_N66_agreed() == EINA_FALSE){
140 if(is_sap_connection() == EINA_TRUE){
141 ise_show_tos_n66_popup(ad);
143 launch_bt_connection_popup(ad);
146 ise_show_stt_popup(ad);
150 static void _input_smartreply_notify_cb(void *user_data)
152 ecore_main_loop_iterate();
153 _update_genlist_items((void *)app_data);
156 static void _input_template_notify_cb(void *user_data)
158 _update_genlist_items((void *)app_data);
162 static void _emoticon_clicked_cb(void *data, Evas_Object * obj, void *event_info)
164 App_Data* ad = (App_Data*)data;
166 PRINTFUNC(DLOG_DEBUG, "");
171 // ise_show_emoticon_popup(ad);
172 ise_show_emoticon_popup_rotary(ad);
175 static void _keyboard_clicked_cb(void *data, Evas_Object * obj, void *event_info)
177 App_Data* ad = (App_Data *)data;
179 PRINTFUNC(DLOG_DEBUG, "");
184 input_keyboard_launch(ad->win_main, data);
187 static void __bt_connection_result_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
192 PRINTFUNC(DLOG_ERROR, "service_h is NULL");
196 app_control_get_extra_data(reply, "__BT_CONNECTION__", &val);
198 if ( strcmp(val, "Connected") == 0 ) {
199 PRINTFUNC(DLOG_ERROR, "BT Connected");
201 PRINTFUNC(DLOG_ERROR, "BT Not Connected");
208 static void __ise_smartreply_gl_sel(void *data, Evas_Object *obj, void *event_info)
210 App_Data* app_data = (App_Data*) data;
211 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
214 elm_genlist_item_selected_set(item, EINA_FALSE);
216 int index = (unsigned int) elm_object_item_data_get(item);
218 char *reply = input_smartreply_get_nth_item(index);
220 input_smartreply_send_feedback(reply);
221 reply_to_sender_by_callback(reply, "smartreply");
228 static void __ise_template_add_gl_sel(void *data, Evas_Object *obj, void *event_info)
230 App_Data* app_data = (App_Data*) data;
231 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
234 elm_genlist_item_selected_set(item, EINA_FALSE);
236 if(is_sap_connection() == EINA_TRUE){
238 show_popup_toast(gettext("WDS_IME_TPOP_ADD_TEMPLATE_ON_YOUR_PHONE_ABB"), true);
240 // send message to Host
241 app_control_h appctrl;
242 app_control_create(&appctrl);
243 app_control_set_app_id(appctrl, "com.samsung.w-manager-service");
244 app_control_add_extra_data(appctrl, "type", "gm_setting");
245 app_control_add_extra_data(appctrl, "data/setting_menu", "texttemplate_setting");
246 app_control_send_launch_request(appctrl, NULL, NULL);
247 app_control_destroy(appctrl);
249 app_control_h app_control;
250 app_control_create(&app_control);
251 app_control_set_app_id(app_control, "com.samsung.bt-connection-popup");
252 app_control_add_extra_data(app_control, "msg", "perform");
253 app_control_send_launch_request(app_control, __bt_connection_result_cb, NULL);
254 app_control_destroy(app_control);
259 static void __ise_template_gl_sel(void *data, Evas_Object *obj, void *event_info)
261 App_Data* app_data = (App_Data*) data;
262 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
266 elm_genlist_item_selected_set(item, EINA_FALSE);
268 index = (unsigned int) elm_object_item_data_get(item);
269 const std::vector<TemplateData> template_list = input_template_get_list();
271 //@ToDo : should call reply function when any template string is selected and confirmed.
272 // Here reply string will be template_list[index].text.c_str();
273 if( index < template_list.size()) {
274 reply_to_sender_by_callback(gettext(template_list[index].text.c_str()), "template");
280 static Evas_Object * __ise_gl_3button_content_get(void *data, Evas_Object *obj, const char *part)
282 if (!strcmp(part, "elm.icon.1") || (!strcmp(part, "elm.icon.2")) || (!strcmp(part, "elm.icon.3"))) {
283 Evas_Object* btn = elm_button_add(obj);
284 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
285 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
286 Evas_Object* ic = elm_image_add(btn);
287 elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
288 string path = get_resource_path();
289 if (!strcmp(part, "elm.icon.1")) {
290 elm_object_style_set(btn, "anchor");
291 string path_ic = path + "images/w_mode_stt_ic.png";
292 elm_image_file_set(ic, path_ic.c_str(), NULL);
293 elm_object_content_set(btn, ic);
294 evas_object_layer_set(btn, 32000);
296 } else if (!strcmp(part, "elm.icon.2")){
297 elm_object_style_set(btn, "anchor");
298 string path_ic = path + "images/Delta_w_mode_emoticon_ic.png";
299 elm_image_file_set(ic, path_ic.c_str(), NULL);
300 elm_object_content_set(btn, ic);
301 evas_object_layer_set(btn, 32000);
303 } else if (!strcmp(part, "elm.icon.3")){
304 elm_object_style_set(btn, "anchor");
305 string path_ic = path + "images/w_mode_keyboard_ic.png";
306 elm_image_file_set(ic, path_ic.c_str(), NULL);
307 elm_object_content_set(btn, ic);
308 evas_object_layer_set(btn, 32000);
309 evas_object_propagate_events_set(btn, EINA_FALSE);
313 } else if (!strcmp(part, "elm.icon.1.touch_area") || (!strcmp(part, "elm.icon.2.touch_area")) || (!strcmp(part, "elm.icon.3.touch_area"))) {
314 Evas_Object* btn = elm_button_add(obj);
315 elm_object_style_set(btn, "touch_area");
316 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
317 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
318 string path = get_resource_path();
319 if (!strcmp(part, "elm.icon.1.touch_area")) {
320 evas_object_layer_set(btn, 32000);
321 evas_object_smart_callback_add(btn, "clicked", _stt_clicked_cb, app_data);
323 } else if (!strcmp(part, "elm.icon.2.touch_area")){
324 evas_object_layer_set(btn, 32000);
325 evas_object_smart_callback_add(btn, "clicked", _emoticon_clicked_cb, app_data);
326 } else if (!strcmp(part, "elm.icon.3.touch_area")) {
327 evas_object_layer_set(btn, 32000);
328 evas_object_propagate_events_set(btn, EINA_FALSE);
329 evas_object_smart_callback_add(btn, "clicked", _keyboard_clicked_cb, app_data);
333 } else if (!strcmp(part, "base")) {
334 Evas_Object* btn = elm_button_add(obj);
335 elm_object_style_set(btn, "ime_transparent");
341 static char * __ise_smartreply_gl_text_get(void *data, Evas_Object *obj, const char *part)
343 if(!strcmp(part, "elm.text")) {
351 reply = input_smartreply_get_nth_item(index);
355 /* Set hightlight color on first 3 smartreply items */
357 char *colored = _genlist_text_set_theme_color(reply, "AT0113");
359 if (colored == NULL) {
372 static char * __ise_template_gl_text_get(void *data, Evas_Object *obj, const char *part)
374 if(!strcmp(part, "elm.text")) {
375 unsigned int index = (unsigned int)data;
376 const std::vector<TemplateData> template_list = input_template_get_list();
378 if(index < template_list.size()) {
379 if(template_list[index].use_gettext) {
380 return strdup(gettext(template_list[index].text.c_str()));
382 Eina_Strbuf *buf = NULL;
383 const char *str = NULL;
386 buf = eina_strbuf_new();
388 eina_strbuf_append(buf, template_list[index].text.c_str());
389 eina_strbuf_replace_all(buf, "\n", "");
390 eina_strbuf_replace_all(buf, "\r", "");
392 str = eina_strbuf_string_get(buf);
395 markup = elm_entry_utf8_to_markup(str);
397 eina_strbuf_free(buf);
407 static char * __ise_addtemplate_gl_text_get(void *data, Evas_Object *obj, const char *part)
409 if(!strcmp(part, "elm.text")) {
410 return(strdup(gettext("WDS_IME_MBODY_ADD_TEMPLATE_ABB")));
415 static Evas_Object * __ise_gl_1button_content_get(void *data, Evas_Object *obj, const char *part)
417 if (!strcmp(part, "elm.icon")) {
418 Evas_Object* btn = elm_button_add(obj);
419 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
420 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
421 Evas_Object* ic = elm_image_add(btn);
422 elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
423 string path = get_resource_path();
424 elm_object_style_set(btn, "ime_button_template");
425 string path_ic = path + "/images/w_list_add_ic.png";
426 elm_image_file_set(ic, path_ic.c_str(), NULL);
427 elm_object_content_set(btn, ic);
428 evas_object_layer_set(btn, 32000);
435 static void __ise_gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
437 //Update genlist items. The Item texts will be translated in the _gl_text_get().
438 elm_genlist_realized_items_update(obj);
442 static char *_genlist_text_set_theme_color(const char *str, const char *code)
445 Eina_Strbuf *buf = NULL;
446 char *colored = NULL;
451 buf = eina_strbuf_new();
453 PRINTFUNC(DLOG_ERROR, "Can not get create strbuf");
457 // ea_theme_color_get(code,
459 // NULL, NULL, NULL, NULL,
460 // NULL, NULL, NULL, NULL);
462 eina_strbuf_append_printf(buf, "<color=#%02x%02x%02x%02x>%s</color>",
465 colored = eina_strbuf_string_steal(buf);
467 eina_strbuf_free(buf);
473 static void _app_control_send_reply_cb(app_control_h request, app_control_h reply,
474 app_control_result_e result, void *user_data)
476 PRINTFUNC(DLOG_DEBUG, "");
477 reply_to_sender_by_callback(NULL, NULL);
481 void set_source_caller_app_id(app_control_h app_control)
484 PRINTFUNC(DLOG_ERROR, "can't get app_control");
489 app_control_get_caller(app_data->source_app_control, &caller);
492 PRINTFUNC(DLOG_DEBUG, "caller = %s", caller);
493 app_control_add_extra_data(app_control, "caller_appid", caller);
498 void reply_to_sender_by_callback(const char *value, const char *type)
500 PRINTFUNC(DLOG_DEBUG, "");
502 app_control_h app_control;
504 if(app_control_create(&app_control) == 0) {
508 app_control_add_extra_data(app_control, "selected_context", value);
511 app_control_add_extra_data(app_control, "reply_type", type);
513 set_source_caller_app_id(app_control);
515 ret = app_control_reply_to_launch_request(app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED);
516 if (ret != APP_CONTROL_ERROR_NONE)
517 PRINTFUNC(DLOG_ERROR, "reply failed : %d", ret);
519 app_control_destroy(app_control);
520 app_control_destroy(app_data->source_app_control);
521 app_data->source_app_control = NULL;
525 void reply_to_sender_by_callback_for_back()
527 PRINTFUNC(DLOG_DEBUG, "");
529 app_control_h app_control;
531 if(app_control_create(&app_control) == 0) {
534 app_control_add_extra_data(app_control, "back_to_composer", "yes");
536 ret = app_control_reply_to_launch_request(app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED);
537 if (ret != APP_CONTROL_ERROR_NONE)
538 PRINTFUNC(DLOG_ERROR, "reply failed : %d", ret);
540 app_control_destroy(app_control);
541 app_control_destroy(app_data->source_app_control);
542 app_data->source_app_control = NULL;
546 char* get_resource_path()
548 if(NULL == app_data->res_path) {
549 app_data->res_path = app_get_resource_path();
550 PRINTFUNC(DLOG_INFO, "set resource path = %s", app_data->res_path);
552 return (app_data->res_path);
555 char* get_shared_resource_path()
557 if(NULL == app_data->shared_res_path) {
558 app_data->shared_res_path = app_get_shared_resource_path();
559 PRINTFUNC(DLOG_INFO, "set shared resource path = %s", app_data->shared_res_path);
561 return (app_data->shared_res_path);
564 void show_gl_focus(Eina_Bool bVisible){
565 if(app_data->genlist == NULL)
568 if(bVisible == EINA_TRUE){
569 elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,enable", "elm");
570 //elm_layout_theme_set(app_data->genlist, "genlist", "base", "focus_bg");
571 //elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,show", "elm");
573 elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,disable", "elm");
574 //elm_layout_theme_set(app_data->genlist, "genlist", "base", "default");
575 //elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,hide", "elm");
579 void show_popup_toast(const char *text, bool check_img)
581 PRINTFUNC(DLOG_ERROR, "show_popup_toast");
585 popup = elm_popup_add(app_data->win_main);
586 elm_object_style_set(popup, "toast/circle");
587 elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
588 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
591 string path = get_resource_path();
592 string path_ic = path + "/images/toast_check_icon.png";
593 Evas_Object * img = elm_image_add(popup);
594 elm_image_file_set(img, path_ic.c_str(), NULL);
595 elm_object_part_content_set(popup, "toast,icon", img);
598 elm_object_part_text_set(popup, "elm.text", text);
601 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _popup_back_cb, NULL);
602 evas_object_smart_callback_add(popup, "dismissed", _popup_close_cb, NULL);
603 evas_object_smart_callback_add(popup, "block,clicked", _popup_back_cb, NULL);
605 elm_popup_timeout_set(popup, 2.0);
606 evas_object_show(popup);
609 static void _popup_close_cb(void *data, Evas_Object *obj, void *event_info)
612 evas_object_hide(obj);
613 evas_object_del(obj);
617 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
620 elm_popup_dismiss(obj);
624 void _back_to_genlist_for_selector()
626 PRINTFUNC(DLOG_DEBUG, "");
628 if(!app_data) return;
630 if(app_data->app_type == APP_TYPE_STT || app_data->app_type == APP_TYPE_EMOTICON){
631 PRINTFUNC(DLOG_DEBUG, "launched as STT/EMOTICON mode, So exit here.");
632 reply_to_sender_by_callback(NULL, NULL);
636 Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
638 eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
641 static void _item_realized(void *data, Evas_Object *obj, void *event_info) //called when list scrolled
643 PRINTFUNC(DLOG_DEBUG, "%s", __func__);
646 Evas_Object* _create_genlist(Evas_Object* navi)
648 Evas_Object* genlist = elm_genlist_add(navi);
652 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
653 elm_genlist_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
655 Evas_Object* circle_object_genlist = eext_circle_object_genlist_add(genlist, app_data->circle_surface);
656 eext_circle_object_genlist_scroller_policy_set(circle_object_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
657 evas_object_data_set(genlist, "circle", (void *) circle_object_genlist);
658 eext_rotary_object_event_activated_set(circle_object_genlist, EINA_TRUE);
660 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
661 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
663 evas_object_smart_callback_add(genlist, "language,changed", __ise_gl_lang_changed, genlist);
664 evas_object_show(genlist);
666 // uxt_genlist_set_bottom_margin_enabled(genlist, EINA_TRUE);
668 show_gl_focus(EINA_FALSE);
670 Elm_Object_Item *nf_main_item = elm_naviframe_item_push(navi,
677 elm_naviframe_item_pop_cb_set(nf_main_item, back_cb, app_data);
678 evas_object_smart_callback_add(genlist, "realized", _item_realized, NULL);
683 static void _item_position_changed_cb(void *data, Evas_Object *obj, void *event_info)
688 Evas_Object *genlist = (Evas_Object *)obj;
689 Elm_Object_Item *gen_item = (Elm_Object_Item *)data;
692 elm_scroller_region_get(genlist, NULL, &y, NULL, NULL);
694 // PRINTFUNC(DLOG_DEBUG,"y=%d",y);
696 if (250 > y && y >= 100){
697 if (last_step == 0) return;
699 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.0", "elm");
700 show_gl_focus(EINA_TRUE);
701 } else if (100 > y && y >= 50){
702 if (last_step == 1) return;
704 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.1", "elm");
705 show_gl_focus(EINA_TRUE);
706 } else if (y < 50 && y >=0){
707 if (last_step == 2) return;
709 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.9", "elm");
710 show_gl_focus(EINA_FALSE);
715 _main_menu_title_text_get(void *data, Evas_Object *obj, const char *part)
719 snprintf(buf, 1023, "%s", "Select method");
723 void _create_genlist_items(void* user_data, bool is_type_reply)
725 LOGD("[psw] _create_genlist_items");
727 App_Data* app_data = (App_Data*) user_data;
729 if(NULL == app_data->genlist) {
730 app_data->genlist = _create_genlist(app_data->naviframe);
731 if(NULL == app_data->genlist)
735 elm_genlist_clear(app_data->genlist);
736 g_smartreply_current_number = 0; /* reset previous smartreply size to 0 */
738 Elm_Genlist_Item_Class * itc0 = elm_genlist_item_class_new();
739 itc0->item_style = "title";
740 itc0->func.text_get = _main_menu_title_text_get;
741 itc0->func.content_get = NULL;
742 itc0->func.state_get = NULL;
743 itc0->func.del = NULL;
745 Elm_Genlist_Item_Class * itc1 = elm_genlist_item_class_new();
746 itc1->item_style = "3button";
747 itc1->func.text_get = NULL;
748 itc1->func.content_get = __ise_gl_3button_content_get;
749 itc1->func.state_get = NULL;
750 itc1->func.del = NULL;
753 // dummy title for empty space
754 it_empty = elm_genlist_item_append(app_data->genlist, itc0,
756 ELM_GENLIST_ITEM_NONE,
759 if (!is_type_reply) {
761 it_title = elm_genlist_item_append(app_data->genlist, itc1,
763 ELM_GENLIST_ITEM_NONE,
766 elm_genlist_item_select_mode_set(it_title, ELM_OBJECT_SELECT_MODE_NONE);
768 if (input_smartreply_is_enabled() == false) {
769 _update_template_items(app_data);
770 if(g_template_current_number > 0) {
771 Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
772 eext_circle_object_genlist_scroller_policy_set(circle_genlist,
773 ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
776 // dummy title for bottom
777 Elm_Object_Item *dummy;
779 dummy = elm_genlist_item_append(app_data->genlist, itc0,
781 ELM_GENLIST_ITEM_NONE,
784 elm_genlist_item_select_mode_set(dummy, ELM_OBJECT_SELECT_MODE_NONE);
788 Elm_Object_Item *item = elm_genlist_item_next_get(it_title);
789 elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
791 evas_object_smart_callback_add(app_data->genlist, "elm,item,position,changed", _item_position_changed_cb, it_title);
793 elm_genlist_item_class_free(itc0);
794 elm_genlist_item_class_free(itc1);
797 void _update_genlist_items(void *user_data)
801 if (input_smartreply_is_enabled())
802 len = input_smartreply_get_reply_num();
804 if (g_smartreply_current_number != len)
805 _update_smartreply_items(user_data);
807 _update_template_items(user_data);
809 g_smartreply_current_number = len;
811 if (g_smartreply_current_number > 0 || g_template_current_number > 0) {
812 Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
813 eext_circle_object_genlist_scroller_policy_set(circle_genlist,
814 ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
818 void _update_smartreply_items(void *user_data)
822 Elm_Object_Item *first;
823 Elm_Object_Item *menu;
824 Elm_Object_Item *pos;
829 app_data = (App_Data *)user_data;
831 if (app_data == NULL) {
832 PRINTFUNC(DLOG_ERROR, "Can not get app_data");
836 if (app_data->genlist == NULL) {
837 /* smartreply will update when genlist is exist only */
838 PRINTFUNC(DLOG_ERROR, "Can not get getlist");
842 if (input_smartreply_is_enabled())
843 len = input_smartreply_get_reply_num();
845 if (g_smartreply_current_number == len)
848 first = elm_genlist_first_item_get(app_data->genlist);
849 menu = elm_genlist_item_next_get(first);
851 /* Remove current smartreply list */
852 pos = elm_genlist_item_next_get(menu);
853 for (i = 0; i < g_smartreply_current_number; i++) {
854 Elm_Object_Item *next;
859 next = elm_genlist_item_next_get(pos);
860 elm_object_item_del(pos);
864 /* Append newly added smartreply list */
866 Elm_Genlist_Item_Class *itc;
868 itc = elm_genlist_item_class_new();
870 itc->item_style = "1text";
871 itc->func.text_get = __ise_smartreply_gl_text_get;
872 itc->func.content_get = NULL;
873 itc->func.state_get = NULL;
874 itc->func.del = NULL;
877 for (i = 0; i < len; i++) {
878 pos = elm_genlist_item_insert_after(app_data->genlist,
883 ELM_GENLIST_ITEM_NONE,
884 __ise_smartreply_gl_sel,
889 elm_genlist_item_show(menu, ELM_GENLIST_ITEM_SCROLLTO_TOP);
891 elm_genlist_item_class_free(itc);
894 g_smartreply_current_number = len;
898 void _update_template_items(void *user_data)
902 Elm_Object_Item *first;
903 Elm_Object_Item *menu;
904 Elm_Object_Item *pos;
905 Elm_Object_Item *template_pos;
907 unsigned int template_len = 0;
910 app_data = (App_Data *)user_data;
912 if (app_data == NULL) {
913 PRINTFUNC(DLOG_ERROR, "Can not get app_data");
917 if (app_data->genlist == NULL) {
918 /* smartreply will update when genlist is exist only */
919 PRINTFUNC(DLOG_ERROR, "Can not get getlist");
923 if (app_data->app_type == APP_TYPE_REPLY) {
924 menu = elm_genlist_first_item_get(app_data->genlist);
926 first = elm_genlist_first_item_get(app_data->genlist);
927 menu = elm_genlist_item_next_get(first);
931 /* move to smartreply next if it need */
932 if (input_smartreply_is_enabled()) {
933 int smartreply_len = 0;
935 smartreply_len = input_smartreply_get_reply_num();
936 if (smartreply_len > 0) {
939 for (j = 0; j < smartreply_len; j++) {
943 pos = elm_genlist_item_next_get(pos);
948 /* Remove Current template list */
949 template_pos = elm_genlist_item_next_get(pos);
950 for (i = 0 ; i < g_template_current_number; i++) {
951 Elm_Object_Item *next;
953 if (template_pos == NULL) {
954 PRINTFUNC(DLOG_ERROR, "Template mismatched, iter : %d, current num: %d",
955 i, g_template_current_number);
959 next = elm_genlist_item_next_get(template_pos);
960 elm_object_item_del(template_pos);
964 /* Remove Add or dummpy button */
966 Elm_Object_Item *next;
968 next = elm_genlist_item_next_get(template_pos);
969 elm_object_item_del(template_pos);
973 /* Append New Template list */
974 const std::vector<TemplateData> template_list = input_template_get_list();
977 if (template_list.size() > 0) {
978 Elm_Genlist_Item_Class *itc;
980 itc = elm_genlist_item_class_new();
982 itc->item_style = "1text";
983 itc->func.text_get = __ise_template_gl_text_get;
984 itc->func.content_get = NULL;
985 itc->func.state_get = NULL;
986 itc->func.del = NULL;
988 for (i = 0; i < template_list.size(); i++) {
989 bool matched = false;
991 if(!template_list[i].use_gettext) {
992 int smartreply_len = 0;
995 smartreply_len = input_smartreply_get_reply_num();
996 for (j = 0; j < smartreply_len; j++) {
999 reply = input_smartreply_get_nth_item(j);
1001 if (!strcmp(reply, template_list[i].text.c_str())) {
1011 if (matched == false) {
1012 pos = elm_genlist_item_insert_after(app_data->genlist,
1017 ELM_GENLIST_ITEM_NONE,
1018 __ise_template_gl_sel,
1024 elm_genlist_item_class_free(itc);
1028 // template add button (+)
1029 /* if (!input_template_is_user_template()) {
1030 Elm_Genlist_Item_Class *itc;
1032 itc = elm_genlist_item_class_new();
1034 itc->item_style = "1text.1icon";
1035 itc->func.text_get = __ise_addtemplate_gl_text_get;;
1036 itc->func.content_get = __ise_gl_1button_content_get;
1037 itc->func.state_get = NULL;
1038 itc->func.del = NULL;
1041 pos = elm_genlist_item_insert_after(app_data->genlist,
1046 ELM_GENLIST_ITEM_NONE,
1047 __ise_template_add_gl_sel,
1050 elm_genlist_item_class_free(itc);
1054 elm_genlist_item_show(menu, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1056 g_template_current_number = template_len;
1060 bool _app_create(void* user_data)
1062 int width = 1000, height = 1000;
1063 // App_Data* app_data = NULL;
1064 Evas_Object* layout = NULL;
1065 Evas_Object* conform = NULL;
1066 Evas_Object* bg = NULL;
1067 Evas_Object* window = NULL;
1068 Eext_Circle_Surface *surface;
1074 _app_language_changed(NULL, NULL);
1076 app_data = (App_Data*)user_data;
1078 elm_app_base_scale_set(1.3);
1080 window = elm_win_add(NULL, PACKAGE, ELM_WIN_BASIC);
1082 init_customizing_theme();
1084 elm_win_title_set(window, PACKAGE);
1085 elm_win_borderless_set(window, EINA_TRUE);
1086 // ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height);
1087 evas_object_resize(window, width, height);
1088 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
1090 LOGE("elm_win_add() is failed.");
1094 bg = elm_bg_add(window);
1095 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1096 elm_win_resize_object_add(window, bg);
1097 evas_object_show(bg);
1099 layout = elm_layout_add(window);
1100 elm_layout_theme_set(layout, "layout", "application", "default");
1101 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1103 conform = elm_conformant_add(window);
1104 surface = eext_circle_surface_conformant_add(conform);
1105 evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1108 elm_win_resize_object_add(window, conform);
1109 elm_object_content_set(conform, layout);
1111 evas_object_show(layout);
1112 evas_object_show(conform);
1113 evas_object_show(window);
1114 app_data->win_main = window;
1115 app_data->conform = conform;
1116 app_data->layout_main = layout;
1117 app_data->circle_surface = surface;
1118 app_data->app_type = APP_TYPE_SELECT_MODE;
1120 Evas_Object *naviframe = elm_naviframe_add(layout);
1121 elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE);
1122 eext_object_event_callback_add(naviframe, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, NULL);
1123 elm_object_part_content_set(layout, "elm.swallow.content", naviframe);
1124 evas_object_show(naviframe);
1126 app_data->naviframe = naviframe;
1131 void _app_service(app_control_h service, void* user_data)
1135 char *context = NULL;
1137 app_control_clone(&(app_data->source_app_control), service);
1138 app_data->reply_type = REPLY_APP_NORMAL;
1140 bool is_type_reply = false;
1141 ret = app_control_get_extra_data(service, APP_CONTROL_DATA_INPUT_TYPE, &context);
1142 if (ret == APP_CONTROL_ERROR_NONE) {
1143 if (!strcmp(context, "input_voice")) {
1144 app_data->app_type = APP_TYPE_STT;
1145 _stt_clicked_cb((void *)app_data, NULL, NULL);
1147 } else if (!strcmp(context, "input_emoticon")) {
1148 app_data->app_type = APP_TYPE_EMOTICON;
1149 _emoticon_clicked_cb((void *)app_data, NULL, NULL);
1151 } else if (!strcmp(context, "input_keyboard")) {
1152 app_data->app_type = APP_TYPE_KEYBOARD;
1153 input_keyboard_init(service);
1154 _keyboard_clicked_cb((void *)app_data, NULL, NULL);
1156 } else if (!strcmp(context, "input_reply")) {
1157 app_data->app_type = APP_TYPE_REPLY;
1158 is_type_reply = true;
1162 if (app_data->genlist == NULL)
1163 app_data->genlist = _create_genlist(app_data->naviframe);
1165 input_keyboard_init(service);
1167 // input_smartreply_init(service);
1168 // input_smartreply_set_notify(_input_smartreply_notify_cb, NULL);
1170 // if (input_smartreply_is_enabled())
1171 // input_smartreply_get_reply_async();
1174 input_template_init(service);
1175 input_template_set_notify(_input_template_notify_cb, NULL);
1177 _create_genlist_items(app_data, is_type_reply);
1180 elm_win_activate(app_data->win_main);
1187 void _app_pause(void* user_data)
1189 PRINTFUNC(DLOG_DEBUG, "");
1193 void _app_resume(void* user_data)
1195 PRINTFUNC(DLOG_DEBUG, "");
1198 void _app_terminate(void* user_data)
1200 App_Data* app_data = NULL;
1201 app_data = (App_Data*)user_data;
1203 if(app_data->genlist){
1204 evas_object_smart_callback_del(app_data->genlist, "elm,item,position,changed", _item_position_changed_cb);
1207 if(app_data->res_path)
1208 free(app_data->res_path);
1210 if(app_data->shared_res_path)
1211 free(app_data->shared_res_path);
1213 input_keyboard_deinit();
1214 input_smartreply_deinit();
1216 input_template_unset_notify();
1217 input_template_deinit();
1220 static int init_i18n(const char *domain, const char *dir, char *lang_str)
1222 if (setlocale(LC_ALL, "") == NULL) {
1223 PRINTFUNC(DLOG_INFO, "Some environment variable is invalid, setlocale(LC_ALL, \"\") has returns\ed a null pointer");
1224 if (setlocale(LC_ALL, lang_str) == NULL)
1227 if (bindtextdomain(domain, dir) == NULL)
1229 if (textdomain(domain) == NULL)
1236 * @brief Set language and locale.
1240 static void _app_language_changed(app_event_info_h event_info, void *user_data)
1242 char* lang_str = vconf_get_str(VCONFKEY_LANGSET);
1244 setenv("LANG", lang_str, 1);
1245 setenv("LC_MESSAGES", lang_str, 1);
1247 setenv("LANG", "en_GB.utf8", 1);
1248 setenv("LC_MESSAGES", "en_GB.utf8", 1);
1249 lang_str = strdup("en_GB.UTF-8");
1252 init_i18n(PACKAGE, LOCALEDIR, lang_str);
1255 elm_language_set(lang_str);
1262 int main(int argc, char* argv[])
1264 App_Data app_data = {0, };
1265 ui_app_lifecycle_callback_s event_callback = {0, };
1266 app_event_handler_h handlers[5] = {NULL, };
1268 event_callback.create = _app_create;
1269 event_callback.terminate = _app_terminate;
1270 event_callback.pause = _app_pause;
1271 event_callback.resume = _app_resume;
1272 event_callback.app_control = _app_service;
1274 ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, &app_data);
1275 ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, &app_data);
1276 ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, &app_data);
1277 ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed, &app_data);
1278 ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, NULL, &app_data);
1280 _init_app_data(&app_data);
1282 int ret = ui_app_main(argc, argv, &event_callback, &app_data);
1283 if (ret != APP_ERROR_NONE) {
1284 LOGD("ui_app_main() is failed. err = %d", ret);