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