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