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