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