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