fix the issue that not showed left cue button
[platform/core/uifw/inputdelegator.git] / src / w-input-stt-voice.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 <stdio.h>
18 #include <Elementary.h>
19 #include <Ecore_IMF.h>
20 #include <Ecore.h>
21 #include <device/power.h>
22 #include <efl_assist.h>
23 #include <app_common.h>
24 #include <app.h>
25 #include <string>
26 #include <efl_extension.h>
27 #include <feedback.h>
28
29 #include "Debug.h"
30 #include "w-input-selector.h"
31 #include "w-input-smartreply.h"
32 #include "w-input-stt-voice.h"
33 #include "w-input-stt-engine.h"
34 #include "w-input-stt-ise.h"
35
36 using namespace std;
37
38 #define _EDJ(x)  elm_layout_edje_get(x)
39
40
41 #define GRP_PORTRAIT "mic_control"
42
43 #define item_append(obj, style, index, cb, udata) \
44                 elm_genlist_item_append(obj, &(style), (void *)index, NULL, ELM_GENLIST_ITEM_NONE, cb, udata)
45
46 #define VIRTUAL_TEXT_AREA_FONT_STYLE \
47                 "DEFAULT='font=Tizen:style=Regular  font_size=32 color=#FFFFFF color_class=AT013 text_class=tizen wrap=mixed align=center' \
48                 newline='br' b='+ font=Tizen:style=Bold'link='+ underline=on underline_color=#FFFFFF'"
49
50 extern App_Data* app_data;
51 extern VoiceData *my_voicedata;
52
53 static bool power_state = false;
54
55 static Evas_Object *radio_gp = NULL;
56 Evas_Object *g_setting_window = NULL;
57 static Evas_Object *g_setting_naviframe = NULL;
58 static Evas_Object *g_more_option_layout = NULL;
59
60 static Ecore_Event_Handler *g_evt_key_down = NULL;
61
62 static bool g_is_n66 = true;
63
64 static Elm_Genlist_Item_Class itc_title;
65 static Elm_Genlist_Item_Class itc_1text;
66 static Elm_Genlist_Item_Class itc_2text;
67
68
69 static void set_guide_text(VoiceData *vd, const char* text, bool translatable = false);
70
71 char *supported_language[7] = {
72                 "auto",
73                 "en_US",
74                 "es_US",
75                 "fr_FR",
76                 "zh_CN",
77                 "ja_JP",
78                 "ko_KR",
79 };
80
81
82 char *disp_lang_array[7] = {
83                 "",
84                 "English (United States)",
85                 "Español (América Latina)",
86                 "Français (France)",
87                 "简体中文",
88                 "日本語",
89                 "한국어",
90 };
91
92 typedef enum {
93         STT_VOICE_N66_AUTO,
94         STT_VOICE_N66_EN_US,
95         STT_VOICE_N66_ES_US,
96         STT_VOICE_N66_FR_FR,
97         STT_VOICE_N66_ZH_CN,
98         STT_VOICE_N66_JA_JP,
99         STT_VOICE_N66_KO_KR
100 }STT_VOICE_LANGUAGE_N66_I;
101
102 typedef enum {
103         BEEP_SOUND_START,
104         BEEP_SOUND_STOP,
105         VIBRATION_START,
106         VIBRATION_STOP,
107         BEEP_SOUND_TOUCH,
108         WAKEUP_COMMAND,
109 }FeedbackType;
110
111 static void get_stt_default_language(VoiceData *my_voicedata);
112
113
114 char* get_lang_label(char lang[])
115 {
116         char *str = NULL;
117
118         if (strcmp (lang, "en_US") == 0)
119                 str = disp_lang_array[1];
120
121         else if (strcmp (lang, "ko_KR") == 0)
122                 str = disp_lang_array[6];
123
124         else if (strcmp (lang, "fr_FR") == 0)
125                 str = disp_lang_array[3];
126
127         else if (strcmp (lang, "ja_JP") == 0)
128                 str = disp_lang_array[5];
129
130         else if (strcmp (lang, "zh_CN") == 0)
131                 str = disp_lang_array[4];
132
133         else if (strcmp (lang, "es_US") == 0)
134                 str = disp_lang_array[2];
135
136         else
137                 str = disp_lang_array[1];
138
139         return str;
140 }
141
142
143 static Eina_Bool
144 _bring_in_cb(void *data)
145 {
146         if(!data)
147                 return ECORE_CALLBACK_CANCEL;
148
149         Evas_Coord x, y, w, h;
150
151         Evas_Object *scroller = (Evas_Object *)data;
152         Evas_Object *inner_layout = NULL;
153
154         inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout");
155
156         evas_object_geometry_get(inner_layout, &x, &y, &w, &h);
157         elm_scroller_region_bring_in(scroller, x, h, w, h);
158
159         PRINTFUNC(NO_PRINT, "scroller %d %d %d %d", x, y, w, h);
160
161         return ECORE_CALLBACK_CANCEL;
162 }
163
164 static inline Evas_Coord get_text_block_size(Evas_Object *obj, std::string text)
165 {
166         int calculated_height = 0;
167
168         int max_height = 1280;
169         int unit_width = 282;
170
171         Evas_Coord width, height;
172
173         char *strbuf = NULL;
174         Evas_Object *tb = NULL;
175         Evas_Textblock_Style *st = NULL;
176         Evas_Textblock_Cursor *cur = NULL;
177
178         tb = evas_object_textblock_add(evas_object_evas_get(obj));
179         evas_object_textblock_legacy_newline_set(tb, EINA_FALSE);
180
181         st = evas_textblock_style_new();
182         evas_textblock_style_set(st, VIRTUAL_TEXT_AREA_FONT_STYLE);
183         evas_object_textblock_style_set(tb, st);
184
185         cur = evas_object_textblock_cursor_new(tb);
186         strbuf = elm_entry_utf8_to_markup(text.c_str());
187         evas_object_resize(tb, unit_width, max_height);
188
189         evas_object_textblock_text_markup_set(tb, strbuf);
190         evas_textblock_cursor_format_prepend(cur, "+ wrap=mixed");
191     evas_object_textblock_size_formatted_get(tb, &width, &height);
192         evas_object_resize(tb, unit_width, height);
193
194         if(strbuf) free(strbuf);
195         if(tb) evas_object_del(tb);
196         if(st) evas_textblock_style_free(st);
197 //      if(cur) evas_textblock_cursor_free(cur);
198
199         return height;
200 }
201
202 static Eina_Bool _update_textblock_timer_cb(void *data)
203 {
204         if(!data)
205                 return ECORE_CALLBACK_CANCEL;
206
207         VoiceData* voicedata = (VoiceData*)data;
208
209         voicedata->textblock_timer = NULL;
210
211         std::string result_text;
212         for(int i = 0; i < voicedata->stt_results.size(); i++){
213                 if(i == voicedata->stt_results.size()-1){
214                         result_text += voicedata->stt_results.at(i);
215                 } else {
216                         result_text += voicedata->stt_results.at(i);
217                         result_text += " ";
218                 }
219         }
220
221         Evas_Object *rect = NULL;
222         Evas_Object *entry = NULL;
223         Evas_Object *scroller = NULL;
224         Evas_Object *box = NULL;
225         Evas_Object *inner_layout = NULL;
226         char *strbuf = NULL;
227
228         scroller = elm_layout_content_get((Evas_Object *)voicedata->layout_main, "text_area");
229         if(!scroller)
230         {
231                 PRINTFUNC(DLOG_ERROR, "failed to get scroller");
232                 return ECORE_CALLBACK_CANCEL;
233         }
234
235         box = elm_object_content_get(scroller);
236         if(!box)
237         {
238                 PRINTFUNC(DLOG_ERROR, "failed to get box");
239                 return ECORE_CALLBACK_CANCEL;
240         }
241
242         inner_layout = (Evas_Object *) evas_object_data_get(scroller, "inner_layout");
243         if(!inner_layout)
244         {
245                 PRINTFUNC(DLOG_ERROR, "failed to get inner_layout");
246                 return ECORE_CALLBACK_CANCEL;
247         }
248
249         entry = elm_layout_content_get(inner_layout, "elm.swallow.content");
250         if(!entry)
251         {
252                 PRINTFUNC(DLOG_ERROR, "failed to get entry");
253                 return ECORE_CALLBACK_CANCEL;
254         }
255
256         Evas_Object *top = (Evas_Object *) evas_object_data_get(box, "top_padding");
257         Evas_Object *bottom = (Evas_Object *) evas_object_data_get(box, "bottom_padding");
258
259         if(top) {
260                 elm_box_unpack(box, top);
261                 evas_object_del(top);
262                 top = NULL;
263         }
264         if(bottom) {
265                 elm_box_unpack(box, bottom);
266                 evas_object_del(bottom);
267                 bottom = NULL;
268         }
269
270         Evas_Coord height = get_text_block_size(box, result_text);
271
272 //      if(height < 173) {
273         {
274                 int text_area_height = 360-102; // screen H - bottom button H
275                 int top_height = ((text_area_height - height) / 2);
276                 if(top_height < 120) top_height = 120; // Top fade area H
277
278                 int bottom_height = (text_area_height - top_height - height);
279                 if(bottom_height < 1) bottom_height = 0;
280
281                 PRINTFUNC(SECURE_DEBUG, "str : %s", result_text.c_str());
282                 PRINTFUNC(DLOG_DEBUG, "height : %d", height);
283                 PRINTFUNC(DLOG_DEBUG, "top_height : %d", top_height);
284                 PRINTFUNC(DLOG_DEBUG, "bottom_height : %d", bottom_height);
285
286                 rect = evas_object_rectangle_add(evas_object_evas_get(box));
287                 evas_object_color_set(rect, 0, 0, 0, 100);
288                 evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
289                 evas_object_size_hint_min_set(rect, 282, top_height);
290                 evas_object_show(rect);
291
292                 elm_box_pack_before(box, rect, inner_layout);
293                 evas_object_data_set(box, "top_padding", (void *) rect);
294
295                 rect = evas_object_rectangle_add(evas_object_evas_get(box));
296                 evas_object_color_set(rect, 0, 0, 0, 100);
297                 evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
298                 evas_object_size_hint_min_set(rect, 282, bottom_height);
299                 evas_object_show(rect);
300
301                 elm_box_pack_end(box, rect);
302                 evas_object_data_set(box, "bottom_padding", (void *) rect);
303         }
304
305         elm_entry_entry_set(entry, result_text.c_str());
306
307         Evas_Object *panel_layout = elm_layout_content_get((Evas_Object *)voicedata->layout_main, "left_panel_area");
308         Evas_Object *panel_left = elm_layout_content_get((Evas_Object *)panel_layout, "elm.swallow.right");
309
310         if (result_text.size() > 0) {
311                 elm_object_signal_emit(panel_left, "elm,state,enabled", "elm");
312         } else {
313                 elm_object_signal_emit(panel_left, "elm,state,disabled", "elm");
314         }
315
316         elm_object_signal_emit((Evas_Object *)voicedata->layout_main, "idle,state,guide_text,bottom", "elm");
317
318         if(voicedata->state == STT_STATE_VAL_LISTENING){
319                 if(voicedata->guide_text_timer != NULL){
320                         PRINTFUNC(DLOG_DEBUG, "Skip hide_guide_text");
321                         ecore_timer_del(voicedata->guide_text_timer);
322                         voicedata->guide_text_timer = NULL;
323                 }
324                 set_guide_text(voicedata, SK_TAP_TO_PAUSE, true);
325         }
326
327         elm_object_signal_emit(inner_layout, "scrolling", "entry");
328
329         return ECORE_CALLBACK_CANCEL;
330 }
331
332 void _update_textblock(void *data)
333 {
334         if(!data)
335                 return;
336
337         VoiceData *voicedata = (VoiceData *) data;
338
339         if(voicedata->textblock_timer == NULL){
340                 voicedata->textblock_timer = ecore_timer_add(1.0, _update_textblock_timer_cb, voicedata);
341         } else {
342                 PRINTFUNC(DLOG_DEBUG, "skip : the timer is not expired.");
343         }
344
345         return;
346 }
347
348 void voice_get_string(const char *keyValue, _VoiceData *voicedata)
349 {
350         if(!voicedata)
351                 return;
352
353         char* strbuf = NULL;
354
355         strbuf = elm_entry_utf8_to_markup(keyValue);
356
357         PRINTFUNC(DLOG_DEBUG, "text : %s, voicedata->partial_result=%s", strbuf, voicedata->partial_result);
358
359         if(strbuf){
360                 if(voicedata->partial_result){ // partial_result is not Null so replace
361                         if(strcmp(voicedata->partial_result, strbuf)){
362                                 // different replace
363                                 PRINTFUNC(DLOG_DEBUG, "different replace");
364
365                                 voicedata->stt_results.pop_back();
366                                 voicedata->stt_results.push_back(strbuf);
367
368                                 free(voicedata->partial_result);
369                                 voicedata->partial_result = strdup(strbuf);
370                         }
371                 } else { // partial_result is Null so first case
372                         PRINTFUNC(DLOG_DEBUG, "first push");
373                         voicedata->stt_results.push_back(strbuf);
374                         voicedata->partial_result = strdup(strbuf);
375                 }
376         }
377
378         _update_textblock(voicedata);
379
380         if(strbuf)
381                 free(strbuf);
382
383         PRINTFUNC(DLOG_DEBUG, "ends");
384 }
385
386 static Eina_Bool _recognition_failure_cb(void *data)
387 {
388         if(data) {
389                 VoiceData *voicedata = (VoiceData *) data;
390
391                 voicedata->state = STT_STATE_VAL_INIT;
392                 set_animation_state(voicedata);
393                 voicedata->refresh_timer = NULL;
394         }
395         return ECORE_CALLBACK_CANCEL;
396 }
397
398 void start_by_press(VoiceData *voicedata)
399 {
400         PRINTFUNC(DLOG_DEBUG, "");
401
402         edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
403
404         return;
405 }
406
407 static void on_mic_button_press_cb(void *data, Evas_Object *obj, void *event_info)
408 {
409         PRINTFUNC(NO_PRINT, "");
410
411         VoiceData *voicedata = (VoiceData *)data;
412         edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
413
414         return;
415 }
416
417
418 static Eina_Bool _mic_button_enable_cb(void *data)
419 {
420         PRINTFUNC(DLOG_DEBUG, "");
421
422         if(!data)
423                 return ECORE_CALLBACK_CANCEL;
424
425         VoiceData* voicedata = (VoiceData*)data;
426
427         voicedata->btn_disabling_timer = NULL;
428
429         Evas_Object *button = (Evas_Object *)voicedata->mic_button;
430
431         elm_object_disabled_set(button, EINA_FALSE);
432
433         return ECORE_CALLBACK_CANCEL;
434 }
435
436
437 static void on_confirm_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
438 {
439         if(!data)
440                 return;
441
442         VoiceData* voicedata = (VoiceData*)data;
443
444         std::string result_text;
445         for(int i = 0; i < voicedata->stt_results.size(); i++){
446                 result_text += voicedata->stt_results.at(i);
447                 if(i != voicedata->stt_results.size()-1)
448                         result_text += " ";
449         }
450
451         PRINTFUNC(DLOG_DEBUG, "result_text = %s", result_text.c_str());
452         input_smartreply_send_feedback(result_text.c_str());
453
454         reply_to_sender_by_callback(result_text.c_str(), "voice");
455         destroy_voice();
456         powerUnlock();
457         elm_exit();
458
459         return;
460 }
461
462 static void
463 _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
464 {
465         PRINTFUNC(DLOG_DEBUG, "left cue clicked!!");
466
467         on_confirm_button_clicked_cb(data, NULL, NULL);
468 }
469
470
471
472 void stt_feedback_initialize()
473 {
474         int ret = 0;
475
476         ret = feedback_initialize();
477         if(ret != 0)
478         {
479                 PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!");
480                 return;
481         }
482         return;
483 }
484
485 void stt_feedback(FeedbackType type)
486 {
487         int ret;
488
489         ret = feedback_initialize();
490         if(ret != 0)
491         {
492                 PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!");
493                 return;
494         }
495
496         if (type == VIBRATION_START){
497 //              feedback_play(FEEDBACK_PATTERN_VOICE_START);
498         } else if (type == VIBRATION_STOP){
499 //              feedback_play(FEEDBACK_PATTERN_VOICE_STOP);
500         }
501
502         ret = feedback_deinitialize();
503         if(ret != 0)
504         {
505                 PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!");
506                 return;
507         }
508 }
509
510 void stt_feedback_deinitialize()
511 {
512         int ret = 0;
513
514         ret = feedback_deinitialize();
515         if(ret != 0)
516         {
517                 PRINTFUNC(DLOG_ERROR, "feedback_initialize failed!");
518                 return;
519         }
520         return;
521 }
522
523 static Eina_Bool _idler_cb(void *data)
524 {
525         if(!data) return ECORE_CALLBACK_CANCEL;
526
527         VoiceData *voicedata = (VoiceData *)data;
528
529         PRINTFUNC(DLOG_DEBUG, "");
530
531
532         if(true == _app_stt_initialize(voicedata)) {
533                 PRINTFUNC(NO_PRINT, "_app_stt_initialize None Error");
534                 voicedata->voicefw_state = 1;
535                 voicedata->state = STT_STATE_VAL_INIT;
536         } else {
537                 voicedata->voicefw_state = 0;
538                 PRINTFUNC(DLOG_ERROR, "Initialization Fail!<br>Check STT-daemon is running");
539         }
540
541         Evas_Object *canvas = elm_object_part_content_get(voicedata->layout_main, "EFFECT_BG");
542
543
544         is::ui::WInputSttMicEffect *ieffect = new is::ui::WInputSttMicEffect();
545         ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
546
547         is::ui::MicEffector *effector = new is::ui::MicEffector(canvas, voicedata->layout_main, *ieffect);
548         voicedata->ieffect = ieffect;
549         voicedata->effector = effector;
550
551         ieffect->SetProgressBar(voicedata->progressbar);
552         ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
553
554         voicedata->mo->Update();
555
556         elm_access_highlight_set(voicedata->mic_button);
557
558
559         return ECORE_CALLBACK_CANCEL;
560 }
561
562
563 static Eina_Bool _power_delayed_unlock(void *data){
564         PRINTFUNC(DLOG_DEBUG, "POWER Unlock");
565
566         VoiceData *voicedata = (VoiceData *) data;
567         device_power_release_lock(POWER_LOCK_DISPLAY);
568         voicedata->power_unlock_timer = NULL;
569
570         return ECORE_CALLBACK_CANCEL;
571 }
572
573 void powerUnlock()
574 {
575         PRINTFUNC(DLOG_DEBUG, "POWER Unlock directly.");
576         device_power_release_lock(POWER_LOCK_DISPLAY);
577 }
578
579 void powerLock(void *data, bool enable)
580 {
581         int ret = DEVICE_ERROR_NONE;
582
583         VoiceData *voicedata = (VoiceData *) data;
584
585         if(enable) {
586                 ret = device_power_wakeup(false);
587                 PRINTFUNC(DLOG_DEBUG, "LCD Wakeup");
588
589                 if(ret != DEVICE_ERROR_NONE)
590                         PRINTFUNC(DLOG_ERROR, "LCD Wakeup ERROR = %d", ret);
591
592                 ret = device_power_request_lock(POWER_LOCK_DISPLAY, 0);
593                 PRINTFUNC(DLOG_DEBUG, "POWER LOCK");
594                 power_state = enable;
595
596                 if(ret != DEVICE_ERROR_NONE)
597                         PRINTFUNC(DLOG_ERROR, "ERROR = %d", ret);
598
599                 if(voicedata->power_unlock_timer != NULL){
600                         ecore_timer_del(voicedata->power_unlock_timer);
601                         voicedata->power_unlock_timer = NULL;
602                 }
603         } else {
604                 PRINTFUNC(DLOG_DEBUG, "POWER Unlock Delayed(5 sec)");
605
606                 if(voicedata->power_unlock_timer != NULL){
607                         ecore_timer_del(voicedata->power_unlock_timer);
608                         voicedata->power_unlock_timer = NULL;
609                 }
610                 voicedata->power_unlock_timer = ecore_timer_add(5.0, _power_delayed_unlock, voicedata);
611         }
612 }
613
614
615 static Eina_Bool hide_guide_text(void *data){
616         if(data) {
617                 VoiceData *voicedata = (VoiceData *) data;
618
619                 voicedata->guide_text_timer = NULL;
620
621
622                 PRINTFUNC(DLOG_ERROR, "");
623                 elm_object_part_text_set(voicedata->layout_main, "elm.text", "");
624         }
625         return ECORE_CALLBACK_CANCEL;
626 }
627
628 static void set_guide_text(VoiceData *vd, const char* text, bool translatable)
629 {
630         //elm_object_signal_emit(vd->layout_main, "idle,state,text,visible", "elm");
631
632         if(translatable)
633                 elm_object_domain_translatable_part_text_set(vd->layout_main, "elm.text", PACKAGE, text);
634         else
635                 elm_object_part_text_set(vd->layout_main, "elm.text", text);
636
637         if(!strcmp(text, SK_SPEAK_NOW)){
638                 if(vd->guide_text_timer == NULL)
639                         vd->guide_text_timer = ecore_timer_add(2.0, hide_guide_text, vd);
640         }
641 }
642
643 /**
644  * @brief - function to send the signal to edc
645  *               to change the animation as per stt state
646  * @param - Ug data
647  */
648 void set_animation_state(VoiceData *voicedata)
649 {
650         PRINTFUNC(DLOG_DEBUG, "");
651
652         PRINTFUNC(DLOG_ERROR, "voicedata->state == %s",
653                 voicedata->state == STT_STATE_VAL_INIT ?
654                         "STT_STATE_VAL_INIT" :
655                 voicedata->state == STT_STATE_VAL_LISTENING ?
656                         "STT_STATE_VAL_LISTENING" :
657                 voicedata->state == STT_STATE_VAL_PREPARE_LISTENING ?
658                         "STT_STATE_VAL_PREPARE_LISTENING" :
659                 voicedata->state == STT_STATE_VAL_PROCESSING ?
660                         "STT_STATE_VAL_PROCESSING" :
661                 voicedata->state == STT_STATE_VAL_PREPARE_PROCESSING ?
662                         "STT_STATE_VAL_PREPARE_PROCESSING" :
663                 voicedata->state == STT_STATE_VAL_TERMINATING ?
664                         "STT_STATE_VAL_TERMINATING" : "STT_STATE_VAL_NOT_RECOGNISED");
665
666         if (voicedata->state == STT_STATE_VAL_INIT) {
667 #if 0
668                 if (voicedata->sttmanager->GetCurrent() == STT_STATE_READY) {
669                         set_guide_text(voicedata, "", false);
670                         //_elm_access_say(voicedata->layout_main, _(SK_INIT));
671                 } else {
672                         PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR [%d]", voicedata->sttmanager->GetCurrent());
673                         set_guide_text(voicedata, _(SK_NETWORK_ERROR));
674                         //_elm_access_say(voicedata->layout_main, _(SK_NETWORK_CONNECTION_ERROR));
675                 }
676 #endif
677
678                 if(voicedata->effector)
679                         voicedata->effector->Stop(true);
680
681                 set_guide_text(voicedata, "");
682
683                 PRINTFUNC(DLOG_DEBUG, "%d", voicedata->stt_results.size());
684                 powerLock((void*)voicedata, false);
685         } else if (voicedata->state == STT_STATE_VAL_LISTENING) {
686                 set_guide_text(voicedata, SK_SPEAK_NOW, true);
687
688                 if(voicedata->effector)
689                         voicedata->effector->Start();
690
691                 powerLock((void*)voicedata, true);
692         } else if (voicedata->state == STT_STATE_VAL_PROCESSING) {
693                 set_guide_text(voicedata, "");
694                 if(voicedata->effector)
695                         voicedata->effector->Stop();
696
697                 stt_feedback(VIBRATION_STOP);
698         } else {
699                 PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR");
700                 set_guide_text(voicedata, _(SK_RECOGNITION_FAILED));
701                 //_elm_access_say(voicedata->layout_main, _(SK_RECOGNITION_FAILED));
702
703                 voicedata->state = STT_STATE_VAL_NOT_RECOGNISED;
704
705                 if(voicedata->refresh_timer) {
706                         ecore_timer_del(voicedata->refresh_timer);
707                 }
708
709                 if(voicedata->effector)
710                         voicedata->effector->Stop(true);
711
712                 voicedata->refresh_timer = ecore_timer_add(2.0, _recognition_failure_cb, voicedata);
713
714                 //powerLock((void*)voicedata, false);
715         }
716 }
717
718 void show_error_message(VoiceData *vd, stt_error_e reason)
719 {
720         if(reason == STT_ERROR_OUT_OF_NETWORK)
721         {
722                 PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR");
723
724                 int ancs_connected = 0;
725                 int ret = 0;
726                 ret = vconf_get_int("file/private/weconn/ancs_connected", &ancs_connected);
727
728                 if (ret == 0)
729                         PRINTFUNC(DLOG_ERROR, "ancs connected status : %d", ancs_connected);
730                 else
731                         PRINTFUNC(DLOG_ERROR, "vconf for ancs connection ERROR - %d", ret);
732
733                 if (ancs_connected) {
734                         char text[512];
735                         snprintf(text, sizeof(text), _(SK_NETWORK_ERROR_FOR_IOS), _(SK_SAMSUNG_GEAR));
736
737                         show_popup_toast((const char*)text, false);
738                 } else {
739                         set_guide_text(vd, _(SK_NETWORK_ERROR));
740                 }
741
742                 vd->state = STT_STATE_VAL_INIT;
743
744         } else if (reason == STT_ERROR_RECORDER_BUSY) {
745                 PRINTFUNC(DLOG_WARN, "STT is used by another application");
746                 show_popup_toast(_(SK_STT_BUSY), false);
747                 vd->state = STT_STATE_VAL_INIT;
748         } else {
749                 PRINTFUNC(DLOG_WARN, "Check error code");
750                 show_popup_toast(_(SK_STT_BUSY), false);
751                 vd->state = STT_STATE_VAL_INIT;
752         }
753 }
754
755 static Eina_Bool _start_timer_cb(void* data)
756 {
757         if(data) {
758                 VoiceData *voicedata = (VoiceData *) data;
759
760                 try {
761                         voicedata->state = STT_STATE_VAL_PREPARE_LISTENING;
762                         voicedata->sttmanager->Start();
763                 }
764                 catch (is::stt::SttException &e) {
765                         PRINTFUNC(DLOG_ERROR, "%s", e.what());
766
767                         if (e.GetEcode() == STT_ERROR_OUT_OF_NETWORK)
768                         {
769                                 PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR");
770                                 set_guide_text(voicedata, _(SK_NETWORK_ERROR));
771                                 voicedata->state = STT_STATE_VAL_INIT;
772                         } else if (e.GetEcode() == STT_ERROR_RECORDER_BUSY) {
773                                 PRINTFUNC(DLOG_WARN, "STT is used by another application");
774                                 show_popup_toast(_(SK_STT_BUSY), false);
775                                 voicedata->state = STT_STATE_VAL_INIT;
776                         } else {
777                                 PRINTFUNC(DLOG_WARN, "Check error code");
778                                 show_popup_toast(_(SK_STT_BUSY), false);
779                                 voicedata->state = STT_STATE_VAL_INIT;
780                         }
781                 }
782                 voicedata->start_timer = NULL;
783         }
784         return ECORE_CALLBACK_CANCEL;
785 }
786
787 /**
788  * @brief - cancel button press callback for cross button
789  * @param -
790  */
791
792 void on_initial_anim_press_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
793 {
794         PRINTFUNC(NO_PRINT, "");
795
796         VoiceData *vd = (VoiceData *)data;
797
798         int tempVal = vd->sttmanager->GetCurrent();
799         if(tempVal == STT_STATE_CREATED) {
800                 PRINTFUNC(DLOG_WARN, "IGNORE TOUCH event before STT READY. STT is preparing", vd->state);
801                 return;
802         }
803
804         PRINTFUNC(DLOG_DEBUG, "SttManager State : %d", vd->sttmanager->GetCurrent());
805         PRINTFUNC(DLOG_DEBUG, "Ui Voice State : %d", vd->state);
806
807         switch(vd->state) {
808                 case STT_STATE_VAL_INIT:
809
810                         PRINTFUNC(DLOG_DEBUG, "%s", "STT_STATE_VAL_INIT");
811                         get_stt_default_language(vd);
812                         vd->sttmanager->SetLanguage(std::string(vd->kbd_lang));
813
814                         stt_feedback(VIBRATION_START);
815
816                         if(vd->start_timer) {
817                                 ecore_timer_del(vd->start_timer);
818                                 vd->start_timer = NULL;
819                         }
820
821                         vd->start_timer = ecore_timer_add(0.0, _start_timer_cb, vd);
822                         break;
823
824                 case STT_STATE_VAL_LISTENING :
825                         PRINTFUNC(DLOG_DEBUG, "%s", "STT_STATE_VAL_LISTENING");
826                         try {
827                                 vd->state = STT_STATE_VAL_PREPARE_PROCESSING;
828                                 vd->sttmanager->Stop();
829
830                                 /**
831                                  * Cuased touch reponse time, it can be called to stop animator.
832                                  *
833                                  */
834                                 set_guide_text(vd, "");
835
836                                 if(vd->effector)
837                                         vd->effector->Stop();
838                         }
839                         catch (is::stt::SttException &e) {
840                                 PRINTFUNC(DLOG_ERROR, "%s", e.what());
841
842                                 if(e.GetEcode() != STT_ERROR_INVALID_STATE) {
843                                         PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR");
844                                         set_guide_text(vd, _(SK_RECOGNITION_FAILED));
845                                         vd->state = STT_STATE_VAL_INIT;
846
847                                         if(vd->effector)
848                                                 vd->effector->Stop(true);
849                                 }
850                         }
851                         break;
852
853                 case STT_STATE_VAL_PROCESSING:
854                         PRINTFUNC(DLOG_DEBUG, "%s", "STT_STATE_VAL_PROCESSING");
855                         try {
856                                 //vd->state = STT_STATE_VAL_PREPARE_CANCEL;
857                                 vd->sttmanager->Cancel();
858                         }
859                         catch (is::stt::SttException &e) {
860                                 PRINTFUNC(DLOG_ERROR, "%s", e.what());
861                         }
862
863                         break;
864
865                 case STT_STATE_VAL_NOT_RECOGNISED:
866                         PRINTFUNC(DLOG_DEBUG, "%s", "STT_STATE_VAL_NOT_RECOGNISED");
867                         vd->state = STT_STATE_VAL_INIT ;
868                         break;
869                 default:
870                         PRINTFUNC(DLOG_DEBUG, "default [%d]", vd->state);
871                         break;
872         }
873 }
874
875 static inline void ea_naviframe_back(void *data, Evas_Object *obj, void *event_info)
876 {
877         if(!data) return;
878
879         evas_object_del((Evas_Object *) data);
880
881         g_setting_window = NULL;
882         g_setting_naviframe = NULL;
883
884         if(g_evt_key_down)
885                 ecore_event_handler_del(g_evt_key_down);
886
887         g_evt_key_down = NULL;
888
889         //Hide more option
890         if(g_more_option_layout){
891                 if(eext_more_option_opened_get(g_more_option_layout) == EINA_TRUE) {
892                         eext_more_option_opened_set(g_more_option_layout, EINA_FALSE);
893                 }
894         }
895 }
896
897 static char *__get_genlist_title_label(void *data, Evas_Object *obj, const char *part)
898 {
899         return strdup(_("WDS_VOICE_OPT_LANGUAGE_ABB"));
900 }
901
902 char *__get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
903 {
904         char text[128] = {0, };
905
906         if(!strcmp(part, "elm.text"))
907         {
908                 if((int)data == 0) {
909                         return strdup(_("IDS_VC_BODY_AUTOMATIC"));
910                 } else {
911                         char *s = NULL;
912                         s = (char *)disp_lang_array[(int)data];
913
914                         if(s) {
915                                 char *p = strchr(s, '(');
916                                 if(p) {
917                                         strncpy(text, s, p-s);
918                                 } else {
919                                         strncpy(text, s, strlen(s));
920                                 }
921                         } else {
922                                 strncpy(text, "", strlen(""));
923                         }
924                 }
925                 return strdup(text);
926         } else if (!strcmp(part, "elm.text.1")) {
927                 if ((int)data == 0) {
928                         char* value = NULL;
929                         value = vconf_get_str(VCONFKEY_LANGSET);
930                         if (NULL == value) {
931                                 PRINTFUNC(DLOG_ERROR, "Fail to get display language");
932                                 return NULL;
933                         }
934                         PRINTFUNC(DLOG_DEBUG, "system language (%s)", value);
935
936                         char system_lang[6] = {0, };
937                         strncpy(system_lang, value , 5);
938                         free(value);
939
940                         // confirm whether the system language is supported by stt engine or not.
941                         // if supported, set the language
942                         // otherwise, set language to en_US
943                         return strdup(get_lang_label(system_lang));
944
945                 } else {
946                         char *s = NULL;
947                         s = (char *)disp_lang_array[(int)data];
948
949                         if(s) {
950                                 char *p = strchr(s, '(');
951                                 if(p) {
952                                         strncpy(text, p+1, strlen(s)-(p-s)-2);
953                                 } else {
954                                         strncpy(text, s, strlen(s));
955                                 }
956                         } else {
957                                 strncpy(text, "", strlen(""));
958                         }
959                         return strdup(text);
960                 }
961         }
962         return NULL;
963 }
964
965 static Evas_Object *__get_genlist_item_content(void *data, Evas_Object *obj, const char *part)
966 {
967         int index = (int)data;
968         Evas_Object * content = NULL;
969
970         if (!strcmp(part, "elm.icon")) {
971                 content = elm_radio_add(obj);
972                 elm_radio_state_value_set(content, index);
973                 elm_radio_group_add(content, radio_gp);
974                 evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
975                 evas_object_propagate_events_set(content, EINA_TRUE);
976                 evas_object_size_hint_align_set(content, EVAS_HINT_FILL, EVAS_HINT_FILL);
977                 elm_object_style_set(content, "list");
978         }
979         return content;
980 }
981
982 static int get_language_value()
983 {
984 #if 1
985         int lang = 0, ret = 0;
986
987         ret = preference_get_int(PREFERENCE_ISE_STT_LANGUAGE, &lang);
988         if(PREFERENCE_ERROR_NONE != ret){
989                 PRINTFUNC(DLOG_ERROR, "preference_get_int error!(%d)", ret);
990                 preference_set_int(PREFERENCE_ISE_STT_LANGUAGE, (int)2); //auto
991                 lang = 2;
992         }
993 #else
994         int lang = 0, ret = 0;
995
996         ret = vconf_get_int(VCONFKEY_ISE_STT_LANGUAGE, &lang);
997         if (ret !=0) {
998                 PRINTFUNC(DLOG_ERROR, "Vconf_get_int error!(%d)", ret);
999         }
1000 #endif
1001         if(g_is_n66) {
1002                 if(lang < 0 || lang > 6) {
1003                         PRINTFUNC(DLOG_WARN, "vconf lang orig(%d) to be 0", lang);
1004                         lang = 0;
1005                 }
1006                 PRINTFUNC(DLOG_DEBUG, "n66 current language value for stt (%s).", disp_lang_array[lang]);
1007         }
1008
1009         return lang;
1010 }
1011
1012 static void set_language_value(int type)
1013 {
1014         // Add implementation to store language type.
1015         int ret = 0;
1016
1017 #if 1
1018         ret = preference_set_int(PREFERENCE_ISE_STT_LANGUAGE, (int)type);
1019         if(PREFERENCE_ERROR_NONE != ret){
1020                 PRINTFUNC(DLOG_ERROR, "preference_set_int error!(%d)", ret);
1021         }
1022
1023 #else
1024         ret = vconf_set_int(VCONFKEY_ISE_STT_LANGUAGE, (int) type);
1025         if (ret != 0) {
1026                 PRINTFUNC(DLOG_ERROR, "Vconf_set_int error!(%d)", ret);
1027                 return;
1028         }
1029 #endif
1030         PRINTFUNC(DLOG_DEBUG, "language type (%d)", type);
1031
1032         // Update string
1033 }
1034
1035 static void get_stt_default_language(VoiceData *my_voicedata)
1036 {
1037         if(!my_voicedata) {
1038                 PRINTFUNC(DLOG_ERROR, "my_voicedata NULL");
1039                 return;
1040         }
1041
1042         if(my_voicedata->kbd_lang) {
1043                 free(my_voicedata->kbd_lang);
1044                 my_voicedata->kbd_lang = NULL;
1045         }
1046
1047
1048         if(g_is_n66) {
1049                 STT_VOICE_LANGUAGE_N66_I stt_lang;
1050                 stt_lang = (STT_VOICE_LANGUAGE_N66_I)get_language_value();
1051
1052                 PRINTFUNC(DLOG_DEBUG, "language type (%d)", stt_lang);
1053
1054                 switch(stt_lang) {
1055                 case STT_VOICE_N66_AUTO :
1056                 {
1057                         stt_get_default_language(my_voicedata->voicefw_handle, &my_voicedata->kbd_lang);
1058
1059                         // get system display language
1060                         char* value = NULL;
1061                         value = vconf_get_str(VCONFKEY_LANGSET);
1062                         if (NULL == value) {
1063                                 PRINTFUNC(DLOG_ERROR, "Fail to get display language");
1064                                 return;
1065                         }
1066                         PRINTFUNC(DLOG_DEBUG, "system language (%s)", value);
1067
1068                         char system_lang[6] = {0, };
1069                         strncpy(system_lang, value , 5);
1070                         free(value);
1071
1072                         // confirm whether the system language is supported by stt engine or not.
1073                         // if supported, set the language
1074                         // otherwise, set language to en_US
1075                         if(is_lang_supported_by_stt(system_lang) == TRUE) {
1076                                 my_voicedata->kbd_lang = strdup(system_lang);
1077                                 PRINTFUNC(DLOG_DEBUG, "Set auto language (%s)", system_lang);
1078                         } else {
1079                                 my_voicedata->kbd_lang = strdup("en_US");
1080                                 PRINTFUNC(DLOG_DEBUG, "System language is not supported by STT (%s), en_US will be set", system_lang);
1081                         }
1082                 }
1083                 break;
1084                 case STT_VOICE_N66_EN_US :
1085                 case STT_VOICE_N66_ES_US :
1086                 case STT_VOICE_N66_FR_FR :
1087                 case STT_VOICE_N66_JA_JP :
1088                 case STT_VOICE_N66_KO_KR :
1089                 case STT_VOICE_N66_ZH_CN :
1090                 {
1091                         my_voicedata->kbd_lang = strdup(supported_language[stt_lang]);
1092                 }
1093                 break;
1094                 default :
1095                         my_voicedata->kbd_lang = strdup("en_US");
1096                         break;
1097                 }
1098         }
1099
1100         PRINTFUNC(DLOG_DEBUG, "stt language (%s)", my_voicedata->kbd_lang);
1101 }
1102
1103 static Eina_Bool close_setting_window_idler_cb(void *data)
1104 {
1105         if(g_setting_window && g_setting_naviframe) {
1106                 ea_naviframe_back(g_setting_window, g_setting_naviframe, NULL);
1107         }
1108
1109         return ECORE_CALLBACK_CANCEL;
1110 }
1111
1112 static void language_set_genlist_radio_cb(void *data, Evas_Object *obj, void *event_info)
1113 {
1114         PRINTFUNC(DLOG_DEBUG, "");
1115         if(!data) return;
1116
1117         int index = 0;
1118         Evas_Object *genlist = (Evas_Object *) data;
1119
1120         Elm_Object_Item * item = (Elm_Object_Item *) event_info;
1121         if (item) {
1122                 elm_genlist_item_selected_set(item, 0);
1123                 index = (int)elm_object_item_data_get(item);
1124                 elm_genlist_item_update(item);
1125         }
1126         set_language_value(index);
1127
1128         elm_radio_value_set(radio_gp, index);
1129         ecore_timer_add(0.3, close_setting_window_idler_cb, NULL);
1130 }
1131
1132 static void language_changed_cb2(void *data, Evas_Object *obj, const char *emission, const char *source)
1133 {
1134         if(!obj) return;
1135         elm_genlist_realized_items_update(obj);
1136 }
1137
1138 Eina_Bool _ise_keydown_cb(void *data, int type, void *event)
1139 {
1140         PRINTFUNC(DLOG_DEBUG, "");
1141         if(type == ECORE_EVENT_KEY_DOWN && g_setting_window && g_setting_naviframe) {
1142                 PRINTFUNC(DLOG_DEBUG, "window will be deleted.");
1143                 ea_naviframe_back(g_setting_window, g_setting_naviframe, NULL);
1144         }
1145
1146         return ECORE_CALLBACK_DONE;
1147 }
1148
1149
1150 static void _language_list_item_realized(void *data, Evas_Object *obj, void *event_info) //called when list scrolled
1151 {
1152         PRINTFUNC(DLOG_DEBUG, "%s", __func__);
1153 }
1154
1155 static Evas_Object *create_language_list(Evas_Object *parent)
1156 {
1157         if(!parent) return NULL;
1158
1159         Evas_Object *genlist = elm_genlist_add(parent);
1160         if (!genlist) return NULL;
1161
1162         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
1163         elm_genlist_homogeneous_set(genlist, EINA_TRUE);
1164 //      uxt_genlist_set_bottom_margin_enabled(genlist, EINA_TRUE);
1165
1166         Evas_Object *circle_language_genlist = eext_circle_object_genlist_add(genlist, NULL);
1167         eext_circle_object_genlist_scroller_policy_set(circle_language_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
1168         evas_object_resize(circle_language_genlist, 360, 360);
1169         evas_object_show(circle_language_genlist);
1170         eext_rotary_object_event_activated_set(circle_language_genlist, EINA_TRUE);
1171
1172         int i = 0;
1173         int lang_val = 0;
1174         Elm_Object_Item * item = NULL;
1175         Elm_Object_Item * item_title = NULL;
1176
1177         evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1178         evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
1179
1180         radio_gp = elm_radio_add(genlist);
1181         elm_radio_state_value_set(radio_gp, -1);
1182
1183         lang_val = get_language_value();
1184
1185         //Title
1186         itc_title.item_style = "title";
1187         itc_title.func.text_get = __get_genlist_title_label;
1188         itc_title.func.content_get = NULL;
1189
1190         item_title = elm_genlist_item_append(genlist, &itc_title, (void *)-1, NULL, ELM_GENLIST_ITEM_GROUP, NULL, genlist);
1191
1192         // 2 line text
1193         itc_2text.item_style = "2text.1icon.1/sub1.multiline";
1194         itc_2text.func.text_get = __get_genlist_item_label;
1195         itc_2text.func.content_get = __get_genlist_item_content;
1196
1197
1198         item = item_append(genlist, itc_2text, (void *)0, language_set_genlist_radio_cb, genlist); // AUTO
1199
1200         if(lang_val == i) {
1201                 PRINTFUNC(DLOG_DEBUG, "%d item is choiced.", i);
1202                 elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
1203         }
1204
1205         if ( item == NULL ) {
1206                 PRINTFUNC(DLOG_DEBUG, "elm_genlist_item_append was failed");
1207         }
1208
1209         // 1 line text
1210         itc_1text.item_style = "1text.1icon.1";
1211         itc_1text.func.text_get = __get_genlist_item_label;
1212         itc_1text.func.content_get = __get_genlist_item_content;
1213
1214         if(g_is_n66) {
1215                 for (i = 1; i < 7; i++)
1216                 {
1217                         char *s = (char *)disp_lang_array[i];
1218
1219                         if(strchr(s, '(')){
1220                                 item = item_append(genlist, itc_2text, i, language_set_genlist_radio_cb, genlist);
1221                         } else {
1222                                 item = item_append(genlist, itc_1text, i, language_set_genlist_radio_cb, genlist);
1223                         }
1224
1225                         if(lang_val == i) {
1226                                 PRINTFUNC(DLOG_DEBUG, "%d item is choiced.", i);
1227                                 elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
1228                         }
1229
1230                         if ( item == NULL ) {
1231                                 PRINTFUNC(DLOG_DEBUG, "elm_genlist_item_append was failed");
1232                                 break;
1233                         }
1234                 }
1235         }
1236
1237         elm_radio_value_set(radio_gp, lang_val);
1238
1239         elm_object_signal_callback_add(genlist, "elm,system,language,change", "elm", language_changed_cb2, NULL);
1240 //      eext_rotary_event_callback_set(genlist, _language_list_rotary_cb, NULL);
1241         evas_object_smart_callback_add(genlist, "realized", _language_list_item_realized, NULL);
1242
1243
1244         g_evt_key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _ise_keydown_cb, NULL);
1245         return genlist;
1246 }
1247
1248 void create_setting_window(Evas_Object *more_option_layout)
1249 {
1250         Evas_Coord w, h;
1251
1252         Evas_Object *window = NULL;
1253         Evas_Object *layout = NULL;
1254         Evas_Object *genlist = NULL;
1255         Evas_Object *naviframe = NULL;
1256
1257         Elm_Object_Item *item = NULL;
1258
1259         const char *str = "mobile";
1260
1261         /**
1262          * Create full size window
1263          *
1264          */
1265         window = elm_win_add(NULL, "voice-input-setting", ELM_WIN_BASIC);
1266         if(!window) {
1267                 PRINTFUNC(DLOG_DEBUG, "it's fail to create window.");
1268                 return;
1269         }
1270
1271         elm_win_title_set(window, "voice-input-setting");
1272 //      ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
1273         elm_win_borderless_set(window, EINA_TRUE);
1274         evas_object_resize(window, w, h);
1275
1276         elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_HIDE);
1277         elm_win_profiles_set(window, &str, 1);
1278
1279         /**
1280          * Set window theme
1281          *
1282          */
1283 //      ea_theme_style_set(EA_THEME_STYLE_DEFAULT);
1284 //      ea_theme_changeable_ui_enabled_set(EINA_TRUE);
1285
1286         /**
1287          * Create layout for language list
1288          *
1289          */
1290         layout = elm_layout_add(window);
1291         if (layout) {
1292                 elm_layout_theme_set(layout, "layout", "application", "default");
1293                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1294                 evas_object_show(layout);
1295                 elm_win_resize_object_add(window, layout);
1296         }
1297
1298         /**
1299          * Set Window rotation
1300          *
1301          */
1302         if (elm_win_wm_rotation_supported_get(window)) {
1303                 const int rots[4] = { 0, 90, 180, 270 };
1304                 elm_win_wm_rotation_available_rotations_set(window, rots, 4);
1305         }
1306
1307         /**
1308          * Activate and show window
1309          *
1310          */
1311         elm_win_activate(window);
1312         evas_object_show(window);
1313
1314         /**
1315          * Naviframe
1316          *
1317          */
1318         naviframe = elm_naviframe_add(layout);
1319         if (naviframe == NULL){
1320                 PRINTFUNC(DLOG_DEBUG, "create navi_frame failed");
1321         }
1322
1323 //      ea_object_event_callback_add(naviframe, EA_CALLBACK_BACK, ea_naviframe_back, window);
1324         elm_object_part_content_set(layout, "elm.swallow.content", naviframe);
1325
1326         /**
1327          * Push language list
1328          *
1329          */
1330         genlist = create_language_list(naviframe);
1331
1332         //item = elm_naviframe_item_push(naviframe, "IDS_VC_HEADER_VOICE_INPUT_LANGUAGE", NULL, NULL, genlist, NULL);
1333         item = elm_naviframe_item_push(naviframe, NULL, NULL, NULL, genlist, "empty");
1334         //elm_object_item_domain_text_translatable_set(item, PACKAGE, EINA_TRUE);
1335
1336         g_setting_window = window;
1337         g_setting_naviframe = naviframe;
1338         g_more_option_layout = more_option_layout;
1339 }
1340
1341 static void language_changed_cb(void *data, Evas_Object * obj, void *event_info)
1342 {
1343         PRINTFUNC(DLOG_DEBUG, "");
1344
1345         if(!obj) return;
1346         if(!data) return;
1347 }
1348
1349
1350 void _stt_lang_changed_cb(keynode_t *key, void* data)
1351 {
1352         PRINTFUNC(DLOG_DEBUG, "");
1353         if(!data) return;
1354
1355         VoiceData *vd = (VoiceData *) data;
1356         get_stt_default_language(vd);
1357         vd->sttmanager->SetLanguage(std::string(vd->kbd_lang));
1358         vd->mo->Update();
1359
1360         return;
1361 }
1362
1363 static void __done_key_cb(void *data, Evas_Object *obj, void *event_info )
1364 {
1365         PRINTFUNC(DLOG_DEBUG, "");
1366
1367         if(!obj) return;
1368         if(!data) return;
1369
1370         VoiceData *voicedata = (VoiceData *)data;
1371
1372         elm_naviframe_item_pop(voicedata->naviframe);
1373 }
1374
1375 static void __stt_detailed_entry_input_panel_event_cb(void *data, Ecore_IMF_Context *imf_context,  int value)
1376 {
1377         if(!data) return;
1378
1379         VoiceData *voicedata = (VoiceData *)data;
1380
1381         switch (value) {
1382         case ECORE_IMF_INPUT_PANEL_STATE_HIDE: // 1
1383                 elm_naviframe_item_pop(voicedata->naviframe);
1384                 break;
1385         case ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW: // 2
1386                 PRINTFUNC(DLOG_DEBUG, "keypad state will show.");
1387                 break;
1388         case ECORE_IMF_INPUT_PANEL_STATE_SHOW: // 0
1389                 PRINTFUNC(DLOG_DEBUG, "keypad state show.");
1390                 break;
1391         }
1392 }
1393
1394 static void __stt_detailed_entry_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1395 {
1396         if (obj) {
1397                 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(obj);
1398                 ecore_imf_context_input_panel_event_callback_del(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, __stt_detailed_entry_input_panel_event_cb);
1399                 PRINTFUNC(DLOG_DEBUG, "input_panel_event_cb is deleted.");
1400         }
1401 }
1402
1403 static Evas_Object *create_text_detiled_view(Evas_Object *parent)
1404 {
1405         string edj_path = get_resource_path();
1406         edj_path = edj_path + STT_EDJ_FILE;
1407
1408         //layout
1409         Evas_Object *layout = elm_layout_add(parent);
1410         elm_layout_file_set(layout, edj_path.c_str(), "entry_focused_layout");
1411         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1412         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1413         evas_object_show(layout);
1414
1415         //entry
1416         Evas_Object *entry = elm_entry_add(parent);
1417         evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1418         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
1419 //      ea_entry_selection_back_event_allow_set(entry, EINA_TRUE);
1420         elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
1421         elm_entry_select_allow_set(entry, EINA_FALSE);
1422 //      elm_entry_cursor_handler_disabled_set(entry, EINA_TRUE);
1423         elm_entry_single_line_set(entry, EINA_TRUE);
1424         elm_entry_scrollable_set(entry, EINA_TRUE);
1425         elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
1426
1427         evas_object_show(entry);
1428
1429         elm_object_part_content_set(layout, "contents", entry);
1430         return layout;
1431 }
1432
1433 static Eina_Bool _idler_cb2(void *data)
1434 {
1435         VoiceData *voicedata = (VoiceData *)data;
1436
1437 //      uxt_scroller_set_auto_scroll_enabled(voicedata->scroller, EINA_FALSE);
1438
1439         return ECORE_CALLBACK_CANCEL;
1440 }
1441
1442 static Eina_Bool __stt_entry_detailed_view_pop_cb(void *data, Elm_Object_Item *it)
1443 {
1444         PRINTFUNC(DLOG_DEBUG, "");
1445
1446         if(!data) return EINA_FALSE;
1447
1448         VoiceData *voicedata = (VoiceData *)data;
1449
1450         Evas_Object *main_entry = (Evas_Object *)voicedata->main_entry;
1451         Evas_Object *detailed_layout = elm_object_item_part_content_get(it, "elm.swallow.content");
1452         Evas_Object *detailed_entry = elm_object_part_content_get(detailed_layout, "contents");
1453
1454         const char *str = NULL;
1455
1456         int pos = 0;
1457         pos = elm_entry_cursor_pos_get(detailed_entry);
1458         PRINTFUNC(DLOG_DEBUG, "pos = %d", pos);
1459
1460         str =  elm_entry_entry_get(detailed_entry);
1461
1462         voicedata->stt_results.clear();
1463         voicedata->stt_results.push_back(str);
1464
1465 //      uxt_scroller_set_auto_scroll_enabled(voicedata->scroller, EINA_TRUE);
1466         elm_entry_entry_set(main_entry, str);
1467         elm_entry_cursor_pos_set(main_entry, pos);
1468
1469         int x, y, w, h;
1470         elm_entry_cursor_geometry_get(main_entry, &x, &y, &w, &h);
1471         PRINTFUNC(DLOG_DEBUG, "%d %d %d %d", x, y, w, h);
1472
1473         elm_scroller_region_bring_in(voicedata->scroller, 0, y+h, 300, 168);
1474
1475         ecore_idler_add(_idler_cb2, voicedata);
1476
1477         return EINA_TRUE;
1478 }
1479
1480 static void _stt_entry_clicked_cb(void *data, Evas_Object * obj, void *event_info)
1481 {
1482         PRINTFUNC(DLOG_DEBUG, "");
1483
1484         if(!obj) return;
1485         if(!data) return;
1486
1487         VoiceData *voicedata = (VoiceData *)data;
1488
1489         char *str = NULL;
1490
1491         int pos = 0;
1492         pos = elm_entry_cursor_pos_get(obj);
1493         PRINTFUNC(DLOG_DEBUG, "pos = %d", pos);
1494
1495         str =  elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
1496
1497         if (str && strlen(str) > 0) {
1498                 try {
1499                         if (voicedata->sttmanager->GetCurrent() == STT_STATE_RECORDING ||
1500                                 voicedata->sttmanager->GetCurrent() == STT_STATE_PROCESSING) {
1501                                 voicedata->sttmanager->Cancel();
1502                                 PRINTFUNC(DLOG_DEBUG, "stt entry clicked callback during STT recording and processing");
1503                                 //return;
1504                         }
1505                 }
1506                 catch(is::stt::SttException &e) {
1507                         PRINTFUNC(DLOG_ERROR, "%s", e.what());
1508                 }
1509
1510
1511                 Evas_Object *ly_detailed_view = create_text_detiled_view(voicedata->naviframe);
1512                 // Set text
1513                 Evas_Object *detailed_entry = elm_object_part_content_get(ly_detailed_view, "contents");
1514                 elm_entry_entry_set(detailed_entry, str);
1515                 elm_entry_cursor_pos_set(detailed_entry, pos);
1516                 evas_object_smart_callback_add(detailed_entry, "activated", __done_key_cb, voicedata); // Register callback for Done key
1517
1518                 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(detailed_entry);
1519                 ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, __stt_detailed_entry_input_panel_event_cb, voicedata);
1520                 evas_object_event_callback_add(detailed_entry, EVAS_CALLBACK_DEL, __stt_detailed_entry_del_cb, NULL);
1521
1522                 // Navi Push
1523                 Elm_Object_Item *navi_it = elm_naviframe_item_push(voicedata->naviframe, NULL, NULL, NULL, ly_detailed_view, NULL);
1524                 elm_naviframe_item_pop_cb_set(navi_it, __stt_entry_detailed_view_pop_cb, (void *)voicedata);
1525                 elm_naviframe_item_title_enabled_set(navi_it, EINA_FALSE, EINA_FALSE);
1526                 free(str);
1527         }
1528
1529         return;
1530 }
1531
1532
1533 void activate_circle_scroller_for_stt_textbox(void* data, Eina_Bool bActivate)
1534 {
1535         PRINTFUNC(DLOG_DEBUG, "");
1536
1537         if(!data) return;
1538         VoiceData *voicedata = (VoiceData *)data;
1539
1540         Evas_Object *scroller = NULL;
1541         Evas_Object *circle_scroller = NULL;
1542
1543         scroller = elm_layout_content_get((Evas_Object *)voicedata->layout_main, "text_area");
1544         circle_scroller = (Evas_Object *) evas_object_data_get(scroller, "circle");
1545         eext_rotary_object_event_activated_set(circle_scroller, bActivate);
1546 }
1547
1548 static Evas_Object *create_textblock(void* data)
1549 {
1550         if(!data) return NULL;
1551
1552         VoiceData *voicedata = (VoiceData *)data;
1553
1554         Evas_Object *scroller = NULL;
1555         Evas_Object *box = NULL;
1556         Evas_Object *inner_layout = NULL;
1557         Evas_Object *entry = NULL;
1558         Evas_Object *tb = NULL;
1559         Evas_Object *circle_scroller = NULL;
1560
1561         string edj_path = get_resource_path();
1562         edj_path = edj_path + STT_EDJ_FILE;
1563
1564         scroller = elm_scroller_add(voicedata->layout_main);
1565
1566         elm_scroller_loop_set(scroller, EINA_FALSE, EINA_FALSE);
1567
1568         evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
1569         evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1570
1571         elm_scroller_page_size_set(scroller, 0, 50);
1572         elm_scroller_page_scroll_limit_set(scroller, 0, 1);
1573
1574         elm_object_scroll_lock_x_set(scroller, EINA_TRUE);
1575
1576 //      uxt_scroller_set_auto_scroll_enabled(scroller, EINA_FALSE);
1577
1578         circle_scroller = eext_circle_object_scroller_add(scroller, app_data->circle_surface);
1579         eext_circle_object_scroller_policy_set(circle_scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
1580         eext_rotary_object_event_activated_set(circle_scroller, EINA_TRUE);
1581
1582         box = elm_box_add(scroller);
1583
1584         inner_layout = elm_layout_add(scroller);
1585         elm_layout_file_set(inner_layout, edj_path.c_str(), "layout_textblock");
1586         evas_object_size_hint_weight_set(inner_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1587
1588         elm_object_signal_callback_add(inner_layout, "do_scroll", "entry",
1589                 [](void *data, Evas_Object *obj, const char* signal, const char* e)
1590                 {
1591                         _bring_in_cb((void *) data);
1592                 }, (void *) scroller);
1593
1594         entry = elm_entry_add(inner_layout);
1595         voicedata->main_entry = entry;
1596         elm_entry_editable_set(entry, EINA_FALSE);
1597
1598 #define FORMAT_TEXT_AREA_FONT_STYLE \
1599         "DEFAULT='font=Tizen:style=Regular font_size=32 color=#%02x%02x%02x%02x text_class=tizen wrap=mixed align=center' newline='br' b='+ font=Tizen:style=Bold'link='+ underline=on underline_color=#%02x%02x%02x%02x'"
1600         int a, r, g, b;
1601         char customStyle[512];
1602 //      ea_theme_color_get("AT02112", &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
1603         snprintf(customStyle, 512, FORMAT_TEXT_AREA_FONT_STYLE, r, g, b, a, r, g, b, a);
1604
1605         elm_entry_text_style_user_push(entry, customStyle);
1606
1607         evas_object_smart_callback_add(entry, "clicked", _stt_entry_clicked_cb, voicedata);
1608
1609         elm_object_part_content_set(inner_layout, "elm.swallow.content", entry);
1610
1611         elm_box_pack_end(box, inner_layout);
1612
1613         elm_object_content_set(scroller, box);
1614         evas_object_data_set(scroller, "inner_layout", (void *) inner_layout);
1615         evas_object_data_set(scroller, "circle", (void *) circle_scroller);
1616         evas_object_show(scroller);
1617         evas_object_show(inner_layout);
1618
1619         return scroller;
1620 }
1621
1622 static Evas_Object *create_progressbar(Evas_Object *parent)
1623 {
1624         Evas_Object *progressbar = NULL;
1625
1626         progressbar = elm_progressbar_add(parent);
1627         elm_object_style_set(progressbar, "voice_input/process/small");
1628         elm_progressbar_pulse(progressbar, EINA_TRUE);
1629
1630         evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
1631         evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1632
1633 //      ea_theme_object_color_replace(progressbar, "B065L6", "AO012");
1634
1635         evas_object_show(progressbar);
1636
1637         return progressbar;
1638 }
1639
1640 static Evas_Object *create_fullview(Evas_Object *parent, VoiceData *r_voicedata)
1641 {
1642         PRINTFUNC(NO_PRINT, "");
1643
1644         Evas_Object *more_option_layout = NULL;
1645         Evas_Object *layout_main = NULL;
1646         Evas_Object *lang_btn_box = NULL;
1647         Evas_Object *lang_btn = NULL;
1648         Evas_Object *to = NULL;
1649         Evas_Object *ao = NULL;
1650
1651         char *lang_type_str = NULL;
1652
1653         int lang_val = 0;
1654         int is_screen_reader_on = FALSE;
1655
1656         VoiceData *voicedata = r_voicedata;
1657
1658         /**
1659          * add app_default_layout
1660          *
1661          */
1662         MoreOption* mo = new MoreOption(parent, voicedata);
1663         mo->Create();
1664
1665         voicedata->mo = mo;
1666
1667
1668         layout_main = elm_layout_add(mo->getMoreOptionLayout());
1669
1670         if (!layout_main)
1671                 return NULL;
1672
1673         voicedata->layout_main = layout_main;
1674
1675         string edj_path = get_resource_path();
1676         edj_path = edj_path + STT_EDJ_FILE;
1677
1678         if (vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &is_screen_reader_on) == -1) {
1679                 PRINTFUNC(DLOG_ERROR, "Cannot read value of screen reader from vconf");
1680         }
1681
1682         evas_object_size_hint_weight_set(layout_main, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1683         evas_object_size_hint_align_set(layout_main, EVAS_HINT_FILL, EVAS_HINT_FILL);
1684
1685         elm_layout_file_set(layout_main, edj_path.c_str(), "mic_control");
1686
1687         elm_object_content_set(parent, layout_main);
1688
1689         //Canvas for Cairo effect
1690         Evas_Object *canvas = evas_object_image_filled_add(evas_object_evas_get(layout_main));
1691         evas_object_image_alpha_set(canvas, EINA_TRUE);
1692         evas_object_size_hint_align_set(canvas, EVAS_HINT_FILL, EVAS_HINT_FILL);
1693         evas_object_size_hint_weight_set(canvas, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1694         evas_object_move(canvas, 0, 0);
1695
1696         Evas_Coord CanvasW, CanvasH;
1697         CanvasW = 360;
1698         CanvasH = 74;
1699         evas_object_image_size_set(canvas, CanvasW, CanvasH);
1700         evas_object_resize(canvas, CanvasW, CanvasH);
1701         evas_object_size_hint_min_set(canvas, CanvasW, CanvasH);
1702         evas_object_show(canvas);
1703
1704         elm_object_part_content_set(layout_main, "EFFECT_BG", canvas);
1705
1706
1707         // MIC Button
1708         Evas_Object *m_mic_button = elm_button_add(layout_main);
1709         elm_object_style_set(m_mic_button, "vic/micbutton");
1710         elm_object_part_content_set(layout_main, "MIC", m_mic_button);
1711
1712         elm_object_disabled_set(m_mic_button, EINA_TRUE);
1713         evas_object_smart_callback_add(m_mic_button, "clicked", on_mic_button_press_cb, (void *) voicedata);
1714
1715         voicedata->mic_button = m_mic_button;
1716
1717         if(voicedata->btn_disabling_timer == NULL){
1718                 voicedata->btn_disabling_timer = ecore_timer_add(2.0, _mic_button_enable_cb, voicedata);
1719         }
1720
1721 //      ecore_idler_add(_idler_cb, voicedata);
1722         ecore_timer_add(0.6, _idler_cb, voicedata);
1723
1724         // Confirm panel layout
1725         Evas_Object *panel_layout;
1726         panel_layout = elm_layout_add(layout_main);
1727         elm_layout_theme_set(panel_layout, "layout", "drawer", "panel");
1728         evas_object_show(panel_layout);
1729
1730         // Confirm panel
1731         Evas_Object *panel;
1732         panel = elm_panel_add(panel_layout);
1733         elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT);
1734         elm_layout_theme_set(panel, "panel", "left_confirm", "default");
1735         elm_layout_theme_set(panel, "panel", "left_sending", "default");
1736
1737         elm_layout_signal_callback_add(panel, "cue,clicked", "elm", _panel_cue_clicked_cb, (void *) voicedata);
1738         evas_object_show(panel);
1739
1740         elm_object_part_content_set(panel_layout, "elm.swallow.right", panel);
1741         elm_object_part_content_set(layout_main, "left_panel_area", panel_layout);
1742
1743         elm_object_signal_emit(panel, "elm,state,disabled", "elm");
1744         elm_panel_toggle(panel);
1745
1746
1747         // Textblock
1748         Evas_Object *scroller = create_textblock(voicedata);
1749         elm_object_part_content_set(layout_main, "text_area", scroller);
1750         voicedata->scroller = scroller;
1751
1752         // Progress Bar
1753         Evas_Object *progress_bar = create_progressbar(layout_main);
1754         elm_object_part_content_set(layout_main, "PROGRESS_BAR", progress_bar);
1755         voicedata->progressbar = progress_bar;
1756
1757         // add callback
1758         elm_object_signal_callback_add(layout_main, "idle,state,pulse,visible", "", on_initial_anim_press_cb, voicedata);
1759
1760         mo->SetContentLayout(layout_main);
1761
1762         return layout_main;
1763 }
1764
1765 int is_lang_supported_by_stt(char lang[])
1766 {
1767         /* to check if the language is supported by stt */
1768         int index;
1769         for (index = (sizeof(supported_language) / sizeof(supported_language[0]))-1; index != 0; index--)
1770         {
1771                 if (!strcmp(lang, supported_language[index])) {
1772                         PRINTFUNC(DLOG_DEBUG, "current lang supported (%s)", supported_language[index]);
1773                         return TRUE;
1774                 }
1775         }
1776
1777         PRINTFUNC(DLOG_DEBUG, "current lang not supported (%s)", lang);
1778
1779         return FALSE;
1780 }
1781
1782 int init_voice(Evas_Object *parent, const char *lang, VoiceData *r_voicedata)
1783 {
1784         PRINTFUNC(DLOG_DEBUG, "[init_voice]");
1785
1786 //      stt_is_samsung_asr(&g_is_n66);
1787
1788         VoiceData *voicedata = (VoiceData *)r_voicedata;
1789         if (!voicedata) {
1790                 return FALSE;
1791         }
1792
1793         if (!parent) {
1794                 PRINTFUNC(DLOG_ERROR, "Parent is NULL\n");
1795                 return FALSE;
1796         } else {
1797                 PRINTFUNC(NO_PRINT, "Parent is there");
1798         }
1799
1800         voicedata->voicefw_state = 0;
1801
1802         /* Set Voice Language */
1803         if(voicedata->kbd_lang){
1804                 free(voicedata->kbd_lang);
1805                 voicedata->kbd_lang = NULL;
1806         }
1807
1808         //stt_get_default_language(my_voicedata->voicefw_handle, &my_voicedata->kbd_lang);
1809         get_stt_default_language(voicedata);
1810         if(NULL == voicedata->kbd_lang || FALSE == is_lang_supported_by_stt(voicedata->kbd_lang)) {
1811                 voicedata->kbd_lang = strdup("en_US");
1812         }
1813
1814         PRINTFUNC(DLOG_DEBUG, "Voice input active language is : %s", voicedata->kbd_lang);
1815
1816         voicedata->naviframe = parent;
1817
1818         if (NULL == voicedata->naviframe) {
1819                 return FALSE;
1820         }
1821
1822         if (NULL != voicedata->textblock_timer) {
1823                 PRINTFUNC(DLOG_DEBUG, "delete previous textblock");
1824                 ecore_timer_del(voicedata->textblock_timer);
1825                 voicedata->textblock_timer = NULL;
1826         }
1827
1828         return TRUE;
1829 }
1830
1831 static Eina_Bool init_view(void *data)
1832 {
1833         VoiceData *voicedata = (VoiceData *)data;
1834
1835         if(voicedata == NULL)
1836                 return ECORE_CALLBACK_CANCEL;
1837
1838         voicedata->layout_main = create_fullview(voicedata->naviframe, voicedata);
1839
1840         if (voicedata->layout_main) {
1841                 evas_object_show(voicedata->layout_main);
1842         }
1843
1844         return ECORE_CALLBACK_CANCEL;
1845 }
1846
1847
1848 Evas_Object *show_voice_window(Evas_Object *parent, VoiceData *r_voicedata)
1849 {
1850         PRINTFUNC(NO_PRINT, "[show_voice_window]");
1851
1852         VoiceData *voicedata = (VoiceData *)r_voicedata;
1853         if (!voicedata) {
1854                 return NULL;
1855         }
1856
1857         if (!parent) {
1858                 PRINTFUNC(NO_PRINT, "Parent is NULL\n");
1859                 return NULL;
1860         } else {
1861                 PRINTFUNC(NO_PRINT, "Parent is there");
1862         }
1863
1864         if (NULL != voicedata->layout_main) {
1865                 PRINTFUNC(DLOG_DEBUG, "delete previous layout");
1866                 evas_object_del((voicedata)->layout_main);
1867                 (voicedata)->layout_main = NULL;
1868         }
1869
1870         if (NULL != voicedata->effector) {
1871                 PRINTFUNC(DLOG_DEBUG, "delete previous effect");
1872                 delete (voicedata->effector);
1873                 (voicedata)->effector = NULL;
1874         }
1875
1876         if (NULL != voicedata->ieffect) {
1877                 PRINTFUNC(DLOG_DEBUG, "delete previous ieffect");
1878                 delete (voicedata->ieffect);
1879                 voicedata->ieffect = NULL;
1880         }
1881
1882         if(voicedata->mo) {
1883                 delete voicedata->mo;
1884                 voicedata->mo = NULL;
1885         }
1886
1887         init_view((void *)voicedata);
1888         return voicedata->layout_main;
1889 }
1890
1891
1892 void on_stt_pause(VoiceData *r_voicedata){
1893         PRINTFUNC(DLOG_DEBUG, "");
1894
1895         VoiceData *voicedata = (VoiceData *)r_voicedata;
1896
1897         if(voicedata){
1898                 try{
1899                         //voicedata->state = STT_STATE_VAL_PREPARE_CANCEL;
1900                         voicedata->sttmanager->Cancel();
1901                 }catch(is::stt::SttException &e){
1902                         PRINTFUNC(DLOG_ERROR, "reason : %s", e.what());
1903                 }
1904
1905                 //Hide more option and language settings by interrupt scenario.
1906                 close_setting_window_idler_cb(NULL);
1907                 Evas_Object *mo_layout = voicedata->mo->getMoreOptionLayout();
1908                 if(mo_layout){
1909                         if(eext_more_option_opened_get(mo_layout) == EINA_TRUE) {
1910                                 eext_more_option_opened_set(mo_layout, EINA_FALSE);
1911                         }
1912                 }
1913         }
1914 }
1915
1916 void on_destroy(VoiceData *r_voicedata)
1917 {
1918         PRINTFUNC(NO_PRINT, "");
1919
1920         VoiceData *voicedata = (VoiceData *)r_voicedata;
1921
1922         int result = STT_ERROR_NONE;
1923
1924         powerUnlock();
1925
1926         if (NULL != voicedata) {
1927                 if (NULL != voicedata->layout_main) {
1928                         voicedata->layout_main = NULL;
1929                 }
1930
1931                 if (NULL != voicedata->naviframe) {
1932                         voicedata->naviframe = NULL;
1933                 }
1934
1935                 if (NULL != voicedata->start_timer) {
1936                         ecore_timer_del(voicedata->start_timer);
1937                         voicedata->start_timer = NULL;
1938                 }
1939
1940                 if (NULL != voicedata->refresh_timer) {
1941                         ecore_timer_del(voicedata->refresh_timer);
1942                         voicedata->refresh_timer = NULL;
1943                 }
1944
1945                 if (NULL != voicedata->progressbar_timer) {
1946                         ecore_timer_del(voicedata->progressbar_timer);
1947                         voicedata->progressbar_timer = NULL;
1948                         elm_progressbar_pulse(voicedata->progressbar, EINA_FALSE);
1949                 }
1950
1951                 if (NULL != voicedata->textblock_timer) {
1952                         ecore_timer_del(voicedata->textblock_timer);
1953                         voicedata->textblock_timer = NULL;
1954                 }
1955
1956                 if (NULL != voicedata->guide_text_timer) {
1957                         ecore_timer_del(voicedata->guide_text_timer);
1958                         voicedata->guide_text_timer = NULL;
1959                 }
1960
1961                 if (NULL != voicedata->btn_disabling_timer) {
1962                         ecore_timer_del(voicedata->btn_disabling_timer);
1963                         voicedata->btn_disabling_timer = NULL;
1964                 }
1965
1966                 if (NULL != voicedata->power_unlock_timer) {
1967                         ecore_timer_del(voicedata->power_unlock_timer);
1968                         voicedata->power_unlock_timer = NULL;
1969                 }
1970
1971                 if(voicedata->kbd_lang) {
1972                         free(voicedata->kbd_lang);
1973                         voicedata->kbd_lang = NULL;
1974                 }
1975
1976                 if(voicedata->ieffect) {
1977                         delete voicedata->ieffect;
1978                         voicedata->ieffect = NULL;
1979                 }
1980
1981                 if(voicedata->effector) {
1982                         delete voicedata->effector;
1983                         voicedata->effector = NULL;
1984                 }
1985
1986                 if(voicedata->mo) {
1987                         delete voicedata->mo;
1988                         voicedata->mo = NULL;
1989                 }
1990
1991                 if(voicedata->sttmanager) {
1992                         delete voicedata->sttmanager;
1993                         voicedata->sttmanager = NULL;
1994                 }
1995
1996                 if(voicedata->sttfeedback) {
1997                         delete voicedata->sttfeedback;
1998                         voicedata->sttfeedback = NULL;
1999                 }
2000
2001                 free(voicedata);
2002         }
2003 }
2004
2005
2006