Add initial code for inputdelegator
[platform/core/uifw/inputdelegator.git] / src / w-input-selector.cpp
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "Debug.h"
18
19 #include <app.h>
20 #include <dlog.h>
21 #include <Eina.h>
22 #include <string>
23 #include <efl_assist.h>
24 #include <vconf.h>
25 #include <vconf-keys.h>
26
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"
35
36 #ifdef SUPPORT_LOG_MANAGER
37 #include <samsung_log_manager.h>
38 #include <samsung_log_manager_uri.h>
39 #endif
40
41 #include <stt.h>
42
43
44 using namespace std;
45
46 App_Data* app_data = NULL;
47 #ifdef SUPPORT_LOG_MANAGER
48 static samsung_log_manager_h g_log_manager = NULL;
49 #endif
50
51 InputKeyboardData g_input_keyboard_data;
52
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 */
58
59 Evas_Coord last_step; // 0 ~ 9 for gesture, 10~11 for rotary
60
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;
64
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);
72 #endif
73
74 static char *_genlist_text_set_theme_color(const char *str, const char *code);
75
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);
84
85
86
87 void _init_app_data(App_Data* app_data)
88 {
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;
94
95     app_data->res_path = NULL;
96 }
97
98
99
100 Evas_Object* load_edj(Evas_Object* parent, const char* file, const char* group)
101 {
102         Evas_Object* window;
103         Evas_Object* content;
104         int ret;
105
106         window = elm_layout_add(parent);
107         if (window) {
108                 ret = elm_layout_file_set(window, file, group);
109                 if (!ret) {
110                         evas_object_del(window);
111                         return NULL;
112                 }
113
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);
117
118                 evas_object_size_hint_weight_set(window, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
119         }
120
121         return window;
122 }
123
124 void init_customizing_theme(void)
125 {
126         string stt_edj_path = get_resource_path();
127         string app_edj_path = get_resource_path();
128
129         stt_edj_path = stt_edj_path + STT_EDJ_FILE;
130         app_edj_path = app_edj_path + APP_EDJ_FILE;
131
132         elm_theme_extension_add(NULL, stt_edj_path.c_str());
133         elm_theme_extension_add(NULL, app_edj_path.c_str());
134 }
135
136
137 static Eina_Bool back_cb(void *data, Elm_Object_Item *it)
138 {
139     reply_to_sender_by_callback_for_back();
140     elm_exit();
141     return EINA_FALSE;
142 }
143
144 static void _stt_clicked_cb(void *data, Evas_Object * obj, void *event_info)
145 {
146         App_Data* ad = (App_Data*)data;
147
148         PRINTFUNC(DLOG_DEBUG, "");
149
150         if(!ad)
151                 return;
152
153 #if 0
154         bool bAgreed = false;
155         stt_get_user_agreement(&bAgreed);
156         if(!bAgreed){
157 #endif
158         if(is_tos_N66_agreed() == EINA_FALSE){
159                 if(is_sap_connection() == EINA_TRUE){
160                         ise_show_tos_n66_popup(ad);
161                 } else {
162                         launch_bt_connection_popup(ad);
163                 }
164         }
165         else {
166                 ise_show_stt_popup(ad);
167         }
168
169
170 #ifdef SUPPORT_LOG_MANAGER
171         log_manager_set("IM01", "STT", NULL);
172 #endif
173 }
174
175 static void _input_smartreply_notify_cb(void *user_data)
176 {
177         ecore_main_loop_iterate();
178         _update_genlist_items((void *)app_data);
179 }
180
181 static void _input_template_notify_cb(void *user_data)
182 {
183         _update_genlist_items((void *)app_data);
184 }
185
186
187 static void _emoticon_clicked_cb(void *data, Evas_Object * obj, void *event_info)
188 {
189         App_Data* ad = (App_Data*)data;
190
191         PRINTFUNC(DLOG_DEBUG, "");
192
193         if(!ad)
194                 return;
195
196 //      ise_show_emoticon_popup(ad);
197         ise_show_emoticon_popup_rotary(ad);
198
199 #ifdef SUPPORT_LOG_MANAGER
200         log_manager_set("IM01", "Emoticon", NULL);
201 #endif
202 }
203
204 static void _keyboard_clicked_cb(void *data, Evas_Object * obj, void *event_info)
205 {
206         App_Data* ad = (App_Data *)data;
207
208         PRINTFUNC(DLOG_DEBUG, "");
209
210         if (!ad)
211                 return;
212
213 #ifdef SUPPORT_LOG_MANAGER
214         log_manager_set("IM01", "Keypad", NULL);
215 #endif
216
217     if(app_data->app_type == APP_TYPE_KEYBOARD_FROM_SMS)
218         input_keyboard_launch(ad->win_main);
219     else
220             input_keyboard_launch_with_ui(ad->win_main, data);
221 }
222
223 static void __bt_connection_result_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
224 {
225     char *val = NULL;
226
227     if (reply == NULL) {
228         PRINTFUNC(DLOG_ERROR, "service_h is NULL");
229         return;
230     }
231
232     app_control_get_extra_data(reply, "__BT_CONNECTION__", &val);
233     if (val) {
234         if( strcmp(val, "Connected") == 0 )
235         {
236             PRINTFUNC(DLOG_ERROR, "BT Connected");
237         }
238         else
239         {
240             PRINTFUNC(DLOG_ERROR, "BT Not Connected");
241         }
242
243         free(val);
244     }
245 }
246
247
248 static void __ise_smartreply_gl_sel(void *data, Evas_Object *obj, void *event_info)
249 {
250         App_Data* app_data = (App_Data*) data;
251         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
252
253         if (item) {
254                 elm_genlist_item_selected_set(item, EINA_FALSE);
255
256                 int index = (unsigned int) elm_object_item_data_get(item);
257
258 #ifdef SUPPORT_LOG_MANAGER
259                 log_manager_set("IM01", "Preset", NULL);
260                 log_manager_set("IM02", "Smart Reply", NULL);
261 #endif
262                 char *reply = input_smartreply_get_nth_item(index);
263                 if (reply) {
264                         input_smartreply_send_feedback(reply);
265                         if(app_data->reply_type == REPLY_APP_CONTROL){
266                                 reply_to_sender_by_appcontrol((void*)app_data, reply, "smartreply");
267                                 free(reply);
268                         } else {
269                                 reply_to_sender_by_callback(reply, "smartreply");
270                                 free(reply);
271                                 elm_exit();
272                         }
273
274                 }
275         }
276 }
277
278 static void __ise_template_add_gl_sel(void *data, Evas_Object *obj, void *event_info)
279 {
280         App_Data* app_data = (App_Data*) data;
281         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
282
283         if (item) {
284                 elm_genlist_item_selected_set(item, EINA_FALSE);
285
286                 if(is_sap_connection() == EINA_TRUE){
287                         // Show toast popup
288                         show_popup_toast(gettext("WDS_IME_TPOP_ADD_TEMPLATE_ON_YOUR_PHONE_ABB"), true);
289
290                         // send message to Host
291                         app_control_h appctrl;
292                         app_control_create( &appctrl );
293                         app_control_set_app_id(appctrl, "com.samsung.w-manager-service");
294                         app_control_add_extra_data(appctrl, "type", "gm_setting");
295                         app_control_add_extra_data(appctrl, "data/setting_menu", "texttemplate_setting");
296                         app_control_send_launch_request(appctrl, NULL, NULL);
297                         app_control_destroy(appctrl);
298                 } else {
299                         app_control_h app_control;
300                         app_control_create(&app_control);
301                         app_control_set_app_id(app_control, "com.samsung.bt-connection-popup");
302                         app_control_add_extra_data(app_control,"msg", "perform");
303                         app_control_send_launch_request(app_control, __bt_connection_result_cb, NULL);
304                         app_control_destroy(app_control);
305                 }
306         }
307 }
308
309 static void __ise_template_gl_sel(void *data, Evas_Object *obj, void *event_info)
310 {
311         App_Data* app_data = (App_Data*) data;
312         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
313         int index = 0;
314
315         if (item) {
316                 elm_genlist_item_selected_set(item, EINA_FALSE);
317
318                 index = (unsigned int) elm_object_item_data_get(item);
319                 const std::vector<TemplateData>  template_list = input_template_get_list();
320
321                 //@ToDo : should call reply function when any template string is selected and confirmed.
322                 // Here reply string will be template_list[index].text.c_str();
323                 if( index < template_list.size()) {
324 #ifdef SUPPORT_LOG_MANAGER
325                         log_manager_set("IM01", "Preset", NULL);
326                         log_manager_set("IM02", "Preset except smart reply", NULL);
327 #endif
328                         if(app_data->reply_type == REPLY_APP_CONTROL){
329                                 reply_to_sender_by_appcontrol((void*)app_data, gettext(template_list[index].text.c_str()), "template");
330                         } else {
331                                 reply_to_sender_by_callback(gettext(template_list[index].text.c_str()), "template");
332                                 elm_exit();
333                         }
334                 }
335         }
336 }
337
338 static Evas_Object * __ise_gl_3button_content_get(void *data, Evas_Object *obj, const char *part)
339 {
340     if (!strcmp(part,"elm.icon.1") ||  (!strcmp(part,"elm.icon.2")) ||  (!strcmp(part,"elm.icon.3"))) {
341                 Evas_Object* btn = elm_button_add(obj);
342                 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
343                 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
344                 Evas_Object* ic = elm_image_add(btn);
345                 elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
346                 string path = get_resource_path();
347                 if (!strcmp(part,"elm.icon.1")) {
348                         elm_object_style_set(btn, "anchor");
349                         string path_ic = path + "images/w_mode_stt_ic.png";
350                         elm_image_file_set(ic, path_ic.c_str(), NULL);
351                         elm_object_content_set(btn,ic);
352                         evas_object_layer_set(btn, 32000);
353                         if (elm_config_access_get())
354                                 elm_access_object_unregister(btn);
355
356                         int powerSavingMode = -1;
357                         int ret;
358                         // Power Saving mode check
359                         ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &powerSavingMode);
360                         if ( ret != 0 )
361                         {
362                                 PRINTFUNC(DLOG_ERROR,"VCONFKEY_SETAPPL_PSMODE FAILED");
363                         }
364
365                         if (powerSavingMode == SETTING_PSMODE_WEARABLE_ENHANCED) {
366                                 PRINTFUNC(DLOG_ERROR,"Power Saving mode, disable stt !!!");
367                                 elm_object_disabled_set(btn, EINA_TRUE);
368                         }
369                 } else if (!strcmp(part,"elm.icon.2")){
370                         elm_object_style_set(btn, "anchor");
371                         string path_ic = path + "images/Delta_w_mode_emoticon_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                         if (elm_config_access_get())
376                                 elm_access_object_unregister(btn);
377
378                 } else if (!strcmp(part,"elm.icon.3")){
379                         elm_object_style_set(btn, "anchor");
380                         string path_ic = path + "images/w_mode_keyboard_ic.png";
381                         elm_image_file_set(ic, path_ic.c_str(), NULL);
382                         elm_object_content_set(btn,ic);
383                         evas_object_layer_set(btn, 32000);
384                         evas_object_propagate_events_set(btn, EINA_FALSE);
385                         if (elm_config_access_get())
386                                 elm_access_object_unregister(btn);
387
388                 }
389
390                 return btn;
391         }
392         else if (!strcmp(part,"elm.icon.1.touch_area") ||  (!strcmp(part,"elm.icon.2.touch_area")) ||  (!strcmp(part,"elm.icon.3.touch_area"))) {
393                 Evas_Object* btn = elm_button_add(obj);
394                 elm_object_style_set(btn, "touch_area");
395                 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
396                 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
397                 string path = get_resource_path();
398                 if (!strcmp(part,"elm.icon.1.touch_area")) {
399
400                         int powerSavingMode = -1;
401                         int ret;
402                         // Power Saving mode check
403                         ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &powerSavingMode);
404                         if ( ret != 0 )
405                         {
406                                 PRINTFUNC(DLOG_ERROR,"VCONFKEY_SETAPPL_PSMODE FAILED");
407                         }
408
409                         if (powerSavingMode == SETTING_PSMODE_WEARABLE_ENHANCED) {
410                                 PRINTFUNC(DLOG_ERROR,"Power Saving mode, disable stt !!!");
411                                 elm_object_disabled_set(btn, EINA_TRUE);
412                         }
413
414                         evas_object_layer_set(btn, 32000);
415                         evas_object_smart_callback_add(btn, "clicked", _stt_clicked_cb, app_data);
416                         if (elm_config_access_get()){
417                                 elm_access_info_set(btn, ELM_ACCESS_INFO, gettext("IDS_IME_MBODY_VOICE_INPUT"));
418 //                              elm_access_chain_end_set(btn, ELM_HIGHLIGHT_DIR_PREVIOUS);
419                         }
420
421                 } else if (!strcmp(part,"elm.icon.2.touch_area")){
422                         evas_object_layer_set(btn, 32000);
423                         evas_object_smart_callback_add(btn, "clicked", _emoticon_clicked_cb, app_data);
424                         if (elm_config_access_get())
425                                 elm_access_info_set(btn, ELM_ACCESS_INFO, gettext("IDS_COM_HEADER_EMOTICON"));
426                 } else if (!strcmp(part,"elm.icon.3.touch_area")){
427                         evas_object_layer_set(btn, 32000);
428                         evas_object_propagate_events_set(btn, EINA_FALSE);
429                         evas_object_smart_callback_add(btn, "clicked", _keyboard_clicked_cb, app_data);
430                         if (elm_config_access_get())
431                                 elm_access_info_set(btn, ELM_ACCESS_INFO, gettext("IDS_COM_OPT_KEYBOARD"));
432                 }
433
434                 return btn;
435         }
436         else if(!strcmp(part,"base")){
437                 Evas_Object* btn = elm_button_add(obj);
438                 if (elm_config_access_get())
439                         elm_access_object_unregister(btn);
440                 elm_object_style_set(btn, "ime_transparent");
441                 return btn;
442         }
443         return NULL;
444 }
445
446 static char * __ise_smartreply_gl_text_get(void *data, Evas_Object *obj, const char *part)
447 {
448         if(!strcmp(part, "elm.text")) {
449                 int index;
450                 char *reply = NULL;
451
452                 index = (int)data;
453                 if (index < 0)
454                         return NULL;
455
456                 reply = input_smartreply_get_nth_item(index);
457                 if (reply == NULL)
458                         return NULL;
459
460                 /* Set hightlight color on first 3 smartreply items */
461                 if (index < 3) {
462                         char *colored = _genlist_text_set_theme_color(reply, "AT0113");
463
464                         if (colored == NULL)
465                                 return reply;
466                         else {
467                                 free(reply);
468                                 return colored;
469                         }
470                 }
471
472                 return reply;
473         }
474         return NULL;
475 }
476
477 static char * __ise_template_gl_text_get(void *data, Evas_Object *obj, const char *part)
478 {
479         if(!strcmp(part, "elm.text")) {
480                 unsigned int index = (unsigned int)data;
481                 const std::vector<TemplateData>  template_list = input_template_get_list();
482
483                 if(index < template_list.size()) {
484                         if(template_list[index].use_gettext)
485                                 return strdup(gettext(template_list[index].text.c_str()));
486                         else {
487                                 Eina_Strbuf *buf = NULL;
488                                 const char *str = NULL;
489                                 char *markup = NULL;
490
491                                 buf = eina_strbuf_new();
492                                 if(buf) {
493                                         eina_strbuf_append(buf, template_list[index].text.c_str());
494                                         eina_strbuf_replace_all(buf, "\n", "");
495                                         eina_strbuf_replace_all(buf, "\r", "");
496
497                                         str = eina_strbuf_string_get(buf);
498
499                                         if (str) {
500                                                 markup = elm_entry_utf8_to_markup(str);
501                                         }
502                                         eina_strbuf_free(buf);
503                                 }
504
505                                 return markup;
506                         }
507                 }
508
509         }
510         return NULL;
511 }
512
513 static char * __ise_addtemplate_gl_text_get(void *data, Evas_Object *obj, const char *part)
514 {
515         if(!strcmp(part, "elm.text")) {
516                 return(strdup(gettext("WDS_IME_MBODY_ADD_TEMPLATE_ABB")));
517         }
518         return NULL;
519 }
520
521 static Evas_Object * __ise_gl_1button_content_get(void *data, Evas_Object *obj, const char *part)
522 {
523         if (!strcmp(part,"elm.icon")) {
524                 Evas_Object* btn = elm_button_add(obj);
525                 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
526                 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
527                 Evas_Object* ic = elm_image_add(btn);
528                 elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
529                 string path = get_resource_path();
530                 elm_object_style_set(btn, "ime_button_template");
531                 string path_ic = path + "/images/w_list_add_ic.png";
532                 elm_image_file_set(ic, path_ic.c_str(), NULL);
533                 elm_object_content_set(btn,ic);
534                 evas_object_layer_set(btn, 32000);
535                 if (elm_config_access_get())
536                         elm_access_object_unregister(btn);
537
538                 return btn;
539         }
540         return NULL;
541 }
542
543 static void __ise_gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
544 {
545         //Update genlist items. The Item texts will be translated in the _gl_text_get().
546         elm_genlist_realized_items_update(obj);
547 }
548
549 static int _app_control_request_transient_app_cb(void *data)
550 {
551         return 0;
552 }
553
554
555 static char *_genlist_text_set_theme_color(const char *str, const char *code)
556 {
557         int r, g, b, a;
558         Eina_Strbuf *buf = NULL;
559         char *colored = NULL;
560
561         if (code == NULL)
562                 return NULL;
563
564         buf = eina_strbuf_new();
565         if (buf == NULL) {
566                 PRINTFUNC(DLOG_ERROR, "Can not get create strbuf");
567                 return NULL;
568         }
569
570 //      ea_theme_color_get(code,
571 //                      &r, &g, &b, &a,
572 //                      NULL, NULL, NULL, NULL,
573 //                      NULL, NULL, NULL, NULL);
574
575         eina_strbuf_append_printf(buf, "<color=#%02x%02x%02x%02x>%s</color>",
576                         r, g, b, a, str);
577
578         colored = eina_strbuf_string_steal(buf);
579
580         eina_strbuf_free(buf);
581
582         return colored;
583 }
584
585
586 static void _app_control_send_reply_cb(app_control_h request, app_control_h reply,
587                                                 app_control_result_e result, void *user_data)
588 {
589                 PRINTFUNC(DLOG_DEBUG, "");
590                 reply_to_sender_by_callback(NULL, NULL);
591                 elm_exit();
592 }
593
594 void set_source_caller_app_id(app_control_h app_control)
595 {
596         if(!app_control){
597                 PRINTFUNC(DLOG_ERROR,"can't get app_control");
598                 return;
599         }
600
601 //      CscFeatureBool is_security_permission_manager = CSC_FEATURE_BOOL_FALSE;
602 //      is_security_permission_manager = csc_feature_get_bool(CSC_FEATURE_DEF_BOOL_SECURITY_PERMISSION_MANAGER);
603
604 //      if(is_security_permission_manager == CSC_FEATURE_BOOL_TRUE){
605
606                 char *caller = NULL;
607                 app_control_get_caller(app_data->source_app_control, &caller);
608
609                 if(caller){
610                         PRINTFUNC(DLOG_DEBUG,"caller = %s", caller);
611                         app_control_add_extra_data(app_control, "caller_appid", caller);
612                         free(caller);
613                 }
614 //      }
615
616 }
617
618 void reply_to_sender_by_appcontrol(void *data, const char *value, const char *type)
619 {
620
621         PRINTFUNC(DLOG_DEBUG, "");
622
623         int ret;
624         char *app_id;
625
626         app_control_h app_control;
627
628         App_Data *appdata = (App_Data *)data;
629
630         if(!appdata){
631                 PRINTFUNC(DLOG_ERROR,"Null pointer");
632                 return;
633         }
634
635         ret = app_control_create(&app_control);
636         if (ret != APP_CONTROL_ERROR_NONE) {
637                 PRINTFUNC(DLOG_ERROR, "Can not create app_control : %d", ret);
638                 return;
639         }
640
641         app_id = g_input_keyboard_data.app_id;
642         if (app_id == NULL) {
643                 PRINTFUNC(DLOG_INFO, "app id is undefined, use defualt");
644                 app_id = "com.samsung.message.appcontrol.compose";
645         }
646
647         if(!strcmp(app_id, "com.samsung.message.appcontrol.compose")){
648                 app_id = "com.samsung.msg-send";
649         }
650
651         app_control_set_app_id(app_control, app_id);
652         app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
653 /*
654         ret =  app_control_set_window(app_control,
655                                 elm_win_xwindow_get(appdata->win_main));
656         if (ret != APP_CONTROL_ERROR_NONE) {
657                 PRINTFUNC(DLOG_ERROR, "Can not app control set window : %d", ret);
658                 app_control_destroy(app_control);
659                 return;
660         }
661 */
662         if (g_input_keyboard_data.data_array && g_input_keyboard_data.data_array_len > 0) {
663                  app_control_add_extra_data_array(app_control,
664                                                  "selector_keyboard_data_array",
665                                                  (const char**)(g_input_keyboard_data.data_array),
666                                                  g_input_keyboard_data.data_array_len);
667         }
668
669         app_control_add_extra_data(app_control, "selector_send_data_array", "sending_popup");
670
671         if (value)
672                 app_control_add_extra_data(app_control, "selected_context", value);
673
674         if (type)
675                 app_control_add_extra_data(app_control, "reply_type", type);
676
677         set_source_caller_app_id(app_control);
678
679         ret = app_control_send_launch_request(app_control,
680                                         _app_control_send_reply_cb,
681                                         NULL);
682
683         if (ret != APP_CONTROL_ERROR_NONE)
684                 PRINTFUNC(DLOG_ERROR, "Can not launch app_control: %d", ret);
685
686         app_control_destroy(app_control);
687
688         return;
689
690
691 }
692
693 void reply_to_sender_by_callback(const char *value, const char *type)
694 {
695
696         PRINTFUNC(DLOG_DEBUG, "");
697
698         app_control_h app_control;
699
700         if(app_control_create(&app_control) == 0) {
701                 int ret;
702
703                 if (value)
704                         app_control_add_extra_data(app_control, "selected_context", value);
705
706                 if (type)
707                         app_control_add_extra_data(app_control, "reply_type", type);
708
709                 set_source_caller_app_id(app_control);
710
711                 ret = app_control_reply_to_launch_request( app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED);
712                 if (ret != APP_CONTROL_ERROR_NONE)
713                         PRINTFUNC(DLOG_ERROR, "reply failed : %d", ret);
714
715                 app_control_destroy(app_control);
716                 app_control_destroy(app_data->source_app_control);
717                 app_data->source_app_control = NULL;
718         }
719 }
720
721 void reply_to_sender_by_callback_for_back()
722 {
723
724         PRINTFUNC(DLOG_DEBUG, "");
725
726         app_control_h app_control;
727
728         if(app_control_create(&app_control) == 0) {
729                 int ret;
730
731                 app_control_add_extra_data(app_control, "back_to_composer", "yes");
732
733                 ret = app_control_reply_to_launch_request( app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED);
734                 if (ret != APP_CONTROL_ERROR_NONE)
735                         PRINTFUNC(DLOG_ERROR, "reply failed : %d", ret);
736
737                 app_control_destroy(app_control);
738                 app_control_destroy(app_data->source_app_control);
739                 app_data->source_app_control = NULL;
740         }
741 }
742
743
744 char* get_resource_path()
745 {
746         if(NULL == app_data->res_path) {
747                 app_data->res_path = app_get_resource_path();
748                 PRINTFUNC(DLOG_INFO, "set resource path = %s", app_data->res_path);
749         }
750         return (app_data->res_path);
751 }
752
753 char* get_shared_resource_path()
754 {
755         if(NULL == app_data->shared_res_path) {
756                 app_data->shared_res_path = app_get_shared_resource_path();
757                 PRINTFUNC(DLOG_INFO, "set shared resource path = %s", app_data->shared_res_path);
758         }
759         return (app_data->shared_res_path);
760 }
761
762 void show_gl_focus(Eina_Bool bVisible){
763
764         if(app_data->genlist == NULL)
765                 return;
766
767         if(bVisible == EINA_TRUE){
768                 elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,enable", "elm");
769                 //elm_layout_theme_set(app_data->genlist, "genlist", "base", "focus_bg");
770                 //elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,show", "elm");
771         } else {
772                 elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,disable", "elm");
773                 //elm_layout_theme_set(app_data->genlist, "genlist", "base", "default");
774                 //elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,hide", "elm");
775         }
776 }
777
778 void show_popup_toast(const char *text, bool check_img)
779 {
780
781         PRINTFUNC(DLOG_ERROR, "show_popup_toast");
782
783         Evas_Object *popup;
784
785         popup = elm_popup_add(app_data->win_main);
786         elm_object_style_set(popup, "toast/circle");
787         elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
788         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
789
790         if (check_img) {
791                 string path = get_resource_path();
792                 string path_ic = path + "/images/toast_check_icon.png";
793                 Evas_Object * img = elm_image_add(popup);
794                 elm_image_file_set(img, path_ic.c_str(), NULL);
795                 elm_object_part_content_set(popup, "toast,icon", img);
796         }
797         if(text) {
798                 elm_object_part_text_set(popup,"elm.text", text);
799         }
800
801         eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _popup_back_cb, NULL);
802         evas_object_smart_callback_add(popup, "dismissed", _popup_close_cb, NULL);
803         evas_object_smart_callback_add(popup, "block,clicked", _popup_back_cb, NULL);
804
805         if(elm_config_access_get() == EINA_FALSE)
806                 elm_popup_timeout_set(popup, 2.0);
807         else {
808                 elm_object_access_info_set(popup, text);
809 //              Evas_Object *ao = elm_object_part_access_object_get(popup, "access.outline");
810 //              elm_access_info_cb_set(ao, ELM_ACCESS_INFO, _toast_delete_popup_access_info_cb, popup);
811                 elm_popup_timeout_set(popup, 8.0);
812         }
813
814         evas_object_show(popup);
815 }
816
817 static void _popup_close_cb(void *data, Evas_Object *obj, void *event_info)
818 {
819         if(obj){
820                 evas_object_hide(obj);
821                 evas_object_del(obj);
822         }
823 }
824
825 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
826 {
827         if(obj)
828                 elm_popup_dismiss(obj);
829 }
830
831 char * _toast_delete_popup_access_info_cb(void *data, Evas_Object *obj)
832 {
833         PRINTFUNC(DLOG_ERROR, "%s", __func__);
834         const char * info = elm_object_part_text_get((Evas_Object*)data,"elm.text");
835
836         return strdup(info);
837 }
838
839
840 void _back_to_genlist_for_selector()
841 {
842
843         PRINTFUNC(DLOG_DEBUG,"");
844
845         if(!app_data) return;
846
847         if(app_data->app_type == APP_TYPE_STT || app_data->app_type == APP_TYPE_EMOTICON){
848                 PRINTFUNC(DLOG_DEBUG,"launched as STT/EMOTICON mode, So exit here.");
849                 reply_to_sender_by_callback(NULL, NULL);
850                 elm_exit();
851         }
852
853         Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
854
855         eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
856
857 }
858
859
860 char *_it_plus_access_info_cb(void *data, Evas_Object *obj)
861 {
862         PRINTFUNC(DLOG_DEBUG,"%s", __func__);
863         std::string text =      std::string(gettext("IDS_ACCS_BODY_BUTTON_TTS"));
864
865         return strdup(text.c_str());
866 }
867
868 char *_access_info_cb(void *data, Evas_Object *obj)
869 {
870         PRINTFUNC(DLOG_DEBUG,"%s", __func__);
871         return strdup(gettext("WDS_TTS_TBBODY_DOUBLE_TAP_TO_SEND"));
872 }
873
874 Eina_Bool _access_action_next_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
875 {
876         Evas_Object *genlist = (Evas_Object*)data;
877         PRINTFUNC(DLOG_ERROR, "[TNT] _access_action_next_cb called, genlist type:%s", evas_object_type_get(genlist));
878         Elm_Object_Item *it = elm_genlist_first_item_get(genlist);//emptry item?
879         PRINTFUNC(DLOG_ERROR, "[TNT] get first item:%p", it);
880         it = elm_genlist_item_next_get(it);//title item(3 button?)
881         PRINTFUNC(DLOG_ERROR, "[TNT] get Second item:%p, title_item:%p", it, it_title);
882         elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
883         force_highlight_to_top = EINA_TRUE;
884         return EINA_TRUE;
885 }
886
887 Eina_Bool _access_action_prev_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
888 {
889         Evas_Object *genlist = (Evas_Object*)data;
890         PRINTFUNC(DLOG_ERROR, "[TNT] _access_action_prev_cb called, genlist type:%s", evas_object_type_get(genlist));
891         Elm_Object_Item *it = elm_genlist_last_item_get(genlist);//plus button item
892         PRINTFUNC(DLOG_ERROR, "[TNT] get last item:%p", it);
893         elm_genlist_item_show(it, ELM_GENLIST_ITEM_SCROLLTO_IN);
894         force_highlight_to_bottom= EINA_TRUE;
895         return EINA_TRUE;
896 }
897
898 static void _item_realized(void *data, Evas_Object *obj, void *event_info) //called when list scrolled
899 {
900         PRINTFUNC(DLOG_DEBUG,"%s", __func__);
901         if (elm_config_access_get()) {
902                 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
903                 Evas_Object *item_access = elm_object_item_access_object_get(item);
904
905                 if (item == it_empty || item == it_title) {
906                         elm_access_object_unregister(item_access);
907                         if (item == it_title)
908                         {
909                                 Evas_Object *btn = elm_object_item_part_content_get(item, "elm.icon.1.touch_area");
910                                 PRINTFUNC(DLOG_ERROR, "[TNT] 1st button(%p), type:%s",btn, evas_object_type_get(btn));
911                                 Evas_Object *btn_access = btn;//elm_access_object_get(btn);
912                                 PRINTFUNC(DLOG_ERROR, "[TNT] title item realized!!!!, force_highlight_to_top:%d, is_genlist_highlighed:%d",force_highlight_to_top,  is_genlist_highlighed);
913                                 if (force_highlight_to_top || !is_genlist_highlighed)
914                                 {
915                                         //highlight to first button.
916                                         PRINTFUNC(DLOG_ERROR, "[TNT] force highlight to 1st button(%p), acces_obj:%p",btn, btn_access);
917                                         elm_access_highlight_set(btn_access);
918                                         force_highlight_to_top = EINA_FALSE;
919                                         is_genlist_highlighed = EINA_TRUE;
920                                 }
921                                 PRINTFUNC(DLOG_ERROR, "[TNT] set highlight pre callback on btn");
922                                 elm_access_action_cb_set(btn_access, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, _access_action_prev_cb, obj);
923                         }
924                 }
925                 else if (item == it_plus) {
926                         //elm_access_object_unregister(item_access); // there is no guide line
927                         elm_access_info_cb_set(item_access, ELM_ACCESS_CONTEXT_INFO, _it_plus_access_info_cb, NULL);
928                         PRINTFUNC(DLOG_ERROR, "[TNT] set highlight next callback on plus item");
929                         elm_access_action_cb_set(item_access, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, _access_action_next_cb, obj);
930                         if (force_highlight_to_bottom)
931                         {
932                                 PRINTFUNC(DLOG_ERROR, "[TNT] Forcely set highlight on plus item!!");
933                                 elm_access_highlight_set(item_access);
934                                 force_highlight_to_bottom = EINA_FALSE;
935                                 is_genlist_highlighed = EINA_TRUE;
936                         }
937                 }
938                 else {
939                         elm_access_info_cb_set(item_access, ELM_ACCESS_CONTEXT_INFO, _access_info_cb, NULL);
940                 }
941         }
942 }
943
944 Evas_Object* _create_genlist(Evas_Object* navi)
945 {
946
947         Evas_Object* genlist = elm_genlist_add(navi);
948         if(NULL == genlist)
949                 return NULL;
950
951         elm_genlist_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
952
953         Evas_Object* circle_object_genlist = eext_circle_object_genlist_add(genlist, app_data->circle_surface);
954         eext_circle_object_genlist_scroller_policy_set(circle_object_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
955         evas_object_data_set(genlist, "circle", (void *) circle_object_genlist);
956         eext_rotary_object_event_activated_set(circle_object_genlist, EINA_TRUE);
957
958         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
959         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
960
961         evas_object_smart_callback_add(genlist, "language,changed", __ise_gl_lang_changed, genlist);
962         evas_object_show(genlist);
963
964 //      uxt_genlist_set_bottom_margin_enabled(genlist, EINA_TRUE);
965
966         show_gl_focus(EINA_FALSE);
967
968         Elm_Object_Item *nf_main_item = elm_naviframe_item_push(navi,
969             NULL,
970             NULL,
971             NULL,
972             genlist,
973             "empty");
974
975         elm_naviframe_item_pop_cb_set(nf_main_item, back_cb, app_data);
976         evas_object_smart_callback_add(genlist, "realized", _item_realized, NULL);
977
978         return genlist;
979 }
980
981 static void _item_position_changed_cb(void *data, Evas_Object *obj, void *event_info)
982 {
983         if(!obj) return;
984         if(!data) return;
985
986         Evas_Object *genlist = (Evas_Object *)obj;
987         Elm_Object_Item *gen_item = (Elm_Object_Item *)data;
988
989         Evas_Coord y;
990         elm_scroller_region_get(genlist, NULL, &y, NULL, NULL);
991
992 //      PRINTFUNC(DLOG_DEBUG,"y=%d",y);
993
994         if( 250 > y && y >= 100 ){
995                 if(last_step == 0) return;
996                 last_step = 0;
997                 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.0", "elm");
998                 show_gl_focus(EINA_TRUE);
999         } else if( 100 > y && y >= 50 ){
1000                 if(last_step == 1) return;
1001                 last_step = 1;
1002                 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.1", "elm");
1003                 show_gl_focus(EINA_TRUE);
1004         } else if( y < 50 && y >=0){
1005                 if(last_step == 2) return;
1006                 last_step = 2;
1007                 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.9", "elm");
1008                 show_gl_focus(EINA_FALSE);
1009         }
1010
1011
1012 }
1013
1014 static char *
1015 _main_menu_title_text_get(void *data, Evas_Object *obj, const char *part)
1016 {
1017         char buf[1024];
1018
1019         snprintf(buf, 1023, "%s", "Select method");
1020         return strdup(buf);
1021 }
1022
1023 void _create_genlist_items(void* user_data, bool is_type_reply)
1024 {
1025         LOGD("[psw] _create_genlist_items");
1026
1027         App_Data* app_data = (App_Data*) user_data;
1028
1029         if(NULL == app_data->genlist) {
1030                 app_data->genlist = _create_genlist(app_data->naviframe);
1031                 if(NULL == app_data->genlist)
1032                 return;
1033         }
1034
1035         elm_genlist_clear(app_data->genlist);
1036         g_smartreply_current_number = 0;        /* reset previous smartreply size to 0 */
1037
1038         Elm_Genlist_Item_Class * itc0 = elm_genlist_item_class_new();
1039         itc0->item_style = "title";
1040         itc0->func.text_get = _main_menu_title_text_get;
1041         itc0->func.content_get = NULL;
1042         itc0->func.state_get = NULL;
1043         itc0->func.del = NULL;
1044
1045         Elm_Genlist_Item_Class * itc1 = elm_genlist_item_class_new();
1046         itc1->item_style = "3button";
1047         itc1->func.text_get = NULL;
1048         itc1->func.content_get = __ise_gl_3button_content_get;
1049         itc1->func.state_get = NULL;    
1050         itc1->func.del = NULL;
1051
1052
1053         // dummy title for empty space
1054         it_empty = elm_genlist_item_append(app_data->genlist, itc0,
1055                         NULL, NULL,
1056                         ELM_GENLIST_ITEM_NONE,
1057                         NULL, NULL);
1058
1059         if(!is_type_reply) {
1060                 // 3 Buttons
1061                 it_title = elm_genlist_item_append(app_data->genlist, itc1,
1062                                 NULL, NULL,
1063                                 ELM_GENLIST_ITEM_NONE,
1064                                 NULL, NULL);
1065
1066                 elm_genlist_item_select_mode_set(it_title, ELM_OBJECT_SELECT_MODE_NONE);
1067         }
1068     
1069         if (input_smartreply_is_enabled() == false) {
1070                 _update_template_items(app_data);
1071                 if(g_template_current_number > 0) {
1072                         Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
1073                         eext_circle_object_genlist_scroller_policy_set(circle_genlist,
1074                                         ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
1075                 }
1076         }
1077         else {
1078                 // dummy title for bottom
1079                 Elm_Object_Item *dummy;
1080
1081                 dummy = elm_genlist_item_append(app_data->genlist, itc0,
1082                                 NULL, NULL,
1083                                 ELM_GENLIST_ITEM_NONE,
1084                                 NULL, NULL);
1085
1086                 elm_genlist_item_select_mode_set(dummy, ELM_OBJECT_SELECT_MODE_NONE);
1087         }
1088
1089
1090         Elm_Object_Item *item = elm_genlist_item_next_get(it_title);
1091         elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
1092
1093         evas_object_smart_callback_add(app_data->genlist, "elm,item,position,changed", _item_position_changed_cb, it_title);
1094
1095         elm_genlist_item_class_free(itc0);
1096         elm_genlist_item_class_free(itc1);
1097 }    
1098
1099 void _update_genlist_items(void *user_data)
1100 {
1101         int len = 0;
1102
1103         if (input_smartreply_is_enabled())
1104                 len = input_smartreply_get_reply_num();
1105
1106         if (g_smartreply_current_number != len)
1107                 _update_smartreply_items(user_data);
1108
1109         _update_template_items(user_data);
1110
1111         g_smartreply_current_number = len;
1112
1113         if (g_smartreply_current_number > 0 || g_template_current_number > 0) {
1114                 Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
1115                 eext_circle_object_genlist_scroller_policy_set(circle_genlist,
1116                                                         ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
1117         }
1118 }
1119
1120 void _update_smartreply_items(void *user_data)
1121 {
1122         App_Data* app_data;
1123
1124         Elm_Object_Item *first;
1125         Elm_Object_Item *menu;
1126         Elm_Object_Item *pos;
1127
1128         int len = 0;
1129         int i = 0;
1130
1131         app_data = (App_Data *)user_data;
1132
1133         if (app_data == NULL) {
1134                 PRINTFUNC(DLOG_ERROR, "Can not get app_data");
1135                 return;
1136         }
1137
1138         if (app_data->genlist == NULL) {
1139                 /* smartreply will update when genlist is exist only */
1140                 PRINTFUNC(DLOG_ERROR, "Can not get getlist");
1141                 return;
1142         }
1143
1144         if (input_smartreply_is_enabled())
1145                 len = input_smartreply_get_reply_num();
1146
1147         if (g_smartreply_current_number == len)
1148                 return;
1149
1150         first = elm_genlist_first_item_get(app_data->genlist);
1151         menu = elm_genlist_item_next_get(first);
1152
1153         /* Remove current smartreply list */
1154         pos = elm_genlist_item_next_get(menu);
1155         for (i = 0; i < g_smartreply_current_number; i++) {
1156                 Elm_Object_Item *next;
1157
1158                 if (pos == NULL)
1159                         break;
1160
1161                 next = elm_genlist_item_next_get(pos);
1162                 elm_object_item_del(pos);
1163                 pos = next;
1164         }
1165
1166         /* Append newly added smartreply list */
1167         if (len > 0) {
1168                 Elm_Genlist_Item_Class *itc;
1169
1170                 itc = elm_genlist_item_class_new();
1171
1172                 itc->item_style = "1text";
1173                 itc->func.text_get = __ise_smartreply_gl_text_get;
1174                 itc->func.content_get = NULL;
1175                 itc->func.state_get = NULL;
1176                 itc->func.del = NULL;
1177
1178                 pos = menu;
1179                 for (i = 0; i < len; i++) {
1180                         pos = elm_genlist_item_insert_after(app_data->genlist,
1181                                                         itc,
1182                                                         (void *)i,
1183                                                         NULL,
1184                                                         pos,
1185                                                         ELM_GENLIST_ITEM_NONE,
1186                                                         __ise_smartreply_gl_sel,
1187                                                         app_data);
1188                 }
1189
1190                 if (menu)
1191                         elm_genlist_item_show(menu, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1192
1193                 elm_genlist_item_class_free(itc);
1194         }
1195
1196         g_smartreply_current_number = len;
1197 }
1198
1199
1200 void _update_template_items(void *user_data)
1201 {
1202         App_Data* app_data;
1203
1204         Elm_Object_Item *first;
1205         Elm_Object_Item *menu;
1206         Elm_Object_Item *pos;
1207         Elm_Object_Item *template_pos;
1208
1209         unsigned int template_len = 0;
1210         unsigned int i = 0;
1211
1212         app_data = (App_Data *)user_data;
1213
1214         if (app_data == NULL) {
1215                 PRINTFUNC(DLOG_ERROR, "Can not get app_data");
1216                 return;
1217         }
1218
1219         if (app_data->genlist == NULL) {
1220                 /* smartreply will update when genlist is exist only */
1221                 PRINTFUNC(DLOG_ERROR, "Can not get getlist");
1222                 return;
1223         }
1224
1225         if (app_data->app_type == APP_TYPE_REPLY) {
1226                 menu = elm_genlist_first_item_get(app_data->genlist);
1227         } else {
1228                 first = elm_genlist_first_item_get(app_data->genlist);
1229                 menu = elm_genlist_item_next_get(first);
1230         }
1231
1232         pos = menu;
1233         /* move to smartreply next if it need */
1234         if (input_smartreply_is_enabled()) {
1235                 int smartreply_len = 0;
1236
1237                 smartreply_len = input_smartreply_get_reply_num();
1238                 if (smartreply_len > 0) {
1239                         int j = 0;
1240
1241                         for (j = 0; j < smartreply_len; j++) {
1242                                 if (pos == NULL)
1243                                         break;
1244
1245                                 pos = elm_genlist_item_next_get(pos);
1246                         }
1247                 }
1248         }
1249
1250         /* Remove Current template list */
1251         template_pos = elm_genlist_item_next_get(pos);
1252         for (i = 0 ; i < g_template_current_number; i++) {
1253                 Elm_Object_Item *next;
1254
1255                 if (template_pos == NULL) {
1256                         PRINTFUNC(DLOG_ERROR, "Template mismatched, iter : %d, current num: %d",
1257                                         i, g_template_current_number);
1258                         break;
1259                 }
1260
1261                 next = elm_genlist_item_next_get(template_pos);
1262                 elm_object_item_del(template_pos);
1263                 template_pos = next;
1264         }
1265
1266         /* Remove Add or dummpy button */
1267         if(template_pos) {
1268                 Elm_Object_Item *next;
1269
1270                 next = elm_genlist_item_next_get(template_pos);
1271                 elm_object_item_del(template_pos);
1272                 template_pos = next;
1273         }
1274
1275         /* Append New Template list */
1276         const std::vector<TemplateData> template_list = input_template_get_list();
1277         template_len = 0;
1278
1279         if (template_list.size() > 0) {
1280                 Elm_Genlist_Item_Class *itc;
1281
1282                 itc = elm_genlist_item_class_new();
1283
1284                 itc->item_style = "1text";
1285                 itc->func.text_get = __ise_template_gl_text_get;
1286                 itc->func.content_get = NULL;
1287                 itc->func.state_get = NULL;
1288                 itc->func.del = NULL;
1289
1290                 for (i = 0; i < template_list.size(); i++) {
1291                         bool matched = false;
1292
1293                         if(!template_list[i].use_gettext) {
1294                                 int smartreply_len = 0;
1295                                 int j = 0;
1296
1297                                 smartreply_len = input_smartreply_get_reply_num();
1298                                 for (j = 0; j < smartreply_len; j++) {
1299                                         char *reply = NULL;
1300
1301                                         reply = input_smartreply_get_nth_item(j);
1302                                         if (reply) {
1303                                                 if (!strcmp(reply, template_list[i].text.c_str())) {
1304                                                         matched = true;
1305                                                         free(reply);
1306                                                         break;
1307                                                 }
1308                                                 free(reply);
1309                                         }
1310                                 }
1311                         }
1312
1313                         if (matched == false) {
1314                                 pos = elm_genlist_item_insert_after(app_data->genlist,
1315                                                 itc,
1316                                                 (void *)i,
1317                                                 NULL,
1318                                                 pos,
1319                                                 ELM_GENLIST_ITEM_NONE,
1320                                                 __ise_template_gl_sel,
1321                                                 app_data);
1322                                 template_len++;
1323                         }
1324                 }
1325
1326                 elm_genlist_item_class_free(itc);
1327         }
1328
1329
1330         // template add button (+)
1331 /*      if (!input_template_is_user_template()) {
1332                 Elm_Genlist_Item_Class *itc;
1333
1334                 itc = elm_genlist_item_class_new();
1335
1336                 itc->item_style = "1text.1icon";
1337                 itc->func.text_get = __ise_addtemplate_gl_text_get;;
1338                 itc->func.content_get = __ise_gl_1button_content_get;
1339                 itc->func.state_get = NULL;
1340                 itc->func.del = NULL;
1341
1342
1343                 pos = elm_genlist_item_insert_after(app_data->genlist,
1344                                 itc,
1345                                 NULL,
1346                                 NULL,
1347                                 pos,
1348                                 ELM_GENLIST_ITEM_NONE,
1349                                 __ise_template_add_gl_sel,
1350                                 app_data);
1351
1352                 elm_genlist_item_class_free(itc);
1353         }
1354 */
1355         if (menu)
1356                 elm_genlist_item_show(menu, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1357
1358         g_template_current_number = template_len;
1359 }
1360
1361
1362 bool _app_create(void* user_data)
1363 {
1364         int width=1000, height=1000;
1365 //      App_Data* app_data = NULL;
1366         Evas_Object* layout = NULL;
1367         Evas_Object* conform = NULL;
1368         Evas_Object* bg = NULL;
1369         Evas_Object* window = NULL;
1370         Eext_Circle_Surface *surface;
1371
1372         if (!user_data) {
1373                 return false;
1374         }
1375
1376         _app_language_changed(NULL, NULL);
1377 #ifdef SUPPORT_LOG_MANAGER
1378         log_manager_init();
1379 #endif
1380
1381         app_data = (App_Data*)user_data;
1382
1383         elm_app_base_scale_set(1.3);
1384
1385         window = elm_win_add(NULL, PACKAGE, ELM_WIN_BASIC);
1386         if (window) {
1387                 init_customizing_theme();
1388
1389                 elm_win_title_set(window, PACKAGE);
1390                 elm_win_borderless_set(window, EINA_TRUE);
1391 //              ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height);
1392                 evas_object_resize(window, width, height);
1393                 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
1394         }
1395         else {
1396                 LOGE("elm_win_add() is failed.");
1397                 return false;
1398         }
1399
1400         bg = elm_bg_add(window);
1401         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1402         elm_win_resize_object_add(window, bg);
1403         evas_object_show(bg);
1404
1405         layout = elm_layout_add(window);
1406         elm_layout_theme_set(layout, "layout", "application", "default");
1407         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1408
1409         conform = elm_conformant_add(window);
1410         surface = eext_circle_surface_conformant_add(conform);
1411         evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1412
1413
1414         elm_win_resize_object_add(window, conform);
1415         elm_object_content_set(conform, layout);
1416
1417         evas_object_show(layout);
1418         evas_object_show(conform);
1419         evas_object_show(window);
1420         app_data->win_main = window;
1421         app_data->conform = conform;
1422         app_data->layout_main = layout;
1423         app_data->circle_surface = surface;
1424         app_data->app_type = APP_TYPE_SELECT_MODE;
1425
1426         Evas_Object *naviframe = elm_naviframe_add(layout);
1427         elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE);
1428         eext_object_event_callback_add(naviframe, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, NULL);
1429         elm_object_part_content_set(layout, "elm.swallow.content", naviframe);
1430         evas_object_show(naviframe);
1431
1432         app_data->naviframe = naviframe;
1433
1434         return true;
1435 }
1436
1437 void _app_service(app_control_h service, void* user_data)
1438 {
1439         int ret;
1440         bool b_ret;
1441         char *context = NULL;
1442         char *app_id = NULL;
1443
1444         app_control_clone(&(app_data->source_app_control), service);
1445
1446         app_data->reply_type = REPLY_APP_NORMAL;
1447         ret = app_control_get_extra_data(service, "selector_keyboard_app_id", &app_id);
1448         if (ret == APP_CONTROL_ERROR_NONE) {
1449                 PRINTFUNC(DLOG_DEBUG, "app_id = %s", app_id);
1450         }
1451
1452         if(app_id){
1453                 if(!strcmp(app_id, "com.samsung.message.appcontrol.compose") || !strcmp(app_id, "com.samsung.wemail-send")) {
1454                         app_data->reply_type = REPLY_APP_CONTROL;
1455                 } else {
1456                         app_data->reply_type = REPLY_APP_NORMAL;
1457                 }
1458         }
1459  
1460         if(app_id)
1461                 free(app_id);
1462
1463     bool is_type_reply = false;
1464         ret = app_control_get_extra_data(service, APP_CONTROL_DATA_INPUT_TYPE, &context);
1465         if (ret == APP_CONTROL_ERROR_NONE) {
1466                 if(!strcmp(context, "input_voice")) {
1467                         app_data->app_type = APP_TYPE_STT;
1468                         _stt_clicked_cb( (void *)app_data, NULL, NULL );
1469                         goto ACTIVATE;
1470                 } else if(!strcmp(context, "input_emoticon")) {
1471                         app_data->app_type = APP_TYPE_EMOTICON;
1472                         _emoticon_clicked_cb( (void *)app_data, NULL, NULL);
1473                         goto ACTIVATE;
1474         } else if(!strcmp(context, "input_keyboard")) {
1475                         app_data->app_type = APP_TYPE_KEYBOARD;
1476             input_keyboard_init(service);
1477                         _keyboard_clicked_cb( (void *)app_data, NULL, NULL);
1478                         goto ACTIVATE;
1479                 } else if(!strcmp(context, "keyboard_input_from_sms")) {
1480                         app_data->app_type = APP_TYPE_KEYBOARD_FROM_SMS;
1481             input_keyboard_init(service);
1482                         _keyboard_clicked_cb( (void *)app_data, NULL, NULL);
1483                         goto ACTIVATE;
1484                 } else if(!strcmp(context, "input_reply")) {
1485                         app_data->app_type = APP_TYPE_REPLY;
1486             is_type_reply = true;
1487                 }
1488         }
1489
1490         if (app_data->genlist == NULL)
1491                 app_data->genlist = _create_genlist(app_data->naviframe);
1492
1493         input_keyboard_init(service);
1494
1495 //      input_smartreply_init(service);
1496 //      input_smartreply_set_notify(_input_smartreply_notify_cb, NULL);
1497
1498 //      if (input_smartreply_is_enabled())
1499 //              input_smartreply_get_reply_async();
1500
1501
1502         input_template_init(service);
1503         input_template_set_notify(_input_template_notify_cb,  NULL);
1504
1505         _create_genlist_items(app_data, is_type_reply);
1506
1507 ACTIVATE :
1508         elm_win_activate(app_data->win_main);
1509
1510 //      app_control_request_transient_app(service, elm_win_xwindow_get(app_data->win_main), _app_control_request_transient_app_cb,  NULL);
1511         if(context)
1512                 free(context);
1513 }
1514
1515
1516 void _app_pause(void* user_data)
1517 {
1518         PRINTFUNC(DLOG_DEBUG, "");
1519         pause_voice();
1520 }
1521
1522 void _app_resume(void* user_data)
1523 {
1524         PRINTFUNC(DLOG_DEBUG, "");
1525 }
1526
1527 void _app_terminate(void* user_data)
1528 {
1529         App_Data* app_data = NULL;
1530         app_data = (App_Data*)user_data;
1531
1532         if(app_data->genlist){
1533                 evas_object_smart_callback_del(app_data->genlist, "elm,item,position,changed", _item_position_changed_cb);
1534         }
1535
1536         if(app_data->res_path)
1537                 free(app_data->res_path);
1538
1539         if(app_data->shared_res_path)
1540                 free(app_data->shared_res_path);
1541
1542         input_keyboard_deinit();
1543         input_smartreply_deinit();
1544
1545         input_template_unset_notify();
1546         input_template_deinit();
1547
1548 #ifdef SUPPORT_LOG_MANAGER
1549         log_manager_exit();
1550 #endif
1551 }
1552
1553 static int init_i18n(const char *domain, const char *dir, char *lang_str)
1554 {
1555         if (setlocale(LC_ALL, "") == NULL) {
1556                 PRINTFUNC(DLOG_INFO,"Some environment variable is invalid, setlocale(LC_ALL, \"\") has returns\ed a null pointer");
1557                 if (setlocale(LC_ALL, lang_str) == NULL)
1558                         return -1;
1559         }
1560         if (bindtextdomain(domain, dir) == NULL)
1561                 return -1;
1562         if (textdomain(domain) == NULL)
1563                 return -1;
1564
1565         return 0;
1566 }
1567
1568 /**
1569  * @brief Set language and locale.
1570  *
1571  * @return void
1572  */
1573 static void _app_language_changed(app_event_info_h event_info, void *user_data)
1574 {
1575         char* lang_str = vconf_get_str(VCONFKEY_LANGSET);
1576         if (lang_str) {
1577                 setenv("LANG", lang_str, 1);
1578                 setenv("LC_MESSAGES", lang_str, 1);
1579         } else {
1580                 setenv("LANG", "en_GB.utf8", 1);
1581                 setenv("LC_MESSAGES", "en_GB.utf8", 1);
1582                 lang_str = strdup("en_GB.UTF-8");
1583         }
1584
1585         init_i18n(PACKAGE, LOCALEDIR, lang_str);
1586
1587         if (lang_str) {
1588                 elm_language_set(lang_str);
1589                 free(lang_str);
1590         }
1591 }
1592
1593
1594
1595 int main(int argc, char* argv[])
1596 {
1597         App_Data app_data = {0,};
1598         ui_app_lifecycle_callback_s event_callback = {0,};
1599     app_event_handler_h handlers[5] = {NULL, };
1600
1601         event_callback.create = _app_create;
1602         event_callback.terminate = _app_terminate;
1603         event_callback.pause = _app_pause;
1604         event_callback.resume = _app_resume;
1605         event_callback.app_control = _app_service;
1606
1607     ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, &app_data);
1608         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, &app_data);
1609         ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, &app_data);
1610         ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed, &app_data);
1611         ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, NULL, &app_data);
1612
1613         _init_app_data(&app_data);
1614
1615         int ret = ui_app_main(argc, argv, &event_callback, &app_data);
1616         if (ret != APP_ERROR_NONE) {
1617                 LOGD("ui_app_main() is failed. err = %d", ret);
1618         }
1619
1620         return ret;
1621 }
1622
1623 #ifdef SUPPORT_LOG_MANAGER
1624 static void log_manager_init(void)
1625 {
1626         if (g_log_manager)
1627                 return;
1628
1629         samsung_log_manager_create(&g_log_manager);
1630 }
1631
1632 static void log_manager_exit(void)
1633 {
1634         samsung_log_manager_destroy(g_log_manager);
1635         g_log_manager = NULL;
1636 }
1637
1638 static void log_manager_set(const char *feature, const char *extra, const char *value)
1639 {
1640         const char *uri = USE_APP_FEATURE_SURVEY_URI;
1641
1642         unsigned int request_id;
1643         bundle *log_data;
1644
1645         if (g_log_manager == NULL) {
1646                 PRINTFUNC(DLOG_ERROR, "log manager doesn't initialized");
1647                 return;
1648         }
1649
1650         if (feature == NULL) {
1651                 PRINTFUNC(DLOG_ERROR, "feature is empty");
1652                 return;
1653         }
1654
1655         log_data = bundle_create();
1656
1657         bundle_add(log_data, "app_id", PACKAGE);
1658         bundle_add(log_data, "feature", feature);
1659
1660         if (extra)
1661                 bundle_add(log_data, "extra", extra);
1662         if (value)
1663                 bundle_add(log_data, "value", value);
1664
1665         samsung_log_manager_insert(g_log_manager, uri, log_data, NULL, NULL, &request_id);
1666
1667         bundle_free(log_data);
1668 }
1669 #endif
1670