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