remove the smartreply and template feature
[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-keyboard.h"
30 #include "w-input-stt-ise.h"
31 #include "w-input-emoticon.h"
32 #include "w-input-stt-tos.h"
33
34 #include <stt.h>
35
36
37 using namespace std;
38
39 App_Data* app_data = NULL;
40
41 InputKeyboardData g_input_keyboard_data;
42
43 static Elm_Object_Item *it_empty;
44 static Elm_Object_Item *it_title;
45 static Elm_Object_Item *it_plus;
46
47 Evas_Coord last_step; // 0 ~ 9 for gesture, 10~11 for rotary
48
49 void _init_app_data(App_Data* app_data);
50 static void _app_language_changed(app_event_info_h event_info, void *user_data);
51
52 static char *_genlist_text_set_theme_color(const char *str, const char *code);
53
54 Evas_Object* _create_genlist(Evas_Object* parent);
55 void _create_genlist_items(void* user_data, bool is_type_reply);
56 static void _popup_close_cb(void *data, Evas_Object *obj, void *event_info);
57 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info);
58
59
60
61 void _init_app_data(App_Data* app_data)
62 {
63     app_data->win_main = NULL;
64     app_data->layout_main = NULL;
65     app_data->conform = NULL;
66     app_data->naviframe = NULL;
67     app_data->genlist = NULL;
68
69     app_data->res_path = NULL;
70 }
71
72
73
74 Evas_Object* load_edj(Evas_Object* parent, const char* file, const char* group)
75 {
76         Evas_Object* window;
77         Evas_Object* content;
78         int ret;
79
80         window = elm_layout_add(parent);
81         if (window) {
82                 ret = elm_layout_file_set(window, file, group);
83                 if (!ret) {
84                         evas_object_del(window);
85                         return NULL;
86                 }
87
88                 content = elm_layout_add(parent);
89                 elm_layout_theme_set(content, "layout", "application", "default");
90                 elm_object_part_content_set(window, "elm.swallow.content", content);
91
92                 evas_object_size_hint_weight_set(window, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
93         }
94
95         return window;
96 }
97
98 void init_customizing_theme(void)
99 {
100         string stt_edj_path = get_resource_path();
101         string app_edj_path = get_resource_path();
102
103         stt_edj_path = stt_edj_path + STT_EDJ_FILE;
104         app_edj_path = app_edj_path + APP_EDJ_FILE;
105
106         elm_theme_extension_add(NULL, stt_edj_path.c_str());
107         elm_theme_extension_add(NULL, app_edj_path.c_str());
108 }
109
110
111 static Eina_Bool back_cb(void *data, Elm_Object_Item *it)
112 {
113     reply_to_sender_by_callback_for_back();
114     elm_exit();
115     return EINA_FALSE;
116 }
117
118 static void _stt_clicked_cb(void *data, Evas_Object * obj, void *event_info)
119 {
120         App_Data* ad = (App_Data*)data;
121
122         PRINTFUNC(DLOG_DEBUG, "");
123
124         if(!ad)
125                 return;
126
127 #if 0
128         bool bAgreed = false;
129         stt_get_user_agreement(&bAgreed);
130         if(!bAgreed){
131 #endif
132         if(is_tos_N66_agreed() == EINA_FALSE){
133                 if(is_sap_connection() == EINA_TRUE){
134                         ise_show_tos_n66_popup(ad);
135                 } else {
136                         launch_bt_connection_popup(ad);
137                 }
138         } else {
139                 ise_show_stt_popup(ad);
140         }
141 }
142
143 static void _emoticon_clicked_cb(void *data, Evas_Object * obj, void *event_info)
144 {
145         App_Data* ad = (App_Data*)data;
146
147         PRINTFUNC(DLOG_DEBUG, "");
148
149         if(!ad)
150                 return;
151
152 //      ise_show_emoticon_popup(ad);
153         ise_show_emoticon_popup_rotary(ad);
154 }
155
156 static void _keyboard_clicked_cb(void *data, Evas_Object * obj, void *event_info)
157 {
158         App_Data* ad = (App_Data *)data;
159
160         PRINTFUNC(DLOG_DEBUG, "");
161
162         if (!ad)
163                 return;
164
165         input_keyboard_launch(ad->win_main, data);
166 }
167
168 static void __bt_connection_result_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
169 {
170         char *val = NULL;
171
172         if (reply == NULL) {
173                 PRINTFUNC(DLOG_ERROR, "service_h is NULL");
174                 return;
175         }
176
177         app_control_get_extra_data(reply, "__BT_CONNECTION__", &val);
178         if (val) {
179                 if ( strcmp(val, "Connected") == 0 ) {
180                         PRINTFUNC(DLOG_ERROR, "BT Connected");
181                 } else {
182                         PRINTFUNC(DLOG_ERROR, "BT Not Connected");
183                 }
184                 free(val);
185         }
186 }
187
188
189 static Evas_Object * __ise_gl_3button_content_get(void *data, Evas_Object *obj, const char *part)
190 {
191         if (!strcmp(part, "elm.icon.1") ||  (!strcmp(part, "elm.icon.2")) ||  (!strcmp(part, "elm.icon.3"))) {
192                 Evas_Object* btn = elm_button_add(obj);
193                 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
194                 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
195                 Evas_Object* ic = elm_image_add(btn);
196                 elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
197                 string path = get_resource_path();
198                 if (!strcmp(part, "elm.icon.1")) {
199                         elm_object_style_set(btn, "anchor");
200                         string path_ic = path + "images/w_mode_stt_ic.png";
201                         elm_image_file_set(ic, path_ic.c_str(), NULL);
202                         elm_object_content_set(btn, ic);
203                         evas_object_layer_set(btn, 32000);
204
205                 } else if (!strcmp(part, "elm.icon.2")){
206                         elm_object_style_set(btn, "anchor");
207                         string path_ic = path + "images/Delta_w_mode_emoticon_ic.png";
208                         elm_image_file_set(ic, path_ic.c_str(), NULL);
209                         elm_object_content_set(btn, ic);
210                         evas_object_layer_set(btn, 32000);
211
212                 } else if (!strcmp(part, "elm.icon.3")){
213                         elm_object_style_set(btn, "anchor");
214                         string path_ic = path + "images/w_mode_keyboard_ic.png";
215                         elm_image_file_set(ic, path_ic.c_str(), NULL);
216                         elm_object_content_set(btn, ic);
217                         evas_object_layer_set(btn, 32000);
218                         evas_object_propagate_events_set(btn, EINA_FALSE);
219                 }
220
221                 return btn;
222         } else if (!strcmp(part, "elm.icon.1.touch_area") ||  (!strcmp(part, "elm.icon.2.touch_area")) ||  (!strcmp(part, "elm.icon.3.touch_area"))) {
223                 Evas_Object* btn = elm_button_add(obj);
224                 elm_object_style_set(btn, "touch_area");
225                 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
226                 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
227                 string path = get_resource_path();
228                 if (!strcmp(part, "elm.icon.1.touch_area")) {
229                         evas_object_layer_set(btn, 32000);
230                         evas_object_smart_callback_add(btn, "clicked", _stt_clicked_cb, app_data);
231
232                 } else if (!strcmp(part, "elm.icon.2.touch_area")){
233                         evas_object_layer_set(btn, 32000);
234                         evas_object_smart_callback_add(btn, "clicked", _emoticon_clicked_cb, app_data);
235                 } else if (!strcmp(part, "elm.icon.3.touch_area")) {
236                         evas_object_layer_set(btn, 32000);
237                         evas_object_propagate_events_set(btn, EINA_FALSE);
238                         evas_object_smart_callback_add(btn, "clicked", _keyboard_clicked_cb, app_data);
239                 }
240
241                 return btn;
242         } else if (!strcmp(part, "base")) {
243                 Evas_Object* btn = elm_button_add(obj);
244                 elm_object_style_set(btn, "ime_transparent");
245                 return btn;
246         }
247         return NULL;
248 }
249
250
251 static void __ise_gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
252 {
253         //Update genlist items. The Item texts will be translated in the _gl_text_get().
254         elm_genlist_realized_items_update(obj);
255 }
256
257
258 static char *_genlist_text_set_theme_color(const char *str, const char *code)
259 {
260         int r, g, b, a;
261         Eina_Strbuf *buf = NULL;
262         char *colored = NULL;
263
264         if (code == NULL)
265                 return NULL;
266
267         buf = eina_strbuf_new();
268         if (buf == NULL) {
269                 PRINTFUNC(DLOG_ERROR, "Can not get create strbuf");
270                 return NULL;
271         }
272
273 //      ea_theme_color_get(code,
274 //                      &r, &g, &b, &a,
275 //                      NULL, NULL, NULL, NULL,
276 //                      NULL, NULL, NULL, NULL);
277
278         eina_strbuf_append_printf(buf, "<color=#%02x%02x%02x%02x>%s</color>",
279                         r, g, b, a, str);
280
281         colored = eina_strbuf_string_steal(buf);
282
283         eina_strbuf_free(buf);
284
285         return colored;
286 }
287
288
289 static void _app_control_send_reply_cb(app_control_h request, app_control_h reply,
290                                                 app_control_result_e result, void *user_data)
291 {
292                 PRINTFUNC(DLOG_DEBUG, "");
293                 reply_to_sender_by_callback(NULL, NULL);
294                 elm_exit();
295 }
296
297 void set_source_caller_app_id(app_control_h app_control)
298 {
299         if(!app_control){
300                 PRINTFUNC(DLOG_ERROR, "can't get app_control");
301                 return;
302         }
303
304         char *caller = NULL;
305         app_control_get_caller(app_data->source_app_control, &caller);
306
307         if(caller){
308                 PRINTFUNC(DLOG_DEBUG, "caller = %s", caller);
309                 app_control_add_extra_data(app_control, "caller_appid", caller);
310                 free(caller);
311         }
312 }
313
314 void reply_to_sender_by_callback(const char *value, const char *type)
315 {
316         PRINTFUNC(DLOG_DEBUG, "");
317
318         app_control_h app_control;
319
320         if(app_control_create(&app_control) == 0) {
321                 int ret;
322
323                 if (value)
324                         app_control_add_extra_data(app_control, "selected_context", value);
325
326                 if (type)
327                         app_control_add_extra_data(app_control, "reply_type", type);
328
329                 set_source_caller_app_id(app_control);
330
331                 ret = app_control_reply_to_launch_request(app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED);
332                 if (ret != APP_CONTROL_ERROR_NONE)
333                         PRINTFUNC(DLOG_ERROR, "reply failed : %d", ret);
334
335                 app_control_destroy(app_control);
336                 app_control_destroy(app_data->source_app_control);
337                 app_data->source_app_control = NULL;
338         }
339 }
340
341 void reply_to_sender_by_callback_for_back()
342 {
343         PRINTFUNC(DLOG_DEBUG, "");
344
345         app_control_h app_control;
346
347         if(app_control_create(&app_control) == 0) {
348                 int ret;
349
350                 app_control_add_extra_data(app_control, "back_to_composer", "yes");
351
352                 ret = app_control_reply_to_launch_request(app_control, app_data->source_app_control, APP_CONTROL_RESULT_SUCCEEDED);
353                 if (ret != APP_CONTROL_ERROR_NONE)
354                         PRINTFUNC(DLOG_ERROR, "reply failed : %d", ret);
355
356                 app_control_destroy(app_control);
357                 app_control_destroy(app_data->source_app_control);
358                 app_data->source_app_control = NULL;
359         }
360 }
361
362 char* get_resource_path()
363 {
364         if(NULL == app_data->res_path) {
365                 app_data->res_path = app_get_resource_path();
366                 PRINTFUNC(DLOG_INFO, "set resource path = %s", app_data->res_path);
367         }
368         return (app_data->res_path);
369 }
370
371 char* get_shared_resource_path()
372 {
373         if(NULL == app_data->shared_res_path) {
374                 app_data->shared_res_path = app_get_shared_resource_path();
375                 PRINTFUNC(DLOG_INFO, "set shared resource path = %s", app_data->shared_res_path);
376         }
377         return (app_data->shared_res_path);
378 }
379
380 void show_gl_focus(Eina_Bool bVisible){
381         if(app_data->genlist == NULL)
382                 return;
383
384         if(bVisible == EINA_TRUE){
385                 elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,enable", "elm");
386                 //elm_layout_theme_set(app_data->genlist, "genlist", "base", "focus_bg");
387                 //elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,show", "elm");
388         } else {
389                 elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,disable", "elm");
390                 //elm_layout_theme_set(app_data->genlist, "genlist", "base", "default");
391                 //elm_object_signal_emit(app_data->genlist, "elm,state,focus_bg,hide", "elm");
392         }
393 }
394
395 void show_popup_toast(const char *text, bool check_img)
396 {
397         PRINTFUNC(DLOG_ERROR, "show_popup_toast");
398
399         Evas_Object *popup;
400
401         popup = elm_popup_add(app_data->win_main);
402         elm_object_style_set(popup, "toast/circle");
403         elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
404         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
405
406         if (check_img) {
407                 string path = get_resource_path();
408                 string path_ic = path + "/images/toast_check_icon.png";
409                 Evas_Object * img = elm_image_add(popup);
410                 elm_image_file_set(img, path_ic.c_str(), NULL);
411                 elm_object_part_content_set(popup, "toast,icon", img);
412         }
413         if(text) {
414                 elm_object_part_text_set(popup, "elm.text", text);
415         }
416
417         eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, _popup_back_cb, NULL);
418         evas_object_smart_callback_add(popup, "dismissed", _popup_close_cb, NULL);
419         evas_object_smart_callback_add(popup, "block,clicked", _popup_back_cb, NULL);
420
421         elm_popup_timeout_set(popup, 2.0);
422         evas_object_show(popup);
423 }
424
425 static void _popup_close_cb(void *data, Evas_Object *obj, void *event_info)
426 {
427         if(obj){
428                 evas_object_hide(obj);
429                 evas_object_del(obj);
430         }
431 }
432
433 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
434 {
435         if(obj)
436                 elm_popup_dismiss(obj);
437 }
438
439
440 void _back_to_genlist_for_selector()
441 {
442         PRINTFUNC(DLOG_DEBUG, "");
443
444         if(!app_data) return;
445
446         if(app_data->app_type == APP_TYPE_STT || app_data->app_type == APP_TYPE_EMOTICON){
447                 PRINTFUNC(DLOG_DEBUG, "launched as STT/EMOTICON mode, So exit here.");
448                 reply_to_sender_by_callback(NULL, NULL);
449                 elm_exit();
450         }
451
452         Evas_Object *circle_genlist = (Evas_Object *) evas_object_data_get(app_data->genlist, "circle");
453
454         eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
455 }
456
457 static void _item_realized(void *data, Evas_Object *obj, void *event_info) //called when list scrolled
458 {
459         PRINTFUNC(DLOG_DEBUG, "%s", __func__);
460 }
461
462 Evas_Object* _create_genlist(Evas_Object* navi)
463 {
464         Evas_Object* genlist = elm_genlist_add(navi);
465         if(NULL == genlist)
466                 return NULL;
467
468         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
469         elm_genlist_scroller_policy_set(genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
470
471         Evas_Object* circle_object_genlist = eext_circle_object_genlist_add(genlist, app_data->circle_surface);
472         eext_circle_object_genlist_scroller_policy_set(circle_object_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
473         evas_object_data_set(genlist, "circle", (void *) circle_object_genlist);
474         eext_rotary_object_event_activated_set(circle_object_genlist, EINA_TRUE);
475
476         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
477         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
478
479         evas_object_smart_callback_add(genlist, "language,changed", __ise_gl_lang_changed, genlist);
480         evas_object_show(genlist);
481
482 //      uxt_genlist_set_bottom_margin_enabled(genlist, EINA_TRUE);
483
484         show_gl_focus(EINA_FALSE);
485
486         Elm_Object_Item *nf_main_item = elm_naviframe_item_push(navi,
487             NULL,
488             NULL,
489             NULL,
490             genlist,
491             "empty");
492
493         elm_naviframe_item_pop_cb_set(nf_main_item, back_cb, app_data);
494         evas_object_smart_callback_add(genlist, "realized", _item_realized, NULL);
495
496         return genlist;
497 }
498
499 static void _item_position_changed_cb(void *data, Evas_Object *obj, void *event_info)
500 {
501         if(!obj) return;
502         if(!data) return;
503
504         Evas_Object *genlist = (Evas_Object *)obj;
505         Elm_Object_Item *gen_item = (Elm_Object_Item *)data;
506
507         Evas_Coord y;
508         elm_scroller_region_get(genlist, NULL, &y, NULL, NULL);
509
510 //      PRINTFUNC(DLOG_DEBUG,"y=%d",y);
511
512         if (250 > y && y >= 100){
513                 if (last_step == 0) return;
514                 last_step = 0;
515                 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.0", "elm");
516                 show_gl_focus(EINA_TRUE);
517         } else if (100 > y && y >= 50){
518                 if (last_step == 1) return;
519                 last_step = 1;
520                 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.1", "elm");
521                 show_gl_focus(EINA_TRUE);
522         } else if (y < 50 && y >=0){
523                 if (last_step == 2) return;
524                 last_step = 2;
525                 elm_object_item_signal_emit(gen_item, "elm,action,ime,0.9", "elm");
526                 show_gl_focus(EINA_FALSE);
527         }
528 }
529
530 static char *
531 _main_menu_title_text_get(void *data, Evas_Object *obj, const char *part)
532 {
533         char buf[1024];
534
535         snprintf(buf, 1023, "%s", "Select method");
536         return strdup(buf);
537 }
538
539 void _create_genlist_items(void* user_data, bool is_type_reply)
540 {
541         LOGD("[psw] _create_genlist_items");
542
543         App_Data* app_data = (App_Data*) user_data;
544
545         if(NULL == app_data->genlist) {
546                 app_data->genlist = _create_genlist(app_data->naviframe);
547                 if(NULL == app_data->genlist)
548                 return;
549         }
550
551         elm_genlist_clear(app_data->genlist);
552
553         Elm_Genlist_Item_Class * itc0 = elm_genlist_item_class_new();
554         itc0->item_style = "title";
555         itc0->func.text_get = _main_menu_title_text_get;
556         itc0->func.content_get = NULL;
557         itc0->func.state_get = NULL;
558         itc0->func.del = NULL;
559
560         Elm_Genlist_Item_Class * itc1 = elm_genlist_item_class_new();
561         itc1->item_style = "3button";
562         itc1->func.text_get = NULL;
563         itc1->func.content_get = __ise_gl_3button_content_get;
564         itc1->func.state_get = NULL;
565         itc1->func.del = NULL;
566
567
568         // dummy title for empty space
569         it_empty = elm_genlist_item_append(app_data->genlist, itc0,
570                         NULL, NULL,
571                         ELM_GENLIST_ITEM_NONE,
572                         NULL, NULL);
573
574         if (!is_type_reply) {
575                 // 3 Buttons
576                 it_title = elm_genlist_item_append(app_data->genlist, itc1,
577                                 NULL, NULL,
578                                 ELM_GENLIST_ITEM_NONE,
579                                 NULL, NULL);
580
581                 elm_genlist_item_select_mode_set(it_title, ELM_OBJECT_SELECT_MODE_NONE);
582         }
583
584         Elm_Object_Item *item = elm_genlist_item_next_get(it_title);
585         elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
586
587         evas_object_smart_callback_add(app_data->genlist, "elm,item,position,changed", _item_position_changed_cb, it_title);
588
589         elm_genlist_item_class_free(itc0);
590         elm_genlist_item_class_free(itc1);
591 }
592
593 bool _app_create(void* user_data)
594 {
595         int width = 1000, height = 1000;
596 //      App_Data* app_data = NULL;
597         Evas_Object* layout = NULL;
598         Evas_Object* conform = NULL;
599         Evas_Object* bg = NULL;
600         Evas_Object* window = NULL;
601         Eext_Circle_Surface *surface;
602
603         if (!user_data) {
604                 return false;
605         }
606
607         _app_language_changed(NULL, NULL);
608
609         app_data = (App_Data*)user_data;
610
611         elm_app_base_scale_set(1.3);
612
613         window = elm_win_add(NULL, PACKAGE, ELM_WIN_BASIC);
614         if (window) {
615                 init_customizing_theme();
616
617                 elm_win_title_set(window, PACKAGE);
618                 elm_win_borderless_set(window, EINA_TRUE);
619 //              ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height);
620                 evas_object_resize(window, width, height);
621                 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
622         } else {
623                 LOGE("elm_win_add() is failed.");
624                 return false;
625         }
626
627         bg = elm_bg_add(window);
628         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
629         elm_win_resize_object_add(window, bg);
630         evas_object_show(bg);
631
632         layout = elm_layout_add(window);
633         elm_layout_theme_set(layout, "layout", "application", "default");
634         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
635
636         conform = elm_conformant_add(window);
637         surface = eext_circle_surface_conformant_add(conform);
638         evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
639
640
641         elm_win_resize_object_add(window, conform);
642         elm_object_content_set(conform, layout);
643
644         evas_object_show(layout);
645         evas_object_show(conform);
646         evas_object_show(window);
647         app_data->win_main = window;
648         app_data->conform = conform;
649         app_data->layout_main = layout;
650         app_data->circle_surface = surface;
651         app_data->app_type = APP_TYPE_SELECT_MODE;
652
653         Evas_Object *naviframe = elm_naviframe_add(layout);
654         elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE);
655         eext_object_event_callback_add(naviframe, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, NULL);
656         elm_object_part_content_set(layout, "elm.swallow.content", naviframe);
657         evas_object_show(naviframe);
658
659         app_data->naviframe = naviframe;
660
661         return true;
662 }
663
664 void _app_service(app_control_h service, void* user_data)
665 {
666         int ret;
667         bool b_ret;
668         char *context = NULL;
669
670         app_control_clone(&(app_data->source_app_control), service);
671         app_data->reply_type = REPLY_APP_NORMAL;
672
673     bool is_type_reply = false;
674         ret = app_control_get_extra_data(service, APP_CONTROL_DATA_INPUT_TYPE, &context);
675         if (ret == APP_CONTROL_ERROR_NONE) {
676                 if (!strcmp(context, "input_voice")) {
677                         app_data->app_type = APP_TYPE_STT;
678                         _stt_clicked_cb((void *)app_data, NULL, NULL);
679                         goto ACTIVATE;
680                 } else if (!strcmp(context, "input_emoticon")) {
681                         app_data->app_type = APP_TYPE_EMOTICON;
682                         _emoticon_clicked_cb((void *)app_data, NULL, NULL);
683                         goto ACTIVATE;
684         } else if (!strcmp(context, "input_keyboard")) {
685                         app_data->app_type = APP_TYPE_KEYBOARD;
686                         input_keyboard_init(service);
687                         _keyboard_clicked_cb((void *)app_data, NULL, NULL);
688                         goto ACTIVATE;
689                 } else if (!strcmp(context, "input_reply")) {
690                         app_data->app_type = APP_TYPE_REPLY;
691             is_type_reply = true;
692                 }
693         }
694
695         if (app_data->genlist == NULL)
696                 app_data->genlist = _create_genlist(app_data->naviframe);
697
698         input_keyboard_init(service);
699
700         _create_genlist_items(app_data, is_type_reply);
701
702 ACTIVATE :
703         elm_win_activate(app_data->win_main);
704
705         if(context)
706                 free(context);
707 }
708
709
710 void _app_pause(void* user_data)
711 {
712         PRINTFUNC(DLOG_DEBUG, "");
713         pause_voice();
714 }
715
716 void _app_resume(void* user_data)
717 {
718         PRINTFUNC(DLOG_DEBUG, "");
719 }
720
721 void _app_terminate(void* user_data)
722 {
723         App_Data* app_data = NULL;
724         app_data = (App_Data*)user_data;
725
726         if(app_data->genlist){
727                 evas_object_smart_callback_del(app_data->genlist, "elm,item,position,changed", _item_position_changed_cb);
728         }
729
730         if(app_data->res_path)
731                 free(app_data->res_path);
732
733         if(app_data->shared_res_path)
734                 free(app_data->shared_res_path);
735
736         input_keyboard_deinit();
737 }
738
739 static int init_i18n(const char *domain, const char *dir, char *lang_str)
740 {
741         if (setlocale(LC_ALL, "") == NULL) {
742                 PRINTFUNC(DLOG_INFO, "Some environment variable is invalid, setlocale(LC_ALL, \"\") has returns\ed a null pointer");
743                 if (setlocale(LC_ALL, lang_str) == NULL)
744                         return -1;
745         }
746         if (bindtextdomain(domain, dir) == NULL)
747                 return -1;
748         if (textdomain(domain) == NULL)
749                 return -1;
750
751         return 0;
752 }
753
754 /**
755  * @brief Set language and locale.
756  *
757  * @return void
758  */
759 static void _app_language_changed(app_event_info_h event_info, void *user_data)
760 {
761         char* lang_str = vconf_get_str(VCONFKEY_LANGSET);
762         if (lang_str) {
763                 setenv("LANG", lang_str, 1);
764                 setenv("LC_MESSAGES", lang_str, 1);
765         } else {
766                 setenv("LANG", "en_GB.utf8", 1);
767                 setenv("LC_MESSAGES", "en_GB.utf8", 1);
768                 lang_str = strdup("en_GB.UTF-8");
769         }
770
771         init_i18n(PACKAGE, LOCALEDIR, lang_str);
772
773         if (lang_str) {
774                 elm_language_set(lang_str);
775                 free(lang_str);
776         }
777 }
778
779
780
781 int main(int argc, char* argv[])
782 {
783         App_Data app_data = {0, };
784         ui_app_lifecycle_callback_s event_callback = {0, };
785         app_event_handler_h handlers[5] = {NULL, };
786
787         event_callback.create = _app_create;
788         event_callback.terminate = _app_terminate;
789         event_callback.pause = _app_pause;
790         event_callback.resume = _app_resume;
791         event_callback.app_control = _app_service;
792
793         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, &app_data);
794         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, &app_data);
795         ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, &app_data);
796         ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed, &app_data);
797         ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, NULL, &app_data);
798
799         _init_app_data(&app_data);
800
801         int ret = ui_app_main(argc, argv, &event_callback, &app_data);
802         if (ret != APP_ERROR_NONE) {
803                 LOGD("ui_app_main() is failed. err = %d", ret);
804         }
805
806         return ret;
807 }